REORG/MINOR: stream_interface: move si->fd to struct connection

The socket fd is used only when in socket mode and with a connection.
diff --git a/src/dumpstats.c b/src/dumpstats.c
index 65f076d..8a81678 100644
--- a/src/dumpstats.c
+++ b/src/dumpstats.c
@@ -3347,7 +3347,7 @@
 			     &sess->si[0],
 			     sess->si[0].state,
 			     sess->si[0].flags,
-			     sess->si[0].fd,
+			     si_fd(&sess->si[0]),
 			     sess->si[0].exp ?
 			             tick_is_expired(sess->si[0].exp, now_ms) ? "<PAST>" :
 			                     human_time(TICKS_TO_MS(sess->si[0].exp - now_ms),
@@ -3359,7 +3359,7 @@
 			     &sess->si[1],
 			     sess->si[1].state,
 			     sess->si[1].flags,
-			     sess->si[1].fd,
+			     si_fd(&sess->si[1]),
 			     sess->si[1].exp ?
 			             tick_is_expired(sess->si[1].exp, now_ms) ? "<PAST>" :
 			                     human_time(TICKS_TO_MS(sess->si[1].exp - now_ms),
@@ -3590,7 +3590,7 @@
 				     " s0=[%d,%1xh,fd=%d,ex=%s]",
 				     curr_sess->si[0].state,
 				     curr_sess->si[0].flags,
-				     curr_sess->si[0].fd,
+				     si_fd(&curr_sess->si[0]),
 				     curr_sess->si[0].exp ?
 				     human_time(TICKS_TO_MS(curr_sess->si[0].exp - now_ms),
 						TICKS_TO_MS(1000)) : "");
@@ -3599,7 +3599,7 @@
 				     " s1=[%d,%1xh,fd=%d,ex=%s]",
 				     curr_sess->si[1].state,
 				     curr_sess->si[1].flags,
-				     curr_sess->si[1].fd,
+				     si_fd(&curr_sess->si[1]),
 				     curr_sess->si[1].exp ?
 				     human_time(TICKS_TO_MS(curr_sess->si[1].exp - now_ms),
 						TICKS_TO_MS(1000)) : "");
diff --git a/src/frontend.c b/src/frontend.c
index d2a9e70..63a2c1f 100644
--- a/src/frontend.c
+++ b/src/frontend.c
@@ -52,7 +52,7 @@
  */
 int frontend_accept(struct session *s)
 {
-	int cfd = s->si[0].fd;
+	int cfd = si_fd(&s->si[0]);
 
 	tv_zero(&s->logs.tv_request);
 	s->logs.t_queue = -1;
diff --git a/src/peers.c b/src/peers.c
index db22a84..6fcf2f3 100644
--- a/src/peers.c
+++ b/src/peers.c
@@ -1149,7 +1149,7 @@
 
 	s->req = s->rep = NULL; /* will be allocated later */
 
-	s->si[0].fd = -1;
+	s->si[0].conn.t.sock.fd = -1;
 	s->si[0].owner = t;
 	s->si[0].state = s->si[0].prev_state = SI_ST_EST;
 	s->si[0].err_type = SI_ET_NONE;
@@ -1167,7 +1167,7 @@
 
 	stream_int_register_handler(&s->si[0], &peer_applet);
 
-	s->si[1].fd = -1; /* just to help with debugging */
+	s->si[1].conn.t.sock.fd = -1; /* just to help with debugging */
 	s->si[1].owner = t;
 	s->si[1].state = s->si[1].prev_state = SI_ST_ASS;
 	s->si[1].conn_retries = p->conn_retries;
diff --git a/src/proto_http.c b/src/proto_http.c
index 850589e..189fcf3 100644
--- a/src/proto_http.c
+++ b/src/proto_http.c
@@ -2211,7 +2211,7 @@
 			 * previously disabled it, otherwise we might cause the client
 			 * to delay next data.
 			 */
-			setsockopt(s->si[0].fd, IPPROTO_TCP, TCP_QUICKACK, &one, sizeof(one));
+			setsockopt(si_fd(&s->si[0]), IPPROTO_TCP, TCP_QUICKACK, &one, sizeof(one));
 		}
 #endif
 
@@ -3406,7 +3406,7 @@
 		if ((s->listener->options & LI_O_NOQUICKACK) &&
 		    ((msg->flags & HTTP_MSGF_TE_CHNK) ||
 		     (msg->body_len > req->i - txn->req.eoh - 2)))
-			setsockopt(s->si[0].fd, IPPROTO_TCP, TCP_QUICKACK, &one, sizeof(one));
+			setsockopt(si_fd(&s->si[0]), IPPROTO_TCP, TCP_QUICKACK, &one, sizeof(one));
 #endif
 	}
 
@@ -3759,7 +3759,7 @@
 	clear_target(&s->target);
 
 	s->req->cons->state     = s->req->cons->prev_state = SI_ST_INI;
-	s->req->cons->fd        = -1; /* just to help with debugging */
+	s->req->cons->conn.t.sock.fd = -1; /* just to help with debugging */
 	s->req->cons->err_type  = SI_ET_NONE;
 	s->req->cons->conn_retries = 0;  /* used for logging too */
 	s->req->cons->err_loc   = NULL;
@@ -7293,7 +7293,7 @@
 {
 	int len, max;
 	len = sprintf(trash, "%08x:%s.%s[%04x:%04x]: ", t->uniq_id, t->be->id,
-		      dir, (unsigned  short)t->req->prod->fd, (unsigned short)t->req->cons->fd);
+		      dir, (unsigned  short)si_fd(t->req->prod), (unsigned short)si_fd(t->req->cons));
 	max = end - start;
 	UBOUND(max, trashlen - len - 1);
 	len += strlcpy2(trash + len, start, max + 1);
diff --git a/src/proto_tcp.c b/src/proto_tcp.c
index 02b20dd..ccd9e48 100644
--- a/src/proto_tcp.c
+++ b/src/proto_tcp.c
@@ -237,7 +237,7 @@
 		return SN_ERR_INTERNAL;
 	}
 
-	if ((fd = si->fd = socket(si->addr.to.ss_family, SOCK_STREAM, IPPROTO_TCP)) == -1) {
+	if ((fd = si->conn.t.sock.fd = socket(si->addr.to.ss_family, SOCK_STREAM, IPPROTO_TCP)) == -1) {
 		qfprintf(stderr, "Cannot get a server socket.\n");
 
 		if (errno == ENFILE)
@@ -555,7 +555,7 @@
 			si->send_proxy_ofs = -ret; /* first call */
 
 		/* we have to send trash from (ret+sp for -sp bytes) */
-		ret = send(si->fd, trash + ret + si->send_proxy_ofs, -si->send_proxy_ofs,
+		ret = send(fd, trash + ret + si->send_proxy_ofs, -si->send_proxy_ofs,
 			   (b->flags & BF_OUT_EMPTY) ? 0 : MSG_MORE);
 
 		if (ret == 0)
diff --git a/src/session.c b/src/session.c
index 8a27041..6db9f31 100644
--- a/src/session.c
+++ b/src/session.c
@@ -161,7 +161,7 @@
 	}
 
 	/* this part should be common with other protocols */
-	s->si[0].fd        = cfd;
+	s->si[0].conn.t.sock.fd = cfd;
 	s->si[0].owner     = t;
 	s->si[0].state     = s->si[0].prev_state = SI_ST_EST;
 	s->si[0].err_type  = SI_ET_NONE;
@@ -185,7 +185,7 @@
 	/* pre-initialize the other side's stream interface to an INIT state. The
 	 * callbacks will be initialized before attempting to connect.
 	 */
-	s->si[1].fd        = -1; /* just to help with debugging */
+	s->si[1].conn.t.sock.fd = -1; /* just to help with debugging */
 	s->si[1].owner     = t;
 	s->si[1].state     = s->si[1].prev_state = SI_ST_INI;
 	s->si[1].err_type  = SI_ET_NONE;
@@ -543,7 +543,7 @@
 		si->exp   = TICK_ETERNITY;
 		si->state = SI_ST_CER;
 		si->flags &= ~SI_FL_CAP_SPLICE;
-		fd_delete(si->fd);
+		fd_delete(si_fd(si));
 
 		if (si->release)
 			si->release(si);
@@ -2079,8 +2079,8 @@
 		    s->si[1].prev_state == SI_ST_EST) {
 			len = sprintf(trash, "%08x:%s.srvcls[%04x:%04x]\n",
 				      s->uniq_id, s->be->id,
-				      (unsigned short)s->si[0].fd,
-				      (unsigned short)s->si[1].fd);
+				      (unsigned short)si_fd(&s->si[0]),
+				      (unsigned short)si_fd(&s->si[1]));
 			if (write(1, trash, len) < 0) /* shut gcc warning */;
 		}
 
@@ -2088,8 +2088,8 @@
 		    s->si[0].prev_state == SI_ST_EST) {
 			len = sprintf(trash, "%08x:%s.clicls[%04x:%04x]\n",
 				      s->uniq_id, s->be->id,
-				      (unsigned short)s->si[0].fd,
-				      (unsigned short)s->si[1].fd);
+				      (unsigned short)si_fd(&s->si[0]),
+				      (unsigned short)si_fd(&s->si[1]));
 			if (write(1, trash, len) < 0) /* shut gcc warning */;
 		}
 	}
@@ -2196,7 +2196,7 @@
 		int len;
 		len = sprintf(trash, "%08x:%s.closed[%04x:%04x]\n",
 			      s->uniq_id, s->be->id,
-			      (unsigned short)s->req->prod->fd, (unsigned short)s->req->cons->fd);
+			      (unsigned short)si_fd(s->req->prod), (unsigned short)si_fd(s->req->cons));
 		if (write(1, trash, len) < 0) /* shut gcc warning */;
 	}
 
diff --git a/src/sock_raw.c b/src/sock_raw.c
index 143d145..1205b2e 100644
--- a/src/sock_raw.c
+++ b/src/sock_raw.c
@@ -84,7 +84,7 @@
 static int sock_raw_splice_in(struct buffer *b, struct stream_interface *si)
 {
 	static int splice_detects_close;
-	int fd = si->fd;
+	int fd = si_fd(si);
 	int ret;
 	unsigned long max;
 	int retval = 1;
@@ -526,7 +526,7 @@
 
 #if defined(CONFIG_HAP_LINUX_SPLICE)
 	while (b->pipe) {
-		ret = splice(b->pipe->cons, NULL, si->fd, NULL, b->pipe->data,
+		ret = splice(b->pipe->cons, NULL, si_fd(si), NULL, b->pipe->data,
 			     SPLICE_F_MOVE|SPLICE_F_NONBLOCK);
 		if (ret <= 0) {
 			if (ret == 0 || errno == EAGAIN) {
@@ -601,21 +601,21 @@
 			if (b->flags & BF_SEND_DONTWAIT)
 				send_flag &= ~MSG_MORE;
 
-			ret = send(si->fd, bo_ptr(b), max, send_flag);
+			ret = send(si_fd(si), bo_ptr(b), max, send_flag);
 		} else {
 			int skerr;
 			socklen_t lskerr = sizeof(skerr);
 
-			ret = getsockopt(si->fd, SOL_SOCKET, SO_ERROR, &skerr, &lskerr);
+			ret = getsockopt(si_fd(si), SOL_SOCKET, SO_ERROR, &skerr, &lskerr);
 			if (ret == -1 || skerr)
 				ret = -1;
 			else
-				ret = send(si->fd, bo_ptr(b), max, MSG_DONTWAIT);
+				ret = send(si_fd(si), bo_ptr(b), max, MSG_DONTWAIT);
 		}
 
 		if (ret > 0) {
-			if (fdtab[si->fd].state == FD_STCONN) {
-				fdtab[si->fd].state = FD_STREADY;
+			if (fdtab[si_fd(si)].state == FD_STCONN) {
+				fdtab[si_fd(si)].state = FD_STREADY;
 				si->exp = TICK_ETERNITY;
 			}
 
@@ -788,12 +788,12 @@
 		}
 		else if (si->flags & SI_FL_NOLINGER) {
 			si->flags &= ~SI_FL_NOLINGER;
-			setsockopt(si->fd, SOL_SOCKET, SO_LINGER,
+			setsockopt(si_fd(si), SOL_SOCKET, SO_LINGER,
 				   (struct linger *) &nolinger, sizeof(struct linger));
 		}
 		else if (!(si->flags & SI_FL_NOHALF)) {
-			EV_FD_CLR(si->fd, DIR_WR);
-			shutdown(si->fd, SHUT_WR);
+			EV_FD_CLR(si_fd(si), DIR_WR);
+			shutdown(si_fd(si), SHUT_WR);
 
 			if (!(si->ib->flags & (BF_SHUTR|BF_DONT_READ)))
 				return;
@@ -804,7 +804,7 @@
 		/* we may have to close a pending connection, and mark the
 		 * response buffer as shutr
 		 */
-		fd_delete(si->fd);
+		fd_delete(si_fd(si));
 		/* fall through */
 	case SI_ST_CER:
 	case SI_ST_QUE:
@@ -841,7 +841,7 @@
 		return;
 
 	if (si->ob->flags & BF_SHUTW) {
-		fd_delete(si->fd);
+		fd_delete(si_fd(si));
 		si->state = SI_ST_DIS;
 		si->exp = TICK_ETERNITY;
 
@@ -853,7 +853,7 @@
 		/* we want to immediately forward this close to the write side */
 		return sock_raw_shutw(si);
 	}
-	EV_FD_CLR(si->fd, DIR_RD);
+	EV_FD_CLR(si_fd(si), DIR_RD);
 	return;
 }
 
@@ -867,7 +867,7 @@
 {
 	struct buffer *ib = si->ib;
 	struct buffer *ob = si->ob;
-	int fd = si->fd;
+	int fd = si_fd(si);
 
 	DPRINTF(stderr,"[%u] %s: fd=%d owner=%p ib=%p, ob=%p, exp(r,w)=%u,%u ibf=%08x obf=%08x ibh=%d ibt=%d obh=%d obd=%d si=%d\n",
 		now_ms, __FUNCTION__,
@@ -949,7 +949,7 @@
 
 	DPRINTF(stderr,"[%u] %s: fd=%d owner=%p ib=%p, ob=%p, exp(r,w)=%u,%u ibf=%08x obf=%08x ibh=%d ibt=%d obh=%d obd=%d si=%d\n",
 		now_ms, __FUNCTION__,
-		si->fd, fdtab[si->fd].owner,
+		si_fd(si), fdtab[si_fd(si)].owner,
 		ib, si->ob,
 		ib->rex, si->ob->wex,
 		ib->flags, si->ob->flags,
@@ -962,12 +962,12 @@
 		/* stop reading */
 		if ((ib->flags & (BF_FULL|BF_HIJACK|BF_DONT_READ)) == BF_FULL)
 			si->flags |= SI_FL_WAIT_ROOM;
-		EV_FD_COND_C(si->fd, DIR_RD);
+		EV_FD_COND_C(si_fd(si), DIR_RD);
 	}
 	else {
 		/* (re)start reading */
 		si->flags &= ~SI_FL_WAIT_ROOM;
-		EV_FD_COND_S(si->fd, DIR_RD);
+		EV_FD_COND_S(si_fd(si), DIR_RD);
 	}
 }
 
@@ -984,7 +984,7 @@
 
 	DPRINTF(stderr,"[%u] %s: fd=%d owner=%p ib=%p, ob=%p, exp(r,w)=%u,%u ibf=%08x obf=%08x ibh=%d ibt=%d obh=%d obd=%d si=%d\n",
 		now_ms, __FUNCTION__,
-		si->fd, fdtab[si->fd].owner,
+		si_fd(si), fdtab[si_fd(si)].owner,
 		si->ib, ob,
 		si->ib->rex, ob->wex,
 		si->ib->flags, ob->flags,
@@ -998,7 +998,7 @@
 
 	if (!ob->pipe &&                          /* spliced data wants to be forwarded ASAP */
 	    (!(si->flags & SI_FL_WAIT_DATA) ||    /* not waiting for data */
-	     (fdtab[si->fd].ev & FD_POLL_OUT)))   /* we'll be called anyway */
+	     (fdtab[si_fd(si)].ev & FD_POLL_OUT)))   /* we'll be called anyway */
 		return;
 
 	retval = sock_raw_write_loop(si, ob);
@@ -1011,9 +1011,9 @@
 		/* Write error on the file descriptor. We mark the FD as STERROR so
 		 * that we don't use it anymore and we notify the task.
 		 */
-		fdtab[si->fd].state = FD_STERROR;
-		fdtab[si->fd].ev &= ~FD_POLL_STICKY;
-		EV_FD_REM(si->fd);
+		fdtab[si_fd(si)].state = FD_STERROR;
+		fdtab[si_fd(si)].ev &= ~FD_POLL_STICKY;
+		EV_FD_REM(si_fd(si));
 		si->flags |= SI_FL_ERR;
 		goto out_wakeup;
 	}
@@ -1043,7 +1043,7 @@
 		/* Otherwise there are remaining data to be sent in the buffer,
 		 * which means we have to poll before doing so.
 		 */
-		EV_FD_COND_S(si->fd, DIR_WR);
+		EV_FD_COND_S(si_fd(si), DIR_WR);
 		si->flags &= ~SI_FL_WAIT_DATA;
 		if (!tick_isset(ob->wex))
 			ob->wex = tick_add_ifset(now_ms, ob->wto);