From dc9ca4ba27be4fe6a0284061b8f056c4364fb0d9 Mon Sep 17 00:00:00 2001 From: Mark McLoughlin Date: Tue, 6 Oct 2009 12:17:04 +0100 Subject: Never overwrite a QemuOpt Rather than overwriting a QemuOpt, just add a new one to the tail and always do a reverse search for parameters to preserve the same behaviour. We use this order so that foreach() iterates over the opts in their original order. This will allow us handle options where multiple values for the same parameter is allowed - e.g. -net user,hostfwd= Signed-off-by: Mark McLoughlin Signed-off-by: Anthony Liguori --- qemu-option.c | 51 +++++++++++++++++++++++---------------------------- 1 file changed, 23 insertions(+), 28 deletions(-) (limited to 'qemu-option.c') diff --git a/qemu-option.c b/qemu-option.c index de41c06ea..49efd392d 100644 --- a/qemu-option.c +++ b/qemu-option.c @@ -483,7 +483,7 @@ struct QemuOpt { struct QemuOpts { const char *id; QemuOptsList *list; - QTAILQ_HEAD(, QemuOpt) head; + QTAILQ_HEAD(QemuOptHead, QemuOpt) head; QTAILQ_ENTRY(QemuOpts) next; }; @@ -491,7 +491,7 @@ static QemuOpt *qemu_opt_find(QemuOpts *opts, const char *name) { QemuOpt *opt; - QTAILQ_FOREACH(opt, &opts->head, next) { + QTAILQ_FOREACH_REVERSE(opt, &opts->head, QemuOptHead, next) { if (strcmp(opt->name, name) != 0) continue; return opt; @@ -565,36 +565,31 @@ static void qemu_opt_del(QemuOpt *opt) int qemu_opt_set(QemuOpts *opts, const char *name, const char *value) { QemuOpt *opt; + QemuOptDesc *desc = opts->list->desc; + int i; - opt = qemu_opt_find(opts, name); - if (!opt) { - QemuOptDesc *desc = opts->list->desc; - int i; - - for (i = 0; desc[i].name != NULL; i++) { - if (strcmp(desc[i].name, name) == 0) { - break; - } - } - if (desc[i].name == NULL) { - if (i == 0) { - /* empty list -> allow any */; - } else { - fprintf(stderr, "option \"%s\" is not valid for %s\n", - name, opts->list->name); - return -1; - } + for (i = 0; desc[i].name != NULL; i++) { + if (strcmp(desc[i].name, name) == 0) { + break; } - 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 (desc[i].name == NULL) { + if (i == 0) { + /* empty list -> allow any */; + } else { + fprintf(stderr, "option \"%s\" is not valid for %s\n", + name, opts->list->name); + return -1; } } - qemu_free((/* !const */ char*)opt->str); - opt->str = NULL; + + 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 (value) { opt->str = qemu_strdup(value); } -- cgit v1.2.3