[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