simplifications
[apps/pfixtools.git] / main-postlicyd.c
index b81a813..01eb9e6 100644 (file)
  * Copyright © 2006-2007 Pierre Habouzit
  */
 
-#include <signal.h>
-#include <time.h>
 #include <getopt.h>
 
 #include "common.h"
+#include "epoll.h"
 
-volatile int nbthreads = 0;
+/* administrivia {{{ */
 
 static int main_initialize(void)
 {
@@ -52,21 +51,32 @@ static int main_initialize(void)
     return 0;
 }
 
+static void main_shutdown(void)
+{
+    closelog();
+}
+
+module_init(main_initialize);
+module_exit(main_shutdown);
+
+/* }}} */
+
 void *job_run(void *_fd)
 {
     int fd = (intptr_t)_fd;
 
     close(fd);
+    pthread_detach(pthread_self());
     return NULL;
 }
 
-static void main_loop(void)
+static int main_loop(void)
 {
+    int exitcode = EXIT_SUCCESS;
     int sock = -1;
 
     while (!sigint) {
         int fd = accept(sock, NULL, 0);
-        pthread_attr_t attr;
         pthread_t dummy;
 
         if (fd < 0) {
@@ -75,32 +85,57 @@ static void main_loop(void)
             continue;
         }
 
-        pthread_attr_init(&attr);
-        pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
-        pthread_create(&dummy, &attr, job_run, (void *)(intptr_t)fd);
-        pthread_attr_destroy(&attr);
+        pthread_create(&dummy, NULL, job_run, (void *)(intptr_t)fd);
     }
 
     close(sock);
+    return exitcode;
 }
 
-static void main_shutdown(void)
+int main(int argc, char *argv[])
 {
-    closelog();
-}
+    const char *pidfile = NULL;
+    FILE *f = NULL;
+    int res;
+
+    for (int c = 0; (c = getopt(argc, argv, "h" "p:")) >= 0; ) {
+        switch (c) {
+          case 'p':
+            pidfile = optarg;
+            break;
+          default:
+            //usage();
+            return EXIT_FAILURE;
+        }
+    }
 
-module_init(main_initialize);
-module_exit(main_shutdown);
+    if (pidfile) {
+        f = fopen(pidfile, "w");
+        if (!f) {
+            syslog(LOG_CRIT, "unable to write pidfile %s", pidfile);
+        }
+        fprintf(f, "%d\n", getpid());
+        fflush(f);
+    }
 
-int main(void)
-{
-    if (atexit(common_shutdown)) {
-        fputs("Cannot hook my atexit function, quitting !\n", stderr);
+    if (daemon_detach() < 0) {
+        syslog(LOG_CRIT, "unable to fork");
         return EXIT_FAILURE;
     }
 
-    common_initialize();
-    main_loop();
-    syslog(LOG_INFO, cleanexit ? "Stopping..." : "Unclean exit...");
-    return EXIT_SUCCESS;
+    if (f) {
+        rewind(f);
+        ftruncate(fileno(f), 0);
+        fprintf(f, "%d\n", getpid());
+        fflush(f);
+    }
+    res = main_loop();
+    if (f) {
+        rewind(f);
+        ftruncate(fileno(f), 0);
+        fclose(f);
+        f = NULL;
+    }
+    syslog(LOG_INFO, "Stopping...");
+    return res;
 }