X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=server.c;h=4650f9947f01ed7fd6f1323610090ae16ef22ac4;hp=15ae5c9a296be654471fd1f95aa9395629fae097;hb=65453788515cd5f4c905b518745b4dd7f6f2da10;hpb=63aab30b55d5809704a2d0e1c4e8de20e8228d7d diff --git a/server.c b/server.c index 15ae5c9a..4650f994 100644 --- a/server.c +++ b/server.c @@ -92,6 +92,8 @@ #include "color.h" #include "version.h" +__printf_2_3 void (*para_log)(int, const char*, ...) = daemon_log; + /** Define the array of error lists needed by para_server. */ INIT_SERVER_ERRLISTS; @@ -434,7 +436,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 +450,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 +468,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 = { @@ -495,7 +495,7 @@ static void server_init(int argc, char **argv) init_user_list(user_list_file); /* become daemon */ if (conf.daemon_given) - daemonize(); + daemonize(true /* parent waits for SIGTERM */); PARA_NOTICE_LOG("initializing audio format handlers\n"); afh_init(); @@ -508,17 +508,21 @@ 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); + if (conf.daemon_given) + kill(getppid(), SIGTERM); PARA_NOTICE_LOG("server init complete\n"); }