aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKevin Wolf <kwolf@redhat.com>2021-03-12 14:19:21 +0100
committerKevin Wolf <kwolf@redhat.com>2021-03-19 10:18:17 +0100
commit155b5f8b8d3d5dedd7c57e5223e822dc1b5295c8 (patch)
tree6d49f3223e5d62635eff2c0ebe446afd031448bb
parentf3b70e0779c84a5c220ca67610b27cbe672d986a (diff)
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.c32
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;
}