[Accel-config] [PATCH] accel-config: Fix --help and other options

Ramesh Thomas <[email protected]> Wed, 30 Aug 2023 16:06:39 -0700
Newsgroups dev.linux.lists.accel-config
Message-ID <[email protected]>
Options like --help, --version and --list-cmds don't need the idxd
driver to be loaded. Process them before checking for idxd driver being
loaded. Also make the options more intuitive.

Signed-off-by: Ramesh Thomas <[email protected]>
---
 accfg/accel-config.c | 60 ++++------------------------
 builtin.h            |  1 -
 util/main.c          | 94 +++++++++++++++++++-------------------------
 util/main.h          |  2 +-
 4 files changed, 50 insertions(+), 107 deletions(-)

diff --git a/accfg/accel-config.c b/accfg/accel-config.c
index cf3882e..616f2e5 100644
--- a/accfg/accel-config.c
+++ b/accfg/accel-config.c
@@ -15,50 +15,16 @@
 #include <util/util.h>
 #include <util/main.h>
 
-const char accfg_usage_string[] = "accel-config [--version] [--help] COMMAND [ARGS]";
-const char accfg_more_info_string[] =
-    "See 'accel-config help COMMAND' for more information on a specific command.\n"
-    " accel-config --list-cmds to see all available commands";
-
-static int cmd_version(int argc, const char **argv, void *ctx)
-{
-	printf("%s\n", VERSION);
-	return 0;
-}
-
-static int cmd_help(int argc, const char **argv, void *ctx)
-{
-	const char *const builtin_help_subcommands[] = {
-		"enable-workqueue", "disable-workqueue",
-		"enable-group", "disable-group", NULL
-	};
-	struct option builtin_help_options[] = {
-		OPT_END(),
-	};
-	const char *builtin_help_usage[] = {
-		"accel-config help [command]",
-		NULL
-	};
-
-	parse_options_subcommand(argc, argv, builtin_help_options,
-					builtin_help_subcommands,
-					builtin_help_usage, 0);
-
-	if (!argv[0]) {
-		printf("\n usage: %s\n\n", accfg_usage_string);
-		printf("\n %s\n\n", accfg_more_info_string);
-		return 0;
-	}
-
-	return help_show_man_page(argv[0], "accel-config", "ACCFG_MAN_VIEWER");
-}
+const char accfg_usage_string[] =
+	"accel-config [--list-cmds] [-h | --help] [-v | --version] COMMAND [ARGS]\n\n"
+	" 'accel-config --help COMMAND' for information on a specific command\n"
+	" 'accel-config --list-cmds' for a list of available commands\n"
+	" 'accel-config --version' for version info";
 
 static struct cmd_struct commands[] = {
-	{"version", cmd_version},
 	{"list", cmd_list},
 	{"load-config", cmd_config},
 	{"save-config",  cmd_save},
-	{"help", cmd_help},
 	{"disable-device", cmd_disable_device},
 	{"enable-device", cmd_enable_device},
 	{"disable-wq", cmd_disable_wq},
@@ -80,21 +46,9 @@ int main(int argc, const char **argv)
 	int rc;
 
 	/* Look for flags.. */
-	argv++;
-	argc--;
-	main_handle_options(&argv, &argc, accfg_usage_string, commands,
+	main_handle_options(argv, argc, accfg_usage_string, commands,
 			    ARRAY_SIZE(commands));
 
-	if (argc > 0) {
-		if (!prefixcmp(argv[0], "--"))
-			argv[0] += 2;
-	} else {
-		/* The user didn't specify a command; give them help */
-		printf("\n usage: %s\n\n", accfg_usage_string);
-		printf("\n %s\n\n", accfg_more_info_string);
-		return -EINVAL;
-	}
-
 	if (access("/sys/module/idxd", F_OK)) {
 		fprintf(stderr, "idxd kernel module not loaded\n");
 		return EXIT_FAILURE;
@@ -104,6 +58,8 @@ int main(int argc, const char **argv)
 	if (rc)
 		goto error_exit;
 
+	argv++;
+	argc--;
 	rc = main_handle_internal_command(argc, argv, ctx, commands,
 				     ARRAY_SIZE(commands));
 
diff --git a/builtin.h b/builtin.h
index 96a9d61..9554ee5 100644
--- a/builtin.h
+++ b/builtin.h
@@ -13,7 +13,6 @@
 #ifndef _ACCFG_BUILTIN_H_
 #define _ACCFG_BUILTIN_H_
 extern const char accfg_usage_string[];
-extern const char accfg_more_info_string[];
 
 struct cmd_struct {
 	const char *cmd;
diff --git a/util/main.c b/util/main.c
index 2bf7796..8ce42dc 100644
--- a/util/main.c
+++ b/util/main.c
@@ -25,77 +25,65 @@
 
 #include <util/strbuf.h>
 #include <util/util.h>
+#include <util/main.h>
 
-int main_handle_options(const char ***argv, int *argc, const char *usage_msg,
+void main_handle_options(const char **argv, int argc, const char *usage_msg,
 		struct cmd_struct *cmds, int num_cmds)
 {
-	int handled = 0;
-
-	while (*argc > 0) {
-		const char *cmd = (*argv)[0];
-		if (cmd[0] != '-')
-			break;
-
-		if (!strcmp(cmd, "--version") || !strcmp(cmd, "--help"))
-			break;
-
-		/*
-		 * Shortcut for '-h' and '-v' options to invoke help
-		 * and version command.
-		 */
-		if (!strcmp(cmd, "-h")) {
-			(*argv)[0] = "--help";
-			break;
-		}
-
-		if (!strcmp(cmd, "-v")) {
-			(*argv)[0] = "--version";
-			break;
-		}
+	int i;
 
-		if (!strcmp(cmd, "--list-cmds")) {
-			int i;
+	if (argc < 2) {
+		help_show_man_page(NULL, argv[0], "ACCFG_MAN_VIEWER");
+		goto exit_app;
+	}
 
-			for (i = 0; i < num_cmds; i++) {
-				struct cmd_struct *p = cmds+i;
+	if (!strcmp(argv[1], "--version") || !strcmp(argv[1], "-v")) {
+		printf("%s\n", VERSION);
+		exit(0);
+	}
 
-				/* filter out commands from auto-complete */
-				if (strcmp(p->cmd, "create-nfit") == 0)
-					continue;
-				if (strcmp(p->cmd, "test") == 0)
-					continue;
-				if (strcmp(p->cmd, "bat") == 0)
-					continue;
-				printf("%s\n", p->cmd);
+	if (argv[1][0] != '-') {
+		for (i = 0; i < num_cmds; i++)
+			if (!strcmp(argv[1], cmds[i].cmd)) {
+				if (argc > 2 &&
+						(!strcmp(argv[2], "--help") ||
+						 !strcmp(argv[2], "-h"))) {
+					help_show_man_page(argv[1], argv[0],
+							"ACCFG_MAN_VIEWER");
+					goto exit_app;
+				} else
+					return;
 			}
-			exit(0);
-		} else {
-			fprintf(stderr, "Unknown option: %s\n", cmd);
-			usage(usage_msg);
-		}
+		fprintf(stderr, "Unknown command: '%s'\n", argv[1]);
+		goto exit_app;
+	}
+
+	if (!strcmp(argv[1], "--help") || !strcmp(argv[1], "-h")) {
+		if (argc > 2)
+			help_show_man_page(argv[2], argv[0], "ACCFG_MAN_VIEWER");
+		else
+			help_show_man_page(NULL, argv[0], "ACCFG_MAN_VIEWER");
+	}
 
-		(*argv)++;
-		(*argc)--;
-		handled++;
+	if (!strcmp(argv[1], "--list-cmds")) {
+		for (i = 0; i < num_cmds; i++)
+			printf("%s %s\n", argv[0], cmds[i].cmd);
+		exit(0);
 	}
-	return handled;
+
+exit_app:
+	/* Exits app if not already */
+	usage(usage_msg);
 }
 
 int main_handle_internal_command(int argc, const char **argv, void *ctx,
 		struct cmd_struct *cmds, int num_cmds)
 {
-	const char *cmd = argv[0];
 	int i;
 
-	/* Turn "<binary> cmd --help" into "<binary> help cmd" */
-	if (argc > 1 && !strcmp(argv[1], "--help")) {
-		argv[1] = argv[0];
-		argv[0] = cmd = "help";
-	}
-
 	for (i = 0; i < num_cmds; i++) {
 		struct cmd_struct *p = cmds+i;
-		if (strcmp(p->cmd, cmd))
+		if (strcmp(p->cmd, argv[0]))
 			continue;
 		return p->fn(argc, argv, ctx);
 	}
diff --git a/util/main.h b/util/main.h
index cccba7a..0f031f2 100644
--- a/util/main.h
+++ b/util/main.h
@@ -17,7 +17,7 @@
 #ifndef __MAIN_H__
 #define __MAIN_H__
 struct cmd_struct;
-int main_handle_options(const char ***argv, int *argc, const char *usage_msg,
+void main_handle_options(const char **argv, int argc, const char *usage_msg,
 		struct cmd_struct *cmds, int num_cmds);
 int main_handle_internal_command(int argc, const char **argv, void *ctx,
 		struct cmd_struct *cmds, int num_cmds);
-- 
2.34.1