From: Andre Noll <maan@tuebingen.mpg.de>
Date: Wed, 14 Mar 2018 23:04:06 +0000 (+0100)
Subject: audiod: Use lsu_merge_config_file_options().
X-Git-Tag: v0.6.2~2^2~5
X-Git-Url: https://git.tuebingen.mpg.de/?a=commitdiff_plain;h=d4603bf234d23adb56b208efb90ce66772c4ef5b;p=paraslash.git

audiod: Use lsu_merge_config_file_options().

Besides reading and merging the config file, parse_config_or_die()
also creates the uid whitelist. This part has to be retained, but we
can reduce the indentation level by returning early if --user-allow
was not given.
---

diff --git a/audiod.c b/audiod.c
index 8d152fa6..47bf2e27 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;
 	}
 }