From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([140.186.70.92]:52065) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1RVrKG-0004gk-1e for qemu-devel@nongnu.org; Wed, 30 Nov 2011 16:04:21 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1RVrKE-0000Wr-Ur for qemu-devel@nongnu.org; Wed, 30 Nov 2011 16:04:19 -0500 Received: from cpe-70-123-132-139.austin.res.rr.com ([70.123.132.139]:36974 helo=localhost6.localdomain6) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1RVrKE-0000Wk-OV for qemu-devel@nongnu.org; Wed, 30 Nov 2011 16:04:18 -0500 From: Anthony Liguori Date: Wed, 30 Nov 2011 15:03:34 -0600 Message-Id: <1322687028-29714-5-git-send-email-aliguori@us.ibm.com> In-Reply-To: <1322687028-29714-1-git-send-email-aliguori@us.ibm.com> References: <1322687028-29714-1-git-send-email-aliguori@us.ibm.com> Subject: [Qemu-devel] [PATCH 04/18] qdev: provide an interface to return canonical path from root List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: Kevin Wolf , Peter Maydell , Anthony Liguori , Stefan Hajnoczi , Jan Kiszka , Markus Armbruster , Luiz Capitulino 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 | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ hw/qdev.h | 9 +++++++++ 2 files changed, 58 insertions(+), 0 deletions(-) diff --git a/hw/qdev.c b/hw/qdev.c index 2db2d8e..6b2b194 100644 --- a/hw/qdev.c +++ b/hw/qdev.c @@ -1155,3 +1155,52 @@ DeviceState *qdev_get_root(void) return qdev_root; } + +static gchar *qdev_get_path_in(DeviceState *parent, DeviceState *dev) +{ + GSList *i; + + if (parent == dev) { + return g_strdup(""); + } + + for (i = parent->properties; i; i = i->next) { + DeviceProperty *prop = i->data; + 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 79d691f..82e6d95 100644 --- a/hw/qdev.h +++ b/hw/qdev.h @@ -462,4 +462,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 -- 1.7.4.1