X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=audiod.c;h=e3fd49d3ba3666c29efd1bcbf0d43fa7089e9de0;hp=fc4ac6f5017b2eb5c4876d0c29a0bd53ba512b8f;hb=ac153fd54a0f093581ee863984070a325d5343b8;hpb=94c7c613f4c66a36c81edae74a42024015122c16 diff --git a/audiod.c b/audiod.c index fc4ac6f5..e3fd49d3 100644 --- a/audiod.c +++ b/audiod.c @@ -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,42 +180,28 @@ 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 void parse_config_or_die(void) { + int ret; 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); @@ -225,24 +210,15 @@ static void parse_config_or_die(void) config_file = make_message("%s/.paraslash/audiod.conf", home); free(home); } - if (conf.config_file_given && !file_exists(config_file)) { + ret = file_exists(config_file); + if (conf.config_file_given && !ret) { PARA_EMERG_LOG("can not read config file %s\n", config_file); goto err; } - if (config_file) { - struct audiod_cmdline_parser_params params = { - .override = 0, - .initialize = 0, - .check_required = 1, - .check_ambiguity = 0, - .print_errors = 1 - }; - if (audiod_cmdline_parser_config_file(config_file, &conf, ¶ms)) { - PARA_EMERG_LOG("parse error in config file\n"); - goto err; - } - } + if (ret) + audiod_cmdline_parser_config_file(config_file, &conf, ¶ms); free(config_file); + daemon_set_loglevel(conf.loglevel_arg); return; err: free(config_file); @@ -620,13 +596,12 @@ static int add_filter(int format, char *cmdline) return filter_num; } -static int init_writers(void) +static int parse_writer_args(void) { int i, ret, nw; char *cmd; struct audio_format_info *a; - init_supported_writers(); nw = PARA_MAX(1U, conf.writer_given); PARA_INFO_LOG("maximal number of writers: %d\n", nw); FOR_EACH_AUDIO_FORMAT(i) { @@ -659,16 +634,12 @@ out: return ret; } -static int init_receivers(void) +static int parse_receiver_args(void) { int i, ret, receiver_num; char *cmd = NULL; struct audio_format_info *a; - for (i = 0; receivers[i].name; i++) { - PARA_INFO_LOG("initializing %s receiver\n", receivers[i].name); - receivers[i].init(&receivers[i]); - } for (i = conf.receiver_given - 1; i >= 0; i--) { char *arg = conf.receiver_arg[i]; char *recv_arg = strchr(arg, ':'); @@ -739,11 +710,10 @@ out: return ret; } -static int init_filters(void) +static int parse_filter_args(void) { int i, ret, nf; - filter_init(filters); nf = PARA_MAX(1U, conf.filter_given); PARA_INFO_LOG("maximal number of filters: %d\n", nf); FOR_EACH_AUDIO_FORMAT(i) { @@ -772,17 +742,17 @@ out: return ret; } -static int init_stream_io(void) +static int parse_stream_args(void) { int ret; - ret = init_writers(); + ret = parse_receiver_args(); if (ret < 0) return ret; - ret = init_receivers(); + ret = parse_filter_args(); if (ret < 0) return ret; - ret = init_filters(); + ret = parse_writer_args(); if (ret < 0) return ret; return 1; @@ -1045,13 +1015,13 @@ static void status_pre_select(struct sched *s, struct task *t) int argc = 3; PARA_INFO_LOG("clock diff count: %d\n", st->clock_diff_count); st->clock_diff_count--; - client_open(argc, argv, &st->ct); + client_open(argc, argv, &st->ct, NULL); set_stat_task_restart_barrier(2); } else { char *argv[] = {"audiod", "stat", NULL}; int argc = 2; - client_open(argc, argv, &st->ct); + client_open(argc, argv, &st->ct, NULL); set_stat_task_restart_barrier(5); } free(stat_item_values[SI_BASENAME]); @@ -1109,6 +1079,20 @@ __noreturn static void print_help_and_die(void) 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 @@ -1134,20 +1118,31 @@ int main(int argc, char *argv[]) }; valid_fd_012(); - audiod_cmdline_parser_ext(argc, argv, &conf, ¶ms); + if (audiod_cmdline_parser_ext(argc, argv, &conf, ¶ms)) + exit(EXIT_FAILURE); HANDLE_VERSION_FLAG("audiod", conf); - drop_privileges_or_die(conf.user_arg, conf.group_arg); - parse_config_or_die(); - if (conf.logfile_given) - logfile = open_log(conf.logfile_arg); - i = init_stream_io(); + /* init receivers/filters/writers early to make help work */ + recv_init(); + filter_init(); + writer_init(); if (conf.help_given || conf.detailed_help_given) print_help_and_die(); - if (i < 0) { - PARA_EMERG_LOG("init stream io error: %s\n", para_strerror(-i)); + drop_privileges_or_die(conf.user_arg, conf.group_arg); + parse_config_or_die(); + init_colors_or_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(); + } + ret = parse_stream_args(); + if (ret < 0) { + PARA_EMERG_LOG("%s\n", para_strerror(-ret)); exit(EXIT_FAILURE); } - log_welcome("para_audiod", conf.loglevel_arg); + log_welcome("para_audiod"); server_uptime(UPTIME_SET); set_initial_status(); FOR_EACH_SLOT(i) @@ -1160,7 +1155,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);