[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


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.