]> git.mikk.net Git - smtpsink/commitdiff
Fleshed out options processing in smtpsink.c
authorchris mikkelson <chris@mikk.net>
Wed, 25 Mar 2009 13:27:27 +0000 (08:27 -0500)
committerchris mikkelson <chris@mikk.net>
Wed, 25 Mar 2009 13:27:27 +0000 (08:27 -0500)
Signal handling fixed -- event_base is passed to signal
handling thread, subsequent call to event_init() sets
default base for main thread's event calls.

smtpsink.c

index c8bf590f1b7fb29f6aa78f58cd0418ae66dd8f77..83115203d5a5cd205d08a3a755c84335c14b74d5 100644 (file)
@@ -1,10 +1,15 @@
 #include <stdio.h>
 #include <stdlib.h>
 #include <unistd.h>
+#include <fcntl.h>
 #include <string.h>
 #include <signal.h>
 #include <syslog.h>
+#include <pthread.h>
 #include <err.h>
+#include <sys/types.h>
+#include <pwd.h>
+#include <grp.h>
 
 #include <sys/queue.h>
 #include <netinet/in.h>
 #include "conn_queue.h"
 #include "smtpsink-int.h"
 
+static void
+usage(char *name)
+{
+       errx(1, "Usage:\n\t"
+               "%s [-f] [-c concurrency] [-u user] [-g group] [-p pidfile]\n\t"
+               "       [-l host:port] [-P plugin_spec]",
+               name);
+}
+
 static void
 sigev_exit(int fd, short event, void *arg)
 {
@@ -22,7 +36,7 @@ sigev_exit(int fd, short event, void *arg)
 static void *
 sigloop(void *data)
 {
-       struct event_base *base = event_init();
+       struct event_base *base = (struct event_base *)data;
        struct event sigterm, sigint;
 
        signal_set(&sigint, SIGINT, sigev_exit, 0);
@@ -40,18 +54,64 @@ main(int argc, char **argv)
 {
        /* defaults */
        int concurrency = 10000;
-       char *l_default = "0.0.0.0:2525";
+       char *l_default = "0.0.0.0:25";
+       int flaglisten = 0;
        
        int daemonize = 0;
        int pidfd = -1;
        uid_t uid = 0;
        gid_t gid = 0;
+       char c;
 
        struct group *gr;
        struct passwd *pw;
        pthread_t sl;
 
        int tstart = 1;
+       while ((c=getopt(argc, argv, "fp:c:l:u:g:j:h:")) != -1) {
+               switch(c) {
+               case 'f': daemonize = 0; break;
+               case 'p': pidfd = open(optarg, O_CREAT|O_TRUNC|O_WRONLY, 0600);
+                       if (pidfd < 0)
+                               err(1, "cannot open pidfile");
+                       break;
+               case 'c': concurrency = atoi(optarg);
+                       if (concurrency < 0)
+                               usage(argv[0]);
+                       break;
+               case 'l': 
+                       new_listener(optarg);
+                       flaglisten = 1;
+                       break;
+               case 'u':
+                       if ((pw = getpwnam(optarg))) {
+                               uid = pw->pw_uid;
+                               if (!gid) {
+                                       gid = pw->pw_gid;
+                               }
+                       }
+                       else
+                               errx(1, "unknown user '%s'\n", optarg);
+                       break;
+               case 'g':
+                       if ((gr = getgrnam(optarg)))
+                               uid = gr->gr_gid;
+                       else
+                               errx(1, "unknown group '%s'\n", optarg);
+                       break;
+               case 'j':
+                       tstart = atoi(optarg);  
+                       if (tstart < 0) 
+                               usage(argv[0]);
+                       break;
+               case 'h': banner_hostname = optarg; break;
+               case 'M':
+                       /* WRITEME: module init */
+               case '?':
+               default:
+                       usage(argv[0]);
+               }
+       }
 
        /* parse cmdline args */
 
@@ -63,26 +123,21 @@ main(int argc, char **argv)
                write (pidfd, pid, strlen(pid));
        }
 
-       new_listener(l_default);
+       if (!flaglisten) new_listener(l_default);
 
-       if (gid) {
-               if (setgid(gid) < 0) {
+       if (gid)
+               if (setgid(gid) < 0)
                        err(1, "setgid() failed");
-               }
-       }
-       if (uid) {
-               if (setuid(uid) < 0) {
+       if (uid)
+               if (setuid(uid) < 0)
                        err(1, "setuid() failed");
-               }
-       }
 
        openlog("smtpsink",LOG_PID,LOG_MAIL);
        signal(SIGPIPE,SIG_IGN);
 
+       pthread_create(&sl, 0, sigloop, event_init()); 
        event_init();
 
-       pthread_create(&sl, 0, sigloop, 0);
-
        conn_pool_init(concurrency);
        io_init();
        smtp_init(tstart);