qmp: Add qom-list-properties to list QOM object properties
There is already 'device-list-properties' which does most of the job, however it does not handle everything returned by qom-list-types such as machines as they inherit directly from TYPE_OBJECT and not TYPE_DEVICE. It does not handle abstract classes either. This adds a new qom-list-properties command which prints properties of a specific class and its instance. It is pretty much a simplified copy of the device-list-properties handler. Since it creates an object instance, device properties should appear in the output as they are copied to QOM properties at the instance_init hook. This adds a object_class_property_iter_init() helper to allow class properties enumeration uses it in the new QMP command to allow properties listing for abstract classes. Signed-off-by: Alexey Kardashevskiy <aik@ozlabs.ru> Message-Id: <20180301130939.15875-3-aik@ozlabs.ru> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
35f63767dc
commit
961c47bb8b
@ -1016,6 +1016,22 @@ typedef struct ObjectPropertyIterator {
|
||||
void object_property_iter_init(ObjectPropertyIterator *iter,
|
||||
Object *obj);
|
||||
|
||||
/**
|
||||
* object_class_property_iter_init:
|
||||
* @klass: the class
|
||||
*
|
||||
* Initializes an iterator for traversing all properties
|
||||
* registered against an object class and all parent classes.
|
||||
*
|
||||
* It is forbidden to modify the property list while iterating,
|
||||
* whether removing or adding properties.
|
||||
*
|
||||
* This can be used on abstract classes as it does not create a temporary
|
||||
* instance.
|
||||
*/
|
||||
void object_class_property_iter_init(ObjectPropertyIterator *iter,
|
||||
ObjectClass *klass);
|
||||
|
||||
/**
|
||||
* object_property_iter_next:
|
||||
* @iter: the iterator instance
|
||||
|
@ -1460,6 +1460,21 @@
|
||||
'data': { 'typename': 'str'},
|
||||
'returns': [ 'ObjectPropertyInfo' ] }
|
||||
|
||||
##
|
||||
# @qom-list-properties:
|
||||
#
|
||||
# List properties associated with a QOM object.
|
||||
#
|
||||
# @typename: the type name of an object
|
||||
#
|
||||
# Returns: a list of ObjectPropertyInfo describing object properties
|
||||
#
|
||||
# Since: 2.12
|
||||
##
|
||||
{ 'command': 'qom-list-properties',
|
||||
'data': { 'typename': 'str'},
|
||||
'returns': [ 'ObjectPropertyInfo' ] }
|
||||
|
||||
##
|
||||
# @xen-set-global-dirty-log:
|
||||
#
|
||||
|
49
qmp.c
49
qmp.c
@ -578,6 +578,55 @@ ObjectPropertyInfoList *qmp_device_list_properties(const char *typename,
|
||||
return prop_list;
|
||||
}
|
||||
|
||||
ObjectPropertyInfoList *qmp_qom_list_properties(const char *typename,
|
||||
Error **errp)
|
||||
{
|
||||
ObjectClass *klass;
|
||||
Object *obj = NULL;
|
||||
ObjectProperty *prop;
|
||||
ObjectPropertyIterator iter;
|
||||
ObjectPropertyInfoList *prop_list = NULL;
|
||||
|
||||
klass = object_class_by_name(typename);
|
||||
if (klass == NULL) {
|
||||
error_set(errp, ERROR_CLASS_DEVICE_NOT_FOUND,
|
||||
"Class '%s' not found", typename);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
klass = object_class_dynamic_cast(klass, TYPE_OBJECT);
|
||||
if (klass == NULL) {
|
||||
error_setg(errp, QERR_INVALID_PARAMETER_VALUE, "typename", TYPE_OBJECT);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (object_class_is_abstract(klass)) {
|
||||
object_class_property_iter_init(&iter, klass);
|
||||
} else {
|
||||
obj = object_new(typename);
|
||||
object_property_iter_init(&iter, obj);
|
||||
}
|
||||
while ((prop = object_property_iter_next(&iter))) {
|
||||
ObjectPropertyInfo *info;
|
||||
ObjectPropertyInfoList *entry;
|
||||
|
||||
info = g_malloc0(sizeof(*info));
|
||||
info->name = g_strdup(prop->name);
|
||||
info->type = g_strdup(prop->type);
|
||||
info->has_description = !!prop->description;
|
||||
info->description = g_strdup(prop->description);
|
||||
|
||||
entry = g_malloc0(sizeof(*entry));
|
||||
entry->value = info;
|
||||
entry->next = prop_list;
|
||||
prop_list = entry;
|
||||
}
|
||||
|
||||
object_unref(obj);
|
||||
|
||||
return prop_list;
|
||||
}
|
||||
|
||||
CpuDefinitionInfoList *qmp_query_cpu_definitions(Error **errp)
|
||||
{
|
||||
return arch_query_cpu_definitions(errp);
|
||||
|
@ -1037,6 +1037,13 @@ ObjectProperty *object_property_iter_next(ObjectPropertyIterator *iter)
|
||||
return val;
|
||||
}
|
||||
|
||||
void object_class_property_iter_init(ObjectPropertyIterator *iter,
|
||||
ObjectClass *klass)
|
||||
{
|
||||
g_hash_table_iter_init(&iter->iter, klass->properties);
|
||||
iter->nextclass = klass;
|
||||
}
|
||||
|
||||
ObjectProperty *object_class_property_find(ObjectClass *klass, const char *name,
|
||||
Error **errp)
|
||||
{
|
||||
|
Loading…
x
Reference in New Issue
Block a user