From: Michal Privoznik Date: Thu, 7 Jan 2021 17:09:11 +0000 (+0100) Subject: vsh: Allow double quotes imbalance for auto completion in vshCommandStringGetArg() X-Git-Tag: v7.1.0-rc1~429 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=aad2262b9e5d2d2ffa07fbb2ce0d50a4a9c8e10a;p=thirdparty%2Flibvirt.git vsh: Allow double quotes imbalance for auto completion in vshCommandStringGetArg() If user is trying to auto complete a value that contains a space, they have two options: use backslash to escape space or use quotes, like this: virsh # start --domain "domain with space However, in this case our tokenizer sees imbalance in (double) quotes: there is a starting one that's missing its companion. Well, that's obvious - user is still in process of writing the command. What we need to do in this case is to ignore the imbalance and return success (from the tokenizer) - readline will handle closing the quote properly. Signed-off-by: Michal Privoznik Reviewed-by: Ján Tomko --- diff --git a/tools/vsh.c b/tools/vsh.c index be16d1db89..0e2d4955b4 100644 --- a/tools/vsh.c +++ b/tools/vsh.c @@ -1418,7 +1418,7 @@ vshCommandParse(vshControl *ctl, vshCommandParser *parser, vshCmd **partial) if (optstr) tkdata = optstr; else - tk = parser->getNextArg(ctl, parser, &tkdata, true); + tk = parser->getNextArg(ctl, parser, &tkdata, partial == NULL); if (tk == VSH_TK_ERROR) goto syntaxError; if (tk != VSH_TK_ARG) { @@ -1673,10 +1673,16 @@ vshCommandStringGetArg(vshControl *ctl, vshCommandParser *parser, char **res, *q++ = *p++; } + if (double_quote) { - if (report) + /* We have seen a double quote, but not it's companion + * ending. It's valid though, in case when we're called + * from completer (report = false), but it's not valid + * when parsing real command (report= true). */ + if (report) { vshError(ctl, "%s", _("missing \"")); - return VSH_TK_ERROR; + return VSH_TK_ERROR; + } } *q = '\0';