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