[libvirt] [PATCH 8/8] virsh: add -- support
Eric Blake
eblake at redhat.com
Tue Oct 12 21:32:18 UTC 2010
On 10/12/2010 01:14 AM, Lai Jiangshan wrote:
>
> "--" means no option at the following arguments.
>
> Signed-off-by: Lai Jiangshan<laijs at cn.fujitsu.com>
> ---
> diff --git a/tools/virsh.c b/tools/virsh.c
> index a5b438b..d01091f 100644
> --- a/tools/virsh.c
> +++ b/tools/virsh.c
> @@ -10305,6 +10305,7 @@ vshCommandParse(vshControl *ctl, vshCommandParser *parser)
> vshCmdOpt *last = NULL;
> const vshCmdDef *cmd = NULL;
> int tk;
> + bool data_only = false;
> int data_ct = 0;
>
> first = NULL;
> @@ -10327,6 +10328,8 @@ vshCommandParse(vshControl *ctl, vshCommandParser *parser)
> goto syntaxError; /* ... or ignore this command only? */
> }
> VIR_FREE(tkdata);
> + } else if (data_only) {
> + goto get_data;
> } else if (*tkdata == '-'&& *(tkdata + 1) == '-'&& *(tkdata + 2)
> && c_isalnum(*(tkdata + 2))) {
> char *optstr = strchr(tkdata + 2, '=');
> @@ -10368,7 +10371,12 @@ vshCommandParse(vshControl *ctl, vshCommandParser *parser)
> goto syntaxError;
> }
> }
> + } else if (*tkdata == '-'&& *(tkdata + 1) == '-'
> +&& *(tkdata + 2) == '\0') {
Another case of line break convention. Also, I prefer tkdata[1] over
*(tkdata + 1).
Hmm, that means there's now two levels of -- parsing - one to mark the
end of top-level virsh commands, and one for each command. That is:
virsh -- help -- help
should be the same as
virsh help help
Which also means that virsh should probably be avoiding argv
rearrangement in getopt_long(). That is, given my theoretical echo command,
virsh echo --help
should echo "--help", rather than running 'virsh --help'. Or, more to
the point,
virsh dumpxml --update-cpu vm
correctly avoids promoting --update-cpu to a top-level argument of virsh.
Oh my - I just looked in the code, and virsh is re-doing option parsing
by itself, instead of just telling getopt_long() to stop on the first
non-option; but getting it wrong by not checking for abbreviations.
Another patch or two coming up...
ACK with the nit fixed. Here's what I'm squashing.
diff --git i/tools/virsh.c w/tools/virsh.c
index 79d7756..8c4a7bc 100644
--- i/tools/virsh.c
+++ w/tools/virsh.c
@@ -10347,8 +10347,8 @@ vshCommandParse(vshControl *ctl,
vshCommandParser *parser)
VIR_FREE(tkdata);
} else if (data_only) {
goto get_data;
- } else if (*tkdata == '-' && *(tkdata + 1) == '-' &&
*(tkdata + 2)
- && c_isalnum(*(tkdata + 2))) {
+ } else if (tkdata[0] == '-' && tkdata[1] == '-' &&
+ c_isalnum(tkdata[2])) {
char *optstr = strchr(tkdata + 2, '=');
if (optstr) {
*optstr = '\0'; /* convert the '=' to '\0' */
@@ -10388,8 +10388,8 @@ vshCommandParse(vshControl *ctl,
vshCommandParser *parser)
goto syntaxError;
}
}
- } else if (*tkdata == '-' && *(tkdata + 1) == '-'
- && *(tkdata + 2) == '\0') {
+ } else if (tkdata[0] == '-' && tkdata[1] == '-' &&
+ tkdata[2] == '\0') {
data_only = true;
continue;
} else {
--
Eric Blake eblake at redhat.com +1-801-349-2682
Libvirt virtualization library http://libvirt.org
More information about the libvir-list
mailing list