Rather than directly traversing the object property list, use the object_property_foreach iterator. This removes a dependancy on the implementation approach for properties.
Signed-off-by: Daniel P. Berrange <berra...@redhat.com> --- qmp.c | 103 ++++++++++++++++++++++++++++++++++++++---------------------------- 1 file changed, 59 insertions(+), 44 deletions(-) diff --git a/qmp.c b/qmp.c index 057a7cb..9baad84 100644 --- a/qmp.c +++ b/qmp.c @@ -202,12 +202,29 @@ void qmp_system_wakeup(Error **errp) qemu_system_wakeup_request(QEMU_WAKEUP_REASON_OTHER); } + +static void qmp_qom_list_iter(Object *obj, + ObjectProperty *prop, + Error **errp, + void *opaque) +{ + ObjectPropertyInfoList **props = opaque; + + ObjectPropertyInfoList *entry = g_malloc0(sizeof(*entry)); + + entry->value = g_malloc0(sizeof(ObjectPropertyInfo)); + entry->next = *props; + *props = entry; + + entry->value->name = g_strdup(prop->name); + entry->value->type = g_strdup(prop->type); +} + ObjectPropertyInfoList *qmp_qom_list(const char *path, Error **errp) { Object *obj; bool ambiguous = false; ObjectPropertyInfoList *props = NULL; - ObjectProperty *prop; obj = object_resolve_path(path, &ambiguous); if (obj == NULL) { @@ -220,17 +237,7 @@ ObjectPropertyInfoList *qmp_qom_list(const char *path, Error **errp) return NULL; } - QTAILQ_FOREACH(prop, &obj->properties, node) { - ObjectPropertyInfoList *entry = g_malloc0(sizeof(*entry)); - - entry->value = g_malloc0(sizeof(ObjectPropertyInfo)); - entry->next = props; - props = entry; - - entry->value->name = g_strdup(prop->name); - entry->value->type = g_strdup(prop->type); - } - + object_property_foreach(obj, qmp_qom_list_iter, NULL, &props); return props; } @@ -494,12 +501,49 @@ static DevicePropertyInfo *make_device_property_info(ObjectClass *klass, return info; } +static void qmp_device_list_properties_iter(Object *obj, + ObjectProperty *prop, + Error **errp, + void *opaque) +{ + DevicePropertyInfoList **props = opaque; + DevicePropertyInfo *info; + DevicePropertyInfoList *entry; + + /* Skip Object and DeviceState properties */ + if (strcmp(prop->name, "type") == 0 || + strcmp(prop->name, "realized") == 0 || + strcmp(prop->name, "hotpluggable") == 0 || + strcmp(prop->name, "hotplugged") == 0 || + strcmp(prop->name, "parent_bus") == 0) { + return; + } + + /* Skip legacy properties since they are just string versions of + * properties that we already list. + */ + if (strstart(prop->name, "legacy-", NULL)) { + return; + } + + info = make_device_property_info(object_get_class(obj), + prop->name, prop->type, + prop->description); + if (!info) { + return; + } + + entry = g_malloc0(sizeof(*entry)); + entry->value = info; + entry->next = *props; + *props = entry; +} + DevicePropertyInfoList *qmp_device_list_properties(const char *typename, Error **errp) { ObjectClass *klass; Object *obj; - ObjectProperty *prop; DevicePropertyInfoList *prop_list = NULL; klass = object_class_by_name(typename); @@ -517,37 +561,8 @@ DevicePropertyInfoList *qmp_device_list_properties(const char *typename, obj = object_new(typename); - QTAILQ_FOREACH(prop, &obj->properties, node) { - DevicePropertyInfo *info; - DevicePropertyInfoList *entry; - - /* Skip Object and DeviceState properties */ - if (strcmp(prop->name, "type") == 0 || - strcmp(prop->name, "realized") == 0 || - strcmp(prop->name, "hotpluggable") == 0 || - strcmp(prop->name, "hotplugged") == 0 || - strcmp(prop->name, "parent_bus") == 0) { - continue; - } - - /* Skip legacy properties since they are just string versions of - * properties that we already list. - */ - if (strstart(prop->name, "legacy-", NULL)) { - continue; - } - - info = make_device_property_info(klass, prop->name, prop->type, - prop->description); - if (!info) { - continue; - } - - entry = g_malloc0(sizeof(*entry)); - entry->value = info; - entry->next = prop_list; - prop_list = entry; - } + object_property_foreach(obj, qmp_device_list_properties_iter, + NULL, &prop_list); object_unref(obj); -- 2.4.3