[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PULL v2 03/12] qemu-option: add help fallback to print the
From: |
Marc-André Lureau |
Subject: |
[Qemu-devel] [PULL v2 03/12] qemu-option: add help fallback to print the list of options |
Date: |
Fri, 5 Oct 2018 16:29:01 +0400 |
QDev options accept 'help' (or '?', but that's problematic with shell
globbing) in the list of parameters, which is handy to list the
available options.
Unfortunately, this isn't built in QemuOpts. qemu_opts_parse_noisily()
seems to be the common path for command line options, so place a
fallback to print help, listing the available options.
This is quite handy, for example with qemu "-spice help".
Signed-off-by: Marc-André Lureau <address@hidden>
Reviewed-by: Eric Blake <address@hidden>
---
util/qemu-option.c | 33 ++++++++++++++++++++++-----------
1 file changed, 22 insertions(+), 11 deletions(-)
diff --git a/util/qemu-option.c b/util/qemu-option.c
index 01886efe90..557b6c6626 100644
--- a/util/qemu-option.c
+++ b/util/qemu-option.c
@@ -486,7 +486,7 @@ int qemu_opt_unset(QemuOpts *opts, const char *name)
}
static void opt_set(QemuOpts *opts, const char *name, char *value,
- bool prepend, Error **errp)
+ bool prepend, bool *invalidp, Error **errp)
{
QemuOpt *opt;
const QemuOptDesc *desc;
@@ -496,6 +496,9 @@ static void opt_set(QemuOpts *opts, const char *name, char
*value,
if (!desc && !opts_accepts_any(opts)) {
g_free(value);
error_setg(errp, QERR_INVALID_PARAMETER, name);
+ if (invalidp) {
+ *invalidp = true;
+ }
return;
}
@@ -519,7 +522,7 @@ static void opt_set(QemuOpts *opts, const char *name, char
*value,
void qemu_opt_set(QemuOpts *opts, const char *name, const char *value,
Error **errp)
{
- opt_set(opts, name, g_strdup(value), false, errp);
+ opt_set(opts, name, g_strdup(value), false, NULL, errp);
}
void qemu_opt_set_bool(QemuOpts *opts, const char *name, bool val,
@@ -750,7 +753,8 @@ void qemu_opts_print(QemuOpts *opts, const char *separator)
}
static void opts_do_parse(QemuOpts *opts, const char *params,
- const char *firstname, bool prepend, Error **errp)
+ const char *firstname, bool prepend,
+ bool *invalidp, Error **errp)
{
char *option = NULL;
char *value = NULL;
@@ -785,7 +789,7 @@ static void opts_do_parse(QemuOpts *opts, const char
*params,
}
if (strcmp(option, "id") != 0) {
/* store and parse */
- opt_set(opts, option, value, prepend, &local_err);
+ opt_set(opts, option, value, prepend, invalidp, &local_err);
value = NULL;
if (local_err) {
error_propagate(errp, local_err);
@@ -814,11 +818,12 @@ static void opts_do_parse(QemuOpts *opts, const char
*params,
void qemu_opts_do_parse(QemuOpts *opts, const char *params,
const char *firstname, Error **errp)
{
- opts_do_parse(opts, params, firstname, false, errp);
+ opts_do_parse(opts, params, firstname, false, NULL, errp);
}
static QemuOpts *opts_parse(QemuOptsList *list, const char *params,
- bool permit_abbrev, bool defaults, Error **errp)
+ bool permit_abbrev, bool defaults,
+ bool *invalidp, Error **errp)
{
const char *firstname;
char *id = NULL;
@@ -850,7 +855,7 @@ static QemuOpts *opts_parse(QemuOptsList *list, const char
*params,
return NULL;
}
- opts_do_parse(opts, params, firstname, defaults, &local_err);
+ opts_do_parse(opts, params, firstname, defaults, invalidp, &local_err);
if (local_err) {
error_propagate(errp, local_err);
qemu_opts_del(opts);
@@ -870,7 +875,7 @@ static QemuOpts *opts_parse(QemuOptsList *list, const char
*params,
QemuOpts *qemu_opts_parse(QemuOptsList *list, const char *params,
bool permit_abbrev, Error **errp)
{
- return opts_parse(list, params, permit_abbrev, false, errp);
+ return opts_parse(list, params, permit_abbrev, false, NULL, errp);
}
/**
@@ -886,10 +891,16 @@ QemuOpts *qemu_opts_parse_noisily(QemuOptsList *list,
const char *params,
{
Error *err = NULL;
QemuOpts *opts;
+ bool invalidp = false;
- opts = opts_parse(list, params, permit_abbrev, false, &err);
+ opts = opts_parse(list, params, permit_abbrev, false, &invalidp, &err);
if (err) {
- error_report_err(err);
+ if (invalidp && has_help_option(params)) {
+ qemu_opts_print_help(list);
+ error_free(err);
+ } else {
+ error_report_err(err);
+ }
}
return opts;
}
@@ -899,7 +910,7 @@ void qemu_opts_set_defaults(QemuOptsList *list, const char
*params,
{
QemuOpts *opts;
- opts = opts_parse(list, params, permit_abbrev, true, NULL);
+ opts = opts_parse(list, params, permit_abbrev, true, NULL, NULL);
assert(opts);
}
--
2.19.0.271.gfe8321ec05
- [Qemu-devel] [PULL v2 00/12] Option patches, Marc-André Lureau, 2018/10/05
- [Qemu-devel] [PULL v2 01/12] qdev-monitor: print help to stdout, Marc-André Lureau, 2018/10/05
- [Qemu-devel] [PULL v2 02/12] cutils: add qemu_pstrcmp0(), Marc-André Lureau, 2018/10/05
- [Qemu-devel] [PULL v2 03/12] qemu-option: add help fallback to print the list of options,
Marc-André Lureau <=
- [Qemu-devel] [PULL v2 04/12] qemu-option: improve qemu_opts_print_help() output, Marc-André Lureau, 2018/10/05
- [Qemu-devel] [PULL v2 05/12] qom/object: fix iterating properties over a class, Marc-André Lureau, 2018/10/05
- [Qemu-devel] [PULL v2 06/12] qom/object: register 'type' property as class property, Marc-André Lureau, 2018/10/05
- [Qemu-devel] [PULL v2 07/12] tests/qom-proplist: check duplicate "bv" property registration failed, Marc-André Lureau, 2018/10/05
- [Qemu-devel] [PULL v2 08/12] tests/qom-proplist: check properties are not listed multiple times, Marc-André Lureau, 2018/10/05
- [Qemu-devel] [PULL v2 09/12] tests/qom-proplist: check class properties iterator, Marc-André Lureau, 2018/10/05
- [Qemu-devel] [PULL v2 10/12] vl: handle -object help, Marc-André Lureau, 2018/10/05
- [Qemu-devel] [PULL v2 11/12] hostmem: add some properties description, Marc-André Lureau, 2018/10/05
- [Qemu-devel] [PULL v2 12/12] vl: list user creatable properties when 'help' is argument, Marc-André Lureau, 2018/10/05
- Re: [Qemu-devel] [PULL v2 00/12] Option patches, Peter Maydell, 2018/10/08