From patchwork Fri Dec 2 20:20:43 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anthony Liguori X-Patchwork-Id: 128958 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [140.186.70.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id D8011B6F18 for ; Sat, 3 Dec 2011 07:22:25 +1100 (EST) Received: from localhost ([::1]:40517 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1RWZch-000369-RF for incoming@patchwork.ozlabs.org; Fri, 02 Dec 2011 15:22:19 -0500 Received: from eggs.gnu.org ([140.186.70.92]:32888) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1RWZbr-00013q-12 for qemu-devel@nongnu.org; Fri, 02 Dec 2011 15:21:31 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1RWZbp-0007lC-NE for qemu-devel@nongnu.org; Fri, 02 Dec 2011 15:21:26 -0500 Received: from cpe-70-123-132-139.austin.res.rr.com ([70.123.132.139]:49931 helo=localhost6.localdomain6) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1RWZbp-0007ky-Gu for qemu-devel@nongnu.org; Fri, 02 Dec 2011 15:21:25 -0500 Received: from localhost6.localdomain6 (localhost.localdomain [127.0.0.1]) by localhost6.localdomain6 (8.14.4/8.14.4/Debian-2ubuntu1) with ESMTP id pB2KLJdw015023; Fri, 2 Dec 2011 14:21:19 -0600 Received: (from anthony@localhost) by localhost6.localdomain6 (8.14.4/8.14.4/Submit) id pB2KLHlc015018; Fri, 2 Dec 2011 14:21:17 -0600 From: Anthony Liguori To: qemu-devel@nongnu.org Date: Fri, 2 Dec 2011 14:20:43 -0600 Message-Id: <1322857256-14951-6-git-send-email-aliguori@us.ibm.com> X-Mailer: git-send-email 1.7.4.1 In-Reply-To: <1322857256-14951-1-git-send-email-aliguori@us.ibm.com> References: <1322857256-14951-1-git-send-email-aliguori@us.ibm.com> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 70.123.132.139 Cc: Kevin Wolf , Peter Maydell , Anthony Liguori , Stefan Hajnoczi , Jan Kiszka , Markus Armbruster , Luiz Capitulino , Gerd Hoffman Subject: [Qemu-devel] [PATCH v2 05/18] qdev: provide an interface to return canonical path from root (v2) X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org 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 --- v1 -> v2 - change from gslist to qemu-queue (Kevin/Gerd) --- hw/qdev.c | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ hw/qdev.h | 9 +++++++++ 2 files changed, 57 insertions(+), 0 deletions(-) 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; +} diff --git a/hw/qdev.h b/hw/qdev.h index 52aadd2..0f00497 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