From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:58686) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YW6DD-0001F4-Gb for qemu-devel@nongnu.org; Thu, 12 Mar 2015 12:43:59 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1YW6D6-0001LF-8b for qemu-devel@nongnu.org; Thu, 12 Mar 2015 12:43:55 -0400 Received: from cantor2.suse.de ([195.135.220.15]:47945 helo=mx2.suse.de) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YW6D5-0001Ka-VC for qemu-devel@nongnu.org; Thu, 12 Mar 2015 12:43:48 -0400 From: =?UTF-8?q?Andreas=20F=C3=A4rber?= Date: Thu, 12 Mar 2015 17:43:42 +0100 Message-Id: <1426178624-32638-8-git-send-email-afaerber@suse.de> In-Reply-To: <1426178624-32638-1-git-send-email-afaerber@suse.de> References: <1426178624-32638-1-git-send-email-afaerber@suse.de> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable Subject: [Qemu-devel] [PATCH v2 7/9] qom: Add verbose option to info qom-tree HMP command List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: Hani Benhabiles , =?UTF-8?q?Andreas=20F=C3=A4rber?= , Luiz Capitulino It lists object properties, as equivalent to what info qtree displays. Cc: Hani Benhabiles Signed-off-by: Andreas F=C3=A4rber --- monitor.c | 6 +++--- qdev-monitor.c | 49 ++++++++++++++++++++++++++++++++++++++++++------- 2 files changed, 45 insertions(+), 10 deletions(-) diff --git a/monitor.c b/monitor.c index 48f7f5a..9e16b4a 100644 --- a/monitor.c +++ b/monitor.c @@ -2890,9 +2890,9 @@ static mon_cmd_t info_cmds[] =3D { }, { .name =3D "qom-tree", - .args_type =3D "path:s?", - .params =3D "[path]", - .help =3D "show QOM composition tree", + .args_type =3D "verbose:-v,path:s?", + .params =3D "[-v] [path]", + .help =3D "show QOM composition tree (-v: show properties)= ", .mhandler.cmd =3D hmp_info_qom_tree, }, { diff --git a/qdev-monitor.c b/qdev-monitor.c index 1d87f57..845abfa 100644 --- a/qdev-monitor.c +++ b/qdev-monitor.c @@ -22,6 +22,7 @@ #include "monitor/monitor.h" #include "monitor/qdev.h" #include "qmp-commands.h" +#include "qapi/string-output-visitor.h" #include "sysemu/arch_init.h" #include "qemu/config-file.h" =20 @@ -681,40 +682,74 @@ void hmp_info_qdm(Monitor *mon, const QDict *qdict) typedef struct QOMCompositionState { Monitor *mon; int indent; + bool verbose; } QOMCompositionState; =20 -static void print_qom_composition(Monitor *mon, Object *obj, int indent)= ; +static void print_qom_composition(Monitor *mon, Object *obj, int indent, + bool verbose); =20 static int print_qom_composition_child(Object *obj, void *opaque) { QOMCompositionState *s =3D opaque; =20 - print_qom_composition(s->mon, obj, s->indent); + print_qom_composition(s->mon, obj, s->indent, s->verbose); =20 return 0; } =20 -static void print_qom_composition(Monitor *mon, Object *obj, int indent) +static void print_qom_composition(Monitor *mon, Object *obj, int indent, + bool verbose) { QOMCompositionState s =3D { .mon =3D mon, .indent =3D indent + 2, + .verbose =3D verbose, }; - char *name; + ObjectProperty *prop; + StringOutputVisitor *mo; + Error *local_err =3D NULL; + char *name, *str; =20 if (obj =3D=3D object_get_root()) { name =3D g_strdup(""); } else { name =3D object_get_canonical_path_component(obj); } - monitor_printf(mon, "%*s/%s (%s)\n", indent, "", name, - object_get_typename(obj)); + if (verbose) { + monitor_printf(mon, "%*s/%s\n", indent, "", name); + QTAILQ_FOREACH(prop, &obj->properties, node) { + mo =3D string_output_visitor_new(true); + if (!prop->get) { + monitor_printf(mon, "%*s%s (write-only)\n", indent + 2, = "", + prop->name); + } else { + prop->get(obj, string_output_get_visitor(mo), prop->opaq= ue, + prop->name, &local_err); + if (local_err) { + monitor_printf(mon, "%*s%s: Error: %s\n", indent + 2= , "", + prop->name, error_get_pretty(local_er= r)); + error_free(local_err); + local_err =3D NULL; + } else { + str =3D string_output_get_string(mo); + monitor_printf(mon, "%*s%s: %s\n", indent + 2, "", + prop->name, str); + g_free(str); + } + } + string_output_visitor_cleanup(mo); + } + } else { + monitor_printf(mon, "%*s/%s (%s)\n", indent, "", name, + object_get_typename(obj)); + } g_free(name); object_child_foreach(obj, print_qom_composition_child, &s); } =20 void hmp_info_qom_tree(Monitor *mon, const QDict *dict) { + bool verbose =3D qdict_get_try_bool(dict, "verbose", 0); const char *path =3D qdict_get_try_str(dict, "path"); Object *obj; bool ambiguous =3D false; @@ -732,7 +767,7 @@ void hmp_info_qom_tree(Monitor *mon, const QDict *dic= t) } else { obj =3D qdev_get_machine(); } - print_qom_composition(mon, obj, 0); + print_qom_composition(mon, obj, 0, verbose); } =20 int do_device_add(Monitor *mon, const QDict *qdict, QObject **ret_data) --=20 2.1.4