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