From: Tokunori Ikegami Date: Sun, 13 Jun 2021 16:00:21 +0000 (+0900) Subject: plugin: Allow to handle complementable short command X-Git-Tag: v2.0-rc0~72^2 X-Git-Url: https://www.infradead.org/git/?a=commitdiff_plain;h=b1f7700ea46dd4626e2974155e6b9d68a6886e33;p=users%2Fsagi%2Fnvme-cli.git plugin: Allow to handle complementable short command Signed-off-by: Tokunori Ikegami --- diff --git a/plugin.c b/plugin.c index c7d6b2e1..5e89a39a 100644 --- a/plugin.c +++ b/plugin.c @@ -121,12 +121,13 @@ void general_help(struct plugin *plugin) int handle_plugin(int argc, char **argv, struct plugin *plugin) { - unsigned i = 0; char *str = argv[0]; char use[0x100]; - struct plugin *extension; struct program *prog = plugin->parent; + struct command **cmd = plugin->commands; + struct command *cr = NULL; + bool cr_valid = false; if (!argc) { general_help(plugin); @@ -148,18 +149,29 @@ int handle_plugin(int argc, char **argv, struct plugin *plugin) if (!strcmp(str, "version")) return version(plugin); - for (; plugin->commands[i]; i++) { - struct command *cmd = plugin->commands[i]; - - if (strcmp(str, cmd->name)) - if (!cmd->alias || (cmd->alias && strcmp(str, cmd->alias))) - continue; + while (*cmd) { + if (!strcmp(str, (*cmd)->name) || + ((*cmd)->alias && !strcmp(str, (*cmd)->alias))) + return (*cmd)->fn(argc, argv, *cmd, plugin); + if (!strncmp(str, (*cmd)->name, strlen(str))) { + if (cr) { + cr_valid = false; + } else { + cr = *cmd; + cr_valid = true; + } + } + cmd++; + } - return (cmd->fn(argc, argv, cmd, plugin)); + if (cr && cr_valid) { + sprintf(use, "%s %s [OPTIONS]", prog->name, cr->name); + argconfig_append_usage(use); + return cr->fn(argc, argv, cr, plugin); } /* Check extensions only if this is running the built-in plugin */ - if (plugin->name) { + if (plugin->name) { printf("ERROR: Invalid sub-command '%s' for plugin %s\n", str, plugin->name); return -ENOTTY; }