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>
This commit is contained in:
parent
fa40e43ca0
commit
ffd58ef88c
@ -144,6 +144,22 @@ typedef bool (*user_creatable_add_opts_predicate)(const char *type);
|
|||||||
int user_creatable_add_opts_foreach(void *opaque,
|
int user_creatable_add_opts_foreach(void *opaque,
|
||||||
QemuOpts *opts, Error **errp);
|
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:
|
* user_creatable_process_cmdline:
|
||||||
* @optarg: the object definition string as passed on the command line
|
* @optarg: the object definition string as passed on the command line
|
||||||
|
@ -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;
|
QDict *args;
|
||||||
bool help;
|
bool help;
|
||||||
Visitor *v;
|
Visitor *v;
|
||||||
ObjectOptions *options;
|
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) {
|
if (help) {
|
||||||
user_creatable_print_help_from_qdict(args);
|
user_creatable_print_help_from_qdict(args);
|
||||||
exit(EXIT_SUCCESS);
|
qobject_unref(args);
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
v = qobject_input_visitor_new_keyval(QOBJECT(args));
|
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);
|
visit_free(v);
|
||||||
qobject_unref(args);
|
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);
|
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)
|
bool user_creatable_del(const char *id, Error **errp)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user