mirror of
https://git.proxmox.com/git/qemu
synced 2025-06-15 11:04:11 +00:00
error: Let converted handlers print in human monitor
While fully converted handlers are not supposed to print anything when running in a QMP monitor, they are free to print in a human monitor. For instance, device_add (not yet converted) prints help, and will continue to do so after conversion. Moreover, utility functions converted to QError should remain usable from unconverted handlers. Two problems: * handler_audit() complains when a converted handler prints. Limit that to QMP monitors. * With QMP, handlers need to pass the error object by way of monitor_set_error(). However, we do that both for QMP and for the human monitor. The human monitor prints the error object after the handler returns. If the handler prints anything else, that output "overtakes" the error message. Limit use of monitor_set_error() to QMP monitors. Update handler_audit() accordingly.
This commit is contained in:
parent
6620d3ce9e
commit
cde0fc7544
18
monitor.c
18
monitor.c
@ -3876,13 +3876,6 @@ void monitor_set_error(Monitor *mon, QError *qerror)
|
||||
}
|
||||
}
|
||||
|
||||
static void monitor_print_error(Monitor *mon)
|
||||
{
|
||||
qerror_print(mon->error);
|
||||
QDECREF(mon->error);
|
||||
mon->error = NULL;
|
||||
}
|
||||
|
||||
static int is_async_return(const QObject *data)
|
||||
{
|
||||
if (data && qobject_type(data) == QTYPE_QDICT) {
|
||||
@ -3894,15 +3887,14 @@ static int is_async_return(const QObject *data)
|
||||
|
||||
static void handler_audit(Monitor *mon, const mon_cmd_t *cmd, int ret)
|
||||
{
|
||||
if (monitor_ctrl_mode(mon)) {
|
||||
if (ret && !monitor_has_error(mon)) {
|
||||
/*
|
||||
* If it returns failure, it must have passed on error.
|
||||
*
|
||||
* Action: Report an internal error to the client if in QMP.
|
||||
*/
|
||||
if (monitor_ctrl_mode(mon)) {
|
||||
qerror_report(QERR_UNDEFINED_ERROR);
|
||||
}
|
||||
MON_DEBUG("command '%s' returned failure but did not pass an error\n",
|
||||
cmd->name);
|
||||
}
|
||||
@ -3933,6 +3925,11 @@ static void handler_audit(Monitor *mon, const mon_cmd_t *cmd, int ret)
|
||||
cmd->name, mon_print_count_get(mon));
|
||||
}
|
||||
#endif
|
||||
} else {
|
||||
assert(!monitor_has_error(mon));
|
||||
QDECREF(mon->error);
|
||||
mon->error = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
static void monitor_call_handler(Monitor *mon, const mon_cmd_t *cmd,
|
||||
@ -3985,9 +3982,6 @@ static void handle_user_command(Monitor *mon, const char *cmdline)
|
||||
cmd->mhandler.cmd(mon, qdict);
|
||||
}
|
||||
|
||||
if (monitor_has_error(mon))
|
||||
monitor_print_error(mon);
|
||||
|
||||
out:
|
||||
QDECREF(qdict);
|
||||
}
|
||||
|
@ -207,7 +207,7 @@ void qerror_report_internal(const char *file, int linenr, const char *func,
|
||||
qerror = qerror_from_info(file, linenr, func, fmt, &va);
|
||||
va_end(va);
|
||||
|
||||
if (cur_mon) {
|
||||
if (monitor_cur_is_qmp()) {
|
||||
monitor_set_error(cur_mon, qerror);
|
||||
} else {
|
||||
qerror_print(qerror);
|
||||
|
Loading…
Reference in New Issue
Block a user