Add foreground option.
authorScott Cantor <cantor.2@osu.edu>
Fri, 22 May 2009 01:19:54 +0000 (01:19 +0000)
committerScott Cantor <cantor.2@osu.edu>
Fri, 22 May 2009 01:19:54 +0000 (01:19 +0000)
shibd/shibd.cpp

index 49cbd79..7331d75 100644 (file)
@@ -158,6 +158,7 @@ int real_main(int preinit)
 \r
 int daemon_wait = 3;\r
 bool shibd_running = false;\r
+bool daemonize = true;\r
 \r
 static void term_handler(int arg)\r
 {\r
@@ -197,11 +198,13 @@ static int setup_signals(void)
         return -1;\r
     }\r
 \r
-    memset(&sa, 0, sizeof (sa));\r
-    sa.sa_handler = run_handler;\r
+    if (daemonize) {\r
+        memset(&sa, 0, sizeof (sa));\r
+        sa.sa_handler = run_handler;\r
 \r
-    if (sigaction(SIGUSR1, &sa, NULL) < 0) {\r
-        return -1;\r
+        if (sigaction(SIGUSR1, &sa, NULL) < 0) {\r
+            return -1;\r
+        }\r
     }\r
 \r
     return 0;\r
@@ -213,8 +216,9 @@ static void usage(char* whoami)
     fprintf(stderr, "  -d\tinstallation prefix to use.\n");\r
     fprintf(stderr, "  -c\tconfig file to use.\n");\r
     fprintf(stderr, "  -x\tXML schema catalogs to use.\n");\r
-    fprintf(stderr, "  -t\tcheck configuration file for problems.\n");\r
+    fprintf(stderr, "  -t\ttest configuration file for problems.\n");\r
     fprintf(stderr, "  -f\tforce removal of listener socket.\n");\r
+    fprintf(stderr, "  -F\tstay in the foreground.\n");\r
     fprintf(stderr, "  -p\tpid file to use.\n");\r
     fprintf(stderr, "  -w\tseconds to wait for successful daemonization.\n");\r
     fprintf(stderr, "  -v\tprint software version.\n");\r
@@ -226,7 +230,7 @@ static int parse_args(int argc, char* argv[])
 {\r
     int opt;\r
 \r
-    while ((opt = getopt(argc, argv, "d:c:x:p:w:ftvh")) > 0) {\r
+    while ((opt = getopt(argc, argv, "d:c:x:p:w:fFtvh")) > 0) {\r
         switch (opt) {\r
             case 'd':\r
                 shar_prefix=optarg;\r
@@ -240,6 +244,9 @@ static int parse_args(int argc, char* argv[])
             case 'f':\r
                 unlink_socket = true;\r
                 break;\r
+            case 'F':\r
+                daemonize = false;\r
+                break;\r
             case 't':\r
                 shar_checkonly=true;\r
                 break;\r
@@ -292,18 +299,20 @@ int main(int argc, char *argv[])
         return -1;\r
     }\r
 \r
-    // We must fork() early, while we're single threaded.\r
-    // StorageService cleanup thread is about to start.\r
-    if (!shar_checkonly) {\r
-        switch (fork()) {\r
-            case 0:\r
-                break;\r
-            case -1:\r
-                perror("forking");\r
-                exit(EXIT_FAILURE);\r
-            default:\r
-                sleep(daemon_wait);\r
-                exit(shibd_running ? EXIT_SUCCESS : EXIT_FAILURE);\r
+    if (daemonize) {\r
+        // We must fork() early, while we're single threaded.\r
+        // StorageService cleanup thread is about to start.\r
+        if (!shar_checkonly) {\r
+            switch (fork()) {\r
+                case 0:\r
+                    break;\r
+                case -1:\r
+                    perror("forking");\r
+                    exit(EXIT_FAILURE);\r
+                default:\r
+                    sleep(daemon_wait);\r
+                    exit(shibd_running ? EXIT_SUCCESS : EXIT_FAILURE);\r
+            }\r
         }\r
     }\r
 \r
@@ -316,13 +325,15 @@ int main(int argc, char *argv[])
     if (shar_checkonly)\r
         fprintf(stderr, "overall configuration is loadable, check console for non-fatal problems\n");\r
     else {\r
-        if (setsid() == -1) {\r
-            perror("setsid");\r
-            exit(EXIT_FAILURE);\r
-        }\r
-        if (chdir("/") == -1) {\r
-            perror("chdir to root");\r
-            exit(EXIT_FAILURE);\r
+        if (daemonize) {\r
+            if (setsid() == -1) {\r
+                perror("setsid");\r
+                exit(EXIT_FAILURE);\r
+            }\r
+            if (chdir("/") == -1) {\r
+                perror("chdir to root");\r
+                exit(EXIT_FAILURE);\r
+            }\r
         }\r
 \r
         // Write the pid file\r
@@ -336,15 +347,17 @@ int main(int argc, char *argv[])
             }\r
         }\r
 \r
-        freopen("/dev/null", "r", stdin);\r
-        freopen("/dev/null", "w", stdout);\r
-        freopen("/dev/null", "w", stderr);\r
+        if (daemonize) {\r
+            freopen("/dev/null", "r", stdin);\r
+            freopen("/dev/null", "w", stdout);\r
+            freopen("/dev/null", "w", stderr);\r
+            if (!conf.getServiceProvider()->getListenerService()->setSignal(SIGUSR1)) {\r
+                fprintf(stderr, "listener failed to accept signaling hook\n");\r
+                return -3;\r
+            }\r
+        }\r
 \r
         // Run the listener\r
-        if (!conf.getServiceProvider()->getListenerService()->setSignal(SIGUSR1)) {\r
-            fprintf(stderr, "listener failed to accept signaling hook\n");\r
-            return -3;\r
-        }\r
         if (!conf.getServiceProvider()->getListenerService()->run(unlink_socket, &shibd_shutdown)) {\r
             fprintf(stderr, "listener failed to enter listen loop\n");\r
             return -3;\r