Message ID | 1441183880-26993-6-git-send-email-wency@cn.fujitsu.com |
---|---|
State | New |
Headers | show |
On 09/02/2015 02:51 AM, Wen Congyang wrote: > Signed-off-by: Wen Congyang <wency@cn.fujitsu.com> > Signed-off-by: zhanghailiang <zhang.zhanghailiang@huawei.com> > Signed-off-by: Gonglei <arei.gonglei@huawei.com> Commit message is a bit sparse. > --- > include/qemu/option.h | 2 ++ > util/qemu-option.c | 44 ++++++++++++++++++++++++++++++++++++++++++++ > 2 files changed, 46 insertions(+) > Missing testsuite exposure of the new function. > /* > + * Adds all QDict entries to the QemuOpts that can be added and removes them > + * from the QDict. The key starts with "%index." in the %qdict. When this "%index." reads awkwardly (I thought it was a printf-style format). But I'm not sure if "starts with %index followed by '.'" is any better. > + * function returns, the QDict contains only those entries that couldn't be > + * added to the QemuOpts. > + */ > +void qemu_opts_absorb_qdict_by_index(QemuOpts *opts, QDict *qdict, > + const char *index, Error **errp) > +{ I didn't review the algorithm closely, but here's a superficial comment: > + const QDictEntry *entry, *next; > + const char *key; > + int len = strlen(index); size_t
On 09/03/2015 03:01 AM, Eric Blake wrote: > On 09/02/2015 02:51 AM, Wen Congyang wrote: >> Signed-off-by: Wen Congyang <wency@cn.fujitsu.com> >> Signed-off-by: zhanghailiang <zhang.zhanghailiang@huawei.com> >> Signed-off-by: Gonglei <arei.gonglei@huawei.com> > > Commit message is a bit sparse. > >> --- >> include/qemu/option.h | 2 ++ >> util/qemu-option.c | 44 ++++++++++++++++++++++++++++++++++++++++++++ >> 2 files changed, 46 insertions(+) >> > > Missing testsuite exposure of the new function. Do you mean: update tests/test-qemu-opts.c? > >> /* >> + * Adds all QDict entries to the QemuOpts that can be added and removes them >> + * from the QDict. The key starts with "%index." in the %qdict. When this > > "%index." reads awkwardly (I thought it was a printf-style format). But > I'm not sure if "starts with %index followed by '.'" is any better. The other comments use '@'. I will update it in the next version. > >> + * function returns, the QDict contains only those entries that couldn't be >> + * added to the QemuOpts. >> + */ >> +void qemu_opts_absorb_qdict_by_index(QemuOpts *opts, QDict *qdict, >> + const char *index, Error **errp) >> +{ > > I didn't review the algorithm closely, but here's a superficial comment: > >> + const QDictEntry *entry, *next; >> + const char *key; >> + int len = strlen(index); > > size_t OK, will fix it in the next version. Thanks Wen Congyang >
diff --git a/include/qemu/option.h b/include/qemu/option.h index 57e51c9..725a781 100644 --- a/include/qemu/option.h +++ b/include/qemu/option.h @@ -129,6 +129,8 @@ 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); +void qemu_opts_absorb_qdict_by_index(QemuOpts *opts, QDict *qdict, + const char *index, Error **errp); typedef int (*qemu_opts_loopfunc)(void *opaque, QemuOpts *opts, Error **errp); int qemu_opts_foreach(QemuOptsList *list, qemu_opts_loopfunc func, diff --git a/util/qemu-option.c b/util/qemu-option.c index efe9d27..a93a269 100644 --- a/util/qemu-option.c +++ b/util/qemu-option.c @@ -1021,6 +1021,50 @@ void qemu_opts_absorb_qdict(QemuOpts *opts, QDict *qdict, Error **errp) } /* + * Adds all QDict entries to the QemuOpts that can be added and removes them + * from the QDict. The key starts with "%index." in 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_by_index(QemuOpts *opts, QDict *qdict, + const char *index, Error **errp) +{ + const QDictEntry *entry, *next; + const char *key; + int len = strlen(index); + + entry = qdict_first(qdict); + + while (entry != NULL) { + Error *local_err = NULL; + OptsFromQDictState state = { + .errp = &local_err, + .opts = opts, + }; + + next = qdict_next(qdict, entry); + if (strncmp(entry->key, index, len) || *(entry->key + len) != '.') { + entry = next; + continue; + } + + key = entry->key + len + 1; + + if (find_desc_by_name(opts->list->desc, key)) { + qemu_opts_from_qdict_1(key, entry->value, &state); + if (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