From 1a88eac02a513ed85f11a3c046d2ca0d7663e507 Mon Sep 17 00:00:00 2001 From: Lubomir Rintel Date: Thu, 23 Jun 2016 12:18:52 +0200 Subject: [PATCH] cli: split out do_cmd() --- clients/cli/common.c | 53 ++++++++++++++++++++++++++++++++++++++++++++ clients/cli/common.h | 8 +++++++ clients/cli/nmcli.c | 38 +++++++++---------------------- 3 files changed, 71 insertions(+), 28 deletions(-) diff --git a/clients/cli/common.c b/clients/cli/common.c index 0888f0630c..0267d6f67b 100644 --- a/clients/cli/common.c +++ b/clients/cli/common.c @@ -1389,3 +1389,56 @@ nmc_parse_lldp_capabilities (guint value) return g_string_free (str, FALSE); } + +/** + * nmc_do_cmd: + * @nmc: Client instance + * @cmds: Command table + * @cmd: Command + * @argc: Argument count + * @argv: Arguments vector + * + * Picks the right callback to handle command from the command table. + * If --help argument follows and the usage callback is specified for the command + * it calls the usage callback. + * + * The command table is terminated with a %NULL command. The terminating + * entry's handlers are called if the command is empty. + * + * Returns: a nmcli return code + */ +NMCResultCode +nmc_do_cmd (NmCli *nmc, const NMCCommand cmds[], const char *cmd, int argc, char **argv) +{ + const NMCCommand *c; + + for (c = cmds; c->cmd; ++c) { + if (cmd && matches (cmd, c->cmd) == 0) + break; + } + + if (c->cmd) { + /* A valid command was specified. */ + if (c->usage && nmc_arg_is_help (*(argv+1))) + c->usage (); + else + nmc->return_value = c->func (nmc, argc-1, argv+1); + } else if (cmd) { + /* Not a known command. */ + if (nmc_arg_is_help (cmd) && c->usage) { + c->usage (); + } else { + g_string_printf (nmc->return_text, _("Error: argument '%s' not understood. Try passing --help instead."), cmd); + nmc->return_value = NMC_RESULT_ERROR_USER_INPUT; + } + } else if (c->func) { + /* No command, run the default handler. */ + nmc->return_value = c->func (nmc, argc-1, argv+1); + } else { + /* No command and no default handler. */ + g_string_printf (nmc->return_text, _("Error: missing argument. Try passing --help.")); + nmc->return_value = NMC_RESULT_ERROR_USER_INPUT; + } + + return nmc->return_value; +} diff --git a/clients/cli/common.h b/clients/cli/common.h index 26459e4baa..79cd81a07d 100644 --- a/clients/cli/common.h +++ b/clients/cli/common.h @@ -73,4 +73,12 @@ int nmc_rl_set_deftext (void); char *nmc_parse_lldp_capabilities (guint value); +typedef struct { + const char *cmd; + NMCResultCode (*func) (NmCli *nmc, int argc, char **argv); + void (*usage) (void); +} NMCCommand; + +NMCResultCode nmc_do_cmd (NmCli *nmc, const NMCCommand cmds[], const char *argv0, int argc, char **argv); + #endif /* NMC_COMMON_H */ diff --git a/clients/cli/nmcli.c b/clients/cli/nmcli.c index a203e407c3..b921a27f0f 100644 --- a/clients/cli/nmcli.c +++ b/clients/cli/nmcli.c @@ -114,36 +114,18 @@ do_help (NmCli *nmc, int argc, char **argv) return NMC_RESULT_SUCCESS; } -static const struct cmd { - const char *cmd; - NMCResultCode (*func) (NmCli *nmc, int argc, char **argv); -} nmcli_cmds[] = { - { "general", do_general }, - { "monitor", do_monitor }, - { "networking", do_networking }, - { "radio", do_radio }, - { "connection", do_connections }, - { "device", do_devices }, - { "agent", do_agent }, - { "help", do_help }, +static const NMCCommand nmcli_cmds[] = { + { "general", do_general, NULL }, + { "monitor", do_monitor, NULL }, + { "networking", do_networking, NULL }, + { "radio", do_radio, NULL }, + { "connection", do_connections, NULL }, + { "device", do_devices, NULL }, + { "agent", do_agent, NULL }, + { "help", do_help, NULL }, { 0 } }; -static NMCResultCode -do_cmd (NmCli *nmc, const char *argv0, int argc, char **argv) -{ - const struct cmd *c; - - for (c = nmcli_cmds; c->cmd; ++c) { - if (matches (argv0, c->cmd) == 0) - return c->func (nmc, argc-1, argv+1); - } - - g_string_printf (nmc->return_text, _("Error: Object '%s' is unknown, try 'nmcli help'."), argv0); - nmc->return_value = NMC_RESULT_ERROR_USER_INPUT; - return nmc->return_value; -} - static NMCResultCode parse_command_line (NmCli *nmc, int argc, char **argv) { @@ -301,7 +283,7 @@ parse_command_line (NmCli *nmc, int argc, char **argv) if (argc > 1) { /* Now run the requested command */ - return do_cmd (nmc, argv[1], argc-1, argv+1); + return nmc_do_cmd (nmc, nmcli_cmds, argv[1], argc-1, argv+1); } usage (base);