From: Fredrik Tolf Date: Fri, 28 Dec 2012 06:19:28 +0000 (+0100) Subject: htparser: Improved shutdown behavior further. X-Git-Tag: 0.12~17 X-Git-Url: http://www.dolda2000.com/gitweb/?p=ashd.git;a=commitdiff_plain;h=8e9ec020b45b2f43b0f44249037da82470a5446f htparser: Improved shutdown behavior further. --- diff --git a/src/htparser.c b/src/htparser.c index 8eb3873..8d0b515 100644 --- a/src/htparser.c +++ b/src/htparser.c @@ -405,7 +405,7 @@ static void plexwatch(struct muth *muth, va_list args) { vavar(int, fd); char *buf; - int ret; + int i, ret; while(1) { if(block(fd, EV_READ, 0) == 0) @@ -416,7 +416,8 @@ static void plexwatch(struct muth *muth, va_list args) flog(LOG_WARNING, "received error on rootplex read channel: %s", strerror(errno)); exit(1); } else if(ret == 0) { - exit(0); + free(buf); + break; } /* Maybe I'd like to implement some protocol in this direction * some day... */ @@ -424,6 +425,13 @@ static void plexwatch(struct muth *muth, va_list args) } close(plex); plex = -1; + for(i = 0; i < listeners.d; i++) { + if(listeners.b[i] == muth) + bufdel(listeners, i); + } + flog(LOG_INFO, "root handler exited, so shutting down listening..."); + while(listeners.d > 0) + resume(listeners.b[0], 0); } static void initroot(void *uu) @@ -602,9 +610,8 @@ int main(int argc, char **argv) break; case 1: if(listeners.d > 0) { - for(i = 0; i < listeners.d; i++) - resume(listeners.b[i], 0); - listeners.d = 0; + while(listeners.d > 0) + resume(listeners.b[0], 0); flog(LOG_INFO, "no longer listening"); } else { d = 1; diff --git a/src/plaintcp.c b/src/plaintcp.c index fb4c6ce..7d36a1d 100644 --- a/src/plaintcp.c +++ b/src/plaintcp.c @@ -168,7 +168,7 @@ void servetcp(struct muth *muth, va_list args) static void listenloop(struct muth *muth, va_list args) { vavar(struct tcpport *, tcp); - int ns; + int i, ns; struct sockaddr_storage name; socklen_t namelen; @@ -187,6 +187,10 @@ static void listenloop(struct muth *muth, va_list args) out: close(tcp->fd); free(tcp); + for(i = 0; i < listeners.d; i++) { + if(listeners.b[i] == muth) + bufdel(listeners, i); + } } void handleplain(int argc, char **argp, char **argv) diff --git a/src/ssl-gnutls.c b/src/ssl-gnutls.c index baa1334..0d4dd22 100644 --- a/src/ssl-gnutls.c +++ b/src/ssl-gnutls.c @@ -359,7 +359,7 @@ out: static void listenloop(struct muth *muth, va_list args) { vavar(struct sslport *, pd); - int ns; + int i, ns; struct sockaddr_storage name; socklen_t namelen; @@ -378,6 +378,10 @@ static void listenloop(struct muth *muth, va_list args) out: close(pd->fd); free(pd); + for(i = 0; i < listeners.d; i++) { + if(listeners.b[i] == muth) + bufdel(listeners, i); + } } static gnutls_dh_params_t dhparams(void)