qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Leandro Dorileo <l@dorileo.org>
To: qemu-devel@nongnu.org
Cc: Kevin Wolf <kwolf@redhat.com>, Fam Zheng <famz@redhat.com>,
	Stefan Hajnoczi <stefanha@redhat.com>,
	Liu Yuan <namei.unix@gmail.com>, Jeff Cody <jcody@redhat.com>,
	Markus Armbruster <armbru@redhat.com>, Peter Lieven <pl@kamp.de>,
	"Richard W.M. Jones" <rjones@redhat.com>,
	Luiz Capitulino <lcapitulino@redhat.com>,
	Chunyan Liu <cyliu@suse.com>, Leandro Dorileo <l@dorileo.org>,
	Ronnie Sahlberg <ronniesahlberg@gmail.com>,
	Josh Durgin <josh.durgin@inktank.com>,
	Anthony Liguori <anthony@codemonkey.ws>,
	Paolo Bonzini <pbonzini@redhat.com>, Stefan Weil <sw@weilnetz.de>,
	Max Reitz <mreitz@redhat.com>,
	MORITA Kazutaka <morita.kazutaka@lab.ntt.co.jp>,
	Benoit Canet <benoit@irqsave.net>
Subject: [Qemu-devel] [PATCH 04/26] QemuOpt: introduce qemu_opts_append()
Date: Thu, 20 Mar 2014 21:13:11 -0300	[thread overview]
Message-ID: <1395360813-2833-5-git-send-email-l@dorileo.org> (raw)
In-Reply-To: <1395360813-2833-1-git-send-email-l@dorileo.org>

From: Chunyan Liu <cyliu@suse.com>

The qemu_opts_append() function is intended to merge to different
QemuOptsList's. The resulting list must be freed by its user.

Signed-off-by: Chunyan Liu <cyliu@suse.com>
Signed-off-by: Leandro Dorileo <l@dorileo.org>
---
 include/qemu/option.h |  1 +
 util/qemu-option.c    | 69 +++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 70 insertions(+)

diff --git a/include/qemu/option.h b/include/qemu/option.h
index f0d4798..3f4976d 100644
--- a/include/qemu/option.h
+++ b/include/qemu/option.h
@@ -157,6 +157,7 @@ int qemu_opt_foreach(QemuOpts *opts, qemu_opt_loopfunc func, void *opaque,
 QemuOpts *qemu_opts_find(QemuOptsList *list, const char *id);
 QemuOpts *qemu_opts_create(QemuOptsList *list, const char *id,
                            int fail_if_exists, Error **errp);
+QemuOptsList *qemu_opts_append(QemuOptsList *head, QemuOptsList *tail);
 void qemu_opts_reset(QemuOptsList *list);
 void qemu_opts_loc_restore(QemuOpts *opts);
 int qemu_opts_set(QemuOptsList *list, const char *id,
diff --git a/util/qemu-option.c b/util/qemu-option.c
index 612a966..026d2ff 100644
--- a/util/qemu-option.c
+++ b/util/qemu-option.c
@@ -863,6 +863,75 @@ QemuOpts *qemu_opts_create(QemuOptsList *list, const char *id,
     return opts;
 }
 
+static size_t count_opts_list(QemuOptsList *list)
+{
+    QemuOptDesc *desc = NULL;
+    size_t num_opts = 0;
+
+    if (!list) {
+        return 0;
+    }
+
+    desc = list->desc;
+    while (desc && desc->name) {
+        num_opts++;
+        desc++;
+    }
+
+    return num_opts;
+}
+
+/**
+ * Merge two QEMUOptsList. First argument's QemuOptDesc members take precedence
+ * over second's.
+ *
+ * @note The result's name and implied_opt_name are not copied from them.
+ * Both merge_lists should not be set. Both lists can be NULL.
+ *
+ * The resulting QemuOptsList should be freed by this functions caller.
+ */
+QemuOptsList *qemu_opts_append(QemuOptsList *dst, QemuOptsList *list)
+{
+    size_t num_opts, num_dst_opts;
+    QemuOptsList *tmp;
+    QemuOptDesc *desc;
+
+    if (!dst && !list) {
+        return NULL;
+    }
+
+    num_opts = count_opts_list(dst);
+    num_opts += count_opts_list(list);
+    tmp = g_malloc0(sizeof(QemuOptsList) +
+                    (num_opts + 1) * sizeof(QemuOptDesc));
+    QTAILQ_INIT(&tmp->head);
+    num_dst_opts = 0;
+
+    /* copy dst->desc to new list */
+    if (dst) {
+        desc = dst->desc;
+        while (desc && desc->name) {
+            tmp->desc[num_dst_opts++] = *desc;
+            tmp->desc[num_dst_opts].name = NULL;
+            desc++;
+        }
+    }
+
+    /* add list->desc to new list */
+    if (list) {
+        desc = list->desc;
+        while (desc && desc->name) {
+            if (find_desc_by_name(tmp->desc, desc->name) == NULL) {
+                tmp->desc[num_dst_opts++] = *desc;
+                tmp->desc[num_dst_opts].name = NULL;
+            }
+            desc++;
+        }
+    }
+
+    return tmp;
+}
+
 void qemu_opts_reset(QemuOptsList *list)
 {
     QemuOpts *opts, *next_opts;
-- 
1.9.0

  parent reply	other threads:[~2014-03-21  0:14 UTC|newest]

Thread overview: 34+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-03-21  0:13 [Qemu-devel] [PATCH 00/26] QemuOptionParameter -> QemuOpts migration Leandro Dorileo
2014-03-21  0:13 ` [Qemu-devel] [PATCH 01/26] qapi: output def_value_str when query command line options Leandro Dorileo
2014-03-21 23:15   ` Eric Blake
2014-03-21  0:13 ` [Qemu-devel] [PATCH 02/26] add def_value_str to QemuOptDesc Leandro Dorileo
2014-03-21  0:13 ` [Qemu-devel] [PATCH 03/26] QemuOpt: improve default value Leandro Dorileo
2014-03-21  0:13 ` Leandro Dorileo [this message]
2014-03-21  0:13 ` [Qemu-devel] [PATCH 05/26] QemuOpt: add qemu_opt_print_help() Leandro Dorileo
2014-03-21  0:13 ` [Qemu-devel] [PATCH 06/26] block: migrate block later QemuOptionParameter Leandro Dorileo
2014-03-21  0:13 ` [Qemu-devel] [PATCH 07/26] cow: migrate cow driver QemuOptionParameter usage Leandro Dorileo
2014-03-21  0:13 ` [Qemu-devel] [PATCH 08/26] gluster: migrate gluster " Leandro Dorileo
2014-03-21  0:13 ` [Qemu-devel] [PATCH 09/26] iscsi: migrate iscsi " Leandro Dorileo
2014-03-21  6:43   ` Peter Lieven
2014-03-21 13:31     ` Leandro Dorileo
2014-03-21 13:34       ` Leandro Dorileo
2014-03-21 13:42       ` Peter Lieven
2014-03-21 13:54         ` Leandro Dorileo
2014-03-21  0:13 ` [Qemu-devel] [PATCH 10/26] nfs: migrate nfs " Leandro Dorileo
2014-03-21  0:13 ` [Qemu-devel] [PATCH 11/26] qcow: migrate qcow " Leandro Dorileo
2014-03-21  0:13 ` [Qemu-devel] [PATCH 12/26] qcow2: migrate qcow2 " Leandro Dorileo
2014-03-21  0:13 ` [Qemu-devel] [PATCH 13/26] qed: migrate qed " Leandro Dorileo
2014-03-21  0:13 ` [Qemu-devel] [PATCH 14/26] raw-posix: migrate raw-posix " Leandro Dorileo
2014-03-21  0:13 ` [Qemu-devel] [PATCH 15/26] raw-win32: migrate cow " Leandro Dorileo
2014-03-21  0:13 ` [Qemu-devel] [PATCH 16/26] raw_bsd: migrate raw_bsd " Leandro Dorileo
2014-03-21  0:13 ` [Qemu-devel] [PATCH 17/26] rbd: migrate rbd " Leandro Dorileo
2014-03-21  0:13 ` [Qemu-devel] [PATCH 18/26] sheepdog: migrate sheepdog " Leandro Dorileo
2014-03-21  0:13 ` [Qemu-devel] [PATCH 19/26] ssh: migrate ssh " Leandro Dorileo
2014-03-21  8:32   ` Richard W.M. Jones
2014-03-21  0:13 ` [Qemu-devel] [PATCH 20/26] vdi: migrate vdi " Leandro Dorileo
2014-03-21  0:13 ` [Qemu-devel] [PATCH 21/26] vhdx: migrate vhdx " Leandro Dorileo
2014-03-21  0:13 ` [Qemu-devel] [PATCH 22/26] vmdk: migrate vmdk " Leandro Dorileo
2014-03-21  0:13 ` [Qemu-devel] [PATCH 23/26] vpc: migrate vpc " Leandro Dorileo
2014-03-21  0:13 ` [Qemu-devel] [PATCH 24/26] vvfat: migrate vvfat " Leandro Dorileo
2014-03-21  0:13 ` [Qemu-devel] [PATCH 25/26] QemuOpt: get rid of QEMUOptionParameter Leandro Dorileo
2014-03-21  0:13 ` [Qemu-devel] [PATCH 26/26] qemu-img: migrate QemuOptionParameter usage Leandro Dorileo

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1395360813-2833-5-git-send-email-l@dorileo.org \
    --to=l@dorileo.org \
    --cc=anthony@codemonkey.ws \
    --cc=armbru@redhat.com \
    --cc=benoit@irqsave.net \
    --cc=cyliu@suse.com \
    --cc=famz@redhat.com \
    --cc=jcody@redhat.com \
    --cc=josh.durgin@inktank.com \
    --cc=kwolf@redhat.com \
    --cc=lcapitulino@redhat.com \
    --cc=morita.kazutaka@lab.ntt.co.jp \
    --cc=mreitz@redhat.com \
    --cc=namei.unix@gmail.com \
    --cc=pbonzini@redhat.com \
    --cc=pl@kamp.de \
    --cc=qemu-devel@nongnu.org \
    --cc=rjones@redhat.com \
    --cc=ronniesahlberg@gmail.com \
    --cc=stefanha@redhat.com \
    --cc=sw@weilnetz.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).