X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=server.c;h=e0df714be975b083f4d3cc7116ad0af2501a2b46;hp=e0d50f4f8689e1de283ef80f8341504bcf386d33;hb=d440a71683940a58747de6dc32643db452d9cf54;hpb=c75c35b176cdacf157d27617e954961c88f33975 diff --git a/server.c b/server.c index e0d50f4f..e0df714b 100644 --- a/server.c +++ b/server.c @@ -2,31 +2,6 @@ /** \file server.c Paraslash's main server. */ -/** - * \mainpage Main data structures and selected APIs: - * - * - Senders: \ref sender, - * - Audio file selector: \ref afs_info, \ref afs_table, - * - Audio format handler: \ref audio_format_handler, \ref afh_info - * - Receivers/filters/writers: \ref receiver, \ref receiver_node, - * \ref filter, \ref filter_node, \ref writer_node, \ref writer. - * - Scheduling: \ref sched.h, - * - Buffer trees: \ref buffer_tree.h, - * - Sideband API: \ref sideband.h, - * - Crypto: \ref crypt.h, \ref crypt_backend.h, - * - Error subsystem: \ref error.h, - * - Inter process communication: \ref ipc.h, - * - Forward error correction: \ref fec.h, - * - Daemons: \ref daemon.h, - * - Mixer API: \ref mix.h, - * - Interactive sessions: \ref interactive.h, - * - File descriptors: \ref fd.h, - * - Signals: \ref signal.h, - * - Networking: \ref net.h, - * - Time: \ref time.c, - * - Doubly linked lists: \ref list.h. - */ - #include #include #include @@ -110,7 +85,7 @@ static struct signal_task *signal_task; /** The process id of the audio file selector process. */ pid_t afs_pid = 0; -/* The the main server process (parent of afs and the command handlers). */ +/* The main server process (parent of afs and the command handlers). */ static pid_t server_pid; /** @@ -298,14 +273,14 @@ static int signal_post_select(struct sched *s, __a_unused void *context) if (pid != afs_pid) continue; PARA_EMERG_LOG("fatal: afs died\n"); - kill(0, SIGTERM); - goto cleanup; + goto genocide; } break; /* die on sigint/sigterm. Kill all children too. */ case SIGINT: case SIGTERM: PARA_EMERG_LOG("terminating on signal %d\n", signum); +genocide: kill(0, SIGTERM); /* * We must wait for all of our children to die. For the afs @@ -320,7 +295,6 @@ static int signal_post_select(struct sched *s, __a_unused void *context) while (wait(NULL) != -1 || errno != ECHILD) ; /* still at least one child alive */ mutex_lock(mmd_mutex); -cleanup: free(mmd->afd.afhi.chunk_table); task_notify_all(s, E_DEADLY_SIGNAL); return -E_DEADLY_SIGNAL; @@ -433,15 +407,16 @@ static int command_post_select(struct sched *s, void *context) ret = task_get_notification(sct->task); if (ret < 0) - return ret; + goto fail; for (n = 0; n < sct->num_listen_fds; n++) { ret = command_task_accept(n, s, sct); - if (ret < 0) { - free(sct->listen_fds); - return ret; - } + if (ret < 0) + goto fail; } return 0; +fail: + free(sct->listen_fds); + return ret; } static void init_server_command_task(struct server_command_task *sct, @@ -704,12 +679,13 @@ int main(int argc, char *argv[]) deplete_close_on_fork_list(); if (ret < 0) PARA_EMERG_LOG("%s\n", para_strerror(-ret)); + vss_shutdown(); } else { + vss_shutdown(); alarm(ALARM_TIMEOUT); close_listed_fds(); ret = handle_connect(sct->child_fd); } - vss_shutdown(); shm_detach(mmd); user_list_deplete(); free_lpr();