summaryrefslogtreecommitdiff
path: root/vl.c
diff options
context:
space:
mode:
authorIgor Mammedov <imammedo@redhat.com>2014-01-16 17:34:38 +0100
committerLuiz Capitulino <lcapitulino@redhat.com>2014-01-28 12:47:02 -0500
commit269e09f3fc922b800d118d9c8a721be46b5462a3 (patch)
tree45a18489d3fa4c2bb54e96f7f26ca9f7f6a0af81 /vl.c
parent90e9cf28e57a3e1d6caa0a28b0a332ff982ccb0b (diff)
downloadqemu-269e09f3fc922b800d118d9c8a721be46b5462a3.tar.gz
add optional 2nd stage initialization to -object/object-add commands
Introduces USER_CREATABLE interface that must be implemented by objects which are designed to created with -object CLI option or object-add QMP command. Interface provides an ability to do an optional second stage initialization of the object created with -object/object-add commands. By providing complete() callback, which is called after the object properties were set. It allows to: * prevents misusing of -object/object-add by filtering out objects that are not designed for it. * generalize second stage backend initialization instead of adding custom APIs to perform it * early error detection of backend initialization at -object/ object-add time rather than through a proxy DEVICE object that tries to use backend. Signed-off-by: Igor Mammedov <imammedo@redhat.com> Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com> Signed-off-by: Luiz Capitulino <lcapitulino@redhat.com>
Diffstat (limited to 'vl.c')
-rw-r--r--vl.c13
1 files changed, 13 insertions, 0 deletions
diff --git a/vl.c b/vl.c
index cf3de56b7d..9c2619f271 100644
--- a/vl.c
+++ b/vl.c
@@ -170,6 +170,7 @@ int main(int argc, char **argv)
#include "ui/qemu-spice.h"
#include "qapi/string-input-visitor.h"
+#include "qom/object_interfaces.h"
//#define DEBUG_NET
//#define DEBUG_SLIRP
@@ -2816,9 +2817,21 @@ static int object_create(QemuOpts *opts, void *opaque)
return -1;
}
+ if (!object_dynamic_cast(obj, TYPE_USER_CREATABLE)) {
+ error_setg(&local_err, "object '%s' isn't supported by -object",
+ id);
+ goto out;
+ }
+
+ user_creatable_complete(obj, &local_err);
+ if (local_err) {
+ goto out;
+ }
+
object_property_add_child(container_get(object_get_root(), "/objects"),
id, obj, &local_err);
+out:
object_unref(obj);
if (local_err) {
qerror_report_err(local_err);