1910aea96b67d7f0357f586c47f20848ec435aa1bDavid 'Digit' Turner/* 2910aea96b67d7f0357f586c47f20848ec435aa1bDavid 'Digit' Turner * Device Container 3910aea96b67d7f0357f586c47f20848ec435aa1bDavid 'Digit' Turner * 4910aea96b67d7f0357f586c47f20848ec435aa1bDavid 'Digit' Turner * Copyright IBM, Corp. 2012 5910aea96b67d7f0357f586c47f20848ec435aa1bDavid 'Digit' Turner * 6910aea96b67d7f0357f586c47f20848ec435aa1bDavid 'Digit' Turner * Authors: 7910aea96b67d7f0357f586c47f20848ec435aa1bDavid 'Digit' Turner * Anthony Liguori <aliguori@us.ibm.com> 8910aea96b67d7f0357f586c47f20848ec435aa1bDavid 'Digit' Turner * 9910aea96b67d7f0357f586c47f20848ec435aa1bDavid 'Digit' Turner * This work is licensed under the terms of the GNU GPL, version 2 or later. 10910aea96b67d7f0357f586c47f20848ec435aa1bDavid 'Digit' Turner * See the COPYING file in the top-level directory. 11910aea96b67d7f0357f586c47f20848ec435aa1bDavid 'Digit' Turner */ 12910aea96b67d7f0357f586c47f20848ec435aa1bDavid 'Digit' Turner 13910aea96b67d7f0357f586c47f20848ec435aa1bDavid 'Digit' Turner#include "qom/object.h" 14910aea96b67d7f0357f586c47f20848ec435aa1bDavid 'Digit' Turner#include "qemu/module.h" 15910aea96b67d7f0357f586c47f20848ec435aa1bDavid 'Digit' Turner#include <assert.h> 16910aea96b67d7f0357f586c47f20848ec435aa1bDavid 'Digit' Turner 17910aea96b67d7f0357f586c47f20848ec435aa1bDavid 'Digit' Turnerstatic const TypeInfo container_info = { 18910aea96b67d7f0357f586c47f20848ec435aa1bDavid 'Digit' Turner .name = "container", 19910aea96b67d7f0357f586c47f20848ec435aa1bDavid 'Digit' Turner .instance_size = sizeof(Object), 20910aea96b67d7f0357f586c47f20848ec435aa1bDavid 'Digit' Turner .parent = TYPE_OBJECT, 21910aea96b67d7f0357f586c47f20848ec435aa1bDavid 'Digit' Turner}; 22910aea96b67d7f0357f586c47f20848ec435aa1bDavid 'Digit' Turner 23910aea96b67d7f0357f586c47f20848ec435aa1bDavid 'Digit' Turnerstatic void container_register_types(void) 24910aea96b67d7f0357f586c47f20848ec435aa1bDavid 'Digit' Turner{ 25910aea96b67d7f0357f586c47f20848ec435aa1bDavid 'Digit' Turner type_register_static(&container_info); 26910aea96b67d7f0357f586c47f20848ec435aa1bDavid 'Digit' Turner} 27910aea96b67d7f0357f586c47f20848ec435aa1bDavid 'Digit' Turner 28910aea96b67d7f0357f586c47f20848ec435aa1bDavid 'Digit' TurnerObject *container_get(Object *root, const char *path) 29910aea96b67d7f0357f586c47f20848ec435aa1bDavid 'Digit' Turner{ 30910aea96b67d7f0357f586c47f20848ec435aa1bDavid 'Digit' Turner Object *obj, *child; 31910aea96b67d7f0357f586c47f20848ec435aa1bDavid 'Digit' Turner gchar **parts; 32910aea96b67d7f0357f586c47f20848ec435aa1bDavid 'Digit' Turner int i; 33910aea96b67d7f0357f586c47f20848ec435aa1bDavid 'Digit' Turner 34910aea96b67d7f0357f586c47f20848ec435aa1bDavid 'Digit' Turner parts = g_strsplit(path, "/", 0); 35910aea96b67d7f0357f586c47f20848ec435aa1bDavid 'Digit' Turner assert(parts != NULL && parts[0] != NULL && !parts[0][0]); 36910aea96b67d7f0357f586c47f20848ec435aa1bDavid 'Digit' Turner obj = root; 37910aea96b67d7f0357f586c47f20848ec435aa1bDavid 'Digit' Turner 38910aea96b67d7f0357f586c47f20848ec435aa1bDavid 'Digit' Turner for (i = 1; parts[i] != NULL; i++, obj = child) { 39910aea96b67d7f0357f586c47f20848ec435aa1bDavid 'Digit' Turner child = object_resolve_path_component(obj, parts[i]); 40910aea96b67d7f0357f586c47f20848ec435aa1bDavid 'Digit' Turner if (!child) { 41910aea96b67d7f0357f586c47f20848ec435aa1bDavid 'Digit' Turner child = object_new("container"); 42910aea96b67d7f0357f586c47f20848ec435aa1bDavid 'Digit' Turner object_property_add_child(obj, parts[i], child, NULL); 43910aea96b67d7f0357f586c47f20848ec435aa1bDavid 'Digit' Turner } 44910aea96b67d7f0357f586c47f20848ec435aa1bDavid 'Digit' Turner } 45910aea96b67d7f0357f586c47f20848ec435aa1bDavid 'Digit' Turner 46910aea96b67d7f0357f586c47f20848ec435aa1bDavid 'Digit' Turner g_strfreev(parts); 47910aea96b67d7f0357f586c47f20848ec435aa1bDavid 'Digit' Turner 48910aea96b67d7f0357f586c47f20848ec435aa1bDavid 'Digit' Turner return obj; 49910aea96b67d7f0357f586c47f20848ec435aa1bDavid 'Digit' Turner} 50910aea96b67d7f0357f586c47f20848ec435aa1bDavid 'Digit' Turner 51910aea96b67d7f0357f586c47f20848ec435aa1bDavid 'Digit' Turner 52910aea96b67d7f0357f586c47f20848ec435aa1bDavid 'Digit' Turnertype_init(container_register_types) 53