提交 f9fbd2fd 编写于 作者: A Anthony Liguori

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: NAnthony Liguori <aliguori@us.ibm.com>
上级 a10f07a7
......@@ -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;
}
......@@ -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
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册