From: Martin Kletzander Date: Tue, 11 Nov 2014 10:01:05 +0000 (+0100) Subject: virsh: Enforce proper ordering of options X-Git-Url: http://xenbits.xensource.com/gitweb?a=commitdiff_plain;h=6beb173df70300df01445f4d64f26e1fb927614d;p=libvirt.git virsh: Enforce proper ordering of options Even though vshCmddefOptParse() tried returning -1 if there was an optional option specification that preceded a required one, it failed to check that for boolean type options and options with VSH_OFLAG_REQ_OPT flag set. On the other hand, it makes sense that VSH_OT_ARGV is specified at the end of the option list. Returning -1 enforces the proper ordering thanks to virsh-synopsis test in 'make check'. Signed-off-by: Martin Kletzander --- diff --git a/tools/virsh.c b/tools/virsh.c index 036b5173ab..41893bb071 100644 --- a/tools/virsh.c +++ b/tools/virsh.c @@ -1073,6 +1073,7 @@ vshCmddefOptParse(const vshCmdDef *cmd, uint32_t *opts_need_arg, if (i > 31) return -1; /* too many options */ if (opt->type == VSH_OT_BOOL) { + optional = true; if (opt->flags & VSH_OFLAG_REQ) return -1; /* bool options can't be mandatory */ continue; @@ -1105,12 +1106,14 @@ vshCmddefOptParse(const vshCmdDef *cmd, uint32_t *opts_need_arg, if (opt->flags & VSH_OFLAG_REQ_OPT) { if (opt->flags & VSH_OFLAG_REQ) *opts_required |= 1 << i; + else + optional = true; continue; } *opts_need_arg |= 1 << i; if (opt->flags & VSH_OFLAG_REQ) { - if (optional) + if (optional && opt->type != VSH_OT_ARGV) return -1; /* mandatory options must be listed first */ *opts_required |= 1 << i; } else {