X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=audiod.c;h=b781527ccabb40c43f50a80aab87ef42ee06fb0e;hp=bd0d049a457a4cbc35406eb1d59801e59879ca0a;hb=8221397af24a2df3c2edbc889847ce0ab15eb3e0;hpb=ebe54cf6ee1b9c5daf7837cb618c299a5b5187e0 diff --git a/audiod.c b/audiod.c index bd0d049a..b781527c 100644 --- a/audiod.c +++ b/audiod.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2005-2008 Andre Noll + * Copyright (C) 2005-2009 Andre Noll * * Licensed under the GPL v2. For licencing details see COPYING. */ @@ -14,8 +14,8 @@ #include "audiod.cmdline.h" #include "list.h" #include "sched.h" -#include "recv.h" #include "ggo.h" +#include "recv.h" #include "filter.h" #include "grab_client.cmdline.h" #include "grab_client.h" @@ -83,7 +83,6 @@ int audiod_status = AUDIOD_ON; struct audiod_args_info conf; static char *socket_name; -static FILE *logfile; static struct audio_format_info afi[NUM_AUDIO_FORMATS]; static struct signal_task signal_task_struct, *sig_task = &signal_task_struct; @@ -181,49 +180,49 @@ out: ); } -/** - * the log function of para_audiod - * - * \param ll loglevel - * \param fmt the format string - */ -__printf_2_3 void para_log(int ll, const char* fmt,...) +static int want_colors(void) { - va_list argp; - FILE *outfd; - struct tm *tm; - time_t t1; - char str[MAXLINE] = ""; - static char *hostname; - - if (ll < conf.loglevel_arg) - return; - if (!logfile && conf.daemon_given) - return; - if (!hostname) - hostname = para_hostname(); - outfd = logfile? logfile : stderr; - time(&t1); - tm = localtime(&t1); - strftime(str, MAXLINE, "%b %d %H:%M:%S", tm); - fprintf(outfd, "%s %s ", str, hostname); - if (conf.loglevel_arg <= INFO) - fprintf(outfd, "%i ", ll); - va_start(argp, fmt); - vfprintf(outfd, fmt, argp); - va_end(argp); + if (conf.color_arg == color_arg_no) + return 0; + if (conf.color_arg == color_arg_yes) + return 1; + if (conf.logfile_given) + return 0; + return isatty(STDERR_FILENO); } -static char *configfile_exists(void) +static void parse_config_or_die(void) { - char *home = para_homedir(); - char *config_file = make_message("%s/.paraslash/audiod.conf", - home); - free(home); - if (file_exists(config_file)) - return config_file; + char *config_file; + struct audiod_cmdline_parser_params params = { + .override = 0, + .initialize = 0, + .check_required = 1, + .check_ambiguity = 0, + .print_errors = 1 + }; + + if (conf.config_file_given) + config_file = para_strdup(conf.config_file_arg); + else { + char *home = para_homedir(); + config_file = make_message("%s/.paraslash/audiod.conf", home); + free(home); + } + if (conf.config_file_given && !file_exists(config_file)) { + PARA_EMERG_LOG("can not read config file %s\n", config_file); + goto err; + } + if (audiod_cmdline_parser_config_file(config_file, &conf, ¶ms)) { + PARA_EMERG_LOG("parse error in config file\n"); + goto err; + } + free(config_file); + daemon_set_loglevel(conf.loglevel_arg); + return; +err: free(config_file); - return NULL; + exit(EXIT_FAILURE); } static void setup_signal_handling(void) @@ -1069,6 +1068,38 @@ static void set_initial_status(void) PARA_WARNING_LOG("invalid mode\n"); } +__noreturn static void print_help_and_die(void) +{ + int d = conf.detailed_help_given; + const char **p = d? audiod_args_info_detailed_help + : audiod_args_info_help; + + printf_or_die("%s\n\n", AUDIOD_CMDLINE_PARSER_PACKAGE "-" + AUDIOD_CMDLINE_PARSER_VERSION); + printf_or_die("%s\n\n", audiod_args_info_usage); + for (; *p; p++) + printf_or_die("%s\n", *p); + print_receiver_helps(d); + print_filter_helps(d); + print_writer_helps(d); + exit(0); +} + +static void init_colors_or_die(void) +{ + int ret, i; + + if (!want_colors()) + return; + daemon_set_default_log_colors(); + daemon_set_flag(DF_COLOR_LOG); + for (i = 0; i < conf.log_color_given; i++) { + ret = daemon_set_log_color(conf.log_color_arg[i]); + if (ret < 0) + exit(EXIT_FAILURE); + } +} + /** * the main function of para_audiod * @@ -1081,7 +1112,6 @@ static void set_initial_status(void) * */ int main(int argc, char *argv[]) { - char *config_file; int ret, i; static struct sched s; struct command_task command_task_struct, *cmd_task = &command_task_struct; @@ -1096,28 +1126,24 @@ int main(int argc, char *argv[]) valid_fd_012(); audiod_cmdline_parser_ext(argc, argv, &conf, ¶ms); HANDLE_VERSION_FLAG("audiod", conf); - para_drop_privileges(conf.user_arg, conf.group_arg); - config_file = configfile_exists(); - if (config_file) { - params.override = 0; - params.initialize = 0; - params.check_required = 1; - params.check_ambiguity = 0; - params.print_errors = 1; - if (audiod_cmdline_parser_config_file(config_file, &conf, ¶ms)) { - PARA_EMERG_LOG("parse error in config file\n"); - exit(EXIT_FAILURE); - } - free(config_file); + drop_privileges_or_die(conf.user_arg, conf.group_arg); + parse_config_or_die(); + if (conf.help_given || conf.detailed_help_given) + print_help_and_die(); + daemon_set_flag(DF_LOG_TIME); + daemon_set_flag(DF_LOG_HOSTNAME); + daemon_set_flag(DF_LOG_LL); + if (conf.logfile_given) { + daemon_set_logfile(conf.logfile_arg); + daemon_open_log_or_die(); } - if (conf.logfile_given) - logfile = open_log(conf.logfile_arg); - log_welcome("para_audiod", conf.loglevel_arg); + init_colors_or_die(); i = init_stream_io(); if (i < 0) { PARA_EMERG_LOG("init stream io error: %s\n", para_strerror(-i)); exit(EXIT_FAILURE); } + log_welcome("para_audiod", conf.loglevel_arg); server_uptime(UPTIME_SET); set_initial_status(); FOR_EACH_SLOT(i) @@ -1130,7 +1156,7 @@ int main(int argc, char *argv[]) init_command_task(cmd_task); if (conf.daemon_given) - daemon_init(); + daemonize(); register_task(&sig_task->task); register_task(&cmd_task->task);