Skip to content

Commit

Permalink
qemu-option: add help fallback to print the list of options
Browse files Browse the repository at this point in the history
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 <marcandre.lureau@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
  • Loading branch information
elmarco committed Oct 5, 2018
1 parent 85e33a2 commit e05979d
Showing 1 changed file with 22 additions and 11 deletions.
33 changes: 22 additions & 11 deletions util/qemu-option.c
Expand Up @@ -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;
Expand All @@ -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;
}

Expand All @@ -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,
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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);
Expand All @@ -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);
}

/**
Expand All @@ -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;
}
Expand All @@ -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);
}

Expand Down

0 comments on commit e05979d

Please sign in to comment.