xref: /qemu/qom/container.c (revision 14cccb618508a0aa70eb9ccf366703a019a45ff0)
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 
13*14cccb61SPaolo Bonzini #include "qom/object.h"
148b45d447SAnthony Liguori #include "module.h"
15a612b2a6SPaolo Bonzini #include <assert.h>
168b45d447SAnthony Liguori 
178b45d447SAnthony Liguori static TypeInfo container_info = {
188b45d447SAnthony Liguori     .name          = "container",
198b45d447SAnthony Liguori     .instance_size = sizeof(Object),
208b45d447SAnthony Liguori     .parent        = TYPE_OBJECT,
218b45d447SAnthony Liguori };
228b45d447SAnthony Liguori 
2383f7d43aSAndreas Färber static void container_register_types(void)
248b45d447SAnthony Liguori {
258b45d447SAnthony Liguori     type_register_static(&container_info);
268b45d447SAnthony Liguori }
278b45d447SAnthony Liguori 
28dfe47e70SAndreas Färber Object *container_get(Object *root, const char *path)
29a612b2a6SPaolo Bonzini {
30a612b2a6SPaolo Bonzini     Object *obj, *child;
31a612b2a6SPaolo Bonzini     gchar **parts;
32a612b2a6SPaolo Bonzini     int i;
33a612b2a6SPaolo Bonzini 
34a612b2a6SPaolo Bonzini     parts = g_strsplit(path, "/", 0);
35a612b2a6SPaolo Bonzini     assert(parts != NULL && parts[0] != NULL && !parts[0][0]);
36dfe47e70SAndreas Färber     obj = root;
37a612b2a6SPaolo Bonzini 
38a612b2a6SPaolo Bonzini     for (i = 1; parts[i] != NULL; i++, obj = child) {
39a612b2a6SPaolo Bonzini         child = object_resolve_path_component(obj, parts[i]);
40a612b2a6SPaolo Bonzini         if (!child) {
41a612b2a6SPaolo Bonzini             child = object_new("container");
42a612b2a6SPaolo Bonzini             object_property_add_child(obj, parts[i], child, NULL);
43a612b2a6SPaolo Bonzini         }
44a612b2a6SPaolo Bonzini     }
45a612b2a6SPaolo Bonzini 
46f156f238SStefan Weil     g_strfreev(parts);
47f156f238SStefan Weil 
48a612b2a6SPaolo Bonzini     return obj;
49a612b2a6SPaolo Bonzini }
50a612b2a6SPaolo Bonzini 
51a612b2a6SPaolo Bonzini 
5283f7d43aSAndreas Färber type_init(container_register_types)
53