]> git.tuebingen.mpg.de Git - paraslash.git/blobdiff - server.c
fecdec: Minor cleanups.
[paraslash.git] / server.c
index 4822ebb5c3066404e46f72b8154acc6f452bde04..9c06991378512172e95b70165118ae1ea873bdb1 100644 (file)
--- a/server.c
+++ b/server.c
@@ -115,7 +115,6 @@ int mmd_mutex;
 
 /** The file containing user information (public key, permissions). */
 static char *user_list_file = NULL;
-static int mmd_shm_id;
 
 
 /** The task responsible for server command handling. */
@@ -162,16 +161,16 @@ static void init_colors_or_die(void)
 static void init_ipc_or_die(void)
 {
        void *shm;
-       int ret = shm_new(sizeof(struct misc_meta_data));
+       int shmid, ret = shm_new(sizeof(struct misc_meta_data));
 
        if (ret < 0)
                goto err_out;
-
-       ret = shm_attach(ret, ATTACH_RW, &shm);
+       shmid = ret;
+       ret = shm_attach(shmid, ATTACH_RW, &shm);
+       shm_destroy(shmid);
        if (ret < 0)
                goto err_out;
        mmd = shm;
-       mmd_shm_id = ret;
 
        ret = mutex_new();
        if (ret < 0)
@@ -228,7 +227,7 @@ void parse_config_or_die(int override)
                        .initialize = 0,
                        .check_required = 1,
                        .check_ambiguity = 0,
-                       .print_errors = 1
+                       .print_errors = !conf.daemon_given
                };
                server_cmdline_parser_config_file(cf, &conf, &params);
                conf.daemon_given = tmp;
@@ -303,8 +302,6 @@ genocide:
                kill(0, SIGTERM);
                mutex_destroy(mmd_mutex);
                shm_detach(mmd);
-               shm_destroy(mmd_shm_id);
-
                exit(EXIT_FAILURE);
        }
 }
@@ -331,8 +328,6 @@ static void init_signal_task(void)
                goto err;
        if (signal(SIGPIPE, SIG_IGN) == SIG_ERR)
                goto err;
-       if (signal(SIGUSR1, SIG_IGN) == SIG_ERR)
-               goto err;
        add_close_on_fork_list(st->fd);
        register_task(&st->task);
        return;
@@ -502,6 +497,18 @@ static void server_init(int argc, char **argv)
                daemonize();
        PARA_NOTICE_LOG("initializing audio format handlers\n");
        afh_init();
+
+       /*
+        * Although afs uses its own signal handling we must ignore SIGUSR1
+        * _before_ the afs child process gets born by init_afs() below.  It's
+        * racy to do this in the child because the parent might send SIGUSR1
+        * before the child gets a chance to ignore this signal -- only the
+        * good die young.
+        */
+       if (signal(SIGUSR1, SIG_IGN) == SIG_ERR) {
+               PARA_EMERG_LOG("failed to ignore SIGUSR1\n");
+               exit(EXIT_FAILURE);
+       }
        PARA_NOTICE_LOG("initializing the audio file selector\n");
        afs_socket = init_afs();
        init_signal_task();