X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=server.c;h=89a8137233c019df844f56d3a21bf841fd3fda15;hp=e08b0661d14ddc4a8ef1cf2386cb75efe0655d19;hb=4e979d91dc967b241a0f034a5600447eb7826eef;hpb=343a65bc48b4e0cda4d9a14afcd7e96cca9c5de9 diff --git a/server.c b/server.c index e08b0661..89a81372 100644 --- a/server.c +++ b/server.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 1997-2009 Andre Noll + * Copyright (C) 1997-2010 Andre Noll * * Licensed under the GPL v2. For licencing details see COPYING. */ @@ -16,16 +16,18 @@ * - The main programs: \ref server.c, \ref audiod.c, \ref client.c, * \ref audioc.c, \ref afh.c * - Server: \ref server_command, \ref sender, - * - Audio file selector: \ref audio_format_handler, \ref mood, \ref afs_table, + * - Audio file selector: \ref audio_format_handler, \ref afs_table, * - Client: \ref receiver, \ref receiver_node, \ref filter, \ref filter_node. * * * The gory details, listed by topic: * - * - Audio format handlers: \ref send_common.c \ref mp3_afh.c, \ref ogg_afh.c, \ref aac_afh.c, - * - Decoders: \ref mp3dec_filter.c, \ref oggdec_filter.c, \ref aacdec_filter.c, + * - Audio format handlers: \ref send_common.c \ref mp3_afh.c, + * \ref ogg_afh.c, \ref aac_afh.c, \ref wma_afh.c, + * - Decoders: \ref mp3dec_filter.c, \ref oggdec_filter.c, + * \ref aacdec_filter.c, \ref wmadec_filter.c, * - Volume normalizer: \ref compress_filter.c, - * - Output: \ref alsa_write.c, \ref osx_write.c, + * - Output: \ref alsa_write.c, \ref osx_write.c, \ref oss_write.c, * - http: \ref http_recv.c, \ref http_send.c, * - udp: \ref udp_recv.c, \ref udp_send.c, * - dccp: \ref dccp_recv.c, \ref dccp_send.c, @@ -57,16 +59,19 @@ * - Ring buffer: \ref ringbuffer.c, \ref ringbuffer.h, * - Hashing: \ref hash.h, \ref sha1.h, \ref sha1.c, * - Crypto: \ref crypt.c. - * - Forward error correction: \ref fec.c + * - Forward error correction: \ref fec.c. */ #include #include #include +#include +#include #include #include "para.h" #include "error.h" +#include "crypt.h" #include "server.cmdline.h" #include "afh.h" #include "string.h" @@ -240,6 +245,8 @@ void parse_config_or_die(int override) daemon_set_flag(DF_LOG_PID); daemon_set_flag(DF_LOG_LL); daemon_set_flag(DF_LOG_TIME); + if (conf.log_timing_given) + daemon_set_flag(DF_LOG_TIMING); ret = 1; out: free(cf); @@ -369,15 +376,14 @@ static void command_post_select(struct sched *s, struct task *t) PARA_INFO_LOG("got connection from %s, forking\n", peer_name); mmd->num_connects++; mmd->active_connections++; - random(); /* - * The chunk table is a pointer located in the mmd struct that point to - * dynamically allocated memory that must be freed by the parent and - * the child. However, as the mmd struct is in a shared memory area, - * there's no guarantee that after the fork these pointers are still - * valid in child context. As this pointer is not used in the child - * anyway, we save it to a local variable and free the memory via that - * copy in the child. + * The chunk table is a pointer located in the mmd struct that points + * to dynamically allocated memory, i.e. it must be freed by the parent + * and the child. However, as the mmd struct is in a shared memory + * area, there's no guarantee that after the fork this pointer is still + * valid in child context. As it is not used in the child anyway, we + * save it to a local variable before the fork and free the memory via + * that copy in the child directly after the fork. */ chunk_table = mmd->afd.afhi.chunk_table; child_pid = fork(); @@ -419,7 +425,7 @@ static void init_server_command_task(int argc, char **argv) sct->task.post_select = command_post_select; sct->argc = argc; sct->argv = argv; - ret = para_listen(AF_UNSPEC, IPPROTO_TCP, conf.port_arg); + ret = para_listen_simple(IPPROTO_TCP, conf.port_arg); if (ret < 0) goto err; sct->listen_fd = ret; @@ -434,50 +440,24 @@ err: exit(EXIT_FAILURE); } -static void init_random_seed(void) -{ - unsigned int seed; - int fd, ret = para_open("/dev/urandom", O_RDONLY, 0); - - if (ret < 0) - goto err; - fd = ret; - ret = read(fd, &seed, sizeof(seed)); - if (ret < 0) { - ret = -ERRNO_TO_PARA_ERROR(errno); - goto out; - } - if (ret != sizeof(seed)) { - ret = -ERRNO_TO_PARA_ERROR(EIO); - goto out; - } - srandom(seed); - ret = 1; -out: - close(fd); - if (ret >= 0) - return; -err: - PARA_EMERG_LOG("can not seed pseudo random number generator: %s\n", - para_strerror(-ret)); - exit(EXIT_FAILURE); -} - static int init_afs(void) { int ret, afs_server_socket[2]; + pid_t afs_pid; ret = socketpair(PF_UNIX, SOCK_DGRAM, 0, afs_server_socket); if (ret < 0) exit(EXIT_FAILURE); - afs_socket_cookie = para_random((uint32_t)-1); - mmd->afs_pid = fork(); - if (mmd->afs_pid < 0) + get_random_bytes_or_die((unsigned char *)&afs_socket_cookie, + sizeof(afs_socket_cookie)); + afs_pid = fork(); + if (afs_pid < 0) exit(EXIT_FAILURE); - if (!mmd->afs_pid) { /* child (afs) */ + if (afs_pid == 0) { /* child (afs) */ close(afs_server_socket[0]); afs_init(afs_socket_cookie, afs_server_socket[1]); } + mmd->afs_pid = afs_pid; close(afs_server_socket[1]); ret = mark_fd_nonblocking(afs_server_socket[0]); if (ret < 0) @@ -506,7 +486,7 @@ static void server_init(int argc, char **argv) int afs_socket; valid_fd_012(); - init_random_seed(); + init_random_seed_or_die(); /* parse command line options */ server_cmdline_parser_ext(argc, argv, &conf, ¶ms); HANDLE_VERSION_FLAG("server", conf);