Patch by J Sisson: Conditionally compile with scheduler setting support if target...
[umurmur.git] / src / main.c
index 6d48f6e4656fd01544a6cb725c612e582237ca23..8c5febd6fb742b291c3d7e1e32ea9ac816ae1dc4 100644 (file)
 #include <unistd.h>
 #include <sys/types.h>
 #include <sys/stat.h>
+#include <sys/utsname.h>
 #include <fcntl.h>
 #include <signal.h>
-#include <sched.h>
 #include <errno.h>
-
+#include <string.h>
+#include <stdlib.h>
+#ifdef _POSIX_PRIORITY_SCHEDULING
+#include <sched.h>
+#endif
 #include "server.h"
 #include "ssl.h"
 #include "channel.h"
 #include "conf.h"
 #include "version.h"
 
+char system_string[64], version_string[64];
+int bindport;
+char *bindaddr;
+
 void lockfile(const char *pidfile)
 {
        int lfp;
@@ -104,6 +112,7 @@ void daemonize()
                
 }
 
+#ifdef _POSIX_PRIORITY_SCHEDULING
 void setscheduler()
 {
        int rc;
@@ -115,6 +124,7 @@ void setscheduler()
        if (rc < 0)
                Log_warn("Failed to set scheduler: %s", strerror(errno));
 }
+#endif
 
 void printhelp()
 {
@@ -123,7 +133,11 @@ void printhelp()
        printf("       -d             - Do not deamonize\n");
        printf("       -p <pidfile>   - Write PID to this file\n");
        printf("       -c <conf file> - Specify configuration file\n");
+#ifdef _POSIX_PRIORITY_SCHEDULING
        printf("       -r             - Run with realtime priority\n");
+#endif
+       printf("       -a <address>   - Bind to IP address\n");
+       printf("       -b <port>      - Bind to port\n");
        printf("       -h             - Print this help\n");
        exit(0);
 }
@@ -131,12 +145,19 @@ void printhelp()
 int main(int argc, char **argv)
 {
        bool_t nodaemon = false;
+#ifdef _POSIX_PRIORITY_SCHEDULING
        bool_t realtime = false;
+#endif
        char *conffile = NULL, *pidfile = NULL;
        int c;
+       struct utsname utsbuf;
        
        /* Arguments */
-       while ((c = getopt(argc, argv, "drp:c:h")) != EOF) {
+#ifdef _POSIX_PRIORITY_SCHEDULING
+       while ((c = getopt(argc, argv, "drp:c:a:b:h")) != EOF) {
+#else
+       while ((c = getopt(argc, argv, "dp:c:a:b:h")) != EOF) {
+#endif
                switch(c) {
                case 'c':
                        conffile = optarg;
@@ -144,15 +165,23 @@ int main(int argc, char **argv)
                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;
+#ifdef _POSIX_PRIORITY_SCHEDULING
                case 'r':
                        realtime = true;
                        break;
+#endif
                default:
                        fprintf(stderr, "Unrecognized option\n");
                        printhelp();
@@ -178,20 +207,33 @@ int main(int argc, char **argv)
        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 */
-       SSL_init();
+       SSLi_init();
        Chan_init();
        Client_init();
 
+#ifdef _POSIX_PRIORITY_SCHEDULING
        if (realtime)
                setscheduler();
+#endif
        
        Server_run();
        
-       SSL_deinit();
+       SSLi_deinit();
        Chan_free();
        Log_free();
        Conf_deinit();