]> xenbits.xensource.com Git - libvirt.git/commitdiff
virsh: better support double quote
authorLai Jiangshan <laijs@cn.fujitsu.com>
Tue, 12 Oct 2010 07:13:16 +0000 (15:13 +0800)
committerEric Blake <eblake@redhat.com>
Wed, 13 Oct 2010 13:52:32 +0000 (07:52 -0600)
In origin code, double quote is only allowed at the begin or end
"complicated argument"
--some_opt="complicated string"  (we split this argument into 2 parts,
option and data, the data is "complicated string").

This patch makes it allow double quote at any position of
an argument:
complicated" argument"
complicated" "argument
--"some opt=complicated string"

This patch is also needed for the following patches,
the following patches will not split option argument into 2 parts,
so we have to allow double quote at any position of an argument.

Signed-off-by: Lai Jiangshan <laijs@cn.fujitsu.com>
AUTHORS
tools/virsh.c

diff --git a/AUTHORS b/AUTHORS
index abb3c1ea112673ed6e2cc36e4b88a32dac464ab4..ade9b719e8bbaf8dccaa9b0697e7da48623a489d 100644 (file)
--- a/AUTHORS
+++ b/AUTHORS
@@ -130,6 +130,7 @@ Patches have also been contributed by:
   Patrick Dignan       <pat_dignan@dell.com>
   Serge Hallyn         <serge.hallyn@canonical.com>
   Nikunj A. Dadhania   <nikunj@linux.vnet.ibm.com>
+  Lai Jiangshan        <laijs@cn.fujitsu.com>
 
   [....send patches to get your name here....]
 
index fe35eb9de682aab88b62da91c2a17fa318f9f3b0..03818deaa3f4f76beb608f1e6c8e9f4c03f6415f 100644 (file)
@@ -10271,16 +10271,18 @@ vshCommandRun(vshControl *ctl, const vshCmd *cmd)
 #define VSH_TK_DATA    2
 #define VSH_TK_END    3
 
-static int
+static int ATTRIBUTE_NONNULL(3) ATTRIBUTE_NONNULL(4)
 vshCommandGetToken(vshControl *ctl, char *str, char **end, char **res)
 {
     int tk = VSH_TK_NONE;
-    int quote = FALSE;
+    bool double_quote = false;
     int sz = 0;
     char *p = str;
+    char *q = vshStrdup(ctl, str);
     char *tkstr = NULL;
 
     *end = NULL;
+    *res = q;
 
     while (p && *p && (*p == ' ' || *p == '\t'))
         p++;
@@ -10291,9 +10293,10 @@ vshCommandGetToken(vshControl *ctl, char *str, char **end, char **res)
         *end = ++p;             /* = \0 or begin of next command */
         return VSH_TK_END;
     }
+
     while (*p) {
         /* end of token is blank space or ';' */
-        if ((quote == FALSE && (*p == ' ' || *p == '\t')) || *p == ';')
+        if (!double_quote && (*p == ' ' || *p == '\t' || *p == ';'))
             break;
 
         /* end of option name could be '=' */
@@ -10309,35 +10312,27 @@ vshCommandGetToken(vshControl *ctl, char *str, char **end, char **res)
                 p += 2;
             } else {
                 tk = VSH_TK_DATA;
-                if (*p == '"') {
-                    quote = TRUE;
-                    p++;
-                } else {
-                    quote = FALSE;
-                }
             }
             tkstr = p;          /* begin of token */
-        } else if (quote && *p == '"') {
-            quote = FALSE;
+        }
+
+        if (*p == '"') {
+            double_quote = !double_quote;
             p++;
-            break;              /* end of "..." token */
+            continue;
         }
-        p++;
+
+        *q++ = *p++;
         sz++;
     }
-    if (quote) {
+    if (double_quote) {
         vshError(ctl, "%s", _("missing \""));
         return VSH_TK_ERROR;
     }
-    if (tkstr == NULL || *tkstr == '\0' || p == NULL)
+    if (tkstr == NULL || *tkstr == '\0' || sz == 0)
         return VSH_TK_END;
-    if (sz == 0)
-        return VSH_TK_END;
-
-    *res = vshMalloc(ctl, sz + 1);
-    memcpy(*res, tkstr, sz);
-    *(*res + sz) = '\0';
 
+    *q = '\0';
     *end = p;
     return tk;
 }