Monitor *mon;
/* "id" field of the request */
QObject *id;
- /* Request object to be handled */
+ /*
+ * Request object to be handled or Error to be reported
+ * (exactly one of them is non-null)
+ */
QObject *req;
+ Error *err;
/*
* Whether we need to resume the monitor afterward. This flag is
* used to emulate the old QMP server behavior that the current
{
qobject_unref(req->id);
qobject_unref(req->req);
+ error_free(req->err);
g_free(req);
}
return;
}
- trace_monitor_qmp_cmd_in_band(qobject_get_try_str(req_obj->id) ?: "");
- monitor_qmp_dispatch(req_obj->mon, req_obj->req, req_obj->id);
+ if (req_obj->req) {
+ trace_monitor_qmp_cmd_in_band(qobject_get_try_str(req_obj->id) ?: "");
+ monitor_qmp_dispatch(req_obj->mon, req_obj->req, req_obj->id);
+ } else {
+ assert(req_obj->err);
+ monitor_qmp_respond(req_obj->mon, NULL, req_obj->err, NULL);
+ }
+
if (req_obj->need_resume) {
/* Pairs with the monitor_suspend() in handle_qmp_command() */
monitor_resume(req_obj->mon);
/* json_parser_parse_err() sucks: can fail without setting @err */
error_setg(&err, QERR_JSON_PARSING);
}
- if (err) {
- assert(!req);
- monitor_qmp_respond(mon, NULL, err, NULL);
- return;
- }
qdict = qobject_to(QDict, req);
if (qdict) {
req_obj->mon = mon;
req_obj->id = id;
req_obj->req = req;
+ req_obj->err = err;
req_obj->need_resume = false;
/* Protect qmp_requests and fetching its length. */