From nobody Tue Dec 16 06:13:11 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1552926449274520.0695272747006; Mon, 18 Mar 2019 09:27:29 -0700 (PDT) Received: from localhost ([127.0.0.1]:44218 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h5v6f-0002Lt-28 for importer@patchew.org; Mon, 18 Mar 2019 12:27:21 -0400 Received: from eggs.gnu.org ([209.51.188.92]:43957) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h5v4O-00012H-CY for qemu-devel@nongnu.org; Mon, 18 Mar 2019 12:25:01 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1h5v4M-0002oD-Bn for qemu-devel@nongnu.org; Mon, 18 Mar 2019 12:24:59 -0400 Received: from mail-ot1-x333.google.com ([2607:f8b0:4864:20::333]:43122) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1h5v4K-0002kj-TK for qemu-devel@nongnu.org; Mon, 18 Mar 2019 12:24:57 -0400 Received: by mail-ot1-x333.google.com with SMTP id u15so4833676otq.10 for ; Mon, 18 Mar 2019 09:24:55 -0700 (PDT) Received: from localhost (76-251-165-188.lightspeed.austtx.sbcglobal.net. [76.251.165.188]) by smtp.gmail.com with ESMTPSA id c16sm4055989otl.70.2019.03.18.09.24.52 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Mon, 18 Mar 2019 09:24:52 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=dNmqkhWd37hmbpmXko8Rbz2l4qYvKu/K6fAkh1eNWTk=; b=leCMu/j9XpsQBwFnUK3KkRrvSDATBql8nVIcQxjgNnrAt0FM1HWHDWqQtprPhjnTYp LxnFUlVLHUgPga3hE5vOoRyOz3FrVjyOor4+Z1q/wkpTxxgYkRaDtpzAdk2/EsFMttIi +fdKIiYyG7GsmSOCOUi2AHTXZYHtmpVH7OsG1CdRPmmHrCpAWOlEcXS/qFfCuai4G0ip LI37JtXUoW/GVlNv3KB0c0jblSBE7mgXDKD/BmjXwwSMer8L5eXvDvEZzmr9I36F0/wR n83FmB9WW2BsY8kCG7EzYp2uKeeBQhd+MrM3MKGPnN1cTEDaEJ/Zyyy2vL2OA2GGBca5 CWyg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references:mime-version:content-transfer-encoding; bh=dNmqkhWd37hmbpmXko8Rbz2l4qYvKu/K6fAkh1eNWTk=; b=H7pjt89k9L3YCmjBA15UuJdvCpTCV/cjDSUZJToy5MNg3qLK4ZVj2k5GDGoA2vdebO RRjcfwDYg+DtgeYTYezI3RiX7URiw5iKwi7skK0aEc6Azjkq8BhDU9wHp5MgWa/yskdr suWpvhkJIW3rarLauxUNvSLlSnLYiyxYwlARay2KsR9VffMp24PiaZysVtYA2XFx92zh ZQFqvyNdK3r1Ljm9iBnCluwdBmVAHdus9o9TMBi2FpCnX0sK1KCFCyUWHgfmw1n2CXS1 Wn/h+0QQ908Bhsubnbt2pWeP4YG1MxTZfV9PcBWNmuXi3flfdpf1dBU/XjGUbTVuMQ03 aOdw== X-Gm-Message-State: APjAAAUfYojfsVPlMZ1V36QHipGIzrhMWxJcyjWnQPOjr1P2Px5MBKIX jONn5rCaAWASaRgr56NgK5vNiG5W X-Google-Smtp-Source: APXvYqyhbn5CucnibPYIlFUrQgRIpsOBMquzg8PVghoYDIgwEeRSfamNZThGO0LDeJ+YvjSGUqM6Ww== X-Received: by 2002:a9d:760a:: with SMTP id k10mr11095717otl.367.1552926293490; Mon, 18 Mar 2019 09:24:53 -0700 (PDT) From: Michael Roth To: qemu-devel@nongnu.org Date: Mon, 18 Mar 2019 11:24:10 -0500 Message-Id: <20190318162410.10183-8-mdroth@linux.vnet.ibm.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190318162410.10183-1-mdroth@linux.vnet.ibm.com> References: <20190318162410.10183-1-mdroth@linux.vnet.ibm.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:4864:20::333 Subject: [Qemu-devel] [PULL for-4.0 7/7] qmp: common 'id' handling & make QGA conform to QMP spec X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: peter.maydell@linaro.org, =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) From: Marc-Andr=C3=A9 Lureau Let qmp_dispatch() copy the 'id' field. That way any qmp client will conform to the specification, including QGA. Furthermore, it simplifies the work for qemu monitor. CC: Michael Roth Signed-off-by: Marc-Andr=C3=A9 Lureau Reviewed-by: Markus Armbruster Signed-off-by: Michael Roth --- monitor.c | 33 ++++++++++++--------------------- qapi/qmp-dispatch.c | 10 ++++++++-- tests/test-qga.c | 13 +++++-------- 3 files changed, 25 insertions(+), 31 deletions(-) diff --git a/monitor.c b/monitor.c index 72061d5bae..4807bbe811 100644 --- a/monitor.c +++ b/monitor.c @@ -250,8 +250,6 @@ QEMUBH *qmp_dispatcher_bh; struct QMPRequest { /* Owner of the request */ Monitor *mon; - /* "id" field of the request */ - QObject *id; /* * Request object to be handled or Error to be reported * (exactly one of them is non-null) @@ -353,7 +351,6 @@ int monitor_read_password(Monitor *mon, ReadLineFunc *r= eadline_func, =20 static void qmp_request_free(QMPRequest *req) { - qobject_unref(req->id); qobject_unref(req->req); error_free(req->err); g_free(req); @@ -4108,18 +4105,14 @@ static int monitor_can_read(void *opaque) * Null @rsp can only happen for commands with QCO_NO_SUCCESS_RESP. * Nothing is emitted then. */ -static void monitor_qmp_respond(Monitor *mon, QDict *rsp, QObject *id) +static void monitor_qmp_respond(Monitor *mon, QDict *rsp) { if (rsp) { - if (id) { - qdict_put_obj(rsp, "id", qobject_ref(id)); - } - qmp_send_response(mon, rsp); } } =20 -static void monitor_qmp_dispatch(Monitor *mon, QObject *req, QObject *id) +static void monitor_qmp_dispatch(Monitor *mon, QObject *req) { Monitor *old_mon; QDict *rsp; @@ -4144,7 +4137,7 @@ static void monitor_qmp_dispatch(Monitor *mon, QObjec= t *req, QObject *id) } } =20 - monitor_qmp_respond(mon, rsp, id); + monitor_qmp_respond(mon, rsp); qobject_unref(rsp); } =20 @@ -4208,13 +4201,15 @@ static void monitor_qmp_bh_dispatcher(void *data) mon->qmp.qmp_requests->length =3D=3D QMP_REQ_QUEUE_LEN_MAX - 1; qemu_mutex_unlock(&mon->qmp.qmp_queue_lock); if (req_obj->req) { - trace_monitor_qmp_cmd_in_band(qobject_get_try_str(req_obj->id) ?: = ""); - monitor_qmp_dispatch(mon, req_obj->req, req_obj->id); + QDict *qdict =3D qobject_to(QDict, req_obj->req); + QObject *id =3D qdict ? qdict_get(qdict, "id") : NULL; + trace_monitor_qmp_cmd_in_band(qobject_get_try_str(id) ?: ""); + monitor_qmp_dispatch(mon, req_obj->req); } else { assert(req_obj->err); rsp =3D qmp_error_response(req_obj->err); req_obj->err =3D NULL; - monitor_qmp_respond(mon, rsp, NULL); + monitor_qmp_respond(mon, rsp); qobject_unref(rsp); } =20 @@ -4239,8 +4234,7 @@ static void handle_qmp_command(void *opaque, QObject = *req, Error *err) =20 qdict =3D qobject_to(QDict, req); if (qdict) { - id =3D qobject_ref(qdict_get(qdict, "id")); - qdict_del(qdict, "id"); + id =3D qdict_get(qdict, "id"); } /* else will fail qmp_dispatch() */ =20 if (req && trace_event_get_state_backends(TRACE_HANDLE_QMP_COMMAND)) { @@ -4251,17 +4245,14 @@ static void handle_qmp_command(void *opaque, QObjec= t *req, Error *err) =20 if (qdict && qmp_is_oob(qdict)) { /* OOB commands are executed immediately */ - trace_monitor_qmp_cmd_out_of_band(qobject_get_try_str(id) - ?: ""); - monitor_qmp_dispatch(mon, req, id); + trace_monitor_qmp_cmd_out_of_band(qobject_get_try_str(id) ?: ""); + monitor_qmp_dispatch(mon, req); qobject_unref(req); - qobject_unref(id); return; } =20 req_obj =3D g_new0(QMPRequest, 1); req_obj->mon =3D mon; - req_obj->id =3D id; req_obj->req =3D req; req_obj->err =3D err; =20 @@ -4281,7 +4272,7 @@ static void handle_qmp_command(void *opaque, QObject = *req, Error *err) =20 /* * Put the request to the end of queue so that requests will be - * handled in time order. Ownership for req_obj, req, id, + * handled in time order. Ownership for req_obj, req, * etc. will be delivered to the handler side. */ assert(mon->qmp.qmp_requests->length < QMP_REQ_QUEUE_LEN_MAX); diff --git a/qapi/qmp-dispatch.c b/qapi/qmp-dispatch.c index 1d922e04f7..5f812bb9f2 100644 --- a/qapi/qmp-dispatch.c +++ b/qapi/qmp-dispatch.c @@ -58,6 +58,8 @@ static QDict *qmp_dispatch_check_obj(const QObject *reque= st, bool allow_oob, "QMP input member 'arguments' must be an object= "); return NULL; } + } else if (!strcmp(arg_name, "id")) { + continue; } else { error_setg(errp, "QMP input member '%s' is unexpected", arg_name); @@ -165,11 +167,11 @@ QDict *qmp_dispatch(QmpCommandList *cmds, QObject *re= quest, bool allow_oob) { Error *err =3D NULL; - QObject *ret; + QDict *dict =3D qobject_to(QDict, request); + QObject *ret, *id =3D dict ? qdict_get(dict, "id") : NULL; QDict *rsp; =20 ret =3D do_qmp_dispatch(cmds, request, allow_oob, &err); - if (err) { rsp =3D qmp_error_response(err); } else if (ret) { @@ -180,5 +182,9 @@ QDict *qmp_dispatch(QmpCommandList *cmds, QObject *requ= est, rsp =3D NULL; } =20 + if (rsp && id) { + qdict_put_obj(rsp, "id", qobject_ref(id)); + } + return rsp; } diff --git a/tests/test-qga.c b/tests/test-qga.c index 3d6377436a..891aa3d322 100644 --- a/tests/test-qga.c +++ b/tests/test-qga.c @@ -225,18 +225,15 @@ static void test_qga_ping(gconstpointer fix) qobject_unref(ret); } =20 -static void test_qga_invalid_id(gconstpointer fix) +static void test_qga_id(gconstpointer fix) { const TestFixture *fixture =3D fix; - QDict *ret, *error; - const char *class; + QDict *ret; =20 ret =3D qmp_fd(fixture->fd, "{'execute': 'guest-ping', 'id': 1}"); g_assert_nonnull(ret); - - error =3D qdict_get_qdict(ret, "error"); - class =3D qdict_get_try_str(error, "class"); - g_assert_cmpstr(class, =3D=3D, "GenericError"); + qmp_assert_no_error(ret); + g_assert_cmpint(qdict_get_int(ret, "id"), =3D=3D, 1); =20 qobject_unref(ret); } @@ -992,7 +989,7 @@ int main(int argc, char **argv) g_test_add_data_func("/qga/file-ops", &fix, test_qga_file_ops); g_test_add_data_func("/qga/file-write-read", &fix, test_qga_file_write= _read); g_test_add_data_func("/qga/get-time", &fix, test_qga_get_time); - g_test_add_data_func("/qga/invalid-id", &fix, test_qga_invalid_id); + g_test_add_data_func("/qga/id", &fix, test_qga_id); g_test_add_data_func("/qga/invalid-oob", &fix, test_qga_invalid_oob); g_test_add_data_func("/qga/invalid-cmd", &fix, test_qga_invalid_cmd); g_test_add_data_func("/qga/invalid-args", &fix, test_qga_invalid_args); --=20 2.17.1