qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: "Andreas Färber" <afaerber@suse.de>
To: qemu-devel@nongnu.org
Cc: "Hani Benhabiles" <hani@linux.com>,
	"Andreas Färber" <afaerber@suse.de>,
	"Luiz Capitulino" <lcapitulino@redhat.com>
Subject: [Qemu-devel] [PATCH v2 7/9] qom: Add verbose option to info qom-tree HMP command
Date: Thu, 12 Mar 2015 17:43:42 +0100	[thread overview]
Message-ID: <1426178624-32638-8-git-send-email-afaerber@suse.de> (raw)
In-Reply-To: <1426178624-32638-1-git-send-email-afaerber@suse.de>

It lists object properties, as equivalent to what info qtree displays.

Cc: Hani Benhabiles <hani@linux.com>
Signed-off-by: Andreas Färber <afaerber@suse.de>
---
 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[] = {
     },
     {
         .name       = "qom-tree",
-        .args_type  = "path:s?",
-        .params     = "[path]",
-        .help       = "show QOM composition tree",
+        .args_type  = "verbose:-v,path:s?",
+        .params     = "[-v] [path]",
+        .help       = "show QOM composition tree (-v: show properties)",
         .mhandler.cmd = 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"
 
@@ -681,40 +682,74 @@ void hmp_info_qdm(Monitor *mon, const QDict *qdict)
 typedef struct QOMCompositionState {
     Monitor *mon;
     int indent;
+    bool verbose;
 } QOMCompositionState;
 
-static void print_qom_composition(Monitor *mon, Object *obj, int indent);
+static void print_qom_composition(Monitor *mon, Object *obj, int indent,
+                                  bool verbose);
 
 static int print_qom_composition_child(Object *obj, void *opaque)
 {
     QOMCompositionState *s = opaque;
 
-    print_qom_composition(s->mon, obj, s->indent);
+    print_qom_composition(s->mon, obj, s->indent, s->verbose);
 
     return 0;
 }
 
-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 = {
         .mon = mon,
         .indent = indent + 2,
+        .verbose = verbose,
     };
-    char *name;
+    ObjectProperty *prop;
+    StringOutputVisitor *mo;
+    Error *local_err = NULL;
+    char *name, *str;
 
     if (obj == object_get_root()) {
         name = g_strdup("");
     } else {
         name = 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 = 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->opaque,
+                          prop->name, &local_err);
+                if (local_err) {
+                    monitor_printf(mon, "%*s%s: Error: %s\n", indent + 2, "",
+                                   prop->name, error_get_pretty(local_err));
+                    error_free(local_err);
+                    local_err = NULL;
+                } else {
+                    str = 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);
 }
 
 void hmp_info_qom_tree(Monitor *mon, const QDict *dict)
 {
+    bool verbose = qdict_get_try_bool(dict, "verbose", 0);
     const char *path = qdict_get_try_str(dict, "path");
     Object *obj;
     bool ambiguous = false;
@@ -732,7 +767,7 @@ void hmp_info_qom_tree(Monitor *mon, const QDict *dict)
     } else {
         obj = qdev_get_machine();
     }
-    print_qom_composition(mon, obj, 0);
+    print_qom_composition(mon, obj, 0, verbose);
 }
 
 int do_device_add(Monitor *mon, const QDict *qdict, QObject **ret_data)
-- 
2.1.4

  parent reply	other threads:[~2015-03-12 16:43 UTC|newest]

Thread overview: 19+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-03-12 16:43 [Qemu-devel] [PATCH v2 0/9] qom: HMP commands to supersede info qtree Andreas Färber
2015-03-12 16:43 ` [Qemu-devel] [PATCH v2 1/9] scripts: Add qom-tree script Andreas Färber
2015-03-12 16:43 ` [Qemu-devel] [PATCH v2 2/9] qom: Implement qom-list HMP command Andreas Färber
2015-03-13  1:32   ` Gonglei
2015-03-12 16:43 ` [Qemu-devel] [PATCH v2 3/9] qom: Implement qom-set " Andreas Färber
2015-03-13  1:34   ` Gonglei
2015-03-12 16:43 ` [Qemu-devel] [PATCH v2 4/9] qom: Implement info qom-tree " Andreas Färber
2015-03-12 16:43 ` [Qemu-devel] [PATCH v2 5/9] qapi: Stub out StringOutputVisitor struct support Andreas Färber
2015-03-12 16:43 ` [Qemu-devel] [PATCH v2 6/9] qom: Implement qom-get HMP command Andreas Färber
2015-03-13  1:36   ` Gonglei
2015-03-12 16:43 ` Andreas Färber [this message]
2015-03-12 16:43 ` [Qemu-devel] [PATCH v2 8/9] memory: Move owner-less MemoryRegions to /machine/unattached Andreas Färber
2015-03-12 18:05   ` Paolo Bonzini
2015-03-12 19:16     ` Andreas Färber
2015-03-12 16:43 ` [Qemu-devel] [PATCH v2 9/9] qdev: Move owner-less IRQs " Andreas Färber
2015-03-13  1:30 ` [Qemu-devel] [PATCH v2 0/9] qom: HMP commands to supersede info qtree Gonglei
2015-03-17  5:15   ` Alistair Francis
2015-03-17  7:33 ` Markus Armbruster
2015-03-17 17:17 ` Andreas Färber

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1426178624-32638-8-git-send-email-afaerber@suse.de \
    --to=afaerber@suse.de \
    --cc=hani@linux.com \
    --cc=lcapitulino@redhat.com \
    --cc=qemu-devel@nongnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).