[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH v2 5/8] qemu-option: Add qemu_opts_absorb_qdict()
From: |
Kevin Wolf |
Subject: |
[Qemu-devel] [PATCH v2 5/8] qemu-option: Add qemu_opts_absorb_qdict() |
Date: |
Fri, 15 Mar 2013 10:35:05 +0100 |
This adds a function that adds all entries of a QDict to a QemuOpts if
the keys are known, and leaves only the rest in the QDict.
This way a single QDict of -drive options can be processed in multiple
places (generic block layer, block driver, backing file block driver,
etc.), where each part picks the options it knows. If at the end of the
process the QDict isn't empty, the user specified an invalid option.
Signed-off-by: Kevin Wolf <address@hidden>
Reviewed-by: Eric Blake <address@hidden>
Reviewed-by: Stefan Hajnoczi <address@hidden>
---
include/qemu/option.h | 1 +
util/qemu-option.c | 34 ++++++++++++++++++++++++++++++++++
2 files changed, 35 insertions(+)
diff --git a/include/qemu/option.h b/include/qemu/option.h
index ba197cd..bdb6d21 100644
--- a/include/qemu/option.h
+++ b/include/qemu/option.h
@@ -149,6 +149,7 @@ void qemu_opts_set_defaults(QemuOptsList *list, const char
*params,
QemuOpts *qemu_opts_from_qdict(QemuOptsList *list, const QDict *qdict,
Error **errp);
QDict *qemu_opts_to_qdict(QemuOpts *opts, QDict *qdict);
+void qemu_opts_absorb_qdict(QemuOpts *opts, QDict *qdict, Error **errp);
typedef int (*qemu_opts_loopfunc)(QemuOpts *opts, void *opaque);
int qemu_opts_print(QemuOpts *opts, void *dummy);
diff --git a/util/qemu-option.c b/util/qemu-option.c
index 5a1d03c..8b74bf1 100644
--- a/util/qemu-option.c
+++ b/util/qemu-option.c
@@ -1067,6 +1067,40 @@ QemuOpts *qemu_opts_from_qdict(QemuOptsList *list, const
QDict *qdict,
}
/*
+ * Adds all QDict entries to the QemuOpts that can be added and removes them
+ * from the QDict. When this function returns, the QDict contains only those
+ * entries that couldn't be added to the QemuOpts.
+ */
+void qemu_opts_absorb_qdict(QemuOpts *opts, QDict *qdict, Error **errp)
+{
+ const QDictEntry *entry, *next;
+
+ entry = qdict_first(qdict);
+
+ while (entry != NULL) {
+ Error *local_err = NULL;
+ OptsFromQDictState state = {
+ .errp = &local_err,
+ .opts = opts,
+ };
+
+ next = qdict_next(qdict, entry);
+
+ if (find_desc_by_name(opts->list->desc, entry->key)) {
+ qemu_opts_from_qdict_1(entry->key, entry->value, &state);
+ if (error_is_set(&local_err)) {
+ error_propagate(errp, local_err);
+ return;
+ } else {
+ qdict_del(qdict, entry->key);
+ }
+ }
+
+ entry = next;
+ }
+}
+
+/*
* Convert from QemuOpts to QDict.
* The QDict values are of type QString.
* TODO We'll want to use types appropriate for opt->desc->type, but
--
1.8.1.4
- [Qemu-devel] [PATCH v2 0/8] block: Add driver specific options, Kevin Wolf, 2013/03/15
- [Qemu-devel] [PATCH v2 3/8] Add qdict_clone_shallow(), Kevin Wolf, 2013/03/15
- [Qemu-devel] [PATCH v2 1/8] block: Add options QDict to .bdrv_open(), Kevin Wolf, 2013/03/15
- [Qemu-devel] [PATCH v2 5/8] qemu-option: Add qemu_opts_absorb_qdict(),
Kevin Wolf <=
- [Qemu-devel] [PATCH v2 4/8] block: Add options QDict to bdrv_open_common(), Kevin Wolf, 2013/03/15
- [Qemu-devel] [PATCH v2 6/8] blockdev: Keep a copy of DriveInfo.serial, Kevin Wolf, 2013/03/15
- [Qemu-devel] [PATCH v2 2/8] block: Add options QDict to bdrv_open() prototype, Kevin Wolf, 2013/03/15
- [Qemu-devel] [PATCH v2 8/8] qcow2: Allow lazy refcounts to be enabled on the command line, Kevin Wolf, 2013/03/15
- [Qemu-devel] [PATCH v2 7/8] block: Support driver specific options in drive_init(), Kevin Wolf, 2013/03/15
- Re: [Qemu-devel] [PATCH v2 0/8] block: Add driver specific options, Stefan Hajnoczi, 2013/03/15