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>
This commit is contained in:
Markus Armbruster 2018-07-03 10:53:48 +02:00
parent a193352ff9
commit cee32796ca
4 changed files with 15 additions and 22 deletions

View File

@ -47,7 +47,7 @@ void qmp_enable_command(QmpCommandList *cmds, const char *name);
bool qmp_command_is_enabled(const QmpCommand *cmd); bool qmp_command_is_enabled(const QmpCommand *cmd);
const char *qmp_command_name(const QmpCommand *cmd); const char *qmp_command_name(const QmpCommand *cmd);
bool qmp_has_success_response(const QmpCommand *cmd); bool qmp_has_success_response(const QmpCommand *cmd);
QObject *qmp_build_error_object(Error *err); QDict *qmp_error_response(Error *err);
QObject *qmp_dispatch(QmpCommandList *cmds, QObject *request, QObject *qmp_dispatch(QmpCommandList *cmds, QObject *request,
bool allow_oob); bool allow_oob);
bool qmp_is_oob(QDict *dict); bool qmp_is_oob(QDict *dict);

View File

@ -4107,14 +4107,9 @@ static int monitor_can_read(void *opaque)
static void monitor_qmp_respond(Monitor *mon, QObject *rsp, static void monitor_qmp_respond(Monitor *mon, QObject *rsp,
Error *err, QObject *id) Error *err, QObject *id)
{ {
QDict *qdict = NULL;
if (err) { if (err) {
assert(!rsp); assert(!rsp);
qdict = qdict_new(); rsp = QOBJECT(qmp_error_response(err));
qdict_put_obj(qdict, "error", qmp_build_error_object(err));
error_free(err);
rsp = QOBJECT(qdict);
} }
if (rsp) { if (rsp) {

View File

@ -141,11 +141,15 @@ static QObject *do_qmp_dispatch(QmpCommandList *cmds, QObject *request,
return ret; return ret;
} }
QObject *qmp_build_error_object(Error *err) QDict *qmp_error_response(Error *err)
{ {
return qobject_from_jsonf("{ 'class': %s, 'desc': %s }", QDict *rsp;
QapiErrorClass_str(error_get_class(err)),
error_get_pretty(err)); rsp = qdict_from_jsonf_nofail("{ 'error': { 'class': %s, 'desc': %s } }",
QapiErrorClass_str(error_get_class(err)),
error_get_pretty(err));
error_free(err);
return rsp;
} }
/* /*
@ -166,15 +170,13 @@ QObject *qmp_dispatch(QmpCommandList *cmds, QObject *request,
ret = do_qmp_dispatch(cmds, request, allow_oob, &err); ret = do_qmp_dispatch(cmds, request, allow_oob, &err);
rsp = qdict_new();
if (err) { if (err) {
qdict_put_obj(rsp, "error", qmp_build_error_object(err)); rsp = qmp_error_response(err);
error_free(err);
} else if (ret) { } else if (ret) {
rsp = qdict_new();
qdict_put_obj(rsp, "return", ret); qdict_put_obj(rsp, "return", ret);
} else { } else {
qobject_unref(rsp); rsp = NULL;
return NULL;
} }
return QOBJECT(rsp); return QOBJECT(rsp);

View File

@ -610,15 +610,13 @@ static void process_event(JSONMessageParser *parser, GQueue *tokens)
qdict = qobject_to(QDict, json_parser_parse_err(tokens, NULL, &err)); qdict = qobject_to(QDict, json_parser_parse_err(tokens, NULL, &err));
if (err || !qdict) { if (err || !qdict) {
qobject_unref(qdict); qobject_unref(qdict);
qdict = qdict_new();
if (!err) { if (!err) {
g_warning("failed to parse event: unknown error"); g_warning("failed to parse event: unknown error");
error_setg(&err, QERR_JSON_PARSING); error_setg(&err, QERR_JSON_PARSING);
} else { } else {
g_warning("failed to parse event: %s", error_get_pretty(err)); g_warning("failed to parse event: %s", error_get_pretty(err));
} }
qdict_put_obj(qdict, "error", qmp_build_error_object(err)); qdict = qmp_error_response(err);
error_free(err);
} }
/* handle host->guest commands */ /* handle host->guest commands */
@ -627,11 +625,9 @@ static void process_event(JSONMessageParser *parser, GQueue *tokens)
} else { } else {
if (!qdict_haskey(qdict, "error")) { if (!qdict_haskey(qdict, "error")) {
qobject_unref(qdict); qobject_unref(qdict);
qdict = qdict_new();
g_warning("unrecognized payload format"); g_warning("unrecognized payload format");
error_setg(&err, QERR_UNSUPPORTED); error_setg(&err, QERR_UNSUPPORTED);
qdict_put_obj(qdict, "error", qmp_build_error_object(err)); qdict = qmp_error_response(err);
error_free(err);
} }
ret = send_response(s, QOBJECT(qdict)); ret = send_response(s, QOBJECT(qdict));
if (ret < 0) { if (ret < 0) {