#include <termios.h>
#endif
+#include "qemu-common.h"
#include "qapi/error.h"
#include "qemu-io.h"
#include "qemu/error-report.h"
#include "qemu/main-loop.h"
+#include "qemu/module.h"
#include "qemu/option.h"
#include "qemu/config-file.h"
#include "qemu/readline.h"
#define CMD_NOFILE_OK 0x01
-static char *progname;
-
static BlockBackend *qemuio_blk;
static bool quit_qemu_io;
static char prompt[FILENAME_MAX + 2 /*"> "*/ + 1 /*"\0"*/ ];
if (!prompt[0]) {
- snprintf(prompt, sizeof(prompt), "%s> ", progname);
+ snprintf(prompt, sizeof(prompt), "%s> ", error_get_progname());
}
return prompt;
*fetchable= 1;
}
-static void command_loop(void)
+static int command_loop(void)
{
int i, fetchable = 0, prompted = 0;
+ int ret, last_error = 0;
char *input;
for (i = 0; !quit_qemu_io && i < ncmdline; i++) {
- qemuio_command(qemuio_blk, cmdline[i]);
+ ret = qemuio_command(qemuio_blk, cmdline[i]);
+ if (ret < 0) {
+ last_error = ret;
+ }
}
if (cmdline) {
g_free(cmdline);
- return;
+ return last_error;
}
while (!quit_qemu_io) {
if (input == NULL) {
break;
}
- qemuio_command(qemuio_blk, input);
+ ret = qemuio_command(qemuio_blk, input);
g_free(input);
+ if (ret < 0) {
+ last_error = ret;
+ }
+
prompted = 0;
fetchable = 0;
}
qemu_set_fd_handler(STDIN_FILENO, NULL, NULL, NULL);
+
+ return last_error;
}
static void add_user_command(char *optarg)
},
};
+static bool qemu_io_object_print_help(const char *type, QemuOpts *opts)
+{
+ if (user_creatable_print_help(type, opts)) {
+ exit(0);
+ }
+ return true;
+}
static QemuOptsList file_opts = {
.name = "file",
int c;
int opt_index = 0;
int flags = BDRV_O_UNMAP;
+ int ret;
bool writethrough = true;
Error *local_error = NULL;
QDict *opts = NULL;
signal(SIGPIPE, SIG_IGN);
#endif
+ error_init(argv[0]);
module_call_init(MODULE_INIT_TRACE);
- progname = g_path_get_basename(argv[0]);
qemu_init_exec_dir(argv[0]);
qcrypto_init(&error_fatal);
break;
case 'V':
printf("%s version " QEMU_FULL_VERSION "\n"
- QEMU_COPYRIGHT "\n", progname);
+ QEMU_COPYRIGHT "\n", error_get_progname());
exit(0);
case 'h':
- usage(progname);
+ usage(error_get_progname());
exit(0);
case 'U':
force_share = true;
imageOpts = true;
break;
default:
- usage(progname);
+ usage(error_get_progname());
exit(1);
}
}
if ((argc - optind) > 1) {
- usage(progname);
+ usage(error_get_progname());
exit(1);
}
exit(1);
}
- if (qemu_opts_foreach(&qemu_object_opts,
- user_creatable_add_opts_foreach,
- NULL, NULL)) {
- exit(1);
- }
+ qemu_opts_foreach(&qemu_object_opts,
+ user_creatable_add_opts_foreach,
+ qemu_io_object_print_help, &error_fatal);
if (!trace_init_backends()) {
exit(1);
}
}
}
- command_loop();
+ ret = command_loop();
/*
* Make sure all outstanding requests complete before the program exits.
blk_unref(qemuio_blk);
g_free(readline_state);
- return 0;
+
+ if (ret < 0) {
+ return 1;
+ } else {
+ return 0;
+ }
}