From b01605d7062e4d1f005d5aaaaed158d8efe06d79 Mon Sep 17 00:00:00 2001
From: Andre Noll <maan@systemlinux.org>
Date: Mon, 1 Apr 2013 22:52:20 +0000
Subject: [PATCH] Avoid unwanted log messages during startup.

Regardless of the given loglevel, para_recv currently prints log
messages like these at startup:

	afh_init: initializing mp3 handler
	afh_init: initializing ogg handler
	afh_init: initializing aac handler
	afh_init: initializing wma handler
	afh_init: initializing spx handler
	afh_init: initializing flac handler

That's because recv_init() is called before the command line arguments
are parsed, so the loglevel has not been set at this point. Other
programs have similar problems.

Fix these problems by always setting the loglevel right after a parser
has been called so that the init functions run *after* loglevel has
been set.
---
 afh.c    |  2 +-
 audioc.c |  3 ++-
 audiod.c |  6 ++++--
 fade.c   |  3 ++-
 filter.c |  9 +++++----
 gui.c    |  3 ++-
 play.c   |  3 ++-
 recv.c   | 29 ++++++++++++-----------------
 server.c |  3 ++-
 write.c  |  4 ++--
 10 files changed, 34 insertions(+), 31 deletions(-)

diff --git a/afh.c b/afh.c
index 4c65d7c1..699a6d8f 100644
--- a/afh.c
+++ b/afh.c
@@ -72,8 +72,8 @@ int main(int argc, char **argv)
 	struct afh_info afhi;
 
 	afh_cmdline_parser(argc, argv, &conf);
-	HANDLE_VERSION_FLAG("afh", conf);
 	loglevel = get_loglevel_by_name(conf.loglevel_arg);
+	HANDLE_VERSION_FLAG("afh", conf);
 	ret = -E_AFH_SYNTAX;
 	if (conf.inputs_num == 0)
 		goto out;
diff --git a/audioc.c b/audioc.c
index b0f822b7..6a886718 100644
--- a/audioc.c
+++ b/audioc.c
@@ -287,6 +287,7 @@ int main(int argc, char *argv[])
 
 	audioc_cmdline_parser(argc, argv, &conf);
 	HANDLE_VERSION_FLAG("audioc", conf);
+	loglevel = get_loglevel_by_name(conf.loglevel_arg);
 	cf = configfile_exists();
 	if (cf) {
 		struct audioc_cmdline_parser_params params = {
@@ -299,8 +300,8 @@ int main(int argc, char *argv[])
 		};
 		audioc_cmdline_parser_config_file(cf, &conf, &params);
 		free(cf);
+		loglevel = get_loglevel_by_name(conf.loglevel_arg);
 	}
-	loglevel = get_loglevel_by_name(conf.loglevel_arg);
 	if (conf.socket_given)
 		socket_name = para_strdup(conf.socket_arg);
 	else {
diff --git a/audiod.c b/audiod.c
index 4100d414..e3e3bd9a 100644
--- a/audiod.c
+++ b/audiod.c
@@ -343,10 +343,11 @@ static void parse_config_or_die(void)
 		PARA_EMERG_LOG("can not read config file %s\n", config_file);
 		goto err;
 	}
-	if (ret)
+	if (ret) {
 		audiod_cmdline_parser_config_file(config_file, &conf, &params);
+		daemon_set_loglevel(conf.loglevel_arg);
+	}
 	free(config_file);
-	daemon_set_loglevel(conf.loglevel_arg);
 	return;
 err:
 	free(config_file);
@@ -1352,6 +1353,7 @@ int main(int argc, char *argv[])
 	valid_fd_012();
 	audiod_cmdline_parser_ext(argc, argv, &conf, &params);
 	HANDLE_VERSION_FLAG("audiod", conf);
+	daemon_set_loglevel(conf.loglevel_arg);
 	/* init receivers/filters/writers early to make help work */
 	recv_init();
 	filter_init();
diff --git a/fade.c b/fade.c
index d2ab8287..e6f550a1 100644
--- a/fade.c
+++ b/fade.c
@@ -294,6 +294,7 @@ int main(int argc, char *argv[])
 
 	fade_cmdline_parser(argc, argv, &conf);
 	HANDLE_VERSION_FLAG("fade", conf);
+	loglevel = get_loglevel_by_name(conf.loglevel_arg);
 	ret = configfile_exists();
 	if (!ret && conf.config_file_given) {
 		PARA_EMERG_LOG("can not read config file %s\n",
@@ -310,8 +311,8 @@ int main(int argc, char *argv[])
 		};
 		fade_cmdline_parser_config_file(conf.config_file_arg,
 			&conf, &params);
+		loglevel = get_loglevel_by_name(conf.loglevel_arg);
 	}
-	loglevel = get_loglevel_by_name(conf.loglevel_arg);
 	init_mixers();
 	m = get_mixer_or_die();
 	ret = m->open(conf.mixer_device_arg, &h);
diff --git a/filter.c b/filter.c
index 84ad8577..c6af586d 100644
--- a/filter.c
+++ b/filter.c
@@ -60,16 +60,14 @@ __noreturn static void print_help_and_die(void)
 	exit(0);
 }
 
-static int parse_config(int argc, char *argv[])
+static int parse_config(void)
 {
 	static char *cf; /* config file */
 	struct stat statbuf;
 
-	filter_cmdline_parser(argc, argv, &conf);
 	HANDLE_VERSION_FLAG("filter", conf);
 	if (conf.help_given || conf.detailed_help_given)
 		print_help_and_die();
-	loglevel = get_loglevel_by_name(conf.loglevel_arg);
 	if (!cf) {
 		char *home = para_homedir();
 		cf = make_message("%s/.paraslash/filter.conf", home);
@@ -84,6 +82,7 @@ static int parse_config(int argc, char *argv[])
 			.print_errors = 1
 		};
 		filter_cmdline_parser_config_file(cf, &conf, &params);
+		loglevel = get_loglevel_by_name(conf.loglevel_arg);
 	}
 	if (!conf.filter_given)
 		return -E_NO_FILTERS;
@@ -110,8 +109,10 @@ int main(int argc, char *argv[])
 	struct btr_node *parent;
 	struct filter_node **fns;
 
+	filter_cmdline_parser(argc, argv, &conf); /* aborts on errors */
+	loglevel = get_loglevel_by_name(conf.loglevel_arg);
 	filter_init();
-	ret = parse_config(argc, argv);
+	ret = parse_config();
 	if (ret < 0)
 		goto out;
 	sit->btrn = btr_new_node(&(struct btr_node_description)
diff --git a/gui.c b/gui.c
index e157dd1a..5092315e 100644
--- a/gui.c
+++ b/gui.c
@@ -1521,6 +1521,7 @@ int main(int argc, char *argv[])
 
 	gui_cmdline_parser(argc, argv, &conf); /* exits on errors */
 	HANDLE_VERSION_FLAG("gui", conf);
+	loglevel = get_loglevel_by_name(conf.loglevel_arg);
 	cf = configfile_exists();
 	if (!cf && conf.config_file_given) {
 		fprintf(stderr, "can not read config file %s\n",
@@ -1536,8 +1537,8 @@ int main(int argc, char *argv[])
 			.print_errors = 1,
 		};
 		gui_cmdline_parser_config_file(cf, &conf, &params);
+		loglevel = get_loglevel_by_name(conf.loglevel_arg);
 	}
-	loglevel = get_loglevel_by_name(conf.loglevel_arg);
 	if (check_key_map_args() < 0) {
 		fprintf(stderr, "invalid key map\n");
 		exit(EXIT_FAILURE);
diff --git a/play.c b/play.c
index 83d28514..814ec16a 100644
--- a/play.c
+++ b/play.c
@@ -178,9 +178,9 @@ static void parse_config_or_die(int argc, char *argv[])
 
 	play_cmdline_parser_ext(argc, argv, &conf, &params);
 	HANDLE_VERSION_FLAG("play", conf);
+	loglevel = get_loglevel_by_name(conf.loglevel_arg);
 	if (conf.help_given || conf.detailed_help_given)
 		print_help_and_die();
-	loglevel = get_loglevel_by_name(conf.loglevel_arg);
 	if (conf.config_file_given)
 		config_file = para_strdup(conf.config_file_arg);
 	else {
@@ -197,6 +197,7 @@ static void parse_config_or_die(int argc, char *argv[])
 		params.initialize = 0;
 		params.check_required = 1;
 		play_cmdline_parser_config_file(config_file, &conf, &params);
+		loglevel = get_loglevel_by_name(conf.loglevel_arg);
 	}
 	for (i = 0; i < conf.key_map_given; i++) {
 		char *s = strchr(conf.key_map_arg[i] + 1, ':');
diff --git a/recv.c b/recv.c
index b03c5714..bc727de0 100644
--- a/recv.c
+++ b/recv.c
@@ -52,16 +52,6 @@ __noreturn static void print_help_and_die(void)
 	exit(0);
 }
 
-static void *parse_config(int argc, char *argv[], int *receiver_num)
-{
-	recv_cmdline_parser(argc, argv, &conf);
-	HANDLE_VERSION_FLAG("recv", conf);
-	if (conf.help_given || conf.detailed_help_given)
-		print_help_and_die();
-	loglevel = get_loglevel_by_name(conf.loglevel_arg);
-	return check_receiver_arg(conf.receiver_arg, receiver_num);
-}
-
 /**
  * The main function of para_recv.
  *
@@ -81,16 +71,18 @@ int main(int argc, char *argv[])
 	struct stdout_task sot;
 	static struct sched s;
 
-	s.default_timeout.tv_sec = 1;
-	s.default_timeout.tv_usec = 0;
+	recv_cmdline_parser(argc, argv, &conf);
+	loglevel = get_loglevel_by_name(conf.loglevel_arg);
+	HANDLE_VERSION_FLAG("recv", conf);
+	recv_init();
+	if (conf.help_given || conf.detailed_help_given)
+		print_help_and_die();
 
-	memset(&sot, 0, sizeof(struct stdout_task));
 	memset(&rn, 0, sizeof(struct receiver_node));
-	recv_init();
-	ret = -E_RECV_SYNTAX;
-	rn.conf = parse_config(argc, argv, &receiver_num);
+	rn.conf = check_receiver_arg(conf.receiver_arg, &receiver_num);
 	if (!rn.conf) {
-		PARA_EMERG_LOG("parse failed\n");
+		PARA_EMERG_LOG("invalid receiver specifier\n");
+		ret = -E_RECV_SYNTAX;
 		goto out;
 	}
 	r = &receivers[receiver_num];
@@ -102,6 +94,7 @@ int main(int argc, char *argv[])
 		goto out;
 	r_opened = 1;
 
+	memset(&sot, 0, sizeof(struct stdout_task));
 	sot.btrn = btr_new_node(&(struct btr_node_description)
 		EMBRACE(.parent = rn.btrn, .name = "stdout"));
 	stdout_set_defaults(&sot);
@@ -112,6 +105,8 @@ int main(int argc, char *argv[])
 	sprintf(rn.task.status, "%s", r->name);
 	register_task(&s, &rn.task);
 
+	s.default_timeout.tv_sec = 1;
+	s.default_timeout.tv_usec = 0;
 	ret = schedule(&s);
 out:
 	if (r_opened)
diff --git a/server.c b/server.c
index f3d5237f..31d29c73 100644
--- a/server.c
+++ b/server.c
@@ -236,13 +236,13 @@ void parse_config_or_die(int override)
 			.print_errors = !conf.daemon_given
 		};
 		server_cmdline_parser_config_file(cf, &conf, &params);
+		daemon_set_loglevel(conf.loglevel_arg);
 		conf.daemon_given = tmp;
 	}
 	if (conf.logfile_given) {
 		daemon_set_logfile(conf.logfile_arg);
 		daemon_open_log_or_die();
 	}
-	daemon_set_loglevel(conf.loglevel_arg);
 	init_colors_or_die();
 	daemon_set_flag(DF_LOG_PID);
 	daemon_set_flag(DF_LOG_LL);
@@ -490,6 +490,7 @@ static void server_init(int argc, char **argv)
 	server_cmdline_parser_ext(argc, argv, &conf, &params);
 	HANDLE_VERSION_FLAG("server", conf);
 	drop_privileges_or_die(conf.user_arg, conf.group_arg);
+	daemon_set_loglevel(conf.loglevel_arg);
 	/* parse config file, open log and set defaults */
 	parse_config_or_die(0);
 	log_welcome("para_server");
diff --git a/write.c b/write.c
index 866ea433..f4f757ff 100644
--- a/write.c
+++ b/write.c
@@ -107,7 +107,6 @@ static int setup_and_schedule(void)
 		},
 	};
 
-	loglevel = get_loglevel_by_name(conf.loglevel_arg);
 	sit.btrn = btr_new_node(&(struct btr_node_description)
 		EMBRACE(.name = "stdin"));
 	stdin_set_defaults(&sit);
@@ -173,8 +172,9 @@ int main(int argc, char *argv[])
 {
 	int ret;
 
-	writer_init();
 	write_cmdline_parser(argc, argv, &conf);
+	loglevel = get_loglevel_by_name(conf.loglevel_arg);
+	writer_init();
 	HANDLE_VERSION_FLAG("write", conf);
 	if (conf.help_given || conf.detailed_help_given)
 		print_help_and_die();
-- 
2.39.5