[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH 01/10] qemu-option: add help fallback to print the l
From: |
Marc-André Lureau |
Subject: |
[Qemu-devel] [PATCH 01/10] qemu-option: add help fallback to print the list of options |
Date: |
Thu, 6 Sep 2018 19:12:18 +0400 |
QDev options accept '?' or 'help' in the list of parameters, which is
really 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 check for '?' and print help listing available options.
This is very handy, for example with qemu "-spice ?".
Signed-off-by: Marc-André Lureau <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.rc1
- [Qemu-devel] [PATCH 00/10] Various qemu command line options help improvements, Marc-André Lureau, 2018/09/06
- [Qemu-devel] [PATCH 01/10] qemu-option: add help fallback to print the list of options,
Marc-André Lureau <=
- [Qemu-devel] [PATCH 03/10] qom/object: fix iterating properties over a class, Marc-André Lureau, 2018/09/06
- [Qemu-devel] [PATCH 02/10] qemu-option: improve qemu_opts_print_help() output, Marc-André Lureau, 2018/09/06
- [Qemu-devel] [PATCH 04/10] qom/object: register 'type' property as class property, Marc-André Lureau, 2018/09/06
- [Qemu-devel] [PATCH 06/10] tests/qom-proplist: check properties are not listed multiple times, Marc-André Lureau, 2018/09/06
- [Qemu-devel] [PATCH 07/10] tests/qom-proplist: check class properties iterator, Marc-André Lureau, 2018/09/06
- [Qemu-devel] [PATCH 08/10] vl: handle -object ?, Marc-André Lureau, 2018/09/06
- [Qemu-devel] [PATCH 05/10] tests/qom-proplist: check duplicate "bv" property registration failed, Marc-André Lureau, 2018/09/06