aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEduardo Habkost <ehabkost@redhat.com>2014-11-01 13:56:09 -0200
committerAndreas Färber <afaerber@suse.de>2014-11-04 17:50:00 +0100
commit43c95d782d6cc2297b6235d9ecb1f66f08e9928a (patch)
tree24f9b6a403cd8e2dad26e0c3d24b432033e238c7
parent1bc8dae31baa8b02a1b8e70c3244232e03bbb3b2 (diff)
qdev: Create qdev_get_device_class() function
Extract the DeviceClass lookup from qdev_device_add() to a separate function. Signed-off-by: Eduardo Habkost <ehabkost@redhat.com> Signed-off-by: Andreas Färber <afaerber@suse.de>
-rw-r--r--qdev-monitor.c70
1 files changed, 42 insertions, 28 deletions
diff --git a/qdev-monitor.c b/qdev-monitor.c
index fac7d179fe..982f3f4c09 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;
}