From 9a0bcc4c89effb161cdec639e33ba226307c973d Mon Sep 17 00:00:00 2001 From: chris mikkelson Date: Wed, 25 Mar 2009 08:27:27 -0500 Subject: [PATCH] Fleshed out options processing in smtpsink.c 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 | 81 +++++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 68 insertions(+), 13 deletions(-) diff --git a/smtpsink.c b/smtpsink.c index c8bf590..8311520 100644 --- a/smtpsink.c +++ b/smtpsink.c @@ -1,10 +1,15 @@ #include #include #include +#include #include #include #include +#include #include +#include +#include +#include #include #include @@ -13,6 +18,15 @@ #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); -- 2.50.1