util: Add qemu_opts_to_qdict_filtered()
This allows, given a QemuOpts for a QemuOptsList that was merged from multiple QemuOptsList, to only consider those options that exist in one specific list. Block drivers need this to separate format-layer create options from protocol-level options. Signed-off-by: Kevin Wolf <kwolf@redhat.com> Reviewed-by: Eric Blake <eblake@redhat.com> Reviewed-by: Max Reitz <mreitz@redhat.com>
This commit is contained in:
parent
e4b5dad826
commit
72215395b9
@ -124,6 +124,8 @@ void qemu_opts_set_defaults(QemuOptsList *list, const char *params,
|
|||||||
int permit_abbrev);
|
int permit_abbrev);
|
||||||
QemuOpts *qemu_opts_from_qdict(QemuOptsList *list, const QDict *qdict,
|
QemuOpts *qemu_opts_from_qdict(QemuOptsList *list, const QDict *qdict,
|
||||||
Error **errp);
|
Error **errp);
|
||||||
|
QDict *qemu_opts_to_qdict_filtered(QemuOpts *opts, QDict *qdict,
|
||||||
|
QemuOptsList *list, bool del);
|
||||||
QDict *qemu_opts_to_qdict(QemuOpts *opts, QDict *qdict);
|
QDict *qemu_opts_to_qdict(QemuOpts *opts, QDict *qdict);
|
||||||
void qemu_opts_absorb_qdict(QemuOpts *opts, QDict *qdict, Error **errp);
|
void qemu_opts_absorb_qdict(QemuOpts *opts, QDict *qdict, Error **errp);
|
||||||
|
|
||||||
|
@ -1007,14 +1007,23 @@ void qemu_opts_absorb_qdict(QemuOpts *opts, QDict *qdict, Error **errp)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Convert from QemuOpts to QDict.
|
* Convert from QemuOpts to QDict. The QDict values are of type QString.
|
||||||
* The QDict values are of type QString.
|
*
|
||||||
|
* If @list is given, only add those options to the QDict that are contained in
|
||||||
|
* the list. If @del is true, any options added to the QDict are removed from
|
||||||
|
* the QemuOpts, otherwise they remain there.
|
||||||
|
*
|
||||||
|
* If two options in @opts have the same name, they are processed in order
|
||||||
|
* so that the last one wins (consistent with the reverse iteration in
|
||||||
|
* qemu_opt_find()), but all of them are deleted if @del is true.
|
||||||
|
*
|
||||||
* TODO We'll want to use types appropriate for opt->desc->type, but
|
* TODO We'll want to use types appropriate for opt->desc->type, but
|
||||||
* this is enough for now.
|
* this is enough for now.
|
||||||
*/
|
*/
|
||||||
QDict *qemu_opts_to_qdict(QemuOpts *opts, QDict *qdict)
|
QDict *qemu_opts_to_qdict_filtered(QemuOpts *opts, QDict *qdict,
|
||||||
|
QemuOptsList *list, bool del)
|
||||||
{
|
{
|
||||||
QemuOpt *opt;
|
QemuOpt *opt, *next;
|
||||||
|
|
||||||
if (!qdict) {
|
if (!qdict) {
|
||||||
qdict = qdict_new();
|
qdict = qdict_new();
|
||||||
@ -1022,12 +1031,35 @@ QDict *qemu_opts_to_qdict(QemuOpts *opts, QDict *qdict)
|
|||||||
if (opts->id) {
|
if (opts->id) {
|
||||||
qdict_put_str(qdict, "id", opts->id);
|
qdict_put_str(qdict, "id", opts->id);
|
||||||
}
|
}
|
||||||
QTAILQ_FOREACH(opt, &opts->head, next) {
|
QTAILQ_FOREACH_SAFE(opt, &opts->head, next, next) {
|
||||||
|
if (list) {
|
||||||
|
QemuOptDesc *desc;
|
||||||
|
bool found = false;
|
||||||
|
for (desc = list->desc; desc->name; desc++) {
|
||||||
|
if (!strcmp(desc->name, opt->name)) {
|
||||||
|
found = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!found) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
qdict_put_str(qdict, opt->name, opt->str);
|
qdict_put_str(qdict, opt->name, opt->str);
|
||||||
|
if (del) {
|
||||||
|
qemu_opt_del(opt);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return qdict;
|
return qdict;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Copy all options in a QemuOpts to the given QDict. See
|
||||||
|
* qemu_opts_to_qdict_filtered() for details. */
|
||||||
|
QDict *qemu_opts_to_qdict(QemuOpts *opts, QDict *qdict)
|
||||||
|
{
|
||||||
|
return qemu_opts_to_qdict_filtered(opts, qdict, NULL, false);
|
||||||
|
}
|
||||||
|
|
||||||
/* Validate parsed opts against descriptions where no
|
/* Validate parsed opts against descriptions where no
|
||||||
* descriptions were provided in the QemuOptsList.
|
* descriptions were provided in the QemuOptsList.
|
||||||
*/
|
*/
|
||||||
|
Loading…
x
Reference in New Issue
Block a user