From: john cooper <john.cooper@redhat.com>
To: KVM list <kvm@vger.kernel.org>, qemu-devel@nongnu.org
Cc: john.cooper@redhat.com, "Przywara,
Andre" <Andre.Przywara@amd.com>,
Mark McLoughlin <markmc@redhat.com>
Subject: [Qemu-devel] [PATCH] Add assignment operation to config file parser..
Date: Sat, 06 Feb 2010 13:59:13 -0500 [thread overview]
Message-ID: <4B6DBC01.4060307@redhat.com> (raw)
In-Reply-To: <4B672535.5050303@redhat.com>
This patch reworks support for both assignment and
append in the config file parser. It was motivated
by comments received on the cpu model config file
format.
Commit dc9ca4ba27be4fe6a0284061b8f056c4364fb0d9
changed the behavior of "=" from assign to append.
This patch preserves the ability to append to an
option (however now via "+="), reverts "=" to its
previous behavior, and allows both to interoperate.
Signed-off-by: john cooper <john.cooper@redhat.com>
---
diff --git a/qemu-config.c b/qemu-config.c
index 246fae6..4e53250 100644
--- a/qemu-config.c
+++ b/qemu-config.c
@@ -429,6 +429,7 @@ int qemu_config_parse(FILE *fp)
char line[1024], group[64], id[64], arg[64], value[1024];
QemuOptsList *list = NULL;
QemuOpts *opts = NULL;
+ char append;
while (fgets(line, sizeof(line), fp) != NULL) {
if (line[0] == '\n') {
@@ -455,13 +456,16 @@ int qemu_config_parse(FILE *fp)
opts = qemu_opts_create(list, NULL, 0);
continue;
}
- if (sscanf(line, " %63s = \"%1023[^\"]\"", arg, value) == 2) {
- /* arg = value */
+ append = 0;
+ if (sscanf(line, " %63s = \"%1023[^\"]\"", arg, value) == 2 ||
+ (sscanf(line, " %63s += \"%1023[^\"]\"", arg, value) == 2 ?
+ append = 1 : 0)) {
+ /* arg = value, arg += value */
if (opts == NULL) {
fprintf(stderr, "no group defined\n");
return -1;
}
- if (qemu_opt_set(opts, arg, value) != 0) {
+ if (_qemu_opt_set(opts, arg, value, append) != 0) {
fprintf(stderr, "failed to set \"%s\" for %s\n",
arg, group);
return -1;
diff --git a/qemu-option.c b/qemu-option.c
index a52a4c4..7c0faed 100644
--- a/qemu-option.c
+++ b/qemu-option.c
@@ -562,7 +562,11 @@ static void qemu_opt_del(QemuOpt *opt)
qemu_free(opt);
}
-int qemu_opt_set(QemuOpts *opts, const char *name, const char *value)
+/* add option *name,*value to group *opts. if append add to tail of option
+ * list, else set as sole element (overwrite any existing entries of *name).
+ */
+int _qemu_opt_set(QemuOpts *opts, const char *name, const char *value,
+ char append)
{
QemuOpt *opt;
QemuOptDesc *desc = opts->list->desc;
@@ -582,13 +586,27 @@ int qemu_opt_set(QemuOpts *opts, const char *name, const char *value)
return -1;
}
}
-
- opt = qemu_mallocz(sizeof(*opt));
- opt->name = qemu_strdup(name);
- opt->opts = opts;
- QTAILQ_INSERT_TAIL(&opts->head, opt, next);
- if (desc[i].name != NULL) {
- opt->desc = desc+i;
+ if (append || !(opt = qemu_opt_find(opts, name))) {
+ opt = qemu_mallocz(sizeof(*opt));
+ opt->name = qemu_strdup(name);
+ opt->opts = opts;
+ QTAILQ_INSERT_TAIL(&opts->head, opt, next);
+ if (desc[i].name != NULL) {
+ opt->desc = desc+i;
+ }
+ } else if (!append) {
+ QemuOpt *p, *next;
+
+ /* assign to reclaimed *opt, remove all other *name defs */
+ QTAILQ_FOREACH_SAFE(p, &opts->head, next, next) {
+ if (p != opt && !strcmp(name, p->name)) {
+ qemu_free((char *)p->str);
+ QTAILQ_REMOVE(&opts->head, p, next);
+ qemu_free((char *)p);
+ }
+ }
+ qemu_free((char *)opt->str);
+ opt->str = NULL;
}
if (value) {
opt->str = qemu_strdup(value);
diff --git a/qemu-option.h b/qemu-option.h
index 666b666..2385b1a 100644
--- a/qemu-option.h
+++ b/qemu-option.h
@@ -104,7 +104,14 @@ const char *qemu_opt_get(QemuOpts *opts, const char *name);
int qemu_opt_get_bool(QemuOpts *opts, const char *name, int defval);
uint64_t qemu_opt_get_number(QemuOpts *opts, const char *name, uint64_t defval);
uint64_t qemu_opt_get_size(QemuOpts *opts, const char *name, uint64_t defval);
-int qemu_opt_set(QemuOpts *opts, const char *name, const char *value);
+int _qemu_opt_set(QemuOpts *opts, const char *name, const char *value,
+ char append);
+static inline int qemu_opt_set(QemuOpts *opts, const char *name,
+ const char *value)
+{
+ return (_qemu_opt_set(opts, name, value, 0));
+}
+
typedef int (*qemu_opt_loopfunc)(const char *name, const char *value, void *opaque);
int qemu_opt_foreach(QemuOpts *opts, qemu_opt_loopfunc func, void *opaque,
int abort_on_failure);
--
john.cooper@redhat.com
next prev parent reply other threads:[~2010-02-06 19:07 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-02-01 19:02 [Qemu-devel] [PATCH] Add cpu model configuration support.. (resend) john cooper
2010-02-02 10:17 ` [Qemu-devel] " Andre Przywara
2010-02-02 11:07 ` Andre Przywara
2010-02-02 19:34 ` john cooper
2010-02-06 18:59 ` john cooper [this message]
2010-02-07 16:24 ` [Qemu-devel] [PATCH] Add assignment operation to config file parser Anthony Liguori
2010-02-08 13:21 ` Gerd Hoffmann
2010-02-08 16:00 ` john cooper
2010-06-09 8:05 ` [Qemu-devel] [PATCH] Add optional dump of default config file paths john cooper
2010-06-14 17:01 ` Anthony Liguori
2010-06-14 17:07 ` Daniel P. Berrange
2010-06-14 17:59 ` john cooper
2010-06-14 19:13 ` Anthony Liguori
2010-02-10 20:00 ` [Qemu-devel] [PATCH] Add cpu model configuration support.. (resend) Anthony Liguori
2010-02-14 6:52 ` john cooper
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=4B6DBC01.4060307@redhat.com \
--to=john.cooper@redhat.com \
--cc=Andre.Przywara@amd.com \
--cc=kvm@vger.kernel.org \
--cc=markmc@redhat.com \
--cc=qemu-devel@nongnu.org \
/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).