mirror of https://gitee.com/openkylin/qemu.git
qemu-option: Add qemu_opts_absorb_qdict()
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 <kwolf@redhat.com> Reviewed-by: Eric Blake <eblake@redhat.com> Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com> Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
This commit is contained in:
parent
b6ad491a49
commit
376609cc6c
|
@ -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);
|
||||
|
|
|
@ -1066,6 +1066,40 @@ QemuOpts *qemu_opts_from_qdict(QemuOptsList *list, const QDict *qdict,
|
|||
return opts;
|
||||
}
|
||||
|
||||
/*
|
||||
* 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.
|
||||
|
|
Loading…
Reference in New Issue