Mailing List Archive

[xen-unstable] xl: allow truncation of xl subcommands
# HG changeset patch
# User Keir Fraser <keir.fraser@citrix.com>
# 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@citrix.com>
---
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@lists.xensource.com
http://lists.xensource.com/xen-changelog