From f9fbd2fd0e1ffe666487a072226dd87753db66f9 Mon Sep 17 00:00:00 2001 From: Anthony Liguori Date: Mon, 12 Dec 2011 14:29:29 -0600 Subject: qdev: provide an interface to return canonical path from root (v2) The canonical path is the path in the composition tree from the root to the device. This is effectively the name of the device. This is an incredibly unefficient implementation that will be optimized in a future patch. Signed-off-by: Anthony Liguori --- hw/qdev.c | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) (limited to 'hw/qdev.c') diff --git a/hw/qdev.c b/hw/qdev.c index bb0b9f7..79849c9 100644 --- a/hw/qdev.c +++ b/hw/qdev.c @@ -1173,3 +1173,51 @@ DeviceState *qdev_get_root(void) return qdev_root; } + +static gchar *qdev_get_path_in(DeviceState *parent, DeviceState *dev) +{ + DeviceProperty *prop; + + if (parent == dev) { + return g_strdup(""); + } + + QTAILQ_FOREACH(prop, &parent->properties, node) { + gchar *subpath; + + if (!strstart(prop->type, "child<", NULL)) { + continue; + } + + /* Check to see if the device is one of parent's children */ + if (prop->opaque == dev) { + return g_strdup(prop->name); + } + + /* Check to see if the device is a child of our child */ + subpath = qdev_get_path_in(prop->opaque, dev); + if (subpath) { + gchar *path; + + path = g_strdup_printf("%s/%s", prop->name, subpath); + g_free(subpath); + + return path; + } + } + + return NULL; +} + +gchar *qdev_get_canonical_path(DeviceState *dev) +{ + gchar *path, *newpath; + + path = qdev_get_path_in(qdev_get_root(), dev); + g_assert(path != NULL); + + newpath = g_strdup_printf("/%s", path); + g_free(path); + + return newpath; +} -- cgit v1.1