From 443422fde7cb8410849074181de7b91bfd13b19d Mon Sep 17 00:00:00 2001 From: Markus Armbruster Date: Wed, 28 May 2014 11:16:58 +0200 Subject: qemu-io: Support multiple -o in open command Instead of ignoring all option values but the last one, multiple -o options now have the same meaning as having a single option with all settings in the order of their respective -o options. Same as commit 2dc8328 for qemu-img convert, except here we do it with QemuOpts rather than QEMUOptionParameter. Signed-off-by: Markus Armbruster Reviewed-by: Benoit Canet Signed-off-by: Kevin Wolf --- qemu-io.c | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) (limited to 'qemu-io.c') diff --git a/qemu-io.c b/qemu-io.c index 9fcd72bb10..ef3fef6e5f 100644 --- a/qemu-io.c +++ b/qemu-io.c @@ -118,6 +118,7 @@ static const cmdinfo_t open_cmd = { static QemuOptsList empty_opts = { .name = "drive", + .merge_lists = true, .head = QTAILQ_HEAD_INITIALIZER(empty_opts.head), .desc = { /* no elements => accept any params */ @@ -132,7 +133,7 @@ static int open_f(BlockDriverState *bs, int argc, char **argv) int growable = 0; int c; QemuOpts *qopts; - QDict *opts = NULL; + QDict *opts; while ((c = getopt(argc, argv, "snrgo:")) != EOF) { switch (c) { @@ -149,15 +150,14 @@ static int open_f(BlockDriverState *bs, int argc, char **argv) growable = 1; break; case 'o': - qopts = qemu_opts_parse(&empty_opts, optarg, 0); - if (qopts == NULL) { + if (!qemu_opts_parse(&empty_opts, optarg, 0)) { printf("could not parse option list -- %s\n", optarg); + qemu_opts_reset(&empty_opts); return 0; } - opts = qemu_opts_to_qdict(qopts, opts); - qemu_opts_del(qopts); break; default: + qemu_opts_reset(&empty_opts); return qemuio_command_usage(&open_cmd); } } @@ -166,6 +166,10 @@ static int open_f(BlockDriverState *bs, int argc, char **argv) flags |= BDRV_O_RDWR; } + qopts = qemu_opts_find(&empty_opts, NULL); + opts = qopts ? qemu_opts_to_qdict(qopts, NULL) : NULL; + qemu_opts_reset(&empty_opts); + if (optind == argc - 1) { return openfile(argv[optind], flags, growable, opts); } else if (optind == argc) { -- cgit 1.4.1 From 29f2601aa605f0af0cba8eedcff7812c6c8532e9 Mon Sep 17 00:00:00 2001 From: Markus Armbruster Date: Wed, 28 May 2014 11:16:59 +0200 Subject: qemu-io: Plug memory leak in open command Introduced in commit b543c5c. Spotted by Coverity. Signed-off-by: Markus Armbruster Signed-off-by: Kevin Wolf --- qemu-io.c | 2 ++ 1 file changed, 2 insertions(+) (limited to 'qemu-io.c') diff --git a/qemu-io.c b/qemu-io.c index ef3fef6e5f..f63e771d98 100644 --- a/qemu-io.c +++ b/qemu-io.c @@ -54,6 +54,7 @@ static int openfile(char *name, int flags, int growable, QDict *opts) if (qemuio_bs) { fprintf(stderr, "file open already, try 'help close'\n"); + QDECREF(opts); return 1; } @@ -175,6 +176,7 @@ static int open_f(BlockDriverState *bs, int argc, char **argv) } else if (optind == argc) { return openfile(NULL, flags, growable, opts); } else { + QDECREF(opts); return qemuio_command_usage(&open_cmd); } } -- cgit 1.4.1 From 543f7bef1353be4b30543aa1888048a7b6abb2e9 Mon Sep 17 00:00:00 2001 From: Markus Armbruster Date: Wed, 28 May 2014 11:17:00 +0200 Subject: qemu-io: Don't print NULL when open without non-option arg fails Reproducer: "open -o a=b". Broken in commit fd0fee3. Signed-off-by: Markus Armbruster Signed-off-by: Kevin Wolf --- qemu-io.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) (limited to 'qemu-io.c') diff --git a/qemu-io.c b/qemu-io.c index f63e771d98..795cf46c6e 100644 --- a/qemu-io.c +++ b/qemu-io.c @@ -62,7 +62,8 @@ static int openfile(char *name, int flags, int growable, QDict *opts) if (bdrv_open(&qemuio_bs, name, NULL, opts, flags | BDRV_O_PROTOCOL, NULL, &local_err)) { - fprintf(stderr, "%s: can't open device %s: %s\n", progname, name, + fprintf(stderr, "%s: can't open%s%s: %s\n", progname, + name ? " device " : "", name ?: "", error_get_pretty(local_err)); error_free(local_err); return 1; @@ -73,7 +74,8 @@ static int openfile(char *name, int flags, int growable, QDict *opts) if (bdrv_open(&qemuio_bs, name, NULL, opts, flags, NULL, &local_err) < 0) { - fprintf(stderr, "%s: can't open device %s: %s\n", progname, name, + fprintf(stderr, "%s: can't open%s%s: %s\n", progname, + name ? " device " : "", name ?: "", error_get_pretty(local_err)); error_free(local_err); bdrv_unref(qemuio_bs); -- cgit 1.4.1