From ad2f1b609325abffae743e4b3a5b755294e07e41 Mon Sep 17 00:00:00 2001 From: Lai Jiangshan Date: Tue, 12 Oct 2010 15:13:16 +0800 Subject: [PATCH] virsh: better support double quote 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 --- AUTHORS | 1 + tools/virsh.c | 39 +++++++++++++++++---------------------- 2 files changed, 18 insertions(+), 22 deletions(-) diff --git a/AUTHORS b/AUTHORS index abb3c1ea11..ade9b719e8 100644 --- a/AUTHORS +++ b/AUTHORS @@ -130,6 +130,7 @@ Patches have also been contributed by: Patrick Dignan Serge Hallyn Nikunj A. Dadhania + Lai Jiangshan [....send patches to get your name here....] diff --git a/tools/virsh.c b/tools/virsh.c index fe35eb9de6..03818deaa3 100644 --- a/tools/virsh.c +++ b/tools/virsh.c @@ -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; - p++; - break; /* end of "..." token */ } - p++; + + if (*p == '"') { + double_quote = !double_quote; + p++; + continue; + } + + *q++ = *p++; sz++; } - if (quote) { + if (double_quote) { vshError(ctl, "%s", _("missing \"")); return VSH_TK_ERROR; } - if (tkstr == NULL || *tkstr == '\0' || p == NULL) - return VSH_TK_END; - if (sz == 0) + if (tkstr == NULL || *tkstr == '\0' || sz == 0) return VSH_TK_END; - *res = vshMalloc(ctl, sz + 1); - memcpy(*res, tkstr, sz); - *(*res + sz) = '\0'; - + *q = '\0'; *end = p; return tk; }