static int plex;
static char *pidfile = NULL;
static int daemonize, usesyslog;
+struct mtbuf listeners;
static void trimx(struct hthead *req)
{
out = NULL;
req = resp = NULL;
- while(1) {
+ while(plex >= 0) {
if((req = parsereq(in)) == NULL)
break;
if(!canonreq(req))
if((conn->initreq != NULL) && conn->initreq(conn, req))
break;
- if(block(plex, EV_WRITE, 60) <= 0)
+ if((plex < 0) || block(plex, EV_WRITE, 60) <= 0)
break;
if(socketpair(PF_UNIX, SOCK_STREAM, 0, pfds))
break;
int ret;
while(1) {
- block(fd, EV_READ, 0);
+ if(block(fd, EV_READ, 0) == 0)
+ break;
buf = smalloc(65536);
ret = recv(fd, buf, 65536, 0);
if(ret < 0) {
* some day... */
free(buf);
}
+ close(plex);
+ plex = -1;
}
static void initroot(void *uu)
buffree(vals);
}
+static void sighandler(int sig)
+{
+ exitioloop(1);
+}
+
int main(int argc, char **argv)
{
- int c;
+ int c, d;
int i, s1;
char *root;
FILE *pidout;
flog(LOG_ERR, "could not spawn root multiplexer: %s", strerror(errno));
return(1);
}
- mustart(plexwatch, plex);
+ bufadd(listeners, mustart(plexwatch, plex));
pidout = NULL;
if(pidfile != NULL) {
if((pidout = fopen(pidfile, "w")) == NULL) {
}
}
signal(SIGPIPE, SIG_IGN);
+ signal(SIGCHLD, SIG_IGN);
+ signal(SIGINT, sighandler);
+ signal(SIGTERM, sighandler);
if(daemonize) {
daemon(0, 0);
}
fprintf(pidout, "%i\n", getpid());
fclose(pidout);
}
- ioloop();
+ d = 0;
+ while(!d) {
+ switch(ioloop()) {
+ case 0:
+ d = 1;
+ break;
+ case 1:
+ if(listeners.d > 0) {
+ for(i = 0; i < listeners.d; i++)
+ resume(listeners.b[i], 0);
+ listeners.d = 0;
+ flog(LOG_INFO, "no longer listening");
+ } else {
+ d = 1;
+ }
+ break;
+ }
+ }
return(0);
}
void *pdata;
};
+struct mtbuf {
+ struct muth **b;
+ size_t s, d;
+};
+
void serve(FILE *in, struct conn *conn);
int listensock4(int port);
void handlegnussl(int argc, char **argp, char **argv);
#endif
+extern struct mtbuf listeners;
+
#endif
while(1) {
namelen = sizeof(name);
- block(tcp->fd, EV_READ, 0);
+ if(block(tcp->fd, EV_READ, 0) == 0)
+ goto out;
ns = accept(tcp->fd, (struct sockaddr *)&name, &namelen);
if(ns < 0) {
flog(LOG_ERR, "accept: %s", strerror(errno));
omalloc(tcp);
tcp->fd = fd;
tcp->sport = port;
- mustart(listenloop, tcp);
+ bufadd(listeners, mustart(listenloop, tcp));
if((fd = listensock4(port)) < 0) {
if(errno != EADDRINUSE) {
flog(LOG_ERR, "could not listen on IPv4 (port %i): %s", port, strerror(errno));
omalloc(tcp);
tcp->fd = fd;
tcp->sport = port;
- mustart(listenloop, tcp);
+ bufadd(listeners, mustart(listenloop, tcp));
}
}
while(1) {
namelen = sizeof(name);
- block(pd->fd, EV_READ, 0);
+ if(block(pd->fd, EV_READ, 0) == 0)
+ goto out;
ns = accept(pd->fd, (struct sockaddr *)&name, &namelen);
if(ns < 0) {
flog(LOG_ERR, "accept: %s", strerror(errno));
pd->sport = port;
pd->creds = creds;
pd->ncreds = ncreds.b;
- mustart(listenloop, pd);
+ bufadd(listeners, mustart(listenloop, pd));
if((fd = listensock4(port)) < 0) {
if(errno != EADDRINUSE) {
flog(LOG_ERR, "could not listen on IPv4 port (port %i): %s", port, strerror(errno));
pd->fd = fd;
pd->sport = port;
pd->creds = creds;
- mustart(listenloop, pd);
+ bufadd(listeners, mustart(listenloop, pd));
}
}