qdict: Extract qdict_extract_subqdict
Signed-off-by: Benoit Canet <benoit@irqsave.net> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
This commit is contained in:
parent
c3e4f43a99
commit
5726d872f3
23
block.c
23
block.c
@ -1007,25 +1007,6 @@ int bdrv_open_backing_file(BlockDriverState *bs, QDict *options, Error **errp)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void extract_subqdict(QDict *src, QDict **dst, const char *start)
|
|
||||||
{
|
|
||||||
const QDictEntry *entry, *next;
|
|
||||||
const char *p;
|
|
||||||
|
|
||||||
*dst = qdict_new();
|
|
||||||
entry = qdict_first(src);
|
|
||||||
|
|
||||||
while (entry != NULL) {
|
|
||||||
next = qdict_next(src, entry);
|
|
||||||
if (strstart(entry->key, start, &p)) {
|
|
||||||
qobject_incref(entry->value);
|
|
||||||
qdict_put_obj(*dst, p, entry->value);
|
|
||||||
qdict_del(src, entry->key);
|
|
||||||
}
|
|
||||||
entry = next;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Opens a disk image (raw, qcow2, vmdk, ...)
|
* Opens a disk image (raw, qcow2, vmdk, ...)
|
||||||
*
|
*
|
||||||
@ -1131,7 +1112,7 @@ int bdrv_open(BlockDriverState *bs, const char *filename, QDict *options,
|
|||||||
flags |= BDRV_O_ALLOW_RDWR;
|
flags |= BDRV_O_ALLOW_RDWR;
|
||||||
}
|
}
|
||||||
|
|
||||||
extract_subqdict(options, &file_options, "file.");
|
qdict_extract_subqdict(options, &file_options, "file.");
|
||||||
|
|
||||||
ret = bdrv_file_open(&file, filename, file_options,
|
ret = bdrv_file_open(&file, filename, file_options,
|
||||||
bdrv_open_flags(bs, flags | BDRV_O_UNMAP), &local_err);
|
bdrv_open_flags(bs, flags | BDRV_O_UNMAP), &local_err);
|
||||||
@ -1169,7 +1150,7 @@ int bdrv_open(BlockDriverState *bs, const char *filename, QDict *options,
|
|||||||
if ((flags & BDRV_O_NO_BACKING) == 0) {
|
if ((flags & BDRV_O_NO_BACKING) == 0) {
|
||||||
QDict *backing_options;
|
QDict *backing_options;
|
||||||
|
|
||||||
extract_subqdict(options, &backing_options, "backing.");
|
qdict_extract_subqdict(options, &backing_options, "backing.");
|
||||||
ret = bdrv_open_backing_file(bs, backing_options, &local_err);
|
ret = bdrv_open_backing_file(bs, backing_options, &local_err);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
goto close_and_fail;
|
goto close_and_fail;
|
||||||
|
@ -67,4 +67,6 @@ const char *qdict_get_try_str(const QDict *qdict, const char *key);
|
|||||||
QDict *qdict_clone_shallow(const QDict *src);
|
QDict *qdict_clone_shallow(const QDict *src);
|
||||||
void qdict_flatten(QDict *qdict);
|
void qdict_flatten(QDict *qdict);
|
||||||
|
|
||||||
|
void qdict_extract_subqdict(QDict *src, QDict **dst, const char *start);
|
||||||
|
|
||||||
#endif /* QDICT_H */
|
#endif /* QDICT_H */
|
||||||
|
@ -527,3 +527,24 @@ void qdict_flatten(QDict *qdict)
|
|||||||
{
|
{
|
||||||
qdict_do_flatten(qdict, qdict, NULL);
|
qdict_do_flatten(qdict, qdict, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* extract all the src QDict entries starting by start into dst */
|
||||||
|
void qdict_extract_subqdict(QDict *src, QDict **dst, const char *start)
|
||||||
|
|
||||||
|
{
|
||||||
|
const QDictEntry *entry, *next;
|
||||||
|
const char *p;
|
||||||
|
|
||||||
|
*dst = qdict_new();
|
||||||
|
entry = qdict_first(src);
|
||||||
|
|
||||||
|
while (entry != NULL) {
|
||||||
|
next = qdict_next(src, entry);
|
||||||
|
if (strstart(entry->key, start, &p)) {
|
||||||
|
qobject_incref(entry->value);
|
||||||
|
qdict_put_obj(*dst, p, entry->value);
|
||||||
|
qdict_del(src, entry->key);
|
||||||
|
}
|
||||||
|
entry = next;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user