MINOR: sock: add sock_accept_conn() to test a listening socket

At several places we need to check if a socket is still valid and still
willing to accept connections. Instead of open-coding this, each time,
let's add a new function for this.
diff --git a/include/haproxy/sock.h b/include/haproxy/sock.h
index c43f4d8..40856f4 100644
--- a/include/haproxy/sock.h
+++ b/include/haproxy/sock.h
@@ -40,6 +40,7 @@
 int sock_get_dst(int fd, struct sockaddr *sa, socklen_t salen, int dir);
 int sock_get_old_sockets(const char *unixsocket);
 int sock_find_compatible_fd(const struct receiver *rx);
+int sock_accept_conn(const struct receiver *rx);
 
 #endif /* _HAPROXY_SOCK_H */
 
diff --git a/src/sock.c b/src/sock.c
index 4ef0076..ea6e366 100644
--- a/src/sock.c
+++ b/src/sock.c
@@ -466,6 +466,22 @@
 	return ret;
 }
 
+/* Tests if the receiver supports accepting connections. Returns positive on
+ * success, 0 if not possible, negative if the socket is non-recoverable. The
+ * rationale behind this is that inherited FDs may be broken and that shared
+ * FDs might have been paused by another process.
+ */
+int sock_accept_conn(const struct receiver *rx)
+{
+	int opt_val = 0;
+	socklen_t opt_len = sizeof(opt_val);
+
+	if (getsockopt(rx->fd, SOL_SOCKET, SO_ACCEPTCONN, &opt_val, &opt_len) == -1)
+		return -1;
+
+	return opt_val;
+}
+
 /*
  * Local variables:
  *  c-indent-level: 8