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