MINOR: protocol: implement an ->rx_resume() method

This one undoes ->rx_suspend(), it tries to restore an operational socket.
It was only implemented for TCP since it's the only one we support right
now.
diff --git a/src/proto_tcp.c b/src/proto_tcp.c
index b3dbdd4..5aa7bfd 100644
--- a/src/proto_tcp.c
+++ b/src/proto_tcp.c
@@ -46,6 +46,7 @@
 
 static int tcp_bind_listener(struct listener *listener, char *errmsg, int errlen);
 static int tcp_suspend_receiver(struct receiver *rx);
+static int tcp_resume_receiver(struct receiver *rx);
 static void tcpv4_add_listener(struct listener *listener, int port);
 static void tcpv6_add_listener(struct listener *listener, int port);
 
@@ -60,6 +61,7 @@
 	.add = tcpv4_add_listener,
 	.listen = tcp_bind_listener,
 	.rx_suspend = tcp_suspend_receiver,
+	.rx_resume = tcp_resume_receiver,
 	.accept = &listener_accept,
 	.connect = tcp_connect_server,
 	.receivers = LIST_HEAD_INIT(proto_tcpv4.receivers),
@@ -79,6 +81,7 @@
 	.add = tcpv6_add_listener,
 	.listen = tcp_bind_listener,
 	.rx_suspend = tcp_suspend_receiver,
+	.rx_resume = tcp_resume_receiver,
 	.accept = &listener_accept,
 	.connect = tcp_connect_server,
 	.receivers = LIST_HEAD_INIT(proto_tcpv6.receivers),
@@ -767,6 +770,23 @@
 	return -1;
 }
 
+/* Resume a receiver. Returns < 0 in case of failure, 0 if the receiver
+ * was totally stopped, or > 0 if correctly suspended.
+ */
+static int tcp_resume_receiver(struct receiver *rx)
+{
+	struct listener *l = LIST_ELEM(rx, struct listener *, rx);
+
+	if (rx->fd < 0)
+		return 0;
+
+	if (listen(rx->fd, listener_backlog(l)) == 0) {
+		fd_want_recv(l->rx.fd);
+		return 1;
+	}
+	return -1;
+}
+
 
 /*
  * Local variables: