When an abstract class is used on device-list-properties, we can simply return the class properties registered for the class.
This will be useful if management software needs to query for supported options that apply to all devices of a given type (e.g. options supported by all CPU models, options supported by all PCI devices). Signed-off-by: Eduardo Habkost <ehabk...@redhat.com> --- Changes series v1 -> v2: * (none) Changes series v2 -> v3: * Reworded commit message Changes series v3 -> v4: * (none) --- qmp.c | 21 +++++++++------------ 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/qmp.c b/qmp.c index a06cb7b..1e7e60d 100644 --- a/qmp.c +++ b/qmp.c @@ -518,7 +518,7 @@ DevicePropertyInfoList *qmp_device_list_properties(const char *typename, Error **errp) { ObjectClass *klass; - Object *obj; + Object *obj = NULL; ObjectProperty *prop; ObjectPropertyIterator iter; DevicePropertyInfoList *prop_list = NULL; @@ -537,19 +537,16 @@ DevicePropertyInfoList *qmp_device_list_properties(const char *typename, } if (object_class_is_abstract(klass)) { - error_setg(errp, QERR_INVALID_PARAMETER_VALUE, "name", - "non-abstract device type"); - return NULL; - } - - if (DEVICE_CLASS(klass)->cannot_destroy_with_object_finalize_yet) { - error_setg(errp, "Can't list properties of device '%s'", typename); - return NULL; + object_class_property_iter_init(&iter, klass); + } else { + if (DEVICE_CLASS(klass)->cannot_destroy_with_object_finalize_yet) { + error_setg(errp, "Can't list properties of device '%s'", typename); + return NULL; + } + obj = object_new(typename); + object_property_iter_init(&iter, obj); } - obj = object_new(typename); - - object_property_iter_init(&iter, obj); while ((prop = object_property_iter_next(&iter))) { DevicePropertyInfo *info; DevicePropertyInfoList *entry; -- 2.7.4