MEDIUM: connection: make conn_sock_shutw() aware of lingering

Instead of having to manually handle lingering outside, let's make
conn_sock_shutw() check for it before calling shutdown(). We simply
don't want to emit the FIN if we're going to reset the connection
due to lingering. It's particularly important for silent-drop where
it's absolutely mandatory that no packet leaves the machine.
diff --git a/include/proto/connection.h b/include/proto/connection.h
index 17b68dd..defdefe 100644
--- a/include/proto/connection.h
+++ b/include/proto/connection.h
@@ -432,7 +432,8 @@
 {
 	c->flags |= CO_FL_SOCK_WR_SH;
 	__conn_sock_stop_send(c);
-	if (conn_ctrl_ready(c))
+	/* don't perform a clean shutdown if we're going to reset */
+	if (conn_ctrl_ready(c) && !fdtab[c->handle.fd].linger_risk)
 		shutdown(c->handle.fd, SHUT_WR);
 }
 
diff --git a/src/stream_interface.c b/src/stream_interface.c
index 28af07e..7838372 100644
--- a/src/stream_interface.c
+++ b/src/stream_interface.c
@@ -861,6 +861,7 @@
 		else {
 			/* clean data-layer shutdown */
 			conn_xprt_shutw(conn);
+			conn_sock_shutw(conn);
 
 			/* If the stream interface is configured to disable half-open
 			 * connections, we'll skip the shutdown(), but only if the
@@ -869,9 +870,6 @@
 			 * waiting for the server).
 			 */
 			if (!(si->flags & SI_FL_NOHALF) || !(ic->flags & (CF_SHUTR|CF_DONT_READ))) {
-				/* We shutdown transport layer */
-				conn_sock_shutw(conn);
-
 				if (!(ic->flags & (CF_SHUTR|CF_DONT_READ))) {
 					/* OK just a shutw, but we want the caller
 					 * to disable polling on this FD if exists.