[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH] Never overwrite a QemuOpt
From: |
Mark McLoughlin |
Subject: |
[Qemu-devel] [PATCH] Never overwrite a QemuOpt |
Date: |
Tue, 6 Oct 2009 12:17:04 +0100 |
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 <address@hidden>
---
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
- [Qemu-devel] [PATCH] Make qemu_opts_parse() handle empty strings, (continued)
- [Qemu-devel] [PATCH] Make qemu_opts_parse() handle empty strings, Mark McLoughlin, 2009/10/06
- [Qemu-devel] [PATCH] Move memset() from net_client_uninit() to net_client_init(), Mark McLoughlin, 2009/10/06
- [Qemu-devel] [PATCH] Don't exit() in config_error(), Mark McLoughlin, 2009/10/06
- [Qemu-devel] [PATCH] Add qemu_opts_validate() for post parsing validation, Mark McLoughlin, 2009/10/06
- [Qemu-devel] [PATCH] Make net_client_init() consume slirp_configs even on error, Mark McLoughlin, 2009/10/06
- [Qemu-devel] [PATCH] Remove bogus error message from qemu_opts_set(), Mark McLoughlin, 2009/10/06
- [Qemu-devel] [PATCH] Remove double error message in qemu_option_set(), Mark McLoughlin, 2009/10/06
- [Qemu-devel] [PATCH] Drop config_error(), use qemu_error() instead, Mark McLoughlin, 2009/10/06
- [Qemu-devel] [PATCH] Final net cleanup after conversion to QemuOpts, Mark McLoughlin, 2009/10/06
- [Qemu-devel] [PATCH] Remove double error message for -device option parsing, Mark McLoughlin, 2009/10/06
- [Qemu-devel] [PATCH] Never overwrite a QemuOpt,
Mark McLoughlin <=
- [Qemu-devel] [PATCH] Port -net vde to QemuOpts, Mark McLoughlin, 2009/10/06
- [Qemu-devel] [PATCH] Port -net tap to QemuOpts, Mark McLoughlin, 2009/10/06
- [Qemu-devel] [PATCH] Port usb net to QemuOpts, Mark McLoughlin, 2009/10/06
- [Qemu-devel] [PATCH] Add qemu_net_opts, Mark McLoughlin, 2009/10/06
- [Qemu-devel] [PATCH] Port -net user to QemuOpts, Mark McLoughlin, 2009/10/06
- [Qemu-devel] [PATCH] Clean up legacy code in net_client_init(), Mark McLoughlin, 2009/10/06
- [Qemu-devel] [PATCH] Port host_net_add monitor command to QemuOpts, Mark McLoughlin, 2009/10/06
- [Qemu-devel] [PATCH] Port -net dump to QemuOpts, Mark McLoughlin, 2009/10/06
- [Qemu-devel] [PATCH] Port -net socket to QemuOpts, Mark McLoughlin, 2009/10/06
- [Qemu-devel] [PATCH] Port PCI NIC hotplug to QemuOpts, Mark McLoughlin, 2009/10/06