Ensure libdb handles are properly closed when terminating.
[statserve.git] / statserve.c
index ab3b346..9bee73b 100644 (file)
@@ -3,6 +3,7 @@
 #include <unistd.h>
 #include <errno.h>
 #include <string.h>
+#include <sys/socket.h>
 #include <ashd/req.h>
 #include <ashd/resp.h>
 #include <ashd/log.h>
@@ -84,6 +85,21 @@ static void listenloop(struct muth *muth, va_list args)
     }
 }
 
+static void sigterm(int sig)
+{
+    shutdown(0, SHUT_RDWR);
+}
+
+static void closeall(void)
+{
+    struct source *src;
+    
+    for(src = sources; src != NULL; src = src->next) {
+       if(src->close)
+           src->close(src);
+    }
+}
+
 int main(int argc, char **argv)
 {
     int c;
@@ -104,7 +120,10 @@ int main(int argc, char **argv)
     }
     last = NULL;
     while(optind < argc) {
-       src = parsesource(argv[optind++]);
+       if((src = parsesource(argv[optind++])) == NULL) {
+           closeall();
+           return(1);
+       }
        if(!sources)
            sources = src;
        if(last)
@@ -113,9 +132,13 @@ int main(int argc, char **argv)
     }
     if(!sources) {
        usage(stderr);
+       closeall();
        return(1);
     }
     mustart(listenloop, 0);
+    signal(SIGINT, sigterm);
+    signal(SIGTERM, sigterm);
     ioloop();
+    closeall();
     return(0);
 }