prepare hooking of policy.c module.
[apps/pfixtools.git] / main-postlicyd.c
index 6810bba..92c2026 100644 (file)
  * Copyright © 2006-2007 Pierre Habouzit
  */
 
-#include <signal.h>
-#include <time.h>
 #include <getopt.h>
 
-#include "common.h"
+#include "threads.h"
+#include "policy.h"
+
+#define DAEMON_NAME             "postlicyd"
 
 /* administrivia {{{ */
 
@@ -60,49 +61,71 @@ static void main_shutdown(void)
 module_init(main_initialize);
 module_exit(main_shutdown);
 
-/* }}} */
-
-void *job_run(void *_fd)
+void usage(void)
 {
-    int fd = (intptr_t)_fd;
-
-    close(fd);
-    return NULL;
+    fputs("usage: "DAEMON_NAME" [options] config\n"
+          "\n"
+          "Options:\n"
+          "    -p <pidfile> file to write our pid to\n"
+         , stderr);
 }
 
-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) {
             if (errno != EINTR || errno != EAGAIN)
                 UNIXERR("accept");
             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);
+        thread_launch(policy_run, fd, NULL);
+        threads_join();
     }
 
     close(sock);
+    return exitcode;
 }
 
-int main(void)
+int main(int argc, char *argv[])
 {
-    if (atexit(common_shutdown)) {
-        fputs("Cannot hook my atexit function, quitting !\n", stderr);
+    const char *pidfile = 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;
+        }
+    }
+
+    if (argc - optind != 1) {
+        usage();
+        return EXIT_FAILURE;
+    }
+
+    if (pidfile_open(pidfile) < 0) {
+        syslog(LOG_CRIT, "unable to write pidfile %s", pidfile);
+        return EXIT_FAILURE;
+    }
+
+    if (daemon_detach() < 0) {
+        syslog(LOG_CRIT, "unable to fork");
         return EXIT_FAILURE;
     }
 
-    common_initialize();
-    main_loop();
+    pidfile_refresh();
+    res = main_loop();
     syslog(LOG_INFO, "Stopping...");
-    return EXIT_SUCCESS;
+    return res;
 }