fd/ops: Fix accept() address return

Error cases and EOF don't return addresses.

Change-Id: I7c72e64f70d7b74f0761edd40e135ffaa2e9e325
Signed-off-by: William A. Kennington III <wak@google.com>
diff --git a/include-fd/stdplus/fd/gmock.hpp b/include-fd/stdplus/fd/gmock.hpp
index 7b70fd8..2349e44 100644
--- a/include-fd/stdplus/fd/gmock.hpp
+++ b/include-fd/stdplus/fd/gmock.hpp
@@ -23,7 +23,7 @@
     MOCK_METHOD(void, truncate, (off_t size), (override));
     MOCK_METHOD(void, bind, (std::span<const std::byte> sockaddr), (override));
     MOCK_METHOD(void, listen, (int backlog), (override));
-    MOCK_METHOD((std::tuple<std::optional<int>, std::span<std::byte>>), accept,
+    MOCK_METHOD((std::optional<std::tuple<int, std::span<std::byte>>>), accept,
                 (std::span<std::byte> sockaddr), (override));
     MOCK_METHOD(void, setsockopt,
                 (SockLevel level, SockOpt optname,
diff --git a/include-fd/stdplus/fd/impl.hpp b/include-fd/stdplus/fd/impl.hpp
index 9d5acaf..bd8c4dc 100644
--- a/include-fd/stdplus/fd/impl.hpp
+++ b/include-fd/stdplus/fd/impl.hpp
@@ -21,7 +21,7 @@
     void truncate(off_t size) override;
     void bind(std::span<const std::byte> sockaddr) override;
     void listen(int backlog) override;
-    std::tuple<std::optional<int>, std::span<std::byte>>
+    std::optional<std::tuple<int, std::span<std::byte>>>
         accept(std::span<std::byte> sockaddr) override;
     void setsockopt(SockLevel level, SockOpt optname,
                     std::span<const std::byte> opt) override;
diff --git a/include-fd/stdplus/fd/intf.hpp b/include-fd/stdplus/fd/intf.hpp
index 479fcc0..c4e2d7b 100644
--- a/include-fd/stdplus/fd/intf.hpp
+++ b/include-fd/stdplus/fd/intf.hpp
@@ -131,7 +131,7 @@
     virtual void truncate(off_t size) = 0;
     virtual void bind(std::span<const std::byte> sockaddr) = 0;
     virtual void listen(int backlog) = 0;
-    virtual std::tuple<std::optional<int>, std::span<std::byte>>
+    virtual std::optional<std::tuple<int, std::span<std::byte>>>
         accept(std::span<std::byte> sockaddr) = 0;
     virtual void setsockopt(SockLevel level, SockOpt optname,
                             std::span<const std::byte> opt) = 0;
diff --git a/include-fd/stdplus/fd/ops.hpp b/include-fd/stdplus/fd/ops.hpp
index e388dae..4d0b01a 100644
--- a/include-fd/stdplus/fd/ops.hpp
+++ b/include-fd/stdplus/fd/ops.hpp
@@ -114,12 +114,12 @@
 
 inline std::optional<DupableFd> accept(Fd& fd)
 {
-    auto ret = std::get<0>(fd.accept(std::span<std::byte>{}));
+    auto ret = fd.accept(std::span<std::byte>{});
     if (!ret)
     {
         return std::nullopt;
     }
-    return DupableFd(std::move(*ret));
+    return DupableFd(std::move(std::get<0>(*ret)));
 }
 
 template <typename Opt>
diff --git a/src/fd/impl.cpp b/src/fd/impl.cpp
index 40ce7b3..55efbab 100644
--- a/src/fd/impl.cpp
+++ b/src/fd/impl.cpp
@@ -123,7 +123,7 @@
     CHECK_ERRNO(::listen(get(), backlog), "listen");
 }
 
-std::tuple<std::optional<int>, std::span<std::byte>>
+std::optional<std::tuple<int, std::span<std::byte>>>
     FdImpl::accept(std::span<std::byte> sockaddr)
 {
     socklen_t len = sockaddr.size();
@@ -133,7 +133,7 @@
     {
         if (errno == EAGAIN || errno == EWOULDBLOCK)
         {
-            return {};
+            return std::nullopt;
         }
         throw util::makeSystemError(errno, "accept");
     }