X-Git-Url: http://git.code-monkey.de/?a=blobdiff_plain;f=src%2Fmain.c;h=ebff0e523163b91fe99ae6594cbcf8bb2014f0d8;hb=a9e44ce53c945b997b686329a4df5d79e416a837;hp=1e22885389947ed03be9ea01508c7d36d236f0b4;hpb=b3dfe6cb6fe0c5311f2d453a5a736ae443bbd5cd;p=umurmur.git diff --git a/src/main.c b/src/main.c index 1e22885..ebff0e5 100644 --- a/src/main.c +++ b/src/main.c @@ -1,5 +1,5 @@ -/* Copyright (C) 2009-2011, Martin Johansson - Copyright (C) 2005-2011, Thorvald Natvig +/* Copyright (C) 2009-2014, Martin Johansson + Copyright (C) 2005-2014, Thorvald Natvig All rights reserved. @@ -42,8 +42,11 @@ #include #include #ifdef _POSIX_PRIORITY_SCHEDULING +#if (_POSIX_PRIORITY_SCHEDULING > 0) +#define POSIX_PRIORITY_SCHEDULING #include #endif +#endif #include "server.h" #include "ssl.h" #include "channel.h" @@ -51,10 +54,13 @@ #include "client.h" #include "conf.h" #include "version.h" +#include "config.h" char system_string[64], version_string[64]; int bindport; +int bindport6; char *bindaddr; +char *bindaddr6; void lockfile(const char *pidfile) { @@ -65,7 +71,7 @@ void lockfile(const char *pidfile) * unmodified if we cannot lock it. */ lfp = open(pidfile, O_WRONLY|O_CREAT, 0640); - + if (lfp < 0) Log_fatal("Cannot open PID-file %s for writing", pidfile); @@ -86,7 +92,7 @@ void lockfile(const char *pidfile) } snprintf(str,16,"%d\n", getpid()); - write(lfp, str, strlen(str)); /* record pid to lockfile */ + (void)write(lfp, str, strlen(str)); /* record pid to lockfile */ Log_info("PID-file: %s", pidfile); /* If uMurmur ever starts to fork()+exec(), we don't want it to @@ -149,12 +155,12 @@ static void switch_user(void) if (setuid(pwd->pw_uid)) Log_fatal("setuid() failed: %s", strerror(errno)); - + if (!grp) grp = getgrgid(gid); if (!grp) Log_fatal("getgrgid() failed: %s", strerror(errno)); - + Log_info("Switch to user '%s' group '%s'", pwd->pw_name, grp->gr_name); } @@ -175,7 +181,7 @@ void signal_handler(int sig) void daemonize() { int i; - + if (getppid() == 1) return; /* already a daemon */ i = fork(); @@ -185,22 +191,22 @@ void daemonize() } if ( i > 0) exit(0); /* parent exits */ - + /* child (daemon) continues */ setsid(); /* obtain a new process group */ for (i = getdtablesize(); i >= 0; --i) close(i); /* close all descriptors */ - + i = open("/dev/null",O_RDWR); - dup(i); - dup(i); - + (void)dup(i); + (void)dup(i); + umask(027); /* set newly created file permissions */ - chdir("/"); - + (void)chdir("/"); + } -#ifdef _POSIX_PRIORITY_SCHEDULING +#ifdef POSIX_PRIORITY_SCHEDULING void setscheduler() { int rc; @@ -216,35 +222,38 @@ void setscheduler() void printhelp() { - printf("uMurmur version %s. Mumble protocol %d.%d.%d\n", UMURMUR_VERSION, PROTVER_MAJOR, PROTVER_MINOR, PROTVER_PATCH); - printf("Usage: umurmurd [-d] [-r] [-h] [-p ] [-c ] [-a ] [-b ]\n"); + printf("uMurmur version %s ('%s'). Mumble protocol %d.%d.%d\n", UMURMUR_VERSION, + UMURMUR_CODENAME, PROTVER_MAJOR, PROTVER_MINOR, PROTVER_PATCH); + printf("Usage: umurmurd [-d] [-r] [-h] [-p ] [-t] [-c ] [-a ] [-b ]\n"); printf(" -d - Do not daemonize - run in foreground.\n"); -#ifdef _POSIX_PRIORITY_SCHEDULING +#ifdef POSIX_PRIORITY_SCHEDULING printf(" -r - Run with realtime priority\n"); #endif - printf(" -h - Print this help\n"); printf(" -p - Write PID to this file\n"); printf(" -c - Specify configuration file (default %s)\n", DEFAULT_CONFIG); + printf(" -t - Test config. Error message to stderr + non-zero exit code on error\n"); printf(" -a
- Bind to IP address\n"); printf(" -b - Bind to port\n"); + printf(" -h - Print this help\n"); exit(0); } int main(int argc, char **argv) { bool_t nodaemon = false; -#ifdef _POSIX_PRIORITY_SCHEDULING +#ifdef POSIX_PRIORITY_SCHEDULING bool_t realtime = false; #endif + bool_t testconfig = false; char *conffile = NULL, *pidfile = NULL; int c; struct utsname utsbuf; - + /* Arguments */ -#ifdef _POSIX_PRIORITY_SCHEDULING - while ((c = getopt(argc, argv, "drp:c:a:b:h")) != EOF) { +#ifdef POSIX_PRIORITY_SCHEDULING + while ((c = getopt(argc, argv, "drp:c:a:A:b:B:ht")) != EOF) { #else - while ((c = getopt(argc, argv, "dp:c:a:b:h")) != EOF) { + while ((c = getopt(argc, argv, "dp:c:a:A:b:B:ht")) != EOF) { #endif switch(c) { case 'c': @@ -256,16 +265,25 @@ int main(int argc, char **argv) case 'a': bindaddr = optarg; break; + case 'A': + bindaddr6 = optarg; + break; case 'b': bindport = atoi(optarg); break; + case 'B': + bindport6 = atoi(optarg); + break; case 'd': nodaemon = true; break; case 'h': printhelp(); break; -#ifdef _POSIX_PRIORITY_SCHEDULING + case 't': + testconfig = true; + break; +#ifdef POSIX_PRIORITY_SCHEDULING case 'r': realtime = true; break; @@ -276,12 +294,19 @@ int main(int argc, char **argv) break; } } - + + if (testconfig) { + if (!Conf_ok(conffile)) + exit(1); + else + exit(0); + } + /* Initialize the config subsystem early; * switch_user() will need to read some config variables as well as logging. */ Conf_init(conffile); - + /* Logging to terminal if not daemonizing, otherwise to syslog or log file. */ if (!nodaemon) { @@ -295,10 +320,10 @@ int main(int argc, char **argv) /* Reopen log file. If user switch results in access denied, we catch * it early. */ - Log_reset(); + Log_reset(); } else Log_init(true); - + signal(SIGCHLD, SIG_IGN); /* ignore child */ signal(SIGTSTP, SIG_IGN); /* ignore tty signals */ signal(SIGTTOU, SIG_IGN); @@ -306,7 +331,7 @@ int main(int argc, char **argv) signal(SIGPIPE, SIG_IGN); signal(SIGHUP, signal_handler); /* catch hangup signal */ signal(SIGTERM, signal_handler); /* catch kill signal */ - + /* Build system string */ if (uname(&utsbuf) == 0) { snprintf(system_string, 64, "%s %s", utsbuf.sysname, utsbuf.machine); @@ -316,26 +341,28 @@ int main(int argc, char **argv) snprintf(system_string, 64, "unknown unknown"); snprintf(version_string, 64, "unknown"); } - + /* Initializing */ SSLi_init(); Chan_init(); Client_init(); + Ban_init(); -#ifdef _POSIX_PRIORITY_SCHEDULING +#ifdef POSIX_PRIORITY_SCHEDULING if (realtime) setscheduler(); #endif - + Server_run(); - + + Ban_deinit(); SSLi_deinit(); Chan_free(); Log_free(); Conf_deinit(); - + if (pidfile != NULL) unlink(pidfile); - + return 0; }