
On 12.09.2016 10:20, Erik Skultety wrote:
Change the logic in a way, so that VSH_CMD_FLAG_ALIAS behaves similarly to how VSH_OT_ALIAS for command options, i.e. there is no need for code duplication for the alias and the aliased command structures. Along with that change, switch any existing VSH_CMD_FLAG_ALIAS occurrences to this new format.
Signed-off-by: Erik Skultety <eskultet@redhat.com> --- tools/virsh-nodedev.c | 6 ++---- tools/virsh.c | 3 ++- tools/vsh.c | 6 ++++++ tools/vsh.h | 1 + 4 files changed, 11 insertions(+), 5 deletions(-)
diff --git a/tools/virsh-nodedev.c b/tools/virsh-nodedev.c index 321f15c..9446664 100644 --- a/tools/virsh-nodedev.c +++ b/tools/virsh-nodedev.c @@ -986,10 +986,8 @@ const vshCmdDef nodedevCmds[] = { .flags = 0 }, {.name = "nodedev-dettach", - .handler = cmdNodeDeviceDetach, - .opts = opts_node_device_detach, - .info = info_node_device_detach, - .flags = VSH_CMD_FLAG_ALIAS + .flags = VSH_CMD_FLAG_ALIAS, + .alias = "nodedev-detach"
I think that if we do this we should just stop using the misspelled version. I mean, drop it from the man page, do not offer it for autocompletion. Also, you need to update vshCmddefCheckInternals() to check whether all commands passing VSH_CMD_FLAG_ALIAS also set .alias. Otherwise we will segfault later.
}, {.name = "nodedev-dumpxml", .handler = cmdNodeDeviceDumpXML, diff --git a/tools/virsh.c b/tools/virsh.c index cb60edc..60fb02b 100644 --- a/tools/virsh.c +++ b/tools/virsh.c @@ -904,7 +904,8 @@ static const vshCmdDef virshCmds[] = { .handler = cmdSelfTest, .opts = NULL, .info = info_selftest, - .flags = VSH_CMD_FLAG_NOCONNECT | VSH_CMD_FLAG_ALIAS + .flags = VSH_CMD_FLAG_NOCONNECT | VSH_CMD_FLAG_ALIAS, + .alias = "self-test"
So this is just for demonstration purposes? It seems so to me.
}, {.name = NULL} }; diff --git a/tools/vsh.c b/tools/vsh.c index be6a073..ad3e1c7 100644 --- a/tools/vsh.c +++ b/tools/vsh.c @@ -1410,6 +1410,12 @@ vshCommandParse(vshControl *ctl, vshCommandParser *parser) vshError(ctl, _("unknown command: '%s'"), tkdata); goto syntaxError; /* ... or ignore this command only? */ } + /* aliases need to be resolved to the actual commands */ + if (cmd->flags & VSH_CMD_FLAG_ALIAS) { + VIR_FREE(tkdata); + tkdata = vshStrdup(ctl, cmd->alias);
See? If cmd->alias is NULL (because somebody set the _ALIAS flag but haven't provided .alias), tkdata is gonna be NULL.
+ cmd = vshCmddefSearch(tkdata);
Which in turn means, we segfault here. Also, we must not offer those commands who have .alias for autocompletion.
+ } if (vshCmddefOptParse(cmd, &opts_need_arg, &opts_required) < 0) { vshError(ctl, diff --git a/tools/vsh.h b/tools/vsh.h index e53910f..e383e54 100644 --- a/tools/vsh.h +++ b/tools/vsh.h @@ -179,6 +179,7 @@ struct _vshCmdDef { const vshCmdOptDef *opts; /* definition of command options */ const vshCmdInfo *info; /* details about command */ unsigned int flags; /* bitwise OR of VSH_CMD_FLAG */ + const char *alias; /* name of the aliased command */ };
/*
Michal