@@ -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;
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 <ehabkost@redhat.com> --- Changes series v1 -> v2: * (none) Changes series v2 -> v3: * Reworded commit message --- qmp.c | 21 +++++++++------------ 1 file changed, 9 insertions(+), 12 deletions(-)