diff options
author | Kevin Wolf <kwolf@redhat.com> | 2021-02-17 14:59:06 +0100 |
---|---|---|
committer | Kevin Wolf <kwolf@redhat.com> | 2021-03-19 10:17:14 +0100 |
commit | ffd58ef88c73700113e0808e8222ef4d22224f33 (patch) | |
tree | 37d81679fc757d837f9eec23e31f09d7428edae4 /qom | |
parent | fa40e43ca01b8ddd174daf6863282d987e57a235 (diff) |
qom: Add user_creatable_add_from_str()
This is a version of user_creatable_process_cmdline() with an Error
parameter that never calls exit() and is therefore usable in HMP.
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
Acked-by: Paolo Bonzini <pbonzini@redhat.com>
Acked-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
Diffstat (limited to 'qom')
-rw-r--r-- | qom/object_interfaces.c | 29 |
1 files changed, 24 insertions, 5 deletions
diff --git a/qom/object_interfaces.c b/qom/object_interfaces.c index e10a5cf6f0..bc091ef429 100644 --- a/qom/object_interfaces.c +++ b/qom/object_interfaces.c @@ -292,26 +292,45 @@ static void user_creatable_print_help_from_qdict(QDict *args) } } -void user_creatable_process_cmdline(const char *optarg) +bool user_creatable_add_from_str(const char *optarg, Error **errp) { + ERRP_GUARD(); QDict *args; bool help; Visitor *v; ObjectOptions *options; - args = keyval_parse(optarg, "qom-type", &help, &error_fatal); + args = keyval_parse(optarg, "qom-type", &help, errp); + if (*errp) { + return false; + } if (help) { user_creatable_print_help_from_qdict(args); - exit(EXIT_SUCCESS); + qobject_unref(args); + return false; } v = qobject_input_visitor_new_keyval(QOBJECT(args)); - visit_type_ObjectOptions(v, NULL, &options, &error_fatal); + visit_type_ObjectOptions(v, NULL, &options, errp); visit_free(v); qobject_unref(args); - user_creatable_add_qapi(options, &error_fatal); + if (*errp) { + goto out; + } + + user_creatable_add_qapi(options, errp); +out: qapi_free_ObjectOptions(options); + return !*errp; +} + +void user_creatable_process_cmdline(const char *optarg) +{ + if (!user_creatable_add_from_str(optarg, &error_fatal)) { + /* Help was printed */ + exit(EXIT_SUCCESS); + } } bool user_creatable_del(const char *id, Error **errp) |