[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen-unstable] xl: allow truncation of xl subcommands
# HG changeset patch # User Keir Fraser <keir.fraser@xxxxxxxxxx> # Date 1276866554 -3600 # Node ID c4216fa31a8e74eb142ac1a017cb0d67e63eebbb # Parent 3fdd864a79d32a765b389521d1f367e0424208fe xl: allow truncation of xl subcommands for those of us who are used to typing "xm cr foo" Signed-off-by: Tim Deegan <Tim.Deegan@xxxxxxxxxx> --- tools/libxl/xl.c | 25 +++++++++++-------------- tools/libxl/xl.h | 2 ++ tools/libxl/xl_cmdimpl.c | 22 +++++++++++----------- tools/libxl/xl_cmdtable.c | 23 +++++++++++++++++++++++ 4 files changed, 47 insertions(+), 25 deletions(-) diff -r 3fdd864a79d3 -r c4216fa31a8e tools/libxl/xl.c --- a/tools/libxl/xl.c Fri Jun 18 14:08:57 2010 +0100 +++ b/tools/libxl/xl.c Fri Jun 18 14:09:14 2010 +0100 @@ -37,8 +37,9 @@ static xentoollog_level minmsglevel = XT int main(int argc, char **argv) { - int opt = 0, i; + int opt = 0; char *cmd = 0; + struct cmd_spec *cspec; while ((opt = getopt(argc, argv, "+v")) >= 0) { switch (opt) { @@ -69,18 +70,14 @@ int main(int argc, char **argv) srand(time(0)); - for (i = 0; i < cmdtable_len; i++) { - if (!strcmp(cmd, cmd_table[i].cmd_name)) - cmd_table[i].cmd_impl(argc, argv); - } - - if (i >= cmdtable_len) { - if (!strcmp(cmd, "help")) { - help(argv[2]); - exit(0); - } else { - fprintf(stderr, "command not implemented\n"); - exit(1); - } + cspec = cmdtable_lookup(cmd); + if (cspec) + return cspec->cmd_impl(argc, argv); + else if (!strcmp(cmd, "help")) { + help(argv[2]); + exit(0); + } else { + fprintf(stderr, "command not implemented\n"); + exit(1); } } diff -r 3fdd864a79d3 -r c4216fa31a8e tools/libxl/xl.h --- a/tools/libxl/xl.h Fri Jun 18 14:08:57 2010 +0100 +++ b/tools/libxl/xl.h Fri Jun 18 14:09:14 2010 +0100 @@ -80,6 +80,8 @@ void help(char *command); extern struct cmd_spec cmd_table[]; extern int cmdtable_len; +/* Look up a command in the table, allowing unambiguous truncation */ +struct cmd_spec *cmdtable_lookup(const char *s); extern struct libxl_ctx ctx; extern xentoollog_logger_stdiostream *logger; diff -r 3fdd864a79d3 -r c4216fa31a8e tools/libxl/xl_cmdimpl.c --- a/tools/libxl/xl_cmdimpl.c Fri Jun 18 14:08:57 2010 +0100 +++ b/tools/libxl/xl_cmdimpl.c Fri Jun 18 14:09:14 2010 +0100 @@ -1282,6 +1282,7 @@ void help(char *command) void help(char *command) { int i; + struct cmd_spec *cmd; if (!command || !strcmp(command, "help")) { printf("Usage xl <subcommand> [args]\n\n"); @@ -1290,18 +1291,17 @@ void help(char *command) printf(" %-20s%s\n", cmd_table[i].cmd_name, cmd_table[i].cmd_desc); } else { - for (i = 0; i < cmdtable_len; i++) - if (!strcmp(command, cmd_table[i].cmd_name)) - break; - if (i == cmdtable_len) { - printf("command not implemented\n"); - } else { + cmd = cmdtable_lookup(command); + if (cmd) { printf("Usage: xl %s %s\n\n%s.\n\n", - cmd_table[i].cmd_name, - cmd_table[i].cmd_usage, - cmd_table[i].cmd_desc); - if (cmd_table[i].cmd_option) - printf("Options:\n\n%s\n", cmd_table[i].cmd_option); + cmd->cmd_name, + cmd->cmd_usage, + cmd->cmd_desc); + if (cmd->cmd_option) + printf("Options:\n\n%s\n", cmd->cmd_option); + } + else { + printf("command \"%s\" not implemented\n", command); } } } diff -r 3fdd864a79d3 -r c4216fa31a8e tools/libxl/xl_cmdtable.c --- a/tools/libxl/xl_cmdtable.c Fri Jun 18 14:08:57 2010 +0100 +++ b/tools/libxl/xl_cmdtable.c Fri Jun 18 14:09:14 2010 +0100 @@ -12,6 +12,8 @@ * GNU Lesser General Public License for more details. */ +#include <string.h> + #include "xl.h" struct cmd_spec cmd_table[] = { @@ -308,3 +310,24 @@ struct cmd_spec cmd_table[] = { }; int cmdtable_len = sizeof(cmd_table)/sizeof(struct cmd_spec); + +/* Look up a command in the table, allowing unambiguous truncation */ +struct cmd_spec *cmdtable_lookup(const char *s) +{ + struct cmd_spec *cmd = NULL; + size_t len; + int i; + + if (!s) + return NULL; + len = strlen(s); + for (i = 0; i < cmdtable_len; i++) { + if (!strncmp(s, cmd_table[i].cmd_name, len)) { + if (cmd == NULL) + cmd = &cmd_table[i]; + else + return NULL; + } + } + return cmd; +} _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |