]> git.tuebingen.mpg.de Git - paraslash.git/blobdiff - server.c
Improve memory mapping.
[paraslash.git] / server.c
index 5ea8811f960550c26d9b99a2c0a15b9ac204f7f7..436e72af9c7c5b86eadb217d194fb44cf74db5ed 100644 (file)
--- a/server.c
+++ b/server.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 1997-2008 Andre Noll <maan@systemlinux.org>
+ * Copyright (C) 1997-2009 Andre Noll <maan@systemlinux.org>
  *
  * Licensed under the GPL v2. For licencing details see COPYING.
  */
@@ -12,8 +12,9 @@
  *
  * Starting points for getting an overview:
  *
+ *
  *     - The main programs: \ref server.c, \ref audiod.c, \ref client.c,
- *       \ref audioc.c, \ref fsck.c,
+ *       \ref audioc.c, \ref fsck.c, \ref afh.c
  *     - Server: \ref server_command, \ref sender,
  *     - Audio file selector: \ref audio_format_handler, \ref mood, \ref afs_table,
  *     - Client: \ref receiver, \ref receiver_node, \ref filter, \ref filter_node.
  *
  * The gory details, listed by topic:
  *
- *     - Audio format handlers: \ref mp3_afh.c, \ref ogg_afh.c, \ref aac_afh.c,
- *     - Decoders: \ref mp3dec.c, \ref oggdec.c, \ref aacdec.c,
- *     - Volume normalizer: \ref compress.c,
+ *     - 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,
+ *     - Volume normalizer: \ref compress_filter.c,
  *     - Output: \ref alsa_write.c, \ref osx_write.c,
  *     - http: \ref http_recv.c, \ref http_send.c,
- *     - ortp: \ref ortp_recv.c, \ref ortp_send.c,
+ *     - udp: \ref udp_recv.c, \ref udp_send.c,
  *     - dccp: \ref dccp_recv.c, \ref dccp_send.c,
  *     - Audio file selector: \ref afs.c, \ref aft.c, \ref mood.c,
  *     - Afs structures: \ref afs_table, \ref audio_file_data,
@@ -63,6 +64,7 @@
 
 #include <signal.h>
 #include <dirent.h>
+#include <sys/time.h>
 
 #include "para.h"
 #include "error.h"
@@ -115,7 +117,6 @@ static FILE *logfile;
 /** The file containing user information (public key, permissions). */
 static char *user_list_file = NULL;
 static int mmd_shm_id;
-static pid_t afs_pid;
 
 
 /** The task responsible for server command handling. */
@@ -136,7 +137,7 @@ struct server_command_task {
  * \param ll The log level.
  * \param fmt The format string describing the log message.
  */
-void para_log(int ll, const char* fmt,...)
+__printf_2_3 void para_log(int ll, const char* fmt,...)
 {
        va_list argp;
        FILE *outfd;
@@ -165,7 +166,7 @@ void para_log(int ll, const char* fmt,...)
 /*
  * setup shared memory area and get mutex for locking
  */
-static void shm_init(void)
+static void init_ipc_or_die(void)
 {
        void *shm;
        int ret = shm_new(sizeof(struct misc_meta_data));
@@ -197,13 +198,15 @@ err_out:
        exit(EXIT_FAILURE);
 }
 
-static void parse_config(int override)
+void parse_config_or_die(int override)
 {
        char *home = para_homedir();
        struct stat statbuf;
        int ret;
        char *cf;
 
+       close_log(logfile);
+       logfile = NULL;
        if (conf.config_file_given)
                cf = para_strdup(conf.config_file_arg);
        else
@@ -256,12 +259,10 @@ static void signal_pre_select(struct sched *s, struct task *t)
 static void handle_sighup(void)
 {
        PARA_NOTICE_LOG("SIGHUP\n");
-       close_log(logfile); /* gets reopened if necessary by parse_config */
-       logfile = NULL;
-       parse_config(1); /* reopens log */
+       parse_config_or_die(1); /* reopens log */
        init_user_list(user_list_file); /* reload user list */
-       if (afs_pid)
-               kill(afs_pid, SIGHUP);
+       if (mmd->afs_pid)
+               kill(mmd->afs_pid, SIGHUP);
 }
 
 static void signal_post_select(struct sched *s, struct task *t)
@@ -282,7 +283,7 @@ static void signal_post_select(struct sched *s, struct task *t)
                        int ret = para_reap_child(&pid);
                        if (ret <= 0)
                                break;
-                       if (pid != afs_pid)
+                       if (pid != mmd->afs_pid)
                                continue;
                        PARA_EMERG_LOG("fatal: afs died\n");
                        goto genocide;
@@ -448,10 +449,10 @@ static int init_afs(void)
        if (ret < 0)
                exit(EXIT_FAILURE);
        afs_socket_cookie = para_random((uint32_t)-1);
-       afs_pid = fork();
-       if (afs_pid < 0)
+       mmd->afs_pid = fork();
+       if (mmd->afs_pid < 0)
                exit(EXIT_FAILURE);
-       if (!afs_pid) { /* child (afs) */
+       if (!mmd->afs_pid) { /* child (afs) */
                close(afs_server_socket[0]);
                afs_init(afs_socket_cookie, afs_server_socket[1]);
        }
@@ -481,11 +482,13 @@ static void server_init(int argc, char **argv)
        /* parse command line options */
        server_cmdline_parser_ext(argc, argv, &conf, &params);
        HANDLE_VERSION_FLAG("server", conf);
-       para_drop_privileges(conf.user_arg, conf.group_arg);
+       drop_privileges_or_die(conf.user_arg, conf.group_arg);
        /* parse config file, open log and set defaults */
-       parse_config(0);
+       parse_config_or_die(0);
        log_welcome("para_server", conf.loglevel_arg);
-       shm_init(); /* init mmd struct */
+       init_ipc_or_die(); /* init mmd struct and mmd->lock */
+       /* make sure, the global now pointer is uptodate */
+       gettimeofday(now, NULL);
        server_uptime(UPTIME_SET); /* reset server uptime */
        init_user_list(user_list_file);
        /* become daemon */
@@ -493,10 +496,9 @@ static void server_init(int argc, char **argv)
                daemon_init();
        PARA_NOTICE_LOG("initializing audio format handlers\n");
        afh_init();
-       mmd->server_pid = getpid();
-       init_signal_task();
        PARA_NOTICE_LOG("initializing the audio file selector\n");
        afs_socket = init_afs();
+       init_signal_task();
        PARA_NOTICE_LOG("initializing virtual streaming system\n");
        init_vss_task(afs_socket);
        init_server_command_task(argc, argv);