diff mbox

[05/16] introduce a new API qemu_opts_absorb_qdict_by_index()

Message ID 1441183880-26993-6-git-send-email-wency@cn.fujitsu.com
State New
Headers show

Commit Message

Wen Congyang Sept. 2, 2015, 8:51 a.m. UTC
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>
---
 include/qemu/option.h |  2 ++
 util/qemu-option.c    | 44 ++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 46 insertions(+)

Comments

Eric Blake Sept. 2, 2015, 7:01 p.m. UTC | #1
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
Wen Congyang Sept. 7, 2015, 2:18 a.m. UTC | #2
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 mbox

Patch

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