htparser: Improved shutdown behavior further.
authorFredrik Tolf <fredrik@dolda2000.com>
Fri, 28 Dec 2012 06:19:28 +0000 (07:19 +0100)
committerFredrik Tolf <fredrik@dolda2000.com>
Fri, 28 Dec 2012 06:19:28 +0000 (07:19 +0100)
src/htparser.c
src/plaintcp.c
src/ssl-gnutls.c

index 8eb3873..8d0b515 100644 (file)
@@ -405,7 +405,7 @@ static void plexwatch(struct muth *muth, va_list args)
 {
     vavar(int, fd);
     char *buf;
 {
     vavar(int, fd);
     char *buf;
-    int ret;
+    int i, ret;
     
     while(1) {
        if(block(fd, EV_READ, 0) == 0)
     
     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) {
            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... */
        }
        /* 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;
     }
     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)
 }
 
 static void initroot(void *uu)
@@ -602,9 +610,8 @@ int main(int argc, char **argv)
            break;
        case 1:
            if(listeners.d > 0) {
            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;
                flog(LOG_INFO, "no longer listening");
            } else {
                d = 1;
index fb4c6ce..7d36a1d 100644 (file)
@@ -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);
 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;
     
     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);
 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)
 }
 
 void handleplain(int argc, char **argp, char **argv)
index baa1334..0d4dd22 100644 (file)
@@ -359,7 +359,7 @@ out:
 static void listenloop(struct muth *muth, va_list args)
 {
     vavar(struct sslport *, pd);
 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;
     
     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);
 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)
 }
 
 static gnutls_dh_params_t dhparams(void)