REORG: connection: move conn_drain() to connection.c and rename it

It's now called conn_sock_drain() to make it clear that it only reads
at the sock layer and not at the data layer. The function was too big
to remain inlined and it's used at a few places where size counts.
diff --git a/src/checks.c b/src/checks.c
index f61bc9c..2ef14d1 100644
--- a/src/checks.c
+++ b/src/checks.c
@@ -1340,7 +1340,7 @@
 		/* We're here because nobody wants to handle the error, so we
 		 * sure want to abort the hard way.
 		 */
-		conn_drain(conn);
+		conn_sock_drain(conn);
 		conn_force_close(conn);
 	}
 	return 0;
@@ -2079,7 +2079,7 @@
 			 * as a failed response coupled with "observe layer7" caused the
 			 * server state to be suddenly changed.
 			 */
-			conn_drain(conn);
+			conn_sock_drain(conn);
 			conn_force_close(conn);
 		}
 
diff --git a/src/connection.c b/src/connection.c
index 8b3c835..efcd6e1 100644
--- a/src/connection.c
+++ b/src/connection.c
@@ -268,6 +268,42 @@
 	return ret;
 }
 
+/* Drains possibly pending incoming data on the file descriptor attached to the
+ * connection and update the connection's flags accordingly. This is used to
+ * know whether we need to disable lingering on close. Returns non-zero if it
+ * is safe to close without disabling lingering, otherwise zero. The SOCK_RD_SH
+ * flag may also be updated if the incoming shutdown was reported by the drain()
+ * function.
+ */
+int conn_sock_drain(struct connection *conn)
+{
+	if (!conn_ctrl_ready(conn))
+		return 1;
+
+	if (conn->flags & (CO_FL_ERROR | CO_FL_SOCK_RD_SH))
+		return 1;
+
+	if (fdtab[conn->t.sock.fd].ev & (FD_POLL_ERR|FD_POLL_HUP)) {
+		fdtab[conn->t.sock.fd].linger_risk = 0;
+	}
+	else {
+		if (!fd_recv_ready(conn->t.sock.fd))
+			return 0;
+
+		/* disable draining if we were called and have no drain function */
+		if (!conn->ctrl->drain) {
+			__conn_data_stop_recv(conn);
+			return 0;
+		}
+
+		if (conn->ctrl->drain(conn->t.sock.fd) <= 0)
+			return 0;
+	}
+
+	conn->flags |= CO_FL_SOCK_RD_SH;
+	return 1;
+}
+
 /*
  * Get data length from tlv
  */
diff --git a/src/ssl_sock.c b/src/ssl_sock.c
index bc20908..77c4490 100644
--- a/src/ssl_sock.c
+++ b/src/ssl_sock.c
@@ -2466,7 +2466,7 @@
 				 * TCP sockets. We first try to drain possibly pending
 				 * data to avoid this as much as possible.
 				 */
-				conn_drain(conn);
+				conn_sock_drain(conn);
 				if (!conn->err_code)
 					conn->err_code = (conn->xprt_st & SSL_SOCK_RECV_HEARTBEAT) ?
 						CO_ER_SSL_KILLED_HB : CO_ER_SSL_HANDSHAKE;
@@ -2532,7 +2532,7 @@
 			 * TCP sockets. We first try to drain possibly pending
 			 * data to avoid this as much as possible.
 			 */
-			conn_drain(conn);
+			conn_sock_drain(conn);
 			if (!conn->err_code)
 				conn->err_code = (conn->xprt_st & SSL_SOCK_RECV_HEARTBEAT) ?
 					CO_ER_SSL_KILLED_HB : CO_ER_SSL_HANDSHAKE;
diff --git a/src/stream_interface.c b/src/stream_interface.c
index 8450117..1d8cec2 100644
--- a/src/stream_interface.c
+++ b/src/stream_interface.c
@@ -497,7 +497,7 @@
  */
 static void si_idle_conn_null_cb(struct connection *conn)
 {
-	conn_drain(conn);
+	conn_sock_drain(conn);
 }
 
 /* Callback to be used by connection I/O handlers when some activity is detected