cli: split out do_cmd()

This commit is contained in:
Lubomir Rintel 2016-06-23 12:18:52 +02:00
parent a30224f6af
commit 1a88eac02a
3 changed files with 71 additions and 28 deletions

View file

@ -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;
}

View file

@ -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 */

View file

@ -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);