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/include/proto/stream_interface.h b/include/proto/stream_interface.h
index 9a619f8..83c389a 100644
--- a/include/proto/stream_interface.h
+++ b/include/proto/stream_interface.h
@@ -52,6 +52,11 @@
return si->conn.data;
}
+static inline int si_fd(struct stream_interface *si)
+{
+ return si->conn.t.sock.fd;
+}
+
static inline void clear_target(struct target *dest)
{
dest->type = TARG_TYPE_NONE;
@@ -121,7 +126,7 @@
if (!si_ctrl(si) || !si_ctrl(si)->get_src)
return;
- if (si_ctrl(si)->get_src(si->fd, (struct sockaddr *)&si->addr.from,
+ if (si_ctrl(si)->get_src(si_fd(si), (struct sockaddr *)&si->addr.from,
sizeof(si->addr.from),
si->target.type != TARG_TYPE_CLIENT) == -1)
return;
@@ -137,7 +142,7 @@
if (!si_ctrl(si) || !si_ctrl(si)->get_dst)
return;
- if (si_ctrl(si)->get_dst(si->fd, (struct sockaddr *)&si->addr.to,
+ if (si_ctrl(si)->get_dst(si_fd(si), (struct sockaddr *)&si->addr.to,
sizeof(si->addr.to),
si->target.type != TARG_TYPE_CLIENT) == -1)
return;
diff --git a/include/types/stream_interface.h b/include/types/stream_interface.h
index d573c58..ccaa1eb 100644
--- a/include/types/stream_interface.h
+++ b/include/types/stream_interface.h
@@ -105,6 +105,11 @@
struct connection {
const struct sock_ops *data; /* operations at the data layer */
const struct protocol *ctrl; /* operations at the control layer, generally a protocol */
+ union { /* definitions which depend on connection type */
+ struct { /*** information used by socket-based connections ***/
+ int fd; /* file descriptor for a stream driver when known */
+ } sock;
+ } t;
};
struct target {
@@ -158,7 +163,6 @@
struct target target; /* the target to connect to (server, proxy, applet, ...) */
int conn_retries; /* number of connect retries left */
int send_proxy_ofs; /* <0 = offset to (re)send from the end, >0 = send all */
- int fd; /* file descriptor for a stream driver when known */
struct {
int state; /* applet state, initialized to zero */
void *private; /* may be used by any function above */
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);