MEDIUM: proto_sockpair: make use of sockpair_bind_receiver()

Now we rely on the address family's receiver instead of binding everything
ourselves.
diff --git a/src/proto_sockpair.c b/src/proto_sockpair.c
index de28faf..00fce76 100644
--- a/src/proto_sockpair.c
+++ b/src/proto_sockpair.c
@@ -150,9 +150,8 @@
  */
 static int sockpair_bind_listener(struct listener *listener, char *errmsg, int errlen)
 {
-	int fd = listener->rx.fd;
 	int err;
-	const char *msg = NULL;
+	char *msg = NULL;
 
 	err = ERR_NONE;
 
@@ -163,38 +162,18 @@
 	if (listener->state != LI_ASSIGNED)
 		return ERR_NONE; /* already bound */
 
-	if (listener->rx.flags & RX_F_BOUND)
-		goto bound;
-
-	if (listener->rx.fd == -1) {
-		err |= ERR_FATAL | ERR_ALERT;
-		msg = "sockpair can be only used with inherited FDs";
-		goto err_return;
-	}
-
-	if (fd >= global.maxsock) {
-		err |= ERR_FATAL | ERR_ALERT;
-		msg = "socket(): not enough free sockets, raise -n argument";
-		goto err_return;
-	}
-	if (fcntl(fd, F_SETFL, O_NONBLOCK) == -1) {
-		err |= ERR_FATAL | ERR_ALERT;
-		msg = "cannot make sockpair non-blocking";
-		goto err_return;
+	err = sockpair_bind_receiver(&listener->rx, listener->rx.proto->accept, &msg);
+	if (err != ERR_NONE) {
+		snprintf(errmsg, errlen, "%s", msg);
+		free(msg); msg = NULL;
+		return err;
 	}
-	listener->rx.flags |= RX_F_BOUND;
-
- bound:
 	listener->state = LI_LISTEN;
-
-	fd_insert(fd, listener, listener->rx.proto->accept,
-	          thread_mask(listener->rx.settings->bind_thread) & all_threads_mask);
-
 	return err;
 
  err_return:
 	if (msg && errlen)
-		snprintf(errmsg, errlen, "%s [fd %d]", msg, fd);
+		snprintf(errmsg, errlen, "%s [fd %d]", msg, listener->rx.fd);
 	return err;
 }