append given basedir argument with '/' if not given
[rxpd] / src / main.c
index 961c6eb..e3a2173 100644 (file)
@@ -27,9 +27,6 @@
 #include <sys/socket.h>
 #include <netinet/in.h>
 
-#include <event.h>
-
-
 void
 version (void)
 {
@@ -47,44 +44,41 @@ version (void)
 void
 usage (void)
 {
-  /*
-    rxpd [OPTIONS] RULES..
-    -v          verbosity
-    -V          version
-    -d          daemonize
-    -D          debug
-    -b dir      basedir for rules
-    -q          quiet
-    -t port     tcp
-    -u name     unix
-    -p policy   access policies
-    -i          case insensitive
-    -4          ipv4
-    -6          ipv6
-    -r          resolve names
-    -l log      log hits to logfile
-    -h          usage
-
-    -U user     switch to user
-  */
-
+  printf (
+    "rxpd [OPTIONS] RULES..\n"
+    " -v          increase verbosity level\n"
+    " -V          show version\n"
+    " -d          daemonize into background\n"
+    " -D          debug mode\n"
+    " -b dir      basedir for rules\n"
+    " -q          be quiet\n"
+    " -t port     listen on tcp port\n"
+    //" -u name     unix\n"
+    " -p policy   define a list for access policies\n"
+    //" -i          case insensitive\n"
+    //" -4          ipv4\n"
+    //" -6          ipv6\n"
+    //" -r          resolve names\n"
+    //" -l log      log hits to logfile\n"
+    " -h          this usage information\n"
+    //" -U user     switch to user\n"
+    );
 }
 
 
 int
 main (int argc, char** argv)
 {
+  if (pth_init() == FALSE)
+    rxpd_fail (NULL, "pth initialization failed\n");
+
   struct rxpd_base* rxpd;
 
   openlog (PACKAGE_NAME, LOG_PID, LOG_DAEMON);
 
-  rxpd = rxpd_init (event_init ());
+  rxpd = rxpd_init ();
 
-  rxpd_log (rxpd, LOG_NOTICE, PACKAGE_STRING" starting up\n");
-
-  // parse commandline args
   opterr = 0;
-
   int opt;
 
   while ((opt = getopt (argc, argv, "vVdDb:qt:u:p:i46rl:h")) != -1)
@@ -107,9 +101,9 @@ main (int argc, char** argv)
         break;
       case 'b':
         if (!rxpd->basedir)
-          rxpd->basedir = rxpd_strdup (optarg);
+          rxpd_set_basedir (rxpd, optarg);
         else
-          rxpd_die ("basedir already set\n");
+          rxpd_fail (rxpd, "basedir already set\n");
         break;
       case 'q':
         rxpd->verbosity = LOG_ALERT;
@@ -123,10 +117,7 @@ main (int argc, char** argv)
               // TODO error handling
             }
           else
-            {
-              rxpd_log (rxpd, LOG_ALERT, "Illegal port number\n");
-              exit (EXIT_FAILURE);
-            }
+            rxpd_fail (rxpd, "Illegal port number\n");
         }
         // TODO rxpd_socket_new_tcp6 (rxpd, NULL, 2374)
         break;
@@ -139,7 +130,7 @@ main (int argc, char** argv)
         if (!rxpd->policy)
           rxpd->policy = rxpd_file_new (rxpd, optarg);
         else
-          rxpd_die ("policy already set\n");
+          rxpd_fail (rxpd, "policy already set\n");
         break;
       case 'i':
         rxpd->regflags |= REG_ICASE; 
@@ -159,56 +150,50 @@ main (int argc, char** argv)
         exit (0);
         break;
       default:
-        rxpd_log (rxpd, LOG_ALERT, "Unknown option\n");
-        exit (EXIT_FAILURE);
+        rxpd_fail (rxpd, "Unknown option '-%c'\n", opt);
       }
 
-  for (int i = optind; i < argc; ++i)
-    {
-      if (!rxpd_file_load (rxpd_file_new (rxpd, argv[i])))
-        {
-          //rxpd_log (rxpd, LOG_ALERT, "Failed loading file '%s'\n");
-          exit (EXIT_FAILURE);
-        }
-    }
-
-  if (rxpd->daemonize && daemon(0, 0))
-    rxpd_die ("Couldn't daemonize\n");
-
   if (!rxpd->basedir)
-    {
-      rxpd_log (rxpd, LOG_ALERT, "Basedir not set (use -b BASEDIR)\n");
-      exit (EXIT_FAILURE);
-    }
+    rxpd_fail (rxpd, "Basedir not set (use -b BASEDIR)\n");
 
   if (llist_is_empty (&rxpd->sockets))
-    {
-      rxpd_log (rxpd, LOG_ALERT, "No listening sockets (use -t TCP or -u UNIX)\n");
-      exit (EXIT_FAILURE);
-    }
+    rxpd_fail (rxpd, "No listening sockets given (use -t TCP or -u UNIX)\n");
 
   if (rxpd->policy)
     {
       if (rxpd_file_load (rxpd->policy))
         rxpd_log (rxpd, LOG_INFO, "Loaded policy '%s'\n", rxpd->policy->filename);
       else
-        {
-          rxpd_log (rxpd, LOG_ALERT, "Failed loading policy file\n");
-          exit (EXIT_FAILURE);
-        }
+        rxpd_fail (rxpd, "Failed loading policy '%s'\n", rxpd->policy->filename);
+    }
+
+  for (int i = optind; i < argc; ++i)
+    {
+      if (!rxpd_file_load (rxpd_file_new (rxpd, argv[i])))
+        rxpd_fail (rxpd, "Failed loading file '%s'\n", argv[i]);
     }
-      
+
+  if (rxpd->daemonize && daemon(1, 0))
+    rxpd_fail (rxpd, "Couldn't daemonize\n");
+
+  rxpd_log (rxpd, LOG_NOTICE, PACKAGE_STRING" starting up\n");
+
   LLIST_FOREACH (&rxpd->sockets, n)
     {
       struct rxpd_socket* socket = (struct rxpd_socket*)n;
-      rxpd_socket_schedule (socket);
+      rxpd_socket_spawn (socket);
     }
 
+  rxpd_log (rxpd, LOG_NOTICE, PACKAGE_STRING" running\n");
 
-  // eventloop
-  event_dispatch ();
+  LLIST_WHILE_HEAD (&rxpd->sockets, n)
+    {
+      struct rxpd_socket* socket = (struct rxpd_socket*)n;
+      rxpd_socket_delete (rxpd_socket_join (socket));
+    }
 
   rxpd_log (rxpd, LOG_NOTICE, PACKAGE_STRING" exited\n");
   rxpd_destroy ();
+
   return EXIT_SUCCESS;
 }