xref: /qemu/qom/container.c (revision 6e1e04ef035cf687e868858ab6bd18a177e1b822)
18b45d447SAnthony Liguori /*
28b45d447SAnthony Liguori  * Device Container
38b45d447SAnthony Liguori  *
48b45d447SAnthony Liguori  * Copyright IBM, Corp. 2012
58b45d447SAnthony Liguori  *
68b45d447SAnthony Liguori  * Authors:
78b45d447SAnthony Liguori  *  Anthony Liguori   <aliguori@us.ibm.com>
88b45d447SAnthony Liguori  *
98b45d447SAnthony Liguori  * This work is licensed under the terms of the GNU GPL, version 2 or later.
108b45d447SAnthony Liguori  * See the COPYING file in the top-level directory.
118b45d447SAnthony Liguori  */
128b45d447SAnthony Liguori 
139bbc853bSPeter Maydell #include "qemu/osdep.h"
1414cccb61SPaolo Bonzini #include "qom/object.h"
151de7afc9SPaolo Bonzini #include "qemu/module.h"
168b45d447SAnthony Liguori 
178c43a6f0SAndreas Färber static const TypeInfo container_info = {
18e469b331SPeter Xu     .name          = TYPE_CONTAINER,
198b45d447SAnthony Liguori     .parent        = TYPE_OBJECT,
208b45d447SAnthony Liguori };
218b45d447SAnthony Liguori 
2283f7d43aSAndreas Färber static void container_register_types(void)
238b45d447SAnthony Liguori {
248b45d447SAnthony Liguori     type_register_static(&container_info);
258b45d447SAnthony Liguori }
268b45d447SAnthony Liguori 
27*6e1e04efSPeter Xu Object *object_property_add_new_container(Object *obj, const char *name)
28*6e1e04efSPeter Xu {
29*6e1e04efSPeter Xu     Object *child = object_new(TYPE_CONTAINER);
30*6e1e04efSPeter Xu 
31*6e1e04efSPeter Xu     object_property_add_child(obj, name, child);
32*6e1e04efSPeter Xu     object_unref(child);
33*6e1e04efSPeter Xu 
34*6e1e04efSPeter Xu     return child;
35*6e1e04efSPeter Xu }
36*6e1e04efSPeter Xu 
37dfe47e70SAndreas Färber Object *container_get(Object *root, const char *path)
38a612b2a6SPaolo Bonzini {
39a612b2a6SPaolo Bonzini     Object *obj, *child;
40ddfb0baaSMarkus Armbruster     char **parts;
41a612b2a6SPaolo Bonzini     int i;
42a612b2a6SPaolo Bonzini 
43a612b2a6SPaolo Bonzini     parts = g_strsplit(path, "/", 0);
44a612b2a6SPaolo Bonzini     assert(parts != NULL && parts[0] != NULL && !parts[0][0]);
45dfe47e70SAndreas Färber     obj = root;
46a612b2a6SPaolo Bonzini 
47a612b2a6SPaolo Bonzini     for (i = 1; parts[i] != NULL; i++, obj = child) {
48a612b2a6SPaolo Bonzini         child = object_resolve_path_component(obj, parts[i]);
49a612b2a6SPaolo Bonzini         if (!child) {
50*6e1e04efSPeter Xu             child = object_property_add_new_container(obj, parts[i]);
51a612b2a6SPaolo Bonzini         }
52a612b2a6SPaolo Bonzini     }
53a612b2a6SPaolo Bonzini 
54f156f238SStefan Weil     g_strfreev(parts);
55f156f238SStefan Weil 
56a612b2a6SPaolo Bonzini     return obj;
57a612b2a6SPaolo Bonzini }
58a612b2a6SPaolo Bonzini 
59a612b2a6SPaolo Bonzini 
6083f7d43aSAndreas Färber type_init(container_register_types)
61