diff options
-rw-r--r-- | monitor.c | 43 | ||||
-rw-r--r-- | sysemu.h | 7 |
2 files changed, 49 insertions, 1 deletions
@@ -49,6 +49,7 @@ #include "qlist.h" #include "qdict.h" #include "qstring.h" +#include "qerror.h" //#define DEBUG //#define DEBUG_COMPLETION @@ -103,6 +104,7 @@ struct Monitor { CPUState *mon_cpu; BlockDriverCompletionFunc *password_completion_cb; void *password_opaque; + QError *error; QLIST_HEAD(,mon_fd_t) fds; QLIST_ENTRY(Monitor) entry; }; @@ -224,6 +226,11 @@ static inline int monitor_handler_ported(const mon_cmd_t *cmd) return cmd->user_print != NULL; } +static inline int monitor_has_error(const Monitor *mon) +{ + return mon->error != NULL; +} + static void monitor_print_qobject(Monitor *mon, const QObject *data) { switch (qobject_type(data)) { @@ -3168,6 +3175,13 @@ fail: return NULL; } +static void monitor_print_error(Monitor *mon) +{ + qerror_print(mon->error); + QDECREF(mon->error); + mon->error = NULL; +} + static void monitor_handle_command(Monitor *mon, const char *cmdline) { QDict *qdict; @@ -3193,7 +3207,10 @@ static void monitor_handle_command(Monitor *mon, const char *cmdline) cmd->mhandler.cmd(mon, qdict); } - qemu_errors_to_previous(); + if (monitor_has_error(mon)) + monitor_print_error(mon); + + qemu_errors_to_previous(); out: QDECREF(qdict); @@ -3644,3 +3661,27 @@ void qemu_error(const char *fmt, ...) break; } } + +void qemu_error_internal(const char *file, int linenr, const char *func, + const char *fmt, ...) +{ + va_list va; + QError *qerror; + + assert(qemu_error_sink != NULL); + + va_start(va, fmt); + qerror = qerror_from_info(file, linenr, func, fmt, &va); + va_end(va); + + switch (qemu_error_sink->dest) { + case ERR_SINK_FILE: + qerror_print(qerror); + QDECREF(qerror); + break; + case ERR_SINK_MONITOR: + assert(qemu_error_sink->mon->error == NULL); + qemu_error_sink->mon->error = qerror; + break; + } +} @@ -7,6 +7,7 @@ #include "qemu-queue.h" #include "qemu-timer.h" #include "qdict.h" +#include "qerror.h" #ifdef _WIN32 #include <windows.h> @@ -71,6 +72,12 @@ void qemu_errors_to_file(FILE *fp); void qemu_errors_to_mon(Monitor *mon); void qemu_errors_to_previous(void); void qemu_error(const char *fmt, ...) __attribute__ ((format(printf, 1, 2))); +void qemu_error_internal(const char *file, int linenr, const char *func, + const char *fmt, ...) + __attribute__ ((format(printf, 4, 5))); + +#define qemu_error_new(fmt, ...) \ + qemu_error_internal(__FILE__, __LINE__, __func__, fmt, ## __VA_ARGS__) #ifdef _WIN32 /* Polling handling */ |