X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=server.c;h=9c06991378512172e95b70165118ae1ea873bdb1;hp=4822ebb5c3066404e46f72b8154acc6f452bde04;hb=2b3cc3af64d5574473c2f1ea9c32d7589abbb811;hpb=3cfb1d880ebf22546486316cb74cce21f007eb07 diff --git a/server.c b/server.c index 4822ebb5..9c069913 100644 --- 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, ¶ms); 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();