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(a)redhat.com>
---
include/qom/object_interfaces.h | 16 ++++++++++++++++
qom/object_interfaces.c | 29 ++++++++++++++++++++++++-----
2 files changed, 40 insertions(+), 5 deletions(-)
diff --git a/include/qom/object_interfaces.h b/include/qom/object_interfaces.h
index 1e6c51b541..07511e6cff 100644
--- a/include/qom/object_interfaces.h
+++ b/include/qom/object_interfaces.h
@@ -144,6 +144,22 @@ typedef bool (*user_creatable_add_opts_predicate)(const char *type);
int user_creatable_add_opts_foreach(void *opaque,
QemuOpts *opts, Error **errp);
+/**
+ * user_creatable_add_from_str:
+ * @optarg: the object definition string as passed on the command line
+ * @errp: if an error occurs, a pointer to an area to store the error
+ *
+ * Create an instance of the user creatable object by parsing optarg
+ * with a keyval parser and implicit key 'qom-type', converting the
+ * result to ObjectOptions and calling into qmp_object_add().
+ *
+ * If a help option is given, print help instead.
+ *
+ * Returns: true when an object was successfully created, false when an error
+ * occurred (*errp is set then) or help was printed (*errp is not set).
+ */
+bool user_creatable_add_from_str(const char *optarg, Error **errp);
+
/**
* user_creatable_process_cmdline:
* @optarg: the object definition string as passed on the command line
diff --git a/qom/object_interfaces.c b/qom/object_interfaces.c
index efb48249d5..54f0dadfea 100644
--- a/qom/object_interfaces.c
+++ b/qom/object_interfaces.c
@@ -282,26 +282,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)
--
2.29.2