qemu-img: Allow -o help with incomplete argument list

This patch allows using 'qemu-img $subcmd -o help' for the create,
convert and amend subcommands, without specifying the previously
required filename arguments.

Note that it's still allowed and meaningful to specify a filename: An
invocation like 'qemu-img create -o help sheepdog:foo' will also display
options that are provided by the Sheepdog driver.

Signed-off-by: Kevin Wolf <kwolf@redhat.com>
Reviewed-by: Jeff Cody <jcody@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
This commit is contained in:
Kevin Wolf 2014-02-21 16:24:07 +01:00
parent 626f84f39d
commit a283cb6e58
1 changed files with 36 additions and 24 deletions

View File

@ -250,16 +250,19 @@ static int print_block_option_help(const char *filename, const char *fmt)
return 1;
}
proto_drv = bdrv_find_protocol(filename, true);
if (!proto_drv) {
error_report("Unknown protocol '%s'", filename);
return 1;
}
create_options = append_option_parameters(create_options,
drv->create_options);
create_options = append_option_parameters(create_options,
proto_drv->create_options);
if (filename) {
proto_drv = bdrv_find_protocol(filename, true);
if (!proto_drv) {
error_report("Unknown protocol '%s'", filename);
return 1;
}
create_options = append_option_parameters(create_options,
proto_drv->create_options);
}
print_option_help(create_options);
free_option_parameters(create_options);
return 0;
@ -394,10 +397,16 @@ static int img_create(int argc, char **argv)
}
/* Get the filename */
filename = (optind < argc) ? argv[optind] : NULL;
if (options && has_help_option(options)) {
g_free(options);
return print_block_option_help(filename, fmt);
}
if (optind >= argc) {
help();
}
filename = argv[optind++];
optind++;
/* Get image size, if specified */
if (optind < argc) {
@ -421,11 +430,6 @@ static int img_create(int argc, char **argv)
help();
}
if (options && has_help_option(options)) {
g_free(options);
return print_block_option_help(filename, fmt);
}
bdrv_img_create(filename, fmt, base_filename, base_fmt,
options, img_size, BDRV_O_FLAGS, &local_err, quiet);
if (local_err) {
@ -1269,17 +1273,18 @@ static int img_convert(int argc, char **argv)
}
bs_n = argc - optind - 1;
if (bs_n < 1) {
help();
}
out_filename = argv[argc - 1];
out_filename = bs_n >= 1 ? argv[argc - 1] : NULL;
if (options && has_help_option(options)) {
ret = print_block_option_help(out_filename, out_fmt);
goto out;
}
if (bs_n < 1) {
help();
}
if (bs_n > 1 && out_baseimg) {
error_report("-B makes no sense when concatenating multiple input "
"images");
@ -2689,15 +2694,21 @@ static int img_amend(int argc, char **argv)
}
}
if (optind != argc - 1) {
help();
}
if (!options) {
help();
}
filename = argv[argc - 1];
filename = (optind == argc - 1) ? argv[argc - 1] : NULL;
if (fmt && has_help_option(options)) {
/* If a format is explicitly specified (and possibly no filename is
* given), print option help here */
ret = print_block_option_help(filename, fmt);
goto out;
}
if (optind != argc - 1) {
help();
}
bs = bdrv_new_open(filename, fmt, BDRV_O_FLAGS | BDRV_O_RDWR, true, quiet);
if (!bs) {
@ -2709,6 +2720,7 @@ static int img_amend(int argc, char **argv)
fmt = bs->drv->format_name;
if (has_help_option(options)) {
/* If the format was auto-detected, print option help here */
ret = print_block_option_help(filename, fmt);
goto out;
}