aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnthony Liguori <aliguori@us.ibm.com>2011-12-12 14:29:29 -0600
committerAnthony Liguori <aliguori@us.ibm.com>2011-12-15 09:20:47 -0600
commitf9fbd2fd0e1ffe666487a072226dd87753db66f9 (patch)
tree11acf2119ba02c5cbad1f02e28d57754835ffa49
parenta10f07a7d0827eeef920c16b500b50030b7ff651 (diff)
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 <aliguori@us.ibm.com>
-rw-r--r--hw/qdev.c48
-rw-r--r--hw/qdev.h9
2 files changed, 57 insertions, 0 deletions
diff --git a/hw/qdev.c b/hw/qdev.c
index bb0b9f7d6a..79849c9bfd 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;
+}
diff --git a/hw/qdev.h b/hw/qdev.h
index 52aadd2f1f..0f004971a2 100644
--- a/hw/qdev.h
+++ b/hw/qdev.h
@@ -490,4 +490,13 @@ void qdev_property_add_legacy(DeviceState *dev, Property *prop, Error **errp);
*/
DeviceState *qdev_get_root(void);
+/**
+ * @qdev_get_canonical_path - returns the canonical path for a device. This
+ * is the path within the composition tree starting from the root.
+ *
+ * Returns:
+ * The canonical path in the composition tree.
+ */
+gchar *qdev_get_canonical_path(DeviceState *dev);
+
#endif