On Sun, Mar 15, 2020 at 4:05 PM Markus Armbruster <arm...@redhat.com> wrote: > > 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 <arm...@redhat.com>
Reviewed-by: Marc-André Lureau <marcandre.lur...@redhat.com> > --- > qapi/qmp-dispatch.c | 90 +++++++++++++++++++++------------------------ > 1 file changed, 41 insertions(+), 49 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,19 +75,42 @@ 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) > +QDict *qmp_error_response(Error *err) > { > - Error *local_err = NULL; > + QDict *rsp; > + > + 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; > +} > + > +/* > + * Does @qdict look like a command to be run out-of-band? > + */ > +bool qmp_is_oob(const QDict *dict) > +{ > + return qdict_haskey(dict, "exec-oob") > + && !qdict_haskey(dict, "execute"); > +} > + > +QDict *qmp_dispatch(QmpCommandList *cmds, QObject *request, > + bool allow_oob) > +{ > + Error *err = NULL; > bool oob; > const char *command; > - QDict *args, *dict; > + QDict *args; > QmpCommand *cmd; > + QDict *dict = qobject_to(QDict, request); > + QObject *id = dict ? qdict_get(dict, "id") : NULL; > QObject *ret = NULL; > + QDict *rsp; > > - dict = qmp_dispatch_check_obj(request, allow_oob, errp); > + dict = qmp_dispatch_check_obj(request, allow_oob, &err); > if (!dict) { > - return NULL; > + goto out; > } > > command = qdict_get_try_str(dict, "execute"); > @@ -99,27 +122,27 @@ static QObject *do_qmp_dispatch(QmpCommandList *cmds, > QObject *request, > } > cmd = qmp_find_command(cmds, command); > if (cmd == NULL) { > - error_set(errp, ERROR_CLASS_COMMAND_NOT_FOUND, > + error_set(&err, ERROR_CLASS_COMMAND_NOT_FOUND, > "The command %s has not been found", command); > - return NULL; > + goto out; > } > if (!cmd->enabled) { > - error_set(errp, ERROR_CLASS_COMMAND_NOT_FOUND, > + error_set(&err, ERROR_CLASS_COMMAND_NOT_FOUND, > "The command %s has been disabled for this instance", > command); > - return NULL; > + goto out; > } > if (oob && !(cmd->options & QCO_ALLOW_OOB)) { > - error_setg(errp, "The command %s does not support OOB", > + error_setg(&err, "The command %s does not support OOB", > command); > - return NULL; > + goto out; > } > > if (runstate_check(RUN_STATE_PRECONFIG) && > !(cmd->options & QCO_ALLOW_PRECONFIG)) { > - error_setg(errp, "The command '%s' isn't permitted in '%s' state", > + error_setg(&err, "The command '%s' isn't permitted in '%s' state", > cmd->name, RunState_str(RUN_STATE_PRECONFIG)); > - return NULL; > + goto out; > } > > if (!qdict_haskey(dict, "arguments")) { > @@ -129,9 +152,9 @@ static QObject *do_qmp_dispatch(QmpCommandList *cmds, > QObject *request, > qobject_ref(args); > } > > - cmd->fn(args, &ret, &local_err); > - if (local_err) { > - error_propagate(errp, local_err); > + cmd->fn(args, &ret, &err); > + if (err) { > + ; > } else if (cmd->options & QCO_NO_SUCCESS_RESP) { > g_assert(!ret); > } else if (!ret) { > @@ -141,38 +164,7 @@ static QObject *do_qmp_dispatch(QmpCommandList *cmds, > QObject *request, > > qobject_unref(args); > > - return ret; > -} > - > -QDict *qmp_error_response(Error *err) > -{ > - QDict *rsp; > - > - 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; > -} > - > -/* > - * Does @qdict look like a command to be run out-of-band? > - */ > -bool qmp_is_oob(const QDict *dict) > -{ > - return qdict_haskey(dict, "exec-oob") > - && !qdict_haskey(dict, "execute"); > -} > - > -QDict *qmp_dispatch(QmpCommandList *cmds, QObject *request, > - bool allow_oob) > -{ > - Error *err = NULL; > - QDict *dict = qobject_to(QDict, request); > - QObject *ret, *id = dict ? qdict_get(dict, "id") : NULL; > - QDict *rsp; > - > - ret = do_qmp_dispatch(cmds, request, allow_oob, &err); > +out: > if (err) { > rsp = qmp_error_response(err); > } else if (ret) { > -- > 2.21.1 > > -- Marc-André Lureau