structure, instead of whatever we actually bound to. It is more informative
and intuitive.
Report the listen socket spec in the SessionOpen shm record.
Close listen sockets as soon as we have forked the child, this eliminated
a fd-leak when a socket was eliminated from listen_address while the child
ran.
Fix various potential problems related to not being able to bind to one
or more listen addresses.
git-svn-id: svn+ssh://projects.linpro.no/svn/varnish/trunk@2659
d4fa192b-c00b-0410-8231-
f00ffab90ce4
socklen_t mysockaddrlen;
struct sockaddr *sockaddr;
struct sockaddr *mysockaddr;
+ struct listen_sock *mylsock;
/* formatted ascii client address */
char *addr;
addr, sizeof addr, port, sizeof port);
sp->addr = WS_Dup(sp->ws, addr);
sp->port = WS_Dup(sp->ws, port);
- VSL(SLT_SessionOpen, sp->fd, "%s %s", sp->addr, sp->port);
+ VSL(SLT_SessionOpen, sp->fd, "%s %s %s",
+ sp->addr, sp->port, sp->mylsock->name);
sp->acct.first = sp->t_open;
if (need_test)
sock_test(sp->fd);
#endif
i = poll(pfd, heritage.nsocks, 1000);
now = TIM_real();
- for (u = 0; u < heritage.nsocks; u++) {
- if (pfd[u].revents == 0)
+ u = 0;
+ VTAILQ_FOREACH(ls, &heritage.socks, list) {
+ if (ls->sock < 0)
+ continue;
+ if (pfd[u++].revents == 0)
continue;
VSL_stats->client_conn++;
l = sizeof addr_s;
addr = (void*)&addr_s;
- i = accept(pfd[u].fd, addr, &l);
+ i = accept(ls->sock, addr, &l);
if (i < 0) {
if (errno != EAGAIN && errno != ECONNABORTED) {
- VSL(SLT_Debug, pfd[u].fd,
+ VSL(SLT_Debug, ls->sock,
"Accept failed errno=%d", errno);
/* XXX: stats ? */
}
sp->fd = i;
sp->id = i;
sp->t_open = now;
+ sp->mylsock = ls;
sp->step = STP_FIRST;
WRK_QueueSession(sp);
struct listen_sock {
VTAILQ_ENTRY(listen_sock) list;
int sock;
- char *hname;
- char *pname;
+ char *name;
struct vss_addr *addr;
};
{
struct listen_sock *ls, *ls2;
int good = 0;
- char hbuf[TCP_ADDRBUFSIZE];
- char pbuf[TCP_PORTBUFSIZE];
VTAILQ_FOREACH_SAFE(ls, &heritage.socks, list, ls2) {
if (ls->sock >= 0) {
if (ls->sock < 0)
continue;
- TCP_myname(ls->sock, hbuf, sizeof hbuf, pbuf, sizeof pbuf);
- REPLACE(ls->hname, hbuf);
- REPLACE(ls->pname, pbuf);
/*
* Set nonblocking mode to avoid a race where a client
* closes before we call accept(2) and nobody else are in
continue;
AZ(close(ls->sock));
ls->sock = -1;
- REPLACE(ls->hname, NULL);
- REPLACE(ls->pname, NULL);
}
}
exit(1);
}
if (pid == 0) {
+ /* XXX: We should close things like syslog & telnet sockets */
if (geteuid() == 0) {
XXXAZ(setgid(params->gid));
XXXAZ(setuid(params->uid));
fprintf(stderr, "start child pid %jd\n", (intmax_t)pid);
+ close_sockets();
+
AZ(close(child_fds[1]));
child_fds[1] = -1;
if (child_state != CH_RUNNING)
return;
- close_sockets();
child_state = CH_STOPPING;
if (ev_poker != NULL) {
if (child_state == CH_DIED && params->auto_restart)
start_child();
else if (child_state == CH_DIED) {
- close_sockets();
child_state = CH_STOPPED;
} else if (child_state == CH_STOPPING)
child_state = CH_STOPPED;
VTAILQ_FOREACH_SAFE(ls, lsh, list, ls2) {
VTAILQ_REMOVE(lsh, ls, list);
+ free(ls->name);
free(ls->addr);
free(ls);
}
AN(ls);
ls->sock = -1;
ls->addr = ta[j];
+ ls->name = strdup(av[i]);
+ AN(ls->name);
VTAILQ_INSERT_TAIL(&lsh, ls, list);
}
free(ta);