Skip to content

Commit

Permalink
vl: redo -object parsing
Browse files Browse the repository at this point in the history
Follow the lines of the HMP implementation, using OptsVisitor
to parse the options.  This gives access to OptsVisitor's
rich parsing of integer lists.

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Signed-off-by: Hu Tao <hutao@cn.fujitsu.com>
Acked-by: Michael S. Tsirkin <mst@redhat.com>
  • Loading branch information
bonzini authored and mstsirkin committed Jun 16, 2014
1 parent b4bf4a5 commit 0df36bc
Showing 1 changed file with 36 additions and 29 deletions.
65 changes: 36 additions & 29 deletions vl.c
Expand Up @@ -116,7 +116,7 @@ int main(int argc, char **argv)

#include "ui/qemu-spice.h"
#include "qapi/string-input-visitor.h"
#include "qom/object_interfaces.h"
#include "qapi/opts-visitor.h"

#define DEFAULT_RAM_SIZE 128

Expand Down Expand Up @@ -2822,44 +2822,51 @@ static int object_set_property(const char *name, const char *value, void *opaque

static int object_create(QemuOpts *opts, void *opaque)
{
const char *type = qemu_opt_get(opts, "qom-type");
const char *id = qemu_opts_id(opts);
Error *local_err = NULL;
Object *obj;

g_assert(type != NULL);

if (id == NULL) {
qerror_report(QERR_MISSING_PARAMETER, "id");
return -1;
Error *err = NULL;
char *type = NULL;
char *id = NULL;
void *dummy = NULL;
OptsVisitor *ov;
QDict *pdict;

ov = opts_visitor_new(opts);
pdict = qemu_opts_to_qdict(opts, NULL);

visit_start_struct(opts_get_visitor(ov), &dummy, NULL, NULL, 0, &err);
if (err) {
goto out;
}

obj = object_new(type);
if (qemu_opt_foreach(opts, object_set_property, obj, 1) < 0) {
object_unref(obj);
return -1;
qdict_del(pdict, "qom-type");
visit_type_str(opts_get_visitor(ov), &type, "qom-type", &err);
if (err) {
goto out;
}

if (!object_dynamic_cast(obj, TYPE_USER_CREATABLE)) {
error_setg(&local_err, "object '%s' isn't supported by -object",
id);
qdict_del(pdict, "id");
visit_type_str(opts_get_visitor(ov), &id, "id", &err);
if (err) {
goto out;
}

object_property_add_child(container_get(object_get_root(), "/objects"),
id, obj, &local_err);

user_creatable_complete(obj, &local_err);
if (local_err) {
object_property_del(container_get(object_get_root(), "/objects"),
id, &error_abort);
object_add(type, id, pdict, opts_get_visitor(ov), &err);
if (err) {
goto out;
}
visit_end_struct(opts_get_visitor(ov), &err);
if (err) {
qmp_object_del(id, NULL);
}

out:
object_unref(obj);
if (local_err) {
qerror_report_err(local_err);
error_free(local_err);
opts_visitor_cleanup(ov);

QDECREF(pdict);
g_free(id);
g_free(type);
g_free(dummy);
if (err) {
qerror_report_err(err);
return -1;
}
return 0;
Expand Down

0 comments on commit 0df36bc

Please sign in to comment.