From patchwork Tue Sep 6 10:18:06 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: "Dr. David Alan Gilbert" X-Patchwork-Id: 9316329 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id BE1FD601C0 for ; Tue, 6 Sep 2016 10:18:45 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id AE3A328C39 for ; Tue, 6 Sep 2016 10:18:45 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id A2DFC28C3B; Tue, 6 Sep 2016 10:18:45 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-5.9 required=2.0 tests=BAYES_00,HK_NAME_DR, RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id 3DEA528C39 for ; Tue, 6 Sep 2016 10:18:45 +0000 (UTC) Received: from localhost ([::1]:60445 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bhDSm-0006dB-EA for patchwork-qemu-devel@patchwork.kernel.org; Tue, 06 Sep 2016 06:18:44 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:42779) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bhDSK-0006ao-AZ for qemu-devel@nongnu.org; Tue, 06 Sep 2016 06:18:17 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1bhDSG-0000qF-1U for qemu-devel@nongnu.org; Tue, 06 Sep 2016 06:18:15 -0400 Received: from mx1.redhat.com ([209.132.183.28]:56780) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bhDSF-0000qB-Po for qemu-devel@nongnu.org; Tue, 06 Sep 2016 06:18:11 -0400 Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 4FB6F43A2C; Tue, 6 Sep 2016 10:18:11 +0000 (UTC) Received: from dgilbert-t530.redhat.com (ovpn-116-79.ams2.redhat.com [10.36.116.79]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u86AI7Rj018943; Tue, 6 Sep 2016 06:18:07 -0400 From: "Dr. David Alan Gilbert (git)" To: qemu-devel@nongnu.org, lcapitulino@redhat.com, afaerber@suse.de, armbru@redhat.com, pbonzini@redhat.com Date: Tue, 6 Sep 2016 11:18:06 +0100 Message-Id: <1473157086-12062-1-git-send-email-dgilbert@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.30]); Tue, 06 Sep 2016 10:18:11 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH v2] qom: Implement qom-get HMP command 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: kwolf@redhat.com, arei.gonglei@huawei.com Errors-To: qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Sender: "Qemu-devel" X-Virus-Scanned: ClamAV using ClamSMTP From: "Dr. David Alan Gilbert" This started off as Andreas Färber's implementation from March 2015, but after feedback from Paolo morphed into using the json output which handles structs reasonably. Use with qom-list to find the members of an object. (qemu) qom-get /backend/console[0]/device/vga.rom[0] size 65536 (qemu) qom-get /machine smm "auto" (qemu) qom-get /machine rtc-time { "tm_year": 116, "tm_sec": 0, "tm_hour": 9, "tm_min": 46, "tm_mon": 8, "tm_mday": 6 } (qemu) qom-get /machine frob Property '.frob' not found Signed-off-by: Dr. David Alan Gilbert Acked-by: Andreas Färber --- v2 switched from using string-output-visitor to qobject_to_json_pretty, drop string-output-visitor patch. --- hmp-commands.hx | 13 +++++++++++++ hmp.c | 26 ++++++++++++++++++++++++++ hmp.h | 1 + 3 files changed, 40 insertions(+) diff --git a/hmp-commands.hx b/hmp-commands.hx index 848efee..73f0372 100644 --- a/hmp-commands.hx +++ b/hmp-commands.hx @@ -1736,6 +1736,19 @@ Print QOM properties of object at location @var{path} ETEXI { + .name = "qom-get", + .args_type = "path:s,property:s", + .params = "path property", + .help = "print QOM property", + .mhandler.cmd = hmp_qom_get, + }, + +STEXI +@item qom-get @var{path} @var{property} +Print QOM property @var{property} of object at location @var{path} +ETEXI + + { .name = "qom-set", .args_type = "path:s,property:s,value:s", .params = "path property value", diff --git a/hmp.c b/hmp.c index cc2056e..88c659b 100644 --- a/hmp.c +++ b/hmp.c @@ -22,11 +22,13 @@ #include "qemu/option.h" #include "qemu/timer.h" #include "qmp-commands.h" +#include "qom/qom-qobject.h" #include "qemu/sockets.h" #include "monitor/monitor.h" #include "monitor/qdev.h" #include "qapi/opts-visitor.h" #include "qapi/qmp/qerror.h" +#include "qapi/qmp/qjson.h" #include "qapi/string-output-visitor.h" #include "qapi/util.h" #include "qapi-visit.h" @@ -2064,6 +2066,30 @@ void hmp_qom_list(Monitor *mon, const QDict *qdict) hmp_handle_error(mon, &err); } +void hmp_qom_get(Monitor *mon, const QDict *qdict) +{ + const char *path = qdict_get_str(qdict, "path"); + const char *property = qdict_get_str(qdict, "property"); + Error *err = NULL; + Object *obj; + QObject *sub; + + obj = object_resolve_path(path, NULL); + if (obj == NULL) { + error_set(&err, ERROR_CLASS_DEVICE_NOT_FOUND, + "Device '%s' not found", path); + hmp_handle_error(mon, &err); + return; + } + sub = object_property_get_qobject(obj, property, &err); + if (err == NULL) { + QString *str = qobject_to_json_pretty(sub); + monitor_printf(mon, "%s\n", qstring_get_str(str)); + QDECREF(str); + } + hmp_handle_error(mon, &err); +} + void hmp_qom_set(Monitor *mon, const QDict *qdict) { const char *path = qdict_get_str(qdict, "path"); diff --git a/hmp.h b/hmp.h index 0876ec0..882f339 100644 --- a/hmp.h +++ b/hmp.h @@ -103,6 +103,7 @@ void hmp_object_del(Monitor *mon, const QDict *qdict); void hmp_info_memdev(Monitor *mon, const QDict *qdict); void hmp_info_memory_devices(Monitor *mon, const QDict *qdict); void hmp_qom_list(Monitor *mon, const QDict *qdict); +void hmp_qom_get(Monitor *mon, const QDict *qdict); void hmp_qom_set(Monitor *mon, const QDict *qdict); void object_add_completion(ReadLineState *rs, int nb_args, const char *str); void object_del_completion(ReadLineState *rs, int nb_args, const char *str);