X-Git-Url: https://repo.jachan.dev/qemu.git/blobdiff_plain/7d64b2c2e22d956b358a97323f0d70060dcd9a06..fa4faba448046574c8c820098ed46c9a0b5589a6:/qemu-io.c diff --git a/qemu-io.c b/qemu-io.c index d6690289b8..66cf3ef4be 100644 --- a/qemu-io.c +++ b/qemu-io.c @@ -24,10 +24,9 @@ #define CMD_NOFILE_OK 0x01 -char *progname; +static char *progname; -BlockDriverState *qemuio_bs; -extern int qemuio_misalign; +static BlockDriverState *qemuio_bs; /* qemu-io commands passed using -c */ static int ncmdline; @@ -55,27 +54,24 @@ 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; } + qemuio_bs = bdrv_new("hda", &error_abort); + if (growable) { - if (bdrv_file_open(&qemuio_bs, name, NULL, opts, flags, &local_err)) { - fprintf(stderr, "%s: can't open device %s: %s\n", progname, name, - error_get_pretty(local_err)); - error_free(local_err); - return 1; - } - } else { - qemuio_bs = bdrv_new("hda"); - - if (bdrv_open(qemuio_bs, name, opts, flags, NULL, &local_err) < 0) { - fprintf(stderr, "%s: can't open device %s: %s\n", progname, name, - error_get_pretty(local_err)); - error_free(local_err); - bdrv_unref(qemuio_bs); - qemuio_bs = NULL; - return 1; - } + flags |= BDRV_O_PROTOCOL; + } + + if (bdrv_open(&qemuio_bs, name, NULL, opts, flags, NULL, &local_err) < 0) { + 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); + qemuio_bs = NULL; + return 1; } return 0; @@ -115,6 +111,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 */ @@ -129,7 +126,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) { @@ -146,15 +143,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); } } @@ -163,11 +159,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); } } @@ -190,10 +191,11 @@ static const cmdinfo_t quit_cmd = { static void usage(const char *name) { printf( -"Usage: %s [-h] [-V] [-rsnm] [-c cmd] ... [file]\n" +"Usage: %s [-h] [-V] [-rsnm] [-c STRING] ... [file]\n" "QEMU Disk exerciser\n" "\n" -" -c, --cmd command to execute\n" +" -c, --cmd STRING execute command with its arguments\n" +" from the given string\n" " -r, --read-only export read-only\n" " -s, --snapshot use snapshot file\n" " -n, --nocache disable host cache\n" @@ -204,8 +206,10 @@ static void usage(const char *name) " -T, --trace FILE enable trace events listed in the given file\n" " -h, --help display this help and exit\n" " -V, --version output version information and exit\n" +"\n" +"See '%s -c help' for information on available commands." "\n", - name); + name, name); } static char *get_prompt(void) @@ -219,7 +223,8 @@ static char *get_prompt(void) return prompt; } -static void readline_printf_func(void *opaque, const char *fmt, ...) +static void GCC_FMT_ATTR(2, 3) readline_printf_func(void *opaque, + const char *fmt, ...) { va_list ap; va_start(ap, fmt); @@ -341,7 +346,7 @@ static void command_loop(void) static void add_user_command(char *optarg) { - cmdline = g_realloc(cmdline, ++ncmdline * sizeof(char *)); + cmdline = g_renew(char *, cmdline, ++ncmdline); cmdline[ncmdline-1] = optarg; } @@ -374,12 +379,14 @@ int main(int argc, char **argv) int c; int opt_index = 0; int flags = BDRV_O_UNMAP; + Error *local_error = NULL; #ifdef CONFIG_POSIX signal(SIGPIPE, SIG_IGN); #endif progname = basename(argv[0]); + qemu_init_exec_dir(argv[0]); while ((c = getopt_long(argc, argv, sopt, lopt, &opt_index)) != -1) { switch (c) { @@ -402,7 +409,7 @@ int main(int argc, char **argv) readonly = 1; break; case 'm': - qemuio_misalign = 1; + qemuio_misalign = true; break; case 'g': growable = 1; @@ -417,7 +424,7 @@ int main(int argc, char **argv) } break; case 'T': - if (!trace_backend_init(optarg, NULL)) { + if (!trace_init_backends(optarg, NULL)) { exit(1); /* error message will have been printed */ } break; @@ -438,7 +445,11 @@ int main(int argc, char **argv) exit(1); } - qemu_init_main_loop(); + if (qemu_init_main_loop(&local_error)) { + error_report("%s", error_get_pretty(local_error)); + error_free(local_error); + exit(1); + } bdrv_init(); /* initialize commands */