fixed breakage caused by me
[umurmur.git] / src / main.c
index 78060955aff92f8e8e66a4ffdc5ced518a4347b1..bfff28ab0b4696d2d36138aea05796b11c7d736f 100644 (file)
@@ -1,5 +1,5 @@
-/* Copyright (C) 2009-2011, Martin Johansson <martin@fatbob.nu>
-   Copyright (C) 2005-2011, Thorvald Natvig <thorvald@natvig.com>
+/* Copyright (C) 2009-2014, Martin Johansson <martin@fatbob.nu>
+   Copyright (C) 2005-2014, Thorvald Natvig <thorvald@natvig.com>
 
    All rights reserved.
 
@@ -29,7 +29,6 @@
    SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
 
-
 #include <stdio.h>
 #include <unistd.h>
 #include <sys/types.h>
 #include <string.h>
 #include <stdlib.h>
 #ifdef _POSIX_PRIORITY_SCHEDULING
+#if (_POSIX_PRIORITY_SCHEDULING > 0)
+#define POSIX_PRIORITY_SCHEDULING
 #include <sched.h>
 #endif
+#endif
 #include "server.h"
 #include "ssl.h"
 #include "channel.h"
@@ -52,6 +54,7 @@
 #include "client.h"
 #include "conf.h"
 #include "version.h"
+#include "config.h"
 
 char system_string[64], version_string[64];
 int bindport;
@@ -66,7 +69,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);
 
@@ -87,7 +90,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
@@ -150,12 +153,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);
 }
 
@@ -176,7 +179,7 @@ void signal_handler(int sig)
 void daemonize()
 {
        int i;
-       
+
        if (getppid() == 1)
                return; /* already a daemon */
        i = fork();
@@ -186,22 +189,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;
@@ -217,14 +220,16 @@ 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] [-p <pidfile>] [-c <conf file>] [-h]\n");
-       printf("       -d             - Do not daemonize\n");
-       printf("       -p <pidfile>   - Write PID to this file\n");
-       printf("       -c <conf file> - Specify configuration file\n");
-#ifdef _POSIX_PRIORITY_SCHEDULING
+       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 <pidfile>] [-t] [-c <conf file>] [-a <addr>] [-b <port>]\n");
+       printf("       -d             - Do not daemonize - run in foreground.\n");
+#ifdef POSIX_PRIORITY_SCHEDULING
        printf("       -r             - Run with realtime priority\n");
 #endif
+       printf("       -p <pidfile>   - Write PID to this file\n");
+       printf("       -c <conf file> - 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 <address>   - Bind to IP address\n");
        printf("       -b <port>      - Bind to port\n");
        printf("       -h             - Print this help\n");
@@ -234,18 +239,19 @@ void printhelp()
 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:b:ht")) != EOF) {
 #else
-       while ((c = getopt(argc, argv, "dp:c:a:b:h")) != EOF) {
+       while ((c = getopt(argc, argv, "dp:c:a:b:ht")) != EOF) {
 #endif
                switch(c) {
                case 'c':
@@ -266,7 +272,10 @@ int main(int argc, char **argv)
                case 'h':
                        printhelp();
                        break;
-#ifdef _POSIX_PRIORITY_SCHEDULING
+               case 't':
+                       testconfig = true;
+                       break;
+#ifdef POSIX_PRIORITY_SCHEDULING
                case 'r':
                        realtime = true;
                        break;
@@ -277,12 +286,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) {
@@ -296,10 +312,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);
@@ -307,7 +323,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);
@@ -317,26 +333,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;
 }