qemu with hax to log dma reads & writes jcs.org/2018/11/12/vfio

qmp: De-duplicate error response building

All callers of qmp_build_error_object() duplicate the code to wrap it
in a response object. Replace it by qmp_error_response() that
captures the duplicated code, including error_free().

Signed-off-by: Markus Armbruster <armbru@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
Message-Id: <20180703085358.13941-23-armbru@redhat.com>
(cherry picked from commit cee32796cadc9510ee00f029a933009df7a28ae2)
Conflicts:
include/qapi/qmp/dispatch.h
qapi/qmp-dispatch.c
qga/main.c
* drop context dep on cb3e7f08ae
* prereq for ae7da1e5f6
Signed-off-by: Michael Roth <mdroth@linux.vnet.ibm.com>

authored by

Markus Armbruster and committed by
Michael Roth
08c4a51c 44178459

+15 -22
+1 -1
include/qapi/qmp/dispatch.h
··· 47 47 bool qmp_command_is_enabled(const QmpCommand *cmd); 48 48 const char *qmp_command_name(const QmpCommand *cmd); 49 49 bool qmp_has_success_response(const QmpCommand *cmd); 50 - QObject *qmp_build_error_object(Error *err); 50 + QDict *qmp_error_response(Error *err); 51 51 QDict *qmp_dispatch_check_obj(const QObject *request, Error **errp); 52 52 bool qmp_is_oob(QDict *dict); 53 53
+1 -6
monitor.c
··· 4036 4036 static void monitor_qmp_respond(Monitor *mon, QObject *rsp, 4037 4037 Error *err, QObject *id) 4038 4038 { 4039 - QDict *qdict = NULL; 4040 - 4041 4039 if (err) { 4042 4040 assert(!rsp); 4043 - qdict = qdict_new(); 4044 - qdict_put_obj(qdict, "error", qmp_build_error_object(err)); 4045 - error_free(err); 4046 - rsp = QOBJECT(qdict); 4041 + rsp = QOBJECT(qmp_error_response(err)); 4047 4042 } 4048 4043 4049 4044 if (rsp) {
+11 -9
qapi/qmp-dispatch.c
··· 122 122 return ret; 123 123 } 124 124 125 - QObject *qmp_build_error_object(Error *err) 125 + QDict *qmp_error_response(Error *err) 126 126 { 127 - return qobject_from_jsonf("{ 'class': %s, 'desc': %s }", 128 - QapiErrorClass_str(error_get_class(err)), 129 - error_get_pretty(err)); 127 + QDict *rsp; 128 + 129 + rsp = qdict_from_jsonf_nofail("{ 'error': { 'class': %s, 'desc': %s } }", 130 + QapiErrorClass_str(error_get_class(err)), 131 + error_get_pretty(err)); 132 + error_free(err); 133 + return rsp; 130 134 } 131 135 132 136 /* ··· 159 163 160 164 ret = do_qmp_dispatch(cmds, request, &err); 161 165 162 - rsp = qdict_new(); 163 166 if (err) { 164 - qdict_put_obj(rsp, "error", qmp_build_error_object(err)); 165 - error_free(err); 167 + rsp = qmp_error_response(err); 166 168 } else if (ret) { 169 + rsp = qdict_new(); 167 170 qdict_put_obj(rsp, "return", ret); 168 171 } else { 169 - QDECREF(rsp); 170 - return NULL; 172 + rsp = NULL; 171 173 } 172 174 173 175 return QOBJECT(rsp);
+2 -6
qga/main.c
··· 610 610 qdict = qobject_to(QDict, json_parser_parse_err(tokens, NULL, &err)); 611 611 if (err || !qdict) { 612 612 QDECREF(qdict); 613 - qdict = qdict_new(); 614 613 if (!err) { 615 614 g_warning("failed to parse event: unknown error"); 616 615 error_setg(&err, QERR_JSON_PARSING); 617 616 } else { 618 617 g_warning("failed to parse event: %s", error_get_pretty(err)); 619 618 } 620 - qdict_put_obj(qdict, "error", qmp_build_error_object(err)); 621 - error_free(err); 619 + qdict = qmp_error_response(err); 622 620 } 623 621 624 622 /* handle host->guest commands */ ··· 627 625 } else { 628 626 if (!qdict_haskey(qdict, "error")) { 629 627 QDECREF(qdict); 630 - qdict = qdict_new(); 631 628 g_warning("unrecognized payload format"); 632 629 error_setg(&err, QERR_UNSUPPORTED); 633 - qdict_put_obj(qdict, "error", qmp_build_error_object(err)); 634 - error_free(err); 630 + qdict = qmp_error_response(err); 635 631 } 636 632 ret = send_response(s, QOBJECT(qdict)); 637 633 if (ret < 0) {