From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([140.186.70.92]:35304) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1RsiOV-0006dd-GK for qemu-devel@nongnu.org; Wed, 01 Feb 2012 17:11:12 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1RsiOU-0008Jx-84 for qemu-devel@nongnu.org; Wed, 01 Feb 2012 17:11:11 -0500 Received: from mail-pz0-f45.google.com ([209.85.210.45]:58241) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1RsiOT-0008JT-UK for qemu-devel@nongnu.org; Wed, 01 Feb 2012 17:11:10 -0500 Received: by dadp14 with SMTP id p14so1612186dad.4 for ; Wed, 01 Feb 2012 14:11:09 -0800 (PST) Message-ID: <4F29B879.9010500@codemonkey.ws> Date: Wed, 01 Feb 2012 16:11:05 -0600 From: Anthony Liguori MIME-Version: 1.0 References: <4F22F2FE.8000008@siemens.com> In-Reply-To: <4F22F2FE.8000008@siemens.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Subject: Re: [Qemu-devel] [PATCH 1/2] qemu-option: Introduce default mechanism List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Jan Kiszka Cc: qemu-devel On 01/27/2012 12:54 PM, Jan Kiszka wrote: > This adds qemu_opts_set_defaults, an interface provide default values > for a QemuOpts set. Default options are parsed from a string and then > prepended to the list of existing options, or they serve as the sole > QemuOpts set. > > Signed-off-by: Jan Kiszka Applied. Thanks. Regards, Anthony Liguori > --- > qemu-option.c | 58 +++++++++++++++++++++++++++++++++++++++++++++++++------- > qemu-option.h | 2 + > 2 files changed, 52 insertions(+), 8 deletions(-) > > diff --git a/qemu-option.c b/qemu-option.c > index a303f87..4626ccf 100644 > --- a/qemu-option.c > +++ b/qemu-option.c > @@ -603,7 +603,8 @@ static void qemu_opt_del(QemuOpt *opt) > g_free(opt); > } > > -int qemu_opt_set(QemuOpts *opts, const char *name, const char *value) > +static int opt_set(QemuOpts *opts, const char *name, const char *value, > + bool prepend) > { > QemuOpt *opt; > const QemuOptDesc *desc = opts->list->desc; > @@ -626,7 +627,11 @@ int qemu_opt_set(QemuOpts *opts, const char *name, const char *value) > opt = g_malloc0(sizeof(*opt)); > opt->name = g_strdup(name); > opt->opts = opts; > - QTAILQ_INSERT_TAIL(&opts->head, opt, next); > + if (prepend) { > + QTAILQ_INSERT_HEAD(&opts->head, opt, next); > + } else { > + QTAILQ_INSERT_TAIL(&opts->head, opt, next); > + } > if (desc[i].name != NULL) { > opt->desc = desc+i; > } > @@ -640,6 +645,11 @@ int qemu_opt_set(QemuOpts *opts, const char *name, const char *value) > return 0; > } > > +int qemu_opt_set(QemuOpts *opts, const char *name, const char *value) > +{ > + return opt_set(opts, name, value, false); > +} > + > int qemu_opt_set_bool(QemuOpts *opts, const char *name, bool val) > { > QemuOpt *opt; > @@ -691,6 +701,9 @@ QemuOpts *qemu_opts_find(QemuOptsList *list, const char *id) > > QTAILQ_FOREACH(opts,&list->head, next) { > if (!opts->id) { > + if (!id) { > + return opts; > + } > continue; > } > if (strcmp(opts->id, id) != 0) { > @@ -806,7 +819,8 @@ int qemu_opts_print(QemuOpts *opts, void *dummy) > return 0; > } > > -int qemu_opts_do_parse(QemuOpts *opts, const char *params, const char *firstname) > +static int opts_do_parse(QemuOpts *opts, const char *params, > + const char *firstname, bool prepend) > { > char option[128], value[1024]; > const char *p,*pe,*pc; > @@ -841,7 +855,7 @@ int qemu_opts_do_parse(QemuOpts *opts, const char *params, const char *firstname > } > if (strcmp(option, "id") != 0) { > /* store and parse */ > - if (qemu_opt_set(opts, option, value) == -1) { > + if (opt_set(opts, option, value, prepend) == -1) { > return -1; > } > } > @@ -852,8 +866,13 @@ int qemu_opts_do_parse(QemuOpts *opts, const char *params, const char *firstname > return 0; > } > > -QemuOpts *qemu_opts_parse(QemuOptsList *list, const char *params, > - int permit_abbrev) > +int qemu_opts_do_parse(QemuOpts *opts, const char *params, const char *firstname) > +{ > + return opts_do_parse(opts, params, firstname, false); > +} > + > +static QemuOpts *opts_parse(QemuOptsList *list, const char *params, > + int permit_abbrev, bool defaults) > { > const char *firstname; > char value[1024], *id = NULL; > @@ -870,11 +889,19 @@ QemuOpts *qemu_opts_parse(QemuOptsList *list, const char *params, > get_opt_value(value, sizeof(value), p+4); > id = value; > } > - opts = qemu_opts_create(list, id, 1); > + if (defaults) { > + if (!id&& !QTAILQ_EMPTY(&list->head)) { > + opts = qemu_opts_find(list, NULL); > + } else { > + opts = qemu_opts_create(list, id, 0); > + } > + } else { > + opts = qemu_opts_create(list, id, 1); > + } > if (opts == NULL) > return NULL; > > - if (qemu_opts_do_parse(opts, params, firstname) != 0) { > + if (opts_do_parse(opts, params, firstname, defaults) != 0) { > qemu_opts_del(opts); > return NULL; > } > @@ -882,6 +909,21 @@ QemuOpts *qemu_opts_parse(QemuOptsList *list, const char *params, > return opts; > } > > +QemuOpts *qemu_opts_parse(QemuOptsList *list, const char *params, > + int permit_abbrev) > +{ > + return opts_parse(list, params, permit_abbrev, false); > +} > + > +void qemu_opts_set_defaults(QemuOptsList *list, const char *params, > + int permit_abbrev) > +{ > + QemuOpts *opts; > + > + opts = opts_parse(list, params, permit_abbrev, true); > + assert(opts); > +} > + > static void qemu_opts_from_qdict_1(const char *key, QObject *obj, void *opaque) > { > char buf[32]; > diff --git a/qemu-option.h b/qemu-option.h > index 07958e4..e6f61e6 100644 > --- a/qemu-option.h > +++ b/qemu-option.h > @@ -125,6 +125,8 @@ void qemu_opts_del(QemuOpts *opts); > int qemu_opts_validate(QemuOpts *opts, const QemuOptDesc *desc); > int qemu_opts_do_parse(QemuOpts *opts, const char *params, const char *firstname); > QemuOpts *qemu_opts_parse(QemuOptsList *list, const char *params, int permit_abbrev); > +void qemu_opts_set_defaults(QemuOptsList *list, const char *params, > + int permit_abbrev); > QemuOpts *qemu_opts_from_qdict(QemuOptsList *list, const QDict *qdict); > QDict *qemu_opts_to_qdict(QemuOpts *opts, QDict *qdict); >