[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH 19/25] qemu-img: use keyval for -object parsing
From: |
Paolo Bonzini |
Subject: |
[PATCH 19/25] qemu-img: use keyval for -object parsing |
Date: |
Mon, 18 Jan 2021 11:31:07 -0500 |
Enable creation of object with non-scalar properties.
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
qemu-img.c | 258 +++++++++++------------------------------------------
1 file changed, 52 insertions(+), 206 deletions(-)
diff --git a/qemu-img.c b/qemu-img.c
index 8597d069af..639a7b0256 100644
--- a/qemu-img.c
+++ b/qemu-img.c
@@ -226,21 +226,27 @@ static void QEMU_NORETURN help(void)
exit(EXIT_SUCCESS);
}
-static QemuOptsList qemu_object_opts = {
- .name = "object",
- .implied_opt_name = "qom-type",
- .head = QTAILQ_HEAD_INITIALIZER(qemu_object_opts.head),
- .desc = {
- { }
- },
-};
-
-static bool qemu_img_object_print_help(const char *type, QemuOpts *opts)
+static void qemu_img_object_parse(const char *optarg, int exit_code)
{
- if (user_creatable_print_help(type, opts)) {
- exit(0);
+ QDict *args;
+ bool help;
+ Error *local_error = NULL;
+
+ args = keyval_parse(optarg, "qom-type", &help, &local_error);
+ if (local_error) {
+ error_report_err(local_error);
+ exit(exit_code);
}
- return true;
+ if (help) {
+ user_creatable_print_help_from_qdict(args);
+ exit(EXIT_SUCCESS);
+ }
+ user_creatable_add_dict(args, true, &local_error);
+ if (local_error) {
+ error_report_err(local_error);
+ exit(exit_code);
+ }
+ qobject_unref(args);
}
/*
@@ -566,14 +572,9 @@ static int img_create(int argc, char **argv)
case 'u':
flags |= BDRV_O_NO_BACKING;
break;
- case OPTION_OBJECT: {
- QemuOpts *opts;
- opts = qemu_opts_parse_noisily(&qemu_object_opts,
- optarg, true);
- if (!opts) {
- goto fail;
- }
- } break;
+ case OPTION_OBJECT:
+ qemu_img_object_parse(optarg, 1);
+ break;
}
}
@@ -589,12 +590,6 @@ static int img_create(int argc, char **argv)
}
optind++;
- if (qemu_opts_foreach(&qemu_object_opts,
- user_creatable_add_opts_foreach,
- qemu_img_object_print_help, &error_fatal)) {
- goto fail;
- }
-
/* Get image size, if specified */
if (optind < argc) {
int64_t sval;
@@ -804,14 +799,9 @@ static int img_check(int argc, char **argv)
case 'U':
force_share = true;
break;
- case OPTION_OBJECT: {
- QemuOpts *opts;
- opts = qemu_opts_parse_noisily(&qemu_object_opts,
- optarg, true);
- if (!opts) {
- return 1;
- }
- } break;
+ case OPTION_OBJECT:
+ qemu_img_object_parse(optarg, 1);
+ break;
case OPTION_IMAGE_OPTS:
image_opts = true;
break;
@@ -831,12 +821,6 @@ static int img_check(int argc, char **argv)
return 1;
}
- if (qemu_opts_foreach(&qemu_object_opts,
- user_creatable_add_opts_foreach,
- qemu_img_object_print_help, &error_fatal)) {
- return 1;
- }
-
ret = bdrv_parse_cache_mode(cache, &flags, &writethrough);
if (ret < 0) {
error_report("Invalid source cache option: %s", cache);
@@ -1034,14 +1018,9 @@ static int img_commit(int argc, char **argv)
return 1;
}
break;
- case OPTION_OBJECT: {
- QemuOpts *opts;
- opts = qemu_opts_parse_noisily(&qemu_object_opts,
- optarg, true);
- if (!opts) {
- return 1;
- }
- } break;
+ case OPTION_OBJECT:
+ qemu_img_object_parse(optarg, 1);
+ break;
case OPTION_IMAGE_OPTS:
image_opts = true;
break;
@@ -1058,12 +1037,6 @@ static int img_commit(int argc, char **argv)
}
filename = argv[optind++];
- if (qemu_opts_foreach(&qemu_object_opts,
- user_creatable_add_opts_foreach,
- qemu_img_object_print_help, &error_fatal)) {
- return 1;
- }
-
flags = BDRV_O_RDWR | BDRV_O_UNMAP;
ret = bdrv_parse_cache_mode(cache, &flags, &writethrough);
if (ret < 0) {
@@ -1423,15 +1396,9 @@ static int img_compare(int argc, char **argv)
case 'U':
force_share = true;
break;
- case OPTION_OBJECT: {
- QemuOpts *opts;
- opts = qemu_opts_parse_noisily(&qemu_object_opts,
- optarg, true);
- if (!opts) {
- ret = 2;
- goto out4;
- }
- } break;
+ case OPTION_OBJECT:
+ qemu_img_object_parse(optarg, 2);
+ break;
case OPTION_IMAGE_OPTS:
image_opts = true;
break;
@@ -1450,13 +1417,6 @@ static int img_compare(int argc, char **argv)
filename1 = argv[optind++];
filename2 = argv[optind++];
- if (qemu_opts_foreach(&qemu_object_opts,
- user_creatable_add_opts_foreach,
- qemu_img_object_print_help, &error_fatal)) {
- ret = 2;
- goto out4;
- }
-
/* Initialize before goto out */
qemu_progress_init(progress, 2.0);
@@ -1641,7 +1601,6 @@ out2:
blk_unref(blk1);
out3:
qemu_progress_end();
-out4:
return ret;
}
@@ -2342,15 +2301,9 @@ static int img_convert(int argc, char **argv)
goto fail_getopt;
}
break;
- case OPTION_OBJECT: {
- QemuOpts *object_opts;
- object_opts = qemu_opts_parse_noisily(&qemu_object_opts,
- optarg, true);
- if (!object_opts) {
- goto fail_getopt;
- }
+ case OPTION_OBJECT:
+ qemu_img_object_parse(optarg, 1);
break;
- }
case OPTION_IMAGE_OPTS:
image_opts = true;
break;
@@ -2378,12 +2331,6 @@ static int img_convert(int argc, char **argv)
out_fmt = "raw";
}
- if (qemu_opts_foreach(&qemu_object_opts,
- user_creatable_add_opts_foreach,
- qemu_img_object_print_help, &error_fatal)) {
- goto fail_getopt;
- }
-
if (s.compressed && s.copy_range) {
error_report("Cannot enable copy offloading when -c is used");
goto fail_getopt;
@@ -2975,14 +2922,9 @@ static int img_info(int argc, char **argv)
case OPTION_BACKING_CHAIN:
chain = true;
break;
- case OPTION_OBJECT: {
- QemuOpts *opts;
- opts = qemu_opts_parse_noisily(&qemu_object_opts,
- optarg, true);
- if (!opts) {
- return 1;
- }
- } break;
+ case OPTION_OBJECT:
+ qemu_img_object_parse(optarg, 1);
+ break;
case OPTION_IMAGE_OPTS:
image_opts = true;
break;
@@ -3002,12 +2944,6 @@ static int img_info(int argc, char **argv)
return 1;
}
- if (qemu_opts_foreach(&qemu_object_opts,
- user_creatable_add_opts_foreach,
- qemu_img_object_print_help, &error_fatal)) {
- return 1;
- }
-
list = collect_image_info_list(image_opts, filename, fmt, chain,
force_share);
if (!list) {
@@ -3217,14 +3153,9 @@ static int img_map(int argc, char **argv)
return 1;
}
break;
- case OPTION_OBJECT: {
- QemuOpts *opts;
- opts = qemu_opts_parse_noisily(&qemu_object_opts,
- optarg, true);
- if (!opts) {
- return 1;
- }
- } break;
+ case OPTION_OBJECT:
+ qemu_img_object_parse(optarg, 1);
+ break;
case OPTION_IMAGE_OPTS:
image_opts = true;
break;
@@ -3244,12 +3175,6 @@ static int img_map(int argc, char **argv)
return 1;
}
- if (qemu_opts_foreach(&qemu_object_opts,
- user_creatable_add_opts_foreach,
- qemu_img_object_print_help, &error_fatal)) {
- return 1;
- }
-
blk = img_open(image_opts, filename, fmt, 0, false, false, force_share);
if (!blk) {
return 1;
@@ -3388,14 +3313,9 @@ static int img_snapshot(int argc, char **argv)
case 'U':
force_share = true;
break;
- case OPTION_OBJECT: {
- QemuOpts *opts;
- opts = qemu_opts_parse_noisily(&qemu_object_opts,
- optarg, true);
- if (!opts) {
- return 1;
- }
- } break;
+ case OPTION_OBJECT:
+ qemu_img_object_parse(optarg, 1);
+ break;
case OPTION_IMAGE_OPTS:
image_opts = true;
break;
@@ -3407,12 +3327,6 @@ static int img_snapshot(int argc, char **argv)
}
filename = argv[optind++];
- if (qemu_opts_foreach(&qemu_object_opts,
- user_creatable_add_opts_foreach,
- qemu_img_object_print_help, &error_fatal)) {
- return 1;
- }
-
/* Open the image */
blk = img_open(image_opts, filename, NULL, bdrv_oflags, false, quiet,
force_share);
@@ -3546,14 +3460,9 @@ static int img_rebase(int argc, char **argv)
case 'q':
quiet = true;
break;
- case OPTION_OBJECT: {
- QemuOpts *opts;
- opts = qemu_opts_parse_noisily(&qemu_object_opts,
- optarg, true);
- if (!opts) {
- return 1;
- }
- } break;
+ case OPTION_OBJECT:
+ qemu_img_object_parse(optarg, 1);
+ break;
case OPTION_IMAGE_OPTS:
image_opts = true;
break;
@@ -3575,12 +3484,6 @@ static int img_rebase(int argc, char **argv)
}
filename = argv[optind++];
- if (qemu_opts_foreach(&qemu_object_opts,
- user_creatable_add_opts_foreach,
- qemu_img_object_print_help, &error_fatal)) {
- return 1;
- }
-
qemu_progress_init(progress, 2.0);
qemu_progress_print(0, 100);
@@ -3971,14 +3874,9 @@ static int img_resize(int argc, char **argv)
case 'q':
quiet = true;
break;
- case OPTION_OBJECT: {
- QemuOpts *opts;
- opts = qemu_opts_parse_noisily(&qemu_object_opts,
- optarg, true);
- if (!opts) {
- return 1;
- }
- } break;
+ case OPTION_OBJECT:
+ qemu_img_object_parse(optarg, 1);
+ break;
case OPTION_IMAGE_OPTS:
image_opts = true;
break;
@@ -4000,12 +3898,6 @@ static int img_resize(int argc, char **argv)
}
filename = argv[optind++];
- if (qemu_opts_foreach(&qemu_object_opts,
- user_creatable_add_opts_foreach,
- qemu_img_object_print_help, &error_fatal)) {
- return 1;
- }
-
/* Choose grow, shrink, or absolute resize mode */
switch (size[0]) {
case '+':
@@ -4185,12 +4077,7 @@ static int img_amend(int argc, char **argv)
quiet = true;
break;
case OPTION_OBJECT:
- opts = qemu_opts_parse_noisily(&qemu_object_opts,
- optarg, true);
- if (!opts) {
- ret = -1;
- goto out_no_progress;
- }
+ qemu_img_object_parse(optarg, 1);
break;
case OPTION_IMAGE_OPTS:
image_opts = true;
@@ -4205,13 +4092,6 @@ static int img_amend(int argc, char **argv)
error_exit("Must specify options (-o)");
}
- if (qemu_opts_foreach(&qemu_object_opts,
- user_creatable_add_opts_foreach,
- qemu_img_object_print_help, &error_fatal)) {
- ret = -1;
- goto out_no_progress;
- }
-
if (quiet) {
progress = false;
}
@@ -4670,7 +4550,6 @@ static int img_bitmap(int argc, char **argv)
{
Error *err = NULL;
int c, ret = 1;
- QemuOpts *opts = NULL;
const char *fmt = NULL, *src_fmt = NULL, *src_filename = NULL;
const char *filename, *bitmap;
BlockBackend *blk = NULL, *src = NULL;
@@ -4764,10 +4643,7 @@ static int img_bitmap(int argc, char **argv)
merge = true;
break;
case OPTION_OBJECT:
- opts = qemu_opts_parse_noisily(&qemu_object_opts, optarg, true);
- if (!opts) {
- goto out;
- }
+ qemu_img_object_parse(optarg, 1);
break;
case OPTION_IMAGE_OPTS:
image_opts = true;
@@ -4775,12 +4651,6 @@ static int img_bitmap(int argc, char **argv)
}
}
- if (qemu_opts_foreach(&qemu_object_opts,
- user_creatable_add_opts_foreach,
- qemu_img_object_print_help, &error_fatal)) {
- goto out;
- }
-
if (QSIMPLEQ_EMPTY(&actions)) {
error_report("Need at least one of --add, --remove, --clear, "
"--enable, --disable, or --merge");
@@ -4876,7 +4746,6 @@ static int img_bitmap(int argc, char **argv)
out:
blk_unref(src);
blk_unref(blk);
- qemu_opts_del(opts);
return ret;
}
@@ -5038,10 +4907,7 @@ static int img_dd(int argc, char **argv)
force_share = true;
break;
case OPTION_OBJECT:
- if (!qemu_opts_parse_noisily(&qemu_object_opts, optarg, true)) {
- ret = -1;
- goto out;
- }
+ qemu_img_object_parse(optarg, 1);
break;
case OPTION_IMAGE_OPTS:
image_opts = true;
@@ -5088,13 +4954,6 @@ static int img_dd(int argc, char **argv)
goto out;
}
- if (qemu_opts_foreach(&qemu_object_opts,
- user_creatable_add_opts_foreach,
- qemu_img_object_print_help, &error_fatal)) {
- ret = -1;
- goto out;
- }
-
blk1 = img_open(image_opts, in.filename, fmt, 0, false, false,
force_share);
@@ -5270,7 +5129,6 @@ static int img_measure(int argc, char **argv)
char *snapshot_name = NULL;
bool force_share = false;
QemuOpts *opts = NULL;
- QemuOpts *object_opts = NULL;
QemuOpts *sn_opts = NULL;
QemuOptsList *create_opts = NULL;
bool image_opts = false;
@@ -5315,11 +5173,7 @@ static int img_measure(int argc, char **argv)
force_share = true;
break;
case OPTION_OBJECT:
- object_opts = qemu_opts_parse_noisily(&qemu_object_opts,
- optarg, true);
- if (!object_opts) {
- goto out;
- }
+ qemu_img_object_parse(optarg, 1);
break;
case OPTION_IMAGE_OPTS:
image_opts = true;
@@ -5349,12 +5203,6 @@ static int img_measure(int argc, char **argv)
}
}
- if (qemu_opts_foreach(&qemu_object_opts,
- user_creatable_add_opts_foreach,
- qemu_img_object_print_help, &error_fatal)) {
- goto out;
- }
-
if (argc - optind > 1) {
error_report("At most one filename argument is allowed.");
goto out;
@@ -5442,7 +5290,6 @@ static int img_measure(int argc, char **argv)
out:
qapi_free_BlockMeasureInfo(info);
- qemu_opts_del(object_opts);
qemu_opts_del(opts);
qemu_opts_del(sn_opts);
qemu_opts_free(create_opts);
@@ -5494,7 +5341,6 @@ int main(int argc, char **argv)
error_exit("Not enough arguments");
}
- qemu_add_opts(&qemu_object_opts);
qemu_add_opts(&qemu_source_opts);
qemu_add_opts(&qemu_trace_opts);
--
2.26.2
- [PATCH 08/25] hmp: replace "O" parser with keyval, (continued)
- [PATCH 08/25] hmp: replace "O" parser with keyval, Paolo Bonzini, 2021/01/18
- [PATCH 17/25] qemu-io: use keyval for -object parsing, Paolo Bonzini, 2021/01/18
- [PATCH 20/25] qemu: use keyval for -object parsing, Paolo Bonzini, 2021/01/18
- [PATCH 21/25] storage-daemon: do not register the "object" group with QemuOpts, Paolo Bonzini, 2021/01/18
- [PATCH 25/25] vl: switch -accel parsing to keyval, Paolo Bonzini, 2021/01/18
- [PATCH 24/25] qemu-option: remove now-dead code, Paolo Bonzini, 2021/01/18
- [PATCH 18/25] qemu-nbd: use keyval for -object parsing, Paolo Bonzini, 2021/01/18
- [PATCH 22/25] qom: export more functions for use with non-UserCreatable objects, Paolo Bonzini, 2021/01/18
- [PATCH 23/25] vl: switch -M parsing to keyval, Paolo Bonzini, 2021/01/18
- [PATCH 19/25] qemu-img: use keyval for -object parsing,
Paolo Bonzini <=
- Re: [PATCH 00/25] qemu-option, keyval, vl: switch -object/-M/-accel to keyval parsing, no-reply, 2021/01/18