diff options
author | Kevin Wolf | 2021-03-12 14:19:21 +0100 |
---|---|---|
committer | Kevin Wolf | 2021-03-19 10:18:17 +0100 |
commit | 155b5f8b8d3d5dedd7c57e5223e822dc1b5295c8 (patch) | |
tree | 6d49f3223e5d62635eff2c0ebe446afd031448bb | |
parent | char: Simplify chardev_name_foreach() (diff) | |
download | qemu-155b5f8b8d3d5dedd7c57e5223e822dc1b5295c8.tar.gz qemu-155b5f8b8d3d5dedd7c57e5223e822dc1b5295c8.tar.xz qemu-155b5f8b8d3d5dedd7c57e5223e822dc1b5295c8.zip |
qom: Support JSON in HMP object_add and tools --object
Support JSON for --object in all tools and in HMP object_add in the same
way as it is supported in qobject_input_visitor_new_str().
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
Message-Id: <20210312131921.421023-1-kwolf@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
Reviewed-by: Markus Armbruster <armbru@redhat.com>
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
-rw-r--r-- | qom/object_interfaces.c | 32 |
1 files changed, 21 insertions, 11 deletions
diff --git a/qom/object_interfaces.c b/qom/object_interfaces.c index 0614246f8a..7b87f21883 100644 --- a/qom/object_interfaces.c +++ b/qom/object_interfaces.c @@ -296,25 +296,35 @@ static void user_creatable_print_help_from_qdict(QDict *args) ObjectOptions *user_creatable_parse_str(const char *optarg, Error **errp) { ERRP_GUARD(); - QDict *args; + QObject *obj; bool help; Visitor *v; ObjectOptions *options; - args = keyval_parse(optarg, "qom-type", &help, errp); - if (*errp) { - return NULL; - } - if (help) { - user_creatable_print_help_from_qdict(args); - qobject_unref(args); - return NULL; + if (optarg[0] == '{') { + obj = qobject_from_json(optarg, errp); + if (!obj) { + return NULL; + } + v = qobject_input_visitor_new(obj); + } else { + QDict *args = keyval_parse(optarg, "qom-type", &help, errp); + if (*errp) { + return NULL; + } + if (help) { + user_creatable_print_help_from_qdict(args); + qobject_unref(args); + return NULL; + } + + obj = QOBJECT(args); + v = qobject_input_visitor_new_keyval(obj); } - v = qobject_input_visitor_new_keyval(QOBJECT(args)); visit_type_ObjectOptions(v, NULL, &options, errp); visit_free(v); - qobject_unref(args); + qobject_unref(obj); return options; } |