qemu-img: move common options parsing before commands processing

This is necessary to enable creation of common qemu-img options which will
be specified before command.

The patch also enables '-V' alias to '--version' (exactly like in other
block utilities) and documents this change.

Signed-off-by: Denis V. Lunev <den@openvz.org>
Reviewed-by: Eric Blake <eblake@redhat.com>
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
Message-id: 1466174654-30130-7-git-send-email-den@openvz.org
CC: Paolo Bonzini <pbonzini@redhat.com>
CC: Kevin Wolf <kwolf@redhat.com>
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
This commit is contained in:
Denis V. Lunev 2016-06-17 17:44:13 +03:00 committed by Stefan Hajnoczi
parent 39ca463e81
commit 10985131e3
2 changed files with 35 additions and 14 deletions

View File

@ -91,9 +91,12 @@ static void QEMU_NORETURN help(void)
{ {
const char *help_msg = const char *help_msg =
QEMU_IMG_VERSION QEMU_IMG_VERSION
"usage: qemu-img command [command options]\n" "usage: qemu-img [standard options] command [command options]\n"
"QEMU disk image utility\n" "QEMU disk image utility\n"
"\n" "\n"
" '-h', '--help' display this help and exit\n"
" '-V', '--version' output version information and exit\n"
"\n"
"Command syntax:\n" "Command syntax:\n"
#define DEF(option, callback, arg_string) \ #define DEF(option, callback, arg_string) \
" " arg_string "\n" " " arg_string "\n"
@ -3806,7 +3809,7 @@ int main(int argc, char **argv)
int c; int c;
static const struct option long_options[] = { static const struct option long_options[] = {
{"help", no_argument, 0, 'h'}, {"help", no_argument, 0, 'h'},
{"version", no_argument, 0, 'v'}, {"version", no_argument, 0, 'V'},
{0, 0, 0, 0} {0, 0, 0, 0}
}; };
@ -3829,27 +3832,37 @@ int main(int argc, char **argv)
if (argc < 2) { if (argc < 2) {
error_exit("Not enough arguments"); error_exit("Not enough arguments");
} }
cmdname = argv[1];
qemu_add_opts(&qemu_object_opts); qemu_add_opts(&qemu_object_opts);
qemu_add_opts(&qemu_source_opts); qemu_add_opts(&qemu_source_opts);
/* find the command */ while ((c = getopt_long(argc, argv, "+hV", long_options, NULL)) != -1) {
for (cmd = img_cmds; cmd->name != NULL; cmd++) { switch (c) {
if (!strcmp(cmdname, cmd->name)) { case 'h':
return cmd->handler(argc - 1, argv + 1); help();
return 0;
case 'V':
printf(QEMU_IMG_VERSION);
return 0;
} }
} }
c = getopt_long(argc, argv, "h", long_options, NULL); cmdname = argv[optind];
if (c == 'h') { /* reset getopt_long scanning */
help(); argc -= optind;
} if (argc < 1) {
if (c == 'v') {
printf(QEMU_IMG_VERSION);
return 0; return 0;
} }
argv += optind;
optind = 1;
/* find the command */
for (cmd = img_cmds; cmd->name != NULL; cmd++) {
if (!strcmp(cmdname, cmd->name)) {
return cmd->handler(argc, argv);
}
}
/* not found */ /* not found */
error_exit("Command not found: %s", cmdname); error_exit("Command not found: %s", cmdname);

View File

@ -1,6 +1,6 @@
@example @example
@c man begin SYNOPSIS @c man begin SYNOPSIS
@command{qemu-img} @var{command} [@var{command} @var{options}] @command{qemu-img} [@var{standard} @var{options}] @var{command} [@var{command} @var{options}]
@c man end @c man end
@end example @end example
@ -16,6 +16,14 @@ inconsistent state.
@c man begin OPTIONS @c man begin OPTIONS
Standard options:
@table @option
@item -h, --help
Display this help and exit
@item -V, --version
Display version information and exit
@end table
The following commands are supported: The following commands are supported:
@include qemu-img-cmds.texi @include qemu-img-cmds.texi