X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=server.c;h=07a38f44a80436ae79dc89136478e4498d4ca9d8;hp=43ede2a91b752667ad4090e2742c4a844bf66250;hb=aa066efd962198bbeed8e5bcee57572f9e15455a;hpb=b59e841036a107b52a0221e48d7e05f86da92979 diff --git a/server.c b/server.c index 43ede2a9..07a38f44 100644 --- a/server.c +++ b/server.c @@ -1,8 +1,4 @@ -/* - * Copyright (C) 1997 Andre Noll - * - * Licensed under the GPL v2. For licencing details see COPYING. - */ +/* Copyright (C) 1997 Andre Noll , see file COPYING. */ /** \file server.c Paraslash's main server. */ @@ -90,7 +86,15 @@ struct lls_parse_result *server_lpr = NULL; /* Command line options (no config file options). Used in handle_sighup(). */ static struct lls_parse_result *cmdline_lpr; -/** A random value used in child context for authentication. */ +/** + * A random number used to "authenticate" the afs connection. + * + * para_server picks this number by random before it forks the afs process. The + * command handlers know this number as well and write it to the afs socket, + * together with the id of the shared memory area which contains the payload of + * the afs command. A local process has to know this number to abuse the afs + * service provided by the local socket. + */ uint32_t afs_socket_cookie; /** The mutex protecting the shared memory area containing the mmd struct. */ @@ -99,6 +103,9 @@ int mmd_mutex; static struct sched sched; static struct signal_task *signal_task; +/** The process id of the audio file selector process. */ +pid_t afs_pid = 0; + /** The task responsible for server command handling. */ struct server_command_task { /** TCP port on which para_server listens for connections. */ @@ -178,12 +185,11 @@ void parse_config_or_die(bool reload) struct lls_parse_result *cf_lpr, *merged_lpr; char *home = para_homedir(); - daemon_close_log(); if (OPT_GIVEN(CONFIG_FILE)) cf = para_strdup(OPT_STRING_VAL(CONFIG_FILE)); else cf = make_message("%s/.paraslash/server.conf", home); - if (!mmd || getpid() != mmd->afs_pid) { + if (!mmd || getpid() != afs_pid) { if (OPT_GIVEN(USER_LIST)) user_list_file = para_strdup(OPT_STRING_VAL(USER_LIST)); else @@ -196,7 +202,6 @@ void parse_config_or_die(bool reload) goto free_cf; if (ret == -ERRNO_TO_PARA_ERROR(ENOENT) && OPT_GIVEN(CONFIG_FILE)) goto free_cf; - ret = 0; server_lpr = cmdline_lpr; goto success; } @@ -212,7 +217,7 @@ void parse_config_or_die(bool reload) if (reload) /* config file overrides command line */ ret = lls(lls_merge(cf_lpr, cmdline_lpr, CMD_PTR, &merged_lpr, &errctx)); - else /* command line options overrride config file options */ + else /* command line options override config file options */ ret = lls(lls_merge(cmdline_lpr, cf_lpr, CMD_PTR, &merged_lpr, &errctx)); lls_free_parse_result(cf_lpr, CMD_PTR); @@ -263,8 +268,8 @@ static void handle_sighup(void) PARA_NOTICE_LOG("SIGHUP\n"); parse_config_or_die(true); - if (mmd->afs_pid) - kill(mmd->afs_pid, SIGHUP); + if (afs_pid != 0) + kill(afs_pid, SIGHUP); } static int signal_post_select(struct sched *s, __a_unused void *context) @@ -283,7 +288,7 @@ static int signal_post_select(struct sched *s, __a_unused void *context) int ret = para_reap_child(&pid); if (ret <= 0) break; - if (pid != mmd->afs_pid) + if (pid != afs_pid) continue; PARA_EMERG_LOG("fatal: afs died\n"); kill(0, SIGTERM); @@ -309,8 +314,8 @@ static int signal_post_select(struct sched *s, __a_unused void *context) * processes get killed immediately by the above kill(). */ PARA_INFO_LOG("waiting for afs (pid %d) to die\n", - (int)mmd->afs_pid); - waitpid(mmd->afs_pid, NULL, 0); + (int)afs_pid); + waitpid(afs_pid, NULL, 0); cleanup: free(mmd->afd.afhi.chunk_table); close_listed_fds(); @@ -357,8 +362,6 @@ static int command_post_select(struct sched *s, void *context) ret = para_accept(sct->listen_fd, &s->rfds, NULL, 0, &new_fd); if (ret <= 0) goto out; - peer_name = remote_name(new_fd); - PARA_INFO_LOG("got connection from %s, forking\n", peer_name); mmd->num_connects++; mmd->active_connections++; /* @@ -384,6 +387,8 @@ static int command_post_select(struct sched *s, void *context) /* parent keeps accepting connections */ return 0; } + peer_name = remote_name(new_fd); + PARA_INFO_LOG("accepted connection from %s\n", peer_name); /* mmd might already have changed at this point */ free(chunk_table); alarm(ALARM_TIMEOUT); @@ -397,7 +402,7 @@ static int command_post_select(struct sched *s, void *context) memset(sct->argv[i], 0, strlen(sct->argv[i])); i = sct->argc - 1 - lls_num_inputs(cmdline_lpr); sprintf(sct->argv[i], "para_server (serving %s)", peer_name); - handle_connect(new_fd, peer_name); + handle_connect(new_fd); /* never reached*/ out: if (ret < 0) @@ -437,7 +442,6 @@ err: static int init_afs(int argc, char **argv) { int ret, afs_server_socket[2]; - pid_t afs_pid; char c; ret = socketpair(PF_UNIX, SOCK_STREAM, 0, afs_server_socket); @@ -451,14 +455,14 @@ static int init_afs(int argc, char **argv) if (afs_pid == 0) { /* child (afs) */ int i; + afs_pid = getpid(); for (i = argc - 1; i >= 0; i--) memset(argv[i], 0, strlen(argv[i])); i = argc - lls_num_inputs(cmdline_lpr) - 1; sprintf(argv[i], "para_server (afs)"); close(afs_server_socket[0]); - afs_init(afs_socket_cookie, afs_server_socket[1]); + afs_init(afs_server_socket[1]); } - mmd->afs_pid = afs_pid; close(afs_server_socket[1]); if (read(afs_server_socket[0], &c, 1) <= 0) { PARA_EMERG_LOG("early afs exit\n"); @@ -509,7 +513,7 @@ static void server_init(int argc, char **argv) /* become daemon */ if (OPT_GIVEN(DAEMON)) daemon_pipe = daemonize(true /* parent waits for SIGTERM */); - init_random_seed_or_die(); + crypt_init(); daemon_log_welcome("server"); init_ipc_or_die(); /* init mmd struct and mmd->lock */ daemon_set_start_time(); @@ -534,7 +538,7 @@ static void server_init(int argc, char **argv) init_signal_task(); para_unblock_signal(SIGCHLD); PARA_NOTICE_LOG("initializing virtual streaming system\n"); - init_vss_task(afs_socket, &sched); + vss_init(afs_socket, &sched); init_server_command_task(argc, argv); if (daemon_pipe >= 0) { if (write(daemon_pipe, "\0", 1) < 0) {