X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=audiod.c;h=b93f29de4498c50f574e55c4c8b3e9a34dfe0aee;hp=083c2a7a1cef606a80afe4ec67b6c9f453fc5bf6;hb=7e611b37e41f0ec7ec6d3173b7e88ed5b9b3a276;hpb=53af5c6efb309565990203fd8504a812ec9166c9 diff --git a/audiod.c b/audiod.c index 083c2a7a..b93f29de 100644 --- a/audiod.c +++ b/audiod.c @@ -17,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" @@ -378,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; } }