From cf4a0643c8ab7d503465bd3f725369b630ea5001 Mon Sep 17 00:00:00 2001 From: Markus Armbruster Date: Tue, 17 Mar 2020 12:54:46 +0100 Subject: [PATCH] qapi: Inline do_qmp_dispatch() into qmp_dispatch() MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Both functions check @request is a QDict, and both have code for QCO_NO_SUCCESS_RESP. This wasn't the case back when they were created. It's a sign of muddled responsibilities. Inline. The next commits will clean up some more. Signed-off-by: Markus Armbruster Reviewed-by: Marc-André Lureau Message-Id: <20200317115459.31821-22-armbru@redhat.com> --- qapi/qmp-dispatch.c | 134 +++++++++++++++++++++----------------------- 1 file changed, 63 insertions(+), 71 deletions(-) diff --git a/qapi/qmp-dispatch.c b/qapi/qmp-dispatch.c index bc264b3c9b..a588072523 100644 --- a/qapi/qmp-dispatch.c +++ b/qapi/qmp-dispatch.c @@ -75,75 +75,6 @@ static QDict *qmp_dispatch_check_obj(const QObject *request, bool allow_oob, return dict; } -static QObject *do_qmp_dispatch(QmpCommandList *cmds, QObject *request, - bool allow_oob, Error **errp) -{ - Error *local_err = NULL; - bool oob; - const char *command; - QDict *args, *dict; - QmpCommand *cmd; - QObject *ret = NULL; - - dict = qmp_dispatch_check_obj(request, allow_oob, errp); - if (!dict) { - return NULL; - } - - command = qdict_get_try_str(dict, "execute"); - oob = false; - if (!command) { - assert(allow_oob); - command = qdict_get_str(dict, "exec-oob"); - oob = true; - } - cmd = qmp_find_command(cmds, command); - if (cmd == NULL) { - error_set(errp, ERROR_CLASS_COMMAND_NOT_FOUND, - "The command %s has not been found", command); - return NULL; - } - if (!cmd->enabled) { - error_set(errp, ERROR_CLASS_COMMAND_NOT_FOUND, - "The command %s has been disabled for this instance", - command); - return NULL; - } - if (oob && !(cmd->options & QCO_ALLOW_OOB)) { - error_setg(errp, "The command %s does not support OOB", - command); - return NULL; - } - - if (runstate_check(RUN_STATE_PRECONFIG) && - !(cmd->options & QCO_ALLOW_PRECONFIG)) { - error_setg(errp, "The command '%s' isn't permitted in '%s' state", - cmd->name, RunState_str(RUN_STATE_PRECONFIG)); - return NULL; - } - - if (!qdict_haskey(dict, "arguments")) { - args = qdict_new(); - } else { - args = qdict_get_qdict(dict, "arguments"); - qobject_ref(args); - } - - cmd->fn(args, &ret, &local_err); - if (local_err) { - error_propagate(errp, local_err); - } else if (cmd->options & QCO_NO_SUCCESS_RESP) { - g_assert(!ret); - } else if (!ret) { - /* TODO turn into assertion */ - ret = QOBJECT(qdict_new()); - } - - qobject_unref(args); - - return ret; -} - QDict *qmp_error_response(Error *err) { QDict *rsp; @@ -168,11 +99,72 @@ QDict *qmp_dispatch(QmpCommandList *cmds, QObject *request, bool allow_oob) { Error *err = NULL; + bool oob; + const char *command; + QDict *args; + QmpCommand *cmd; QDict *dict = qobject_to(QDict, request); - QObject *ret, *id = dict ? qdict_get(dict, "id") : NULL; + QObject *id = dict ? qdict_get(dict, "id") : NULL; + QObject *ret = NULL; QDict *rsp; - ret = do_qmp_dispatch(cmds, request, allow_oob, &err); + dict = qmp_dispatch_check_obj(request, allow_oob, &err); + if (!dict) { + goto out; + } + + command = qdict_get_try_str(dict, "execute"); + oob = false; + if (!command) { + assert(allow_oob); + command = qdict_get_str(dict, "exec-oob"); + oob = true; + } + cmd = qmp_find_command(cmds, command); + if (cmd == NULL) { + error_set(&err, ERROR_CLASS_COMMAND_NOT_FOUND, + "The command %s has not been found", command); + goto out; + } + if (!cmd->enabled) { + error_set(&err, ERROR_CLASS_COMMAND_NOT_FOUND, + "The command %s has been disabled for this instance", + command); + goto out; + } + if (oob && !(cmd->options & QCO_ALLOW_OOB)) { + error_setg(&err, "The command %s does not support OOB", + command); + goto out; + } + + if (runstate_check(RUN_STATE_PRECONFIG) && + !(cmd->options & QCO_ALLOW_PRECONFIG)) { + error_setg(&err, "The command '%s' isn't permitted in '%s' state", + cmd->name, RunState_str(RUN_STATE_PRECONFIG)); + goto out; + } + + if (!qdict_haskey(dict, "arguments")) { + args = qdict_new(); + } else { + args = qdict_get_qdict(dict, "arguments"); + qobject_ref(args); + } + + cmd->fn(args, &ret, &err); + if (err) { + ; + } else if (cmd->options & QCO_NO_SUCCESS_RESP) { + g_assert(!ret); + } else if (!ret) { + /* TODO turn into assertion */ + ret = QOBJECT(qdict_new()); + } + + qobject_unref(args); + +out: if (err) { rsp = qmp_error_response(err); } else if (ret) {