diff options
| author | Peter Maydell <peter.maydell@linaro.org> | 2014-06-02 15:27:18 +0100 |
|---|---|---|
| committer | Peter Maydell <peter.maydell@linaro.org> | 2014-06-02 15:27:18 +0100 |
| commit | f72b49398ffabf7276026a850cd7c1bba266cc4d (patch) | |
| tree | 209796e49f216de2b7edd3e90de06485fd8edd79 /qemu-io.c | |
| parent | 9bb931802e6ab5ab6947e3cb9cea934fc0724274 (diff) | |
| parent | 55d492d7602c27cabb605f42e72c755de1c186c1 (diff) | |
| download | focaccia-qemu-f72b49398ffabf7276026a850cd7c1bba266cc4d.tar.gz focaccia-qemu-f72b49398ffabf7276026a850cd7c1bba266cc4d.zip | |
Merge remote-tracking branch 'remotes/kevin/tags/for-upstream' into staging
Block patches # gpg: Signature made Mon 02 Jun 2014 14:56:00 BST using RSA key ID C88F2FD6 # gpg: Good signature from "Kevin Wolf <kwolf@redhat.com>" * remotes/kevin/tags/for-upstream: qemu-img: Report error even with --oformat=json vmdk: Fix local_err in vmdk_create block/raw-posix.c: Avoid nonstandard LONG_LONG_MAX qemu-img: Plug memory leak in convert command block/sheepdog: Plug memory leak in sd_snapshot_create() block/vvfat: Plug memory leak in read_directory() block/vvfat: Plug memory leak in check_directory_consistency() block/qapi: Plug memory leak in dump_qobject() case QTYPE_QERROR blockdev: Plug memory leak in drive_init() blockdev: Plug memory leak in blockdev_init() qemu-io: Don't print NULL when open without non-option arg fails qemu-io: Plug memory leak in open command qemu-io: Support multiple -o in open command block: Plug memory leak on brv_open_image() error path qcow2: Plug memory leak on qcow2_invalidate_cache() error paths block/vvfat: Plug memory leak in enable_write_target() qemu-img: Plug memory leak on block option help error path Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
Diffstat (limited to 'qemu-io.c')
| -rw-r--r-- | qemu-io.c | 22 |
1 files changed, 15 insertions, 7 deletions
diff --git a/qemu-io.c b/qemu-io.c index 9fcd72bb10..795cf46c6e 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; } @@ -61,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; @@ -72,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); @@ -118,6 +121,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 +136,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 +153,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,11 +169,16 @@ 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) { return openfile(NULL, flags, growable, opts); } else { + QDECREF(opts); return qemuio_command_usage(&open_cmd); } } |