MINOR: connstream: have a new flag CS_FL_KILL_CONN to kill a connection
This is the equivalent of SI_FL_KILL_CONN but for the connstreams. It
will be set by the stream-interface during the various shutdown
operations.
diff --git a/include/types/connection.h b/include/types/connection.h
index 434318f..f11cfb5 100644
--- a/include/types/connection.h
+++ b/include/types/connection.h
@@ -88,6 +88,7 @@
CS_FL_EOS = 0x00001000, /* End of stream delivered to data layer */
CS_FL_REOS = 0x00002000, /* End of stream received (buffer not empty) */
CS_FL_WAIT_FOR_HS = 0x00010000, /* This stream is waiting for handhskae */
+ CS_FL_KILL_CONN = 0x00020000, /* must kill the connection when the CS closes */
/* following flags are supposed to be set by the mux and read/unset by
* the stream-interface :
diff --git a/src/stream_interface.c b/src/stream_interface.c
index cbe6f6e..669a906 100644
--- a/src/stream_interface.c
+++ b/src/stream_interface.c
@@ -904,6 +904,9 @@
if (si->state != SI_ST_EST && si->state != SI_ST_CON)
return;
+ if (si->flags & SI_FL_KILL_CONN)
+ cs->flags |= CS_FL_KILL_CONN;
+
if (si_oc(si)->flags & CF_SHUTW) {
cs_close(cs);
si->state = SI_ST_DIS;
@@ -950,6 +953,9 @@
* However, if SI_FL_NOLINGER is explicitly set, we know there is
* no risk so we close both sides immediately.
*/
+ if (si->flags & SI_FL_KILL_CONN)
+ cs->flags |= CS_FL_KILL_CONN;
+
if (si->flags & SI_FL_ERR) {
/* quick close, the socket is alredy shut anyway */
}
@@ -984,6 +990,8 @@
/* we may have to close a pending connection, and mark the
* response buffer as shutr
*/
+ if (si->flags & SI_FL_KILL_CONN)
+ cs->flags |= CS_FL_KILL_CONN;
cs_close(cs);
/* fall through */
case SI_ST_CER: