diff --git a/src/net/SocketDescriptor.cxx b/src/net/SocketDescriptor.cxx index 146149af0..97f83cdd9 100644 --- a/src/net/SocketDescriptor.cxx +++ b/src/net/SocketDescriptor.cxx @@ -68,6 +68,20 @@ SocketDescriptor::Accept() : Undefined(); } +SocketDescriptor +SocketDescriptor::AcceptNonBlock() const +{ +#ifdef HAVE_ACCEPT4 + int connection_fd = ::accept4(Get(), nullptr, nullptr, + SOCK_CLOEXEC|SOCK_NONBLOCK); +#else + int connection_fd = ::accept(Get(), nullptr, nullptr); + if (connection_fd >= 0) + SocketDescriptor(connection_fd).SetNonBlocking(); +#endif + return SocketDescriptor(connection_fd); +} + SocketDescriptor SocketDescriptor::AcceptNonBlock(StaticSocketAddress &address) const { diff --git a/src/net/SocketDescriptor.hxx b/src/net/SocketDescriptor.hxx index bc2d86d16..d42f36fe9 100644 --- a/src/net/SocketDescriptor.hxx +++ b/src/net/SocketDescriptor.hxx @@ -173,6 +173,7 @@ public: bool Listen(int backlog); SocketDescriptor Accept(); + SocketDescriptor AcceptNonBlock() const; SocketDescriptor AcceptNonBlock(StaticSocketAddress &address) const; bool Connect(SocketAddress address); diff --git a/src/net/UniqueSocketDescriptor.hxx b/src/net/UniqueSocketDescriptor.hxx index 750198855..0ad529e97 100644 --- a/src/net/UniqueSocketDescriptor.hxx +++ b/src/net/UniqueSocketDescriptor.hxx @@ -76,6 +76,13 @@ public: return fd == other.fd; } + /** + * @return an "undefined" instance on error + */ + UniqueSocketDescriptor AcceptNonBlock() const { + return UniqueSocketDescriptor(SocketDescriptor::AcceptNonBlock()); + } + /** * @return an "undefined" instance on error */