From patchwork Tue Nov 4 17:30:07 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Andreas_F=C3=A4rber?= X-Patchwork-Id: 406718 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id CCD5D1400A0 for ; Wed, 5 Nov 2014 04:32:55 +1100 (AEDT) Received: from localhost ([::1]:42062 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1XlhyP-0002BJ-PE for incoming@patchwork.ozlabs.org; Tue, 04 Nov 2014 12:32:53 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:39053) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Xlhvx-000715-0s for qemu-devel@nongnu.org; Tue, 04 Nov 2014 12:30:27 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Xlhvn-0004mJ-0D for qemu-devel@nongnu.org; Tue, 04 Nov 2014 12:30:20 -0500 Received: from cantor2.suse.de ([195.135.220.15]:54240 helo=mx2.suse.de) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Xlhvm-0004lm-QB for qemu-devel@nongnu.org; Tue, 04 Nov 2014 12:30:10 -0500 Received: from relay1.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id 17D8CAB08; Tue, 4 Nov 2014 17:30:10 +0000 (UTC) From: =?UTF-8?q?Andreas=20F=C3=A4rber?= To: qemu-devel@nongnu.org Date: Tue, 4 Nov 2014 18:30:07 +0100 Message-Id: <1415122209-29164-2-git-send-email-afaerber@suse.de> X-Mailer: git-send-email 1.8.4.5 In-Reply-To: <1415122209-29164-1-git-send-email-afaerber@suse.de> References: <1415122209-29164-1-git-send-email-afaerber@suse.de> MIME-Version: 1.0 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x (no timestamps) [generic] X-Received-From: 195.135.220.15 Cc: Eduardo Habkost , =?UTF-8?q?Andreas=20F=C3=A4rber?= Subject: [Qemu-devel] [PULL 1/3] qdev: Create qdev_get_device_class() function 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 From: Eduardo Habkost Extract the DeviceClass lookup from qdev_device_add() to a separate function. Signed-off-by: Eduardo Habkost Signed-off-by: Andreas Färber --- qdev-monitor.c | 70 +++++++++++++++++++++++++++++++++++----------------------- 1 file changed, 42 insertions(+), 28 deletions(-) diff --git a/qdev-monitor.c b/qdev-monitor.c index fac7d17..982f3f4 100644 --- a/qdev-monitor.c +++ b/qdev-monitor.c @@ -180,6 +180,44 @@ static const char *find_typename_by_alias(const char *alias) return NULL; } +static DeviceClass *qdev_get_device_class(const char **driver, Error **errp) +{ + ObjectClass *oc; + DeviceClass *dc; + + oc = object_class_by_name(*driver); + if (!oc) { + const char *typename = find_typename_by_alias(*driver); + + if (typename) { + *driver = typename; + oc = object_class_by_name(*driver); + } + } + + if (!object_class_dynamic_cast(oc, TYPE_DEVICE)) { + error_setg(errp, "'%s' is not a valid device model name", *driver); + return NULL; + } + + if (object_class_is_abstract(oc)) { + error_set(errp, QERR_INVALID_PARAMETER_VALUE, "driver", + "non-abstract device type"); + return NULL; + } + + dc = DEVICE_CLASS(oc); + if (dc->cannot_instantiate_with_device_add_yet || + (qdev_hotplug && !dc->hotpluggable)) { + error_set(errp, QERR_INVALID_PARAMETER_VALUE, "driver", + "pluggable device type"); + return NULL; + } + + return dc; +} + + int qdev_device_help(QemuOpts *opts) { Error *local_err = NULL; @@ -455,7 +493,6 @@ static BusState *qbus_find(const char *path) DeviceState *qdev_device_add(QemuOpts *opts) { - ObjectClass *oc; DeviceClass *dc; const char *driver, *path, *id; DeviceState *dev; @@ -469,33 +506,10 @@ DeviceState *qdev_device_add(QemuOpts *opts) } /* find driver */ - oc = object_class_by_name(driver); - if (!oc) { - const char *typename = find_typename_by_alias(driver); - - if (typename) { - driver = typename; - oc = object_class_by_name(driver); - } - } - - if (!object_class_dynamic_cast(oc, TYPE_DEVICE)) { - qerror_report(ERROR_CLASS_GENERIC_ERROR, - "'%s' is not a valid device model name", driver); - return NULL; - } - - if (object_class_is_abstract(oc)) { - qerror_report(QERR_INVALID_PARAMETER_VALUE, "driver", - "non-abstract device type"); - return NULL; - } - - dc = DEVICE_CLASS(oc); - if (dc->cannot_instantiate_with_device_add_yet || - (qdev_hotplug && !dc->hotpluggable)) { - qerror_report(QERR_INVALID_PARAMETER_VALUE, "driver", - "pluggable device type"); + dc = qdev_get_device_class(&driver, &err); + if (err) { + qerror_report_err(err); + error_free(err); return NULL; }