From: Stefan Hajnoczi <stefanha@gmail.com>
To: Dong Xu Wang <wdongxu@linux.vnet.ibm.com>
Cc: kwolf@redhat.com, qemu-devel@nongnu.org
Subject: Re: [Qemu-devel] [PATCH V4 07/10] add def_value and use it in qemu_opts_print.
Date: Fri, 26 Oct 2012 11:32:55 +0200 [thread overview]
Message-ID: <20121026093255.GE19272@stefanha-thinkpad.redhat.com> (raw)
In-Reply-To: <1351169848-28223-8-git-send-email-wdongxu@linux.vnet.ibm.com>
On Thu, Oct 25, 2012 at 08:57:25PM +0800, Dong Xu Wang wrote:
> qemu_opts_print has no user now, so I re-write it and use it in
> qemu-img.c.
>
> qemu_opts_print will be used while using "qemu-img create", it will
> produce the same output as previous code.
>
> Signed-off-by: Dong Xu Wang <wdongxu@linux.vnet.ibm.com>
> ---
> qemu-option.c | 41 ++++++++++++++++++++++++++++++++---------
> qemu-option.h | 1 +
> 2 files changed, 33 insertions(+), 9 deletions(-)
The behavior of this function has changed. I think you are trying to
achieve the following:
1. Print every possible option, whether a value has been set or not.
2. Option descriptors may provide a default value.
3. Print to stdout instead of stderr.
Previously the behavior was to print every option that has been set.
Options that have not been set would be skipped.
Please include the intention behind the change either in the commit
description or in a doc comment before the function. It took me a while
to figure out "why" this change is useful.
> diff --git a/qemu-option.c b/qemu-option.c
> index eeb2c9c..54dbdd0 100644
> --- a/qemu-option.c
> +++ b/qemu-option.c
> @@ -860,15 +860,38 @@ void qemu_opts_del(QemuOpts *opts)
>
> int qemu_opts_print(QemuOpts *opts, void *dummy)
> {
> - QemuOpt *opt;
> -
> - fprintf(stderr, "%s: %s:", opts->list->name,
> - opts->id ? opts->id : "<noid>");
> - QTAILQ_FOREACH(opt, &opts->head, next) {
> - fprintf(stderr, " %s=\"%s\"", opt->name, opt->str);
> - }
> - fprintf(stderr, "\n");
> - return 0;
> + QemuOpt *opt = NULL;
> + QemuOptDesc *desc = opts->list->desc;
> +
> + while (desc && desc->name) {
> + opt = qemu_opt_find(opts, desc->name);
> + switch (desc->type) {
> + case QEMU_OPT_STRING:
> + if (opt != NULL) {
> + printf("%s='%s' ", opt->name, opt->str);
> + }
> + break;
> + case QEMU_OPT_BOOL:
> + printf("%s=%s ", desc->name, (opt && opt->str) ? "on" : "off");
> + break;
> + case QEMU_OPT_NUMBER:
> + case QEMU_OPT_SIZE:
> + if (strcmp(desc->name, "cluster_size")) {
> + printf("%s=%" PRId64 " ", desc->name,
> + (opt && opt->value.uint) ? opt->value.uint : 0);
> + } else {
> + printf("%s=%" PRId64 " ", desc->name,
> + (opt && opt->value.uint) ?
> + opt->value.uint : desc->def_value);
> + }
> + break;
> + default:
> + printf("%s=(unknown type) ", desc->name);
> + break;
> + }
This is very specific to qemu-img output formatting. An idea to make
the formatting rules more general:
1. Strings are printed with '%s', other values are printed unquoted %s.
2. If the option has not been set, then def_print_str is used.
3. If the option has not been set and def_print_str is NULL then the
option is skipped.
The code becomes:
for (desc = opts->list->desc; desc && desc->name; desc++) {
const char *value = desc->def_print_str;
QemuOpt *opt;
opt = qemu_opt_find(opts, desc->name);
if (opt) {
value = opt->str;
}
if (!value) {
continue;
}
if (desc->type == QEMU_OPT_STRING) {
printf("%s='%s' ", desc->name, value);
} else {
printf("%s=%s ", desc->name, value);
}
}
If you want an option to print a default value, def_print_str must be
set. Otherwise the option is skipped when no value has been set.
> + desc++;
> + }
> + return 0;
> }
>
> static int opts_do_parse(QemuOpts *opts, const char *params,
> diff --git a/qemu-option.h b/qemu-option.h
> index 002dd07..9ea59cf 100644
> --- a/qemu-option.h
> +++ b/qemu-option.h
> @@ -96,6 +96,7 @@ typedef struct QemuOptDesc {
> const char *name;
> enum QemuOptType type;
> const char *help;
> + uint64_t def_value;
The name "def_value" suggests that this is used as a default value for
the option. In fact it's only used as the default value for printing.
I suggest calling it def_print_str.
Also, if you do the change I suggested above, then this becomes const
char * instead of being uint64_t - this way it can be used for any
option type (str, bool, number, size).
Stefan
next prev parent reply other threads:[~2012-10-26 9:33 UTC|newest]
Thread overview: 17+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-10-25 12:57 [Qemu-devel] [PATCH V4 00/10] replace QEMUOptionParameter with QemuOpts parser Dong Xu Wang
2012-10-25 12:57 ` [Qemu-devel] [PATCH V4 01/10] qemu-option: opt_set(): split it up into more functions Dong Xu Wang
2012-10-25 12:57 ` [Qemu-devel] [PATCH V4 02/10] qemu-option: qemu_opts_validate(): fix duplicated code Dong Xu Wang
2012-10-25 12:57 ` [Qemu-devel] [PATCH V4 03/10] qemu-option: qemu_opt_set_bool(): fix code duplication Dong Xu Wang
2012-10-25 12:57 ` [Qemu-devel] [PATCH V4 04/10] introduce qemu_opts_create_nofail function Dong Xu Wang
2012-10-25 13:06 ` Peter Maydell
2012-10-26 2:46 ` Dong Xu Wang
2012-10-25 12:57 ` [Qemu-devel] [PATCH V4 05/10] use qemu_opts_create_nofail Dong Xu Wang
2012-10-25 12:57 ` [Qemu-devel] [PATCH V4 06/10] create new function: qemu_opt_set_number Dong Xu Wang
2012-10-26 9:02 ` Stefan Hajnoczi
2012-10-29 8:03 ` Dong Xu Wang
2012-10-25 12:57 ` [Qemu-devel] [PATCH V4 07/10] add def_value and use it in qemu_opts_print Dong Xu Wang
2012-10-26 9:32 ` Stefan Hajnoczi [this message]
2012-10-25 12:57 ` [Qemu-devel] [PATCH V4 08/10] Create four opts list related functions Dong Xu Wang
2012-10-25 12:57 ` [Qemu-devel] [PATCH V4 09/10] Use QemuOpts support in block layer Dong Xu Wang
2012-10-26 9:51 ` Stefan Hajnoczi
2012-10-25 12:57 ` [Qemu-devel] [PATCH V4 10/10] remove QEMUOptionParameter related functions and struct Dong Xu Wang
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20121026093255.GE19272@stefanha-thinkpad.redhat.com \
--to=stefanha@gmail.com \
--cc=kwolf@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=wdongxu@linux.vnet.ibm.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).