Commit 781f2b3d authored by Marc-André Lureau's avatar Marc-André Lureau Committed by Michael Roth
Browse files

qga: process_event() simplification



Simplify the code around qmp_dispatch():
- rely on qmp_dispatch/check_obj() for message checking
- have a single send_response() point
- constify send_response() argument

It changes a couple of error messages:

* When @req isn't a dictionary, from
    Invalid JSON syntax
  to
    QMP input must be a JSON object

* When @req lacks member "execute", from
    this feature or command is not currently supported
  to
    QMP input lacks member 'execute'

CC: Michael Roth <mdroth@linux.vnet.ibm.com>
Signed-off-by: default avatarMarc-André Lureau <marcandre.lureau@redhat.com>
Signed-off-by: default avatarMichael Roth <mdroth@linux.vnet.ibm.com>
Reviewed-by: default avatarEric Blake <eblake@redhat.com>
parent 996b9cdc
Loading
Loading
Loading
Loading
+9 −38
Original line number Diff line number Diff line
@@ -523,15 +523,15 @@ fail:
#endif
}

static int send_response(GAState *s, QDict *payload)
static int send_response(GAState *s, const QDict *rsp)
{
    const char *buf;
    QString *payload_qstr, *response_qstr;
    GIOStatus status;

    g_assert(payload && s->channel);
    g_assert(rsp && s->channel);

    payload_qstr = qobject_to_json(QOBJECT(payload));
    payload_qstr = qobject_to_json(QOBJECT(rsp));
    if (!payload_qstr) {
        return -EINVAL;
    }
@@ -557,53 +557,24 @@ static int send_response(GAState *s, QDict *payload)
    return 0;
}

static void process_command(GAState *s, QDict *req)
{
    QDict *rsp;
    int ret;

    g_assert(req);
    g_debug("processing command");
    rsp = qmp_dispatch(&ga_commands, QOBJECT(req), false);
    if (rsp) {
        ret = send_response(s, rsp);
        if (ret < 0) {
            g_warning("error sending response: %s", strerror(-ret));
        }
        qobject_unref(rsp);
    }
}

/* handle requests/control events coming in over the channel */
static void process_event(void *opaque, QObject *obj, Error *err)
{
    GAState *s = opaque;
    QDict *req, *rsp;
    QDict *rsp;
    int ret;

    g_debug("process_event: called");
    assert(!obj != !err);
    if (err) {
        goto err;
    }
    req = qobject_to(QDict, obj);
    if (!req) {
        error_setg(&err, "Input must be a JSON object");
        goto err;
    }
    if (!qdict_haskey(req, "execute")) {
        g_warning("unrecognized payload format");
        error_setg(&err, QERR_UNSUPPORTED);
        goto err;
        rsp = qmp_error_response(err);
        goto end;
    }

    process_command(s, req);
    qobject_unref(obj);
    return;
    g_debug("processing command");
    rsp = qmp_dispatch(&ga_commands, obj, false);

err:
    g_warning("failed to parse event: %s", error_get_pretty(err));
    rsp = qmp_error_response(err);
end:
    ret = send_response(s, rsp);
    if (ret < 0) {
        g_warning("error sending error response: %s", strerror(-ret));