From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:47601) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1WQBPA-0003TC-Lg for qemu-devel@nongnu.org; Wed, 19 Mar 2014 03:59:22 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1WQBP4-0000QS-Le for qemu-devel@nongnu.org; Wed, 19 Mar 2014 03:59:16 -0400 Received: from mx1.redhat.com ([209.132.183.28]:25989) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1WQBP4-0000QK-DY for qemu-devel@nongnu.org; Wed, 19 Mar 2014 03:59:10 -0400 From: Stefan Hajnoczi Date: Wed, 19 Mar 2014 08:58:53 +0100 Message-Id: <1395215937-22987-2-git-send-email-stefanha@redhat.com> In-Reply-To: <1395215937-22987-1-git-send-email-stefanha@redhat.com> References: <1395215937-22987-1-git-send-email-stefanha@redhat.com> Subject: [Qemu-devel] [PATCH RESEND v4 1/5] qom: split object_property_set_link() List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: Paolo Bonzini , Stefan Hajnoczi , Andreas Faerber , Anthony Liguori , Peter Maydell The path resolution logic in object_property_set_link() should be a separate function. This makes the code easier to read and maintain. Signed-off-by: Stefan Hajnoczi --- qom/object.c | 59 +++++++++++++++++++++++++++++++++++++++-------------------- 1 file changed, 39 insertions(+), 20 deletions(-) diff --git a/qom/object.c b/qom/object.c index a2a1ffa..da49474 100644 --- a/qom/object.c +++ b/qom/object.c @@ -1039,17 +1039,49 @@ static void object_get_link_property(Object *obj, Visitor *v, void *opaque, } } +/* object_resolve_link: + * + * Lookup an object and ensure its type matches the link property type. This + * is similar to object_resolve_path() except type verification against the + * link property is performed. + * + * Returns: The matched object or NULL on path lookup failures. + */ +static Object *object_resolve_link(Object *obj, const char *name, + const char *path, Error **errp) +{ + const char *type; + gchar *target_type; + bool ambiguous = false; + Object *target; + + /* Go from link to FOO. */ + type = object_property_get_type(obj, name, NULL); + target_type = g_strndup(&type[5], strlen(type) - 6); + target = object_resolve_path_type(path, target_type, &ambiguous); + + if (ambiguous) { + error_set(errp, QERR_AMBIGUOUS_PATH, path); + } else if (!target) { + target = object_resolve_path(path, &ambiguous); + if (target || ambiguous) { + error_set(errp, QERR_INVALID_PARAMETER_TYPE, name, target_type); + } else { + error_set(errp, QERR_DEVICE_NOT_FOUND, path); + } + target = NULL; + } + g_free(target_type); + + return target; +} + static void object_set_link_property(Object *obj, Visitor *v, void *opaque, const char *name, Error **errp) { Object **child = opaque; Object *old_target; - bool ambiguous = false; - const char *type; char *path; - gchar *target_type; - - type = object_property_get_type(obj, name, NULL); visit_type_str(v, &path, name, errp); @@ -1059,24 +1091,11 @@ static void object_set_link_property(Object *obj, Visitor *v, void *opaque, if (strcmp(path, "") != 0) { Object *target; - /* Go from link to FOO. */ - target_type = g_strndup(&type[5], strlen(type) - 6); - target = object_resolve_path_type(path, target_type, &ambiguous); - - if (ambiguous) { - error_set(errp, QERR_AMBIGUOUS_PATH, path); - } else if (target) { + target = object_resolve_link(obj, name, path, errp); + if (target) { object_ref(target); *child = target; - } else { - target = object_resolve_path(path, &ambiguous); - if (target || ambiguous) { - error_set(errp, QERR_INVALID_PARAMETER_TYPE, name, target_type); - } else { - error_set(errp, QERR_DEVICE_NOT_FOUND, path); - } } - g_free(target_type); } g_free(path); -- 1.8.5.3