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 = { 18*e469b331SPeter 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 27dfe47e70SAndreas Färber Object *container_get(Object *root, const char *path) 28a612b2a6SPaolo Bonzini { 29a612b2a6SPaolo Bonzini Object *obj, *child; 30ddfb0baaSMarkus Armbruster char **parts; 31a612b2a6SPaolo Bonzini int i; 32a612b2a6SPaolo Bonzini 33a612b2a6SPaolo Bonzini parts = g_strsplit(path, "/", 0); 34a612b2a6SPaolo Bonzini assert(parts != NULL && parts[0] != NULL && !parts[0][0]); 35dfe47e70SAndreas Färber obj = root; 36a612b2a6SPaolo Bonzini 37a612b2a6SPaolo Bonzini for (i = 1; parts[i] != NULL; i++, obj = child) { 38a612b2a6SPaolo Bonzini child = object_resolve_path_component(obj, parts[i]); 39a612b2a6SPaolo Bonzini if (!child) { 40*e469b331SPeter Xu child = object_new(TYPE_CONTAINER); 41d2623129SMarkus Armbruster object_property_add_child(obj, parts[i], child); 42f8df5f92SMarc-André Lureau object_unref(child); 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