This allows returning a tree of all object properties under a given
path, in a way similar to scripts/qmp/qom-tree.

Signed-off-by: Alberto Garcia <be...@igalia.com>
---
 qapi/qom.json      | 10 +++++++++-
 qom/qom-hmp-cmds.c |  4 ++--
 qom/qom-qmp-cmds.c | 22 +++++++++++++++++++++-
 3 files changed, 32 insertions(+), 4 deletions(-)

diff --git a/qapi/qom.json b/qapi/qom.json
index c53ef978ff..dfe3a20725 100644
--- a/qapi/qom.json
+++ b/qapi/qom.json
@@ -33,6 +33,10 @@
 #        qdev device type name.  Link properties form the device model
 #        graph.
 #
+# @children: if specified, a list of @ObjectPropertyInfo describing
+#     the child properties. This requires that this property's @type
+#     is of the form 'child<subtype>' (since 9.0)
+#
 # @description: if specified, the description of the property.
 #
 # @default-value: the default value, if any (since 5.0)
@@ -42,6 +46,7 @@
 { 'struct': 'ObjectPropertyInfo',
   'data': { 'name': 'str',
             'type': 'str',
+            '*children' :  [ 'ObjectPropertyInfo' ],
             '*description': 'str',
             '*default-value': 'any' } }
 
@@ -54,6 +59,9 @@
 # @path: the path within the object model.  See @qom-get for a
 #     description of this parameter.
 #
+# @recurse-children: if true, include the child properties recursively
+#     in the return value (default: false) (since 9.0)
+#
 # Returns: a list of @ObjectPropertyInfo that describe the properties
 #     of the object.
 #
@@ -69,7 +77,7 @@
 #                  { "name": "mon0", "type": "child<chardev-stdio>" } ] }
 ##
 { 'command': 'qom-list',
-  'data': { 'path': 'str' },
+  'data': { 'path': 'str', '*recurse-children': 'bool' },
   'returns': [ 'ObjectPropertyInfo' ],
   'allow-preconfig': true }
 
diff --git a/qom/qom-hmp-cmds.c b/qom/qom-hmp-cmds.c
index 6e3a2175a4..7592184fc3 100644
--- a/qom/qom-hmp-cmds.c
+++ b/qom/qom-hmp-cmds.c
@@ -28,7 +28,7 @@ void hmp_qom_list(Monitor *mon, const QDict *qdict)
         return;
     }
 
-    list = qmp_qom_list(path, &err);
+    list = qmp_qom_list(path, false, false, &err);
     if (err == NULL) {
         ObjectPropertyInfoList *start = list;
         while (list != NULL) {
@@ -206,7 +206,7 @@ void object_del_completion(ReadLineState *rs, int nb_args, 
const char *str)
     len = strlen(str);
     readline_set_completion_index(rs, len);
 
-    start = list = qmp_qom_list("/objects", NULL);
+    start = list = qmp_qom_list("/objects", false, false, NULL);
     while (list) {
         ObjectPropertyInfo *info = list->value;
 
diff --git a/qom/qom-qmp-cmds.c b/qom/qom-qmp-cmds.c
index 7c087299de..5c9cb8a09c 100644
--- a/qom/qom-qmp-cmds.c
+++ b/qom/qom-qmp-cmds.c
@@ -28,10 +28,15 @@
 #include "qom/object_interfaces.h"
 #include "qom/qom-qobject.h"
 
-ObjectPropertyInfoList *qmp_qom_list(const char *path, Error **errp)
+ObjectPropertyInfoList *qmp_qom_list(const char *path,
+                                     bool has_recurse_children,
+                                     bool recurse_children,
+                                     Error **errp)
 {
+    ERRP_GUARD();
     Object *obj;
     bool ambiguous = false;
+    bool recurse = has_recurse_children && recurse_children;
     ObjectPropertyInfoList *props = NULL;
     ObjectProperty *prop;
     ObjectPropertyIterator iter;
@@ -55,8 +60,23 @@ ObjectPropertyInfoList *qmp_qom_list(const char *path, Error 
**errp)
 
         value->name = g_strdup(prop->name);
         value->type = g_strdup(prop->type);
+
+        if (recurse && g_str_has_prefix(prop->type, "child<")) {
+            ObjectPropertyInfoList *children;
+            g_autofree char *childpath = g_strdup_printf("%s/%s", path,
+                                                         prop->name);
+            children = qmp_qom_list(childpath, true, true, errp);
+            if (*errp) {
+                qapi_free_ObjectPropertyInfoList(props);
+                props = NULL;
+                goto out;
+            }
+            value->has_children = true;
+            value->children = children;
+        }
     }
 
+out:
     return props;
 }
 
-- 
2.39.2


Reply via email to