From 614b3634d49b98748866fe9ad024eb98133ea4fb Mon Sep 17 00:00:00 2001
From: Max Kellermann <max@musicpd.org>
Date: Fri, 11 Aug 2017 09:02:10 +0200
Subject: [PATCH] net/SocketDescriptor: add AcceptNonBlock() overload without
 address

---
 src/net/SocketDescriptor.cxx       | 14 ++++++++++++++
 src/net/SocketDescriptor.hxx       |  1 +
 src/net/UniqueSocketDescriptor.hxx |  7 +++++++
 3 files changed, 22 insertions(+)

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
 	 */