Revert "server: Listen on command socket before daemonizing."
[paraslash.git] / server.c
index 6b1e11d6fb580b1edd8da144e3c47b2977fb1d2e..82f48e00eb8911503688fd2c9faf9a02b8909e5f 100644 (file)
--- a/server.c
+++ b/server.c
@@ -434,7 +434,7 @@ err:
        exit(EXIT_FAILURE);
 }
 
-static int init_afs(void)
+static int init_afs(int argc, char **argv)
 {
        int ret, afs_server_socket[2];
        pid_t afs_pid;
@@ -448,6 +448,10 @@ static int init_afs(void)
        if (afs_pid < 0)
                exit(EXIT_FAILURE);
        if (afs_pid == 0) { /* child (afs) */
+               int i;
+               for (i = argc - 1; i >= 0; i--)
+                       memset(argv[i], 0, strlen(argv[i]));
+               sprintf(argv[0], "para_server (afs)");
                close(afs_server_socket[0]);
                afs_init(afs_socket_cookie, afs_server_socket[1]);
        }
@@ -462,12 +466,6 @@ static int init_afs(void)
        return afs_server_socket[0];
 }
 
-__noreturn static void tmp_sigchld_handler(__a_unused int s)
-{
-       PARA_EMERG_LOG("caught early SIGCHLD\n");
-       exit(EXIT_FAILURE);
-}
-
 static void server_init(int argc, char **argv)
 {
        struct server_cmdline_parser_params params = {
@@ -493,7 +491,6 @@ static void server_init(int argc, char **argv)
        gettimeofday(now, NULL);
        set_server_start_time(now);
        init_user_list(user_list_file);
-       init_server_command_task(argc, argv);
        /* become daemon */
        if (conf.daemon_given)
                daemonize();
@@ -509,16 +506,19 @@ static void server_init(int argc, char **argv)
         */
        para_sigaction(SIGUSR1, SIG_IGN);
        /*
-        * We have to install a SIGCHLD handler before the afs process is being
-        * forked off. Otherwise, para_server does not notice if afs dies before
-        * the SIGCHLD handler has been installed by init_signal_task() below.
+        * We have to block SIGCHLD before the afs process is being forked off.
+        * Otherwise, para_server does not notice if afs dies before the
+        * SIGCHLD handler has been installed for the parent process by
+        * init_signal_task() below.
         */
-       para_sigaction(SIGCHLD, tmp_sigchld_handler);
+       para_block_signal(SIGCHLD);
        PARA_NOTICE_LOG("initializing the audio file selector\n");
-       afs_socket = init_afs();
+       afs_socket = init_afs(argc, argv);
        init_signal_task();
+       para_unblock_signal(SIGCHLD);
        PARA_NOTICE_LOG("initializing virtual streaming system\n");
        init_vss_task(afs_socket);
+       init_server_command_task(argc, argv);
        PARA_NOTICE_LOG("server init complete\n");
 }