X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=server.c;h=9c06991378512172e95b70165118ae1ea873bdb1;hp=5823cb28d5f458e9b885bf6cddb2795275ac3aa9;hb=ac153fd54a0f093581ee863984070a325d5343b8;hpb=00e4d4da1b2c00da139b09d3ed4ab9ad9fba2691 diff --git a/server.c b/server.c index 5823cb28..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) @@ -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();