From 3f26d08dbcdc2dcafa6f6ca73421516254decd94 Mon Sep 17 00:00:00 2001
From: Andre Noll <maan@tuebingen.mpg.de>
Date: Tue, 17 Oct 2017 19:11:07 +0200
Subject: [PATCH] Save the subcommand pointer in a global variable.

This is needed for subcommand sensitive logging which will be
introduced in a subsequent commit. For now it allows to drop the
argument of check_config(), which is good given that handle_sighup()
already played dirty games by "knowing" it is only called from the
run subcommand.
---
 dss.c | 31 ++++++++++++++++---------------
 1 file changed, 16 insertions(+), 15 deletions(-)

diff --git a/dss.c b/dss.c
index 366f6e2..54d6e42 100644
--- a/dss.c
+++ b/dss.c
@@ -63,6 +63,8 @@ static struct lls_parse_result *cmdline_lpr, *lpr;
 
 /** Parsed subcommand options. */
 static struct lls_parse_result *cmdline_sublpr, *sublpr;
+/* The executing subcommand (NULL at startup). */
+static const struct lls_command *subcmd;
 /** Wether daemon_init() was called. */
 static bool daemonized;
 /** Non-NULL if we log to a file. */
@@ -1066,7 +1068,7 @@ static int change_to_dest_dir(void)
 	return ret;
 }
 
-static int check_config(const struct lls_command *cmd)
+static int check_config(void)
 {
 	int ret;
 	uint32_t unit_interval = OPT_UINT32_VAL(DSS, UNIT_INTERVAL);
@@ -1082,13 +1084,13 @@ static int check_config(const struct lls_command *cmd)
 		DSS_ERROR_LOG(("bad number of intervals: %i\n", num_intervals));
 		return -E_INVALID_NUMBER;
 	}
-	if (cmd == CMD_PTR(RUN) || cmd == CMD_PTR(CREATE))
+	if (subcmd == CMD_PTR(RUN) || subcmd == CMD_PTR(CREATE))
 		if (!OPT_GIVEN(DSS, SOURCE_DIR)) {
 			DSS_ERROR_LOG(("--source-dir required\n"));
 			return -E_SYNTAX;
 		}
-	if (cmd == CMD_PTR(RUN) || cmd == CMD_PTR(CREATE)
-			|| cmd == CMD_PTR(LS) || cmd == CMD_PTR(PRUNE)) {
+	if (subcmd == CMD_PTR(RUN) || subcmd == CMD_PTR(CREATE)
+			|| subcmd == CMD_PTR(LS) || subcmd == CMD_PTR(PRUNE)) {
 		if (!OPT_GIVEN(DSS, DEST_DIR)) {
 			DSS_ERROR_LOG(("--dest-dir required\n"));
 			return -E_SYNTAX;
@@ -1226,7 +1228,7 @@ static int handle_sighup(void)
 	ret = parse_config_file(true /* SIGHUP */, CMD_PTR(RUN));
 	if (ret < 0)
 		return ret;
-	ret = check_config(CMD_PTR(RUN));
+	ret = check_config();
 	if (ret < 0)
 		return ret;
 	close_log(logfile);
@@ -1745,18 +1747,17 @@ static void show_subcommand_summary(void)
 int main(int argc, char **argv)
 {
 	int ret;
-	const struct lls_command *cmd = CMD_PTR(DSS);
 	char *errctx = NULL;
 	unsigned num_inputs;
 	const struct dss_user_data *ud;
 
-	ret = lls_parse(argc, argv, cmd, &cmdline_lpr, &errctx);
+	ret = lls_parse(argc, argv, CMD_PTR(DSS), &cmdline_lpr, &errctx);
 	if (ret < 0) {
 		ret = lopsub_error(ret, &errctx);
 		goto out;
 	}
 	lpr = cmdline_lpr;
-	ret = parse_config_file(false /* no SIGHUP */, cmd);
+	ret = parse_config_file(false /* no SIGHUP */, CMD_PTR(DSS));
 	if (ret < 0)
 		goto out;
 	handle_version_and_help();
@@ -1768,24 +1769,24 @@ int main(int argc, char **argv)
 		ret = lopsub_error(ret, &errctx);
 		goto out;
 	}
-	cmd = lls_cmd(ret, dss_suite);
-	ret = lls_parse(num_inputs, argv + argc - num_inputs, cmd,
+	subcmd = lls_cmd(ret, dss_suite);
+	ret = lls_parse(num_inputs, argv + argc - num_inputs, subcmd,
 		&cmdline_sublpr, &errctx);
 	if (ret < 0) {
 		ret = lopsub_error(ret, &errctx);
 		goto out;
 	}
 	sublpr = cmdline_sublpr;
-	ret = parse_config_file(false /* no SIGHUP */, cmd);
+	ret = parse_config_file(false /* no SIGHUP */, subcmd);
 	if (ret < 0)
 		goto out;
-	ret = check_config(cmd);
+	ret = check_config();
 	if (ret < 0)
 		goto out;
 	ret = setup_signal_handling();
 	if (ret < 0)
 		goto out;
-	ud = lls_user_data(cmd);
+	ud = lls_user_data(subcmd);
 	ret = ud->handler();
 	signal_shutdown();
 out:
@@ -1798,8 +1799,8 @@ out:
 	lls_free_parse_result(lpr, CMD_PTR(DSS));
 	if (lpr != cmdline_lpr)
 		lls_free_parse_result(cmdline_lpr, CMD_PTR(DSS));
-	lls_free_parse_result(sublpr, cmd);
+	lls_free_parse_result(sublpr, subcmd);
 	if (sublpr != cmdline_sublpr)
-		lls_free_parse_result(cmdline_sublpr, cmd);
+		lls_free_parse_result(cmdline_sublpr, subcmd);
 	exit(ret >= 0? EXIT_SUCCESS : EXIT_FAILURE);
 }
-- 
2.39.5