X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=audiod.c;h=b93f29de4498c50f574e55c4c8b3e9a34dfe0aee;hp=52728900840fb76d7b0eb5a39dd6bd2d1ed34afc;hb=f5c010bd27e131fca0c2ae58ebdde80e44655dcc;hpb=5bffffb32d2d8bfc8bc465b43b56a92a6101d35c diff --git a/audiod.c b/audiod.c index 52728900..b93f29de 100644 --- a/audiod.c +++ b/audiod.c @@ -1,8 +1,4 @@ -/* - * Copyright (C) 2005 Andre Noll - * - * Licensed under the GPL v2. For licencing details see COPYING. - */ +/* Copyright (C) 2005 Andre Noll , see file COPYING. */ /** \file audiod.c The paraslash's audio daemon. */ @@ -21,6 +17,7 @@ #include "recv_cmd.lsg.h" #include "para.h" #include "error.h" +#include "lsu.h" #include "crypt.h" #include "list.h" #include "sched.h" @@ -179,7 +176,7 @@ static uid_t *uid_whitelist; /** * The task that calls the status command of para_server. * - * \sa struct status_task + * \sa \ref struct status_task. */ static struct status_task *stat_task = &status_task_struct; @@ -382,81 +379,36 @@ empty: static void parse_config_or_die(void) { - int ret; - char *cf, *errctx = NULL; - void *map; - size_t sz; + int i, ret; + uint32_t n; - if (OPT_GIVEN(CONFIG_FILE)) - cf = para_strdup(OPT_STRING_VAL(CONFIG_FILE)); - else { - char *home = para_homedir(); - cf = make_message("%s/.paraslash/audiod.conf", home); - free(home); - } - ret = mmap_full_file(cf, O_RDONLY, &map, &sz, NULL); + ret = lsu_merge_config_file_options(OPT_STRING_VAL(CONFIG_FILE), + "audiod.conf", &lpr, CMD_PTR, audiod_suite, 0U /* flags */); if (ret < 0) { - if (ret != -E_EMPTY && ret != -ERRNO_TO_PARA_ERROR(ENOENT)) - goto free_cf; - if (ret == -ERRNO_TO_PARA_ERROR(ENOENT) && OPT_GIVEN(CONFIG_FILE)) - goto free_cf; - } else { - int cf_argc; - char **cf_argv; - struct lls_parse_result *cf_lpr, *merged_lpr; - ret = lls(lls_convert_config(map, sz, NULL, &cf_argv, &errctx)); - para_munmap(map, sz); - if (ret < 0) - goto free_cf; - cf_argc = ret; - ret = lls(lls_parse(cf_argc, cf_argv, CMD_PTR, &cf_lpr, &errctx)); - lls_free_argv(cf_argv); - if (ret < 0) - goto free_cf; - ret = lls(lls_merge(lpr, cf_lpr, CMD_PTR, &merged_lpr, - &errctx)); - lls_free_parse_result(cf_lpr, CMD_PTR); - if (ret < 0) - goto free_cf; - lls_free_parse_result(lpr, CMD_PTR); - lpr = merged_lpr; + PARA_EMERG_LOG("failed to parse config file: %s\n", + para_strerror(-ret)); + exit(EXIT_FAILURE); } daemon_set_loglevel(ENUM_STRING_VAL(LOGLEVEL)); - if (OPT_GIVEN(USER_ALLOW)) { - uint32_t n = OPT_GIVEN(USER_ALLOW); - int i; - - uid_whitelist = para_malloc(n * sizeof(uid_t)); - for (i = 0; i < n; i++) { - const char *arg = lls_string_val(i, - OPT_RESULT(USER_ALLOW)); - int32_t val; - struct passwd *pw; - ret = para_atoi32(arg, &val); - if (ret >= 0) { - uid_whitelist[i] = val; - continue; - } - errno = 0; /* see getpwnam(3) */ - pw = getpwnam(arg); - if (!pw) { - PARA_EMERG_LOG("invalid username: %s\n", arg); - free(uid_whitelist); - goto free_cf; - } - uid_whitelist[i] = pw->pw_uid; + n = OPT_GIVEN(USER_ALLOW); + if (n == 0) + return; + uid_whitelist = para_malloc(n * sizeof(uid_t)); + for (i = 0; i < n; i++) { + const char *arg = lls_string_val(i, OPT_RESULT(USER_ALLOW)); + int32_t val; + struct passwd *pw; + ret = para_atoi32(arg, &val); + if (ret >= 0) { + uid_whitelist[i] = val; + continue; } - } - ret = 0; -free_cf: - free(cf); - if (ret < 0) { - if (errctx) - PARA_ERROR_LOG("%s\n", errctx); - free(errctx); - lls_free_parse_result(lpr, CMD_PTR); - PARA_EMERG_LOG("%s\n", para_strerror(-ret)); - exit(EXIT_FAILURE); + pw = getpwnam(arg); + if (!pw) { + PARA_EMERG_LOG("invalid username: %s\n", arg); + exit(EXIT_FAILURE); + } + uid_whitelist[i] = pw->pw_uid; } } @@ -666,6 +618,7 @@ static int open_receiver(int format) EMBRACE(.name = name, .context = rn)); ret = r->open(rn); if (ret < 0) { + PARA_ERROR_LOG("could not open %s receiver\n", name); btr_remove_node(&rn->btrn); free(rn); return ret; @@ -801,38 +754,38 @@ static int update_item(int itemnum, char *buf) { long unsigned sec, usec; - if (stat_task->clock_diff_count && itemnum != SI_CURRENT_TIME) + if (stat_task->clock_diff_count && itemnum != SI_current_time) return 1; free(stat_item_values[itemnum]); stat_item_values[itemnum] = para_strdup(buf); stat_client_write_item(itemnum); switch (itemnum) { - case SI_STATUS_FLAGS: + case SI_status_flags: stat_task->vss_status = 0; if (strchr(buf, 'N')) stat_task->vss_status |= VSS_STATUS_FLAG_NEXT; if (strchr(buf, 'P')) stat_task->vss_status |= VSS_STATUS_FLAG_PLAYING; break; - case SI_OFFSET: + case SI_offset: stat_task->offset_seconds = atoi(buf); break; - case SI_SECONDS_TOTAL: + case SI_seconds_total: stat_task->length_seconds = atoi(buf); break; - case SI_STREAM_START: + case SI_stream_start: if (sscanf(buf, "%lu.%lu", &sec, &usec) == 2) { stat_task->server_stream_start.tv_sec = sec; stat_task->server_stream_start.tv_usec = usec; } break; - case SI_CURRENT_TIME: + case SI_current_time: if (sscanf(buf, "%lu.%lu", &sec, &usec) == 2) { struct timeval tv = {sec, usec}; compute_time_diff(&tv); } break; - case SI_FORMAT: + case SI_format: stat_task->current_audio_format_num = get_audio_format_num(buf); } @@ -1384,10 +1337,10 @@ static int status_post_select(struct sched *s, void *context) client_open(argc, argv, &st->ct, NULL, NULL, st->btrn, s); set_stat_task_restart_barrier(5); } - free(stat_item_values[SI_BASENAME]); - stat_item_values[SI_BASENAME] = para_strdup( + free(stat_item_values[SI_basename]); + stat_item_values[SI_basename] = para_strdup( "no connection to para_server"); - stat_client_write_item(SI_BASENAME); + stat_client_write_item(SI_basename); st->last_status_read = *now; out: start_stop_decoders(); @@ -1496,7 +1449,7 @@ int main(int argc, char *argv[]) version_handle_flag("audiod", OPT_GIVEN(VERSION)); handle_help_flags(); parse_config_or_die(); - init_random_seed_or_die(); + crypt_init(); daemon_set_priority(OPT_UINT32_VAL(PRIORITY)); recv_init(); if (daemon_init_colors_or_die(OPT_UINT32_VAL(COLOR), COLOR_AUTO, @@ -1545,7 +1498,7 @@ int main(int argc, char *argv[]) audiod_cleanup(); sched_shutdown(&sched); signal_shutdown(signal_task); - + crypt_shutdown(); out: lls_free_parse_result(lpr, CMD_PTR); if (errctx)