X-Git-Url: http://dolda2000.com/gitweb/?a=blobdiff_plain;f=src%2Fhtparser.c;h=1dbb8eeef429e4f0148ebad1270b15e24e8ec1b7;hb=e6fbc5e5b16049336cb7357d387b0f08e91fad59;hp=8eb3873bf4f126cd6e092dd35b40e9f7a9bc73b5;hpb=cac13158ac4fdd8b7682f16f879796e9c4e339ff;p=ashd.git diff --git a/src/htparser.c b/src/htparser.c index 8eb3873..1dbb8ee 100644 --- a/src/htparser.c +++ b/src/htparser.c @@ -405,8 +405,9 @@ static void plexwatch(struct muth *muth, va_list args) { vavar(int, fd); char *buf; - int ret; + int i, s, ret; + s = 0; while(1) { if(block(fd, EV_READ, 0) == 0) break; @@ -416,14 +417,24 @@ 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); + s = 1; + free(buf); + break; } /* Maybe I'd like to implement some protocol in this direction * some day... */ free(buf); } - close(plex); - plex = -1; + shutdown(plex, SHUT_RDWR); + for(i = 0; i < listeners.d; i++) { + if(listeners.b[i] == muth) + bufdel(listeners, i); + } + if(s) { + 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 +613,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;