#include "recv_cmd.lsg.h"
#include "para.h"
#include "error.h"
+#include "lsu.h"
#include "crypt.h"
#include "list.h"
#include "sched.h"
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;
}
}