On 18/08/2026 12:10, Marc-André Lureau wrote:
Wire up the new qapi-type field in all four QMP handlers that return
ObjectPropertyInfo or ObjectPropertyValue: qom-list, qom-list-get,
device-list-properties, and qom-list-properties.
When an ObjectProperty has a qapi_type set, the masked QAPI type name
is copied into the response, allowing clients to cross-reference with
query-qmp-schema.
No property has it yet, the following changes will populate it.
Reviewed-by: Markus Armbruster <[email protected]>
Signed-off-by: Marc-André Lureau <[email protected]>
---
qom/qom-qmp-cmds.c | 32 +++++++++++++++++++-------------
1 file changed, 19 insertions(+), 13 deletions(-)
diff --git a/qom/qom-qmp-cmds.c b/qom/qom-qmp-cmds.c
index 330895361d47..f9e6d4371cc5 100644
--- a/qom/qom-qmp-cmds.c
+++ b/qom/qom-qmp-cmds.c
@@ -25,9 +25,22 @@
#include "qapi/qobject-input-visitor.h"
#include "qapi/qobject-output-visitor.h"
#include "qemu/cutils.h"
+#include "qapi/qapi-type-info.h"
#include "qom/object_interfaces.h"
#include "qom/qom-qobject.h"
+static ObjectPropertyInfo *qom_property_info(ObjectProperty *prop)
+{
+ ObjectPropertyInfo *info = g_new0(ObjectPropertyInfo, 1);
+
+ info->name = g_strdup(prop->name);
+ info->type = g_strdup(prop->type);
+ if (prop->qapi_type) {
+ info->qapi_type = g_strdup(prop->qapi_type->masked_name);
+ }
+ return info;
+}
Any reason not to add info->description here? It seems to be set the
same way in both cases below.
+
static Object *qom_resolve_path(const char *path, Error **errp)
{
bool ambiguous = false;
@@ -58,12 +71,7 @@ ObjectPropertyInfoList *qmp_qom_list(const char *path, Error
**errp)
object_property_iter_init(&iter, obj);
while ((prop = object_property_iter_next(&iter))) {
- ObjectPropertyInfo *value = g_new0(ObjectPropertyInfo, 1);
-
- QAPI_LIST_PREPEND(props, value);
-
- value->name = g_strdup(prop->name);
- value->type = g_strdup(prop->type);
+ QAPI_LIST_PREPEND(props, qom_property_info(prop));
}
return props;
@@ -78,6 +86,9 @@ static void qom_list_add_property_value(Object *obj,
ObjectProperty *prop,
item->name = g_strdup(prop->name);
item->type = g_strdup(prop->type);
+ if (prop->qapi_type) {
+ item->qapi_type = g_strdup(prop->qapi_type->masked_name);
+ }
item->value = object_property_get_qobject(obj, prop->name, NULL);
}
@@ -218,9 +229,7 @@ ObjectPropertyInfoList *qmp_device_list_properties(const char *typename,
continue;
}
- info = g_new0(ObjectPropertyInfo, 1);
- info->name = g_strdup(prop->name);
- info->type = g_strdup(prop->type);
+ info = qom_property_info(prop);
info->description = g_strdup(prop->description);
info->default_value = qobject_ref(prop->defval);
@@ -261,11 +270,8 @@ ObjectPropertyInfoList *qmp_qom_list_properties(const char *typename,
object_property_iter_init(&iter, obj);
}
while ((prop = object_property_iter_next(&iter))) {
- ObjectPropertyInfo *info;
+ ObjectPropertyInfo *info = qom_property_info(prop);
- info = g_malloc0(sizeof(*info));
- info->name = g_strdup(prop->name);
- info->type = g_strdup(prop->type);
info->description = g_strdup(prop->description);
info->default_value = qobject_ref(prop->defval);
ATB,
Mark.