From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1Mv84P-0006xj-V4 for qemu-devel@nongnu.org; Tue, 06 Oct 2009 07:19:06 -0400 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1Mv84H-0006rv-LL for qemu-devel@nongnu.org; Tue, 06 Oct 2009 07:19:03 -0400 Received: from [199.232.76.173] (port=40410 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1Mv84F-0006qx-QJ for qemu-devel@nongnu.org; Tue, 06 Oct 2009 07:18:56 -0400 Received: from mx20.gnu.org ([199.232.41.8]:30961) by monty-python.gnu.org with esmtps (TLS-1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.60) (envelope-from ) id 1Mv84F-0007tA-Is for qemu-devel@nongnu.org; Tue, 06 Oct 2009 07:18:55 -0400 Received: from mx1.redhat.com ([209.132.183.28]) by mx20.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1Mv84E-0000RM-Oa for qemu-devel@nongnu.org; Tue, 06 Oct 2009 07:18:55 -0400 Received: from int-mx05.intmail.prod.int.phx2.redhat.com (int-mx05.intmail.prod.int.phx2.redhat.com [10.5.11.18]) by mx1.redhat.com (8.13.8/8.13.8) with ESMTP id n96BIqrY004570 for ; Tue, 6 Oct 2009 07:18:53 -0400 From: Mark McLoughlin Date: Tue, 6 Oct 2009 12:17:04 +0100 Message-Id: <1254827836-11021-15-git-send-email-markmc@redhat.com> In-Reply-To: <1254827783.2720.42.camel@blaa> References: <1254827783.2720.42.camel@blaa> Subject: [Qemu-devel] [PATCH] Never overwrite a QemuOpt List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: Mark McLoughlin 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 --- qemu-option.c | 51 +++++++++++++++++++++++---------------------------- 1 files changed, 23 insertions(+), 28 deletions(-) diff --git a/qemu-option.c b/qemu-option.c index de41c06..49efd39 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); } -- 1.6.2.5