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");
}