#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)
{
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);
{
/* 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 */
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);