X-Git-Url: http://git.code-monkey.de/?a=blobdiff_plain;f=src%2Fmain.c;h=bc913395f8b56e784709aac25ed9839ca1820f73;hb=1aa006c5960c17ccb941fc850b29d49cd5c6d1c3;hp=bfff28ab0b4696d2d36138aea05796b11c7d736f;hpb=a7ffadd41a1457e24ffde19a081c4b8bffe1b3b8;p=umurmur.git diff --git a/src/main.c b/src/main.c index bfff28a..bc91339 100644 --- a/src/main.c +++ b/src/main.c @@ -55,10 +55,14 @@ #include "conf.h" #include "version.h" #include "config.h" +#include "sharedmemory.h" +#include "ban.h" char system_string[64], version_string[64]; int bindport; +int bindport6; char *bindaddr; +char *bindaddr6; void lockfile(const char *pidfile) { @@ -165,14 +169,14 @@ static void switch_user(void) void signal_handler(int sig) { switch(sig) { - case SIGHUP: - Log_info("HUP signal received."); - Log_reset(); - break; - case SIGTERM: - Log_info("TERM signal. Shutting down."); - Server_shutdown(); - break; + case SIGHUP: + Log_info("HUP signal received."); + Log_reset(); + break; + case SIGTERM: + Log_info("TERM signal. Shutting down."); + Server_shutdown(); + break; } } @@ -195,6 +199,10 @@ void daemonize() for (i = getdtablesize(); i >= 0; --i) close(i); /* close all descriptors */ +#ifdef USE_GNUTLS + gnutls_global_init(); +#endif + i = open("/dev/null",O_RDWR); (void)dup(i); (void)dup(i); @@ -221,7 +229,7 @@ void setscheduler() void printhelp() { printf("uMurmur version %s ('%s'). Mumble protocol %d.%d.%d\n", UMURMUR_VERSION, - UMURMUR_CODENAME, PROTVER_MAJOR, PROTVER_MINOR, PROTVER_PATCH); + 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 @@ -231,7 +239,9 @@ void printhelp() 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(" -A
- Bind to IPv6 address\n"); printf(" -b - Bind to port\n"); + printf(" -B - Bind to port (IPv6)\n"); printf(" -h - Print this help\n"); exit(0); } @@ -249,112 +259,137 @@ int main(int argc, char **argv) /* Arguments */ #ifdef POSIX_PRIORITY_SCHEDULING - while ((c = getopt(argc, argv, "drp:c:a:b:ht")) != EOF) { + while ((c = getopt(argc, argv, "drp:c:a:A:b:B:ht")) != EOF) { #else - while ((c = getopt(argc, argv, "dp:c:a:b:ht")) != EOF) { + while ((c = getopt(argc, argv, "dp:c:a:A:b:B:ht")) != EOF) { #endif - switch(c) { - case 'c': - conffile = optarg; - break; - case 'p': - pidfile = optarg; - break; - case 'a': - bindaddr = optarg; - break; - case 'b': - bindport = atoi(optarg); - break; - case 'd': - nodaemon = true; - break; - case 'h': - printhelp(); - break; - case 't': - testconfig = true; - break; + switch(c) { + case 'c': + conffile = optarg; + break; + case 'p': + pidfile = optarg; + break; + 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; + case 't': + testconfig = true; + break; #ifdef POSIX_PRIORITY_SCHEDULING - case 'r': - realtime = true; - break; + case 'r': + realtime = true; + break; #endif - default: - fprintf(stderr, "Unrecognized option\n"); - printhelp(); - break; + default: + fprintf(stderr, "Unrecognized option\n"); + printhelp(); + break; + } } - } - if (testconfig) { - if (!Conf_ok(conffile)) - exit(1); - else - exit(0); - } + 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); + /* 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) { - daemonize(); - Log_init(false); - if (pidfile != NULL) - lockfile(pidfile); + /* Logging to terminal if not daemonizing, otherwise to syslog or log file. + */ + if (!nodaemon) { + daemonize(); + Log_init(false); + if (pidfile != NULL) + lockfile(pidfile); - switch_user(); +#ifdef POSIX_PRIORITY_SCHEDULING + /* Set the scheduling policy, has to be called after daemonizing + * but before we drop privileges */ + if (realtime) + setscheduler(); +#endif - /* Reopen log file. If user switch results in access denied, we catch - * it early. - */ - Log_reset(); - } - else Log_init(true); - - signal(SIGCHLD, SIG_IGN); /* ignore child */ - signal(SIGTSTP, SIG_IGN); /* ignore tty signals */ - signal(SIGTTOU, SIG_IGN); - signal(SIGTTIN, SIG_IGN); - 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); - snprintf(version_string, 64, "%s", utsbuf.release); - } - else { - snprintf(system_string, 64, "unknown unknown"); - snprintf(version_string, 64, "unknown"); - } + switch_user(); - /* Initializing */ - SSLi_init(); - Chan_init(); - Client_init(); - Ban_init(); + /* Reopen log file. If user switch results in access denied, we catch + * it early. + */ + Log_reset(); + } + else Log_init(true); #ifdef POSIX_PRIORITY_SCHEDULING - if (realtime) - setscheduler(); + /* We still want to set scheduling policy if nodaemon is specified, + * but if we are daemonizing setscheduler() will be called above */ + if (nodaemon) { + if (realtime) + setscheduler(); + } +#endif + + signal(SIGCHLD, SIG_IGN); /* ignore child */ + signal(SIGTSTP, SIG_IGN); /* ignore tty signals */ + signal(SIGTTOU, SIG_IGN); + signal(SIGTTIN, SIG_IGN); + 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); + snprintf(version_string, 64, "%s", utsbuf.release); + } + else { + snprintf(system_string, 64, "unknown unknown"); + snprintf(version_string, 64, "unknown"); + } + + /* Initializing */ + SSLi_init(); + Chan_init(); + Client_init(); + Ban_init(); + +#ifdef USE_SHAREDMEMORY_API + Sharedmemory_init( bindport, bindport6 ); #endif - Server_run(); + Server_run(); - Ban_deinit(); - SSLi_deinit(); - Chan_free(); - Log_free(); - Conf_deinit(); +#ifdef USE_SHAREDMEMORY_API + Sharedmemory_deinit(); +#endif - if (pidfile != NULL) - unlink(pidfile); + Ban_deinit(); + SSLi_deinit(); + Chan_free(); + Log_free(); + Conf_deinit(); - return 0; -} + if (pidfile != NULL) + unlink(pidfile); + + return 0; + }