From: Stefan Hajnoczi <stefanha@redhat.com>
To: qemu-devel@nongnu.org
Cc: Peter Maydell <peter.maydell@linaro.org>,
Chunyan Liu <cyliu@suse.com>,
Stefan Hajnoczi <stefanha@redhat.com>
Subject: [Qemu-devel] [PULL 15/39] QemuOpts: add conversion between QEMUOptionParameter to QemuOpts
Date: Mon, 16 Jun 2014 19:23:39 +0800 [thread overview]
Message-ID: <1402917843-6459-16-git-send-email-stefanha@redhat.com> (raw)
In-Reply-To: <1402917843-6459-1-git-send-email-stefanha@redhat.com>
From: Chunyan Liu <cyliu@suse.com>
Add two temp conversion functions between QEMUOptionParameter to QemuOpts,
so that next patch can use it. It will simplify later patch for easier
review. And will be finally removed after all backend drivers switch to
QemuOpts.
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
Reviewed-by: Leandro Dorileo <l@dorileo.org>
Signed-off-by: Chunyan Liu <cyliu@suse.com>
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
---
include/qemu/option.h | 9 +++
util/qemu-option.c | 153 ++++++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 162 insertions(+)
diff --git a/include/qemu/option.h b/include/qemu/option.h
index fbf5dc2..e98e8ef 100644
--- a/include/qemu/option.h
+++ b/include/qemu/option.h
@@ -103,6 +103,12 @@ typedef struct QemuOptDesc {
} QemuOptDesc;
struct QemuOptsList {
+ /* FIXME: Temp used for QEMUOptionParamter->QemuOpts conversion to
+ * indicate the need to free memory. Will remove after all drivers
+ * switch to QemuOpts.
+ */
+ bool allocated;
+
const char *name;
const char *implied_opt_name;
bool merge_lists; /* Merge multiple uses of option into a single list? */
@@ -167,5 +173,8 @@ void qemu_opts_print(QemuOpts *opts);
int qemu_opts_foreach(QemuOptsList *list, qemu_opts_loopfunc func, void *opaque,
int abort_on_failure);
void qemu_opts_print_help(QemuOptsList *list);
+void qemu_opts_free(QemuOptsList *list);
+QEMUOptionParameter *opts_to_params(QemuOpts *opts);
+QemuOptsList *params_to_opts(QEMUOptionParameter *list);
#endif
diff --git a/util/qemu-option.c b/util/qemu-option.c
index cd03eb4..3c5484b 100644
--- a/util/qemu-option.c
+++ b/util/qemu-option.c
@@ -1346,3 +1346,156 @@ int qemu_opts_foreach(QemuOptsList *list, qemu_opts_loopfunc func, void *opaque,
loc_pop(&loc);
return rc;
}
+
+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;
+}
+
+/* Convert QEMUOptionParameter to QemuOpts
+ * FIXME: this function will be removed after all drivers
+ * switch to QemuOpts
+ */
+QemuOptsList *params_to_opts(QEMUOptionParameter *list)
+{
+ QemuOptsList *opts = NULL;
+ size_t num_opts, i = 0;
+
+ if (!list) {
+ return NULL;
+ }
+
+ num_opts = count_option_parameters(list);
+ opts = g_malloc0(sizeof(QemuOptsList) +
+ (num_opts + 1) * sizeof(QemuOptDesc));
+ QTAILQ_INIT(&opts->head);
+ /* (const char *) members will point to malloced space and need to free */
+ opts->allocated = true;
+
+ while (list && list->name) {
+ opts->desc[i].name = g_strdup(list->name);
+ opts->desc[i].help = g_strdup(list->help);
+ switch (list->type) {
+ case OPT_FLAG:
+ opts->desc[i].type = QEMU_OPT_BOOL;
+ opts->desc[i].def_value_str =
+ g_strdup(list->value.n ? "on" : "off");
+ break;
+
+ case OPT_NUMBER:
+ opts->desc[i].type = QEMU_OPT_NUMBER;
+ if (list->value.n) {
+ opts->desc[i].def_value_str =
+ g_strdup_printf("%" PRIu64, list->value.n);
+ }
+ break;
+
+ case OPT_SIZE:
+ opts->desc[i].type = QEMU_OPT_SIZE;
+ if (list->value.n) {
+ opts->desc[i].def_value_str =
+ g_strdup_printf("%" PRIu64, list->value.n);
+ }
+ break;
+
+ case OPT_STRING:
+ opts->desc[i].type = QEMU_OPT_STRING;
+ opts->desc[i].def_value_str = g_strdup(list->value.s);
+ break;
+ }
+
+ i++;
+ list++;
+ }
+
+ return opts;
+}
+
+/* convert QemuOpts to QEMUOptionParameter
+ * Note: result QEMUOptionParameter has shorter lifetime than
+ * input QemuOpts.
+ * FIXME: this function will be removed after all drivers
+ * switch to QemuOpts
+ */
+QEMUOptionParameter *opts_to_params(QemuOpts *opts)
+{
+ QEMUOptionParameter *dest = NULL;
+ QemuOptDesc *desc;
+ size_t num_opts, i = 0;
+ const char *tmp;
+
+ if (!opts || !opts->list || !opts->list->desc) {
+ return NULL;
+ }
+ assert(!opts_accepts_any(opts));
+
+ num_opts = count_opts_list(opts->list);
+ dest = g_malloc0((num_opts + 1) * sizeof(QEMUOptionParameter));
+
+ desc = opts->list->desc;
+ while (desc && desc->name) {
+ dest[i].name = desc->name;
+ dest[i].help = desc->help;
+ dest[i].assigned = qemu_opt_find(opts, desc->name) ? true : false;
+ switch (desc->type) {
+ case QEMU_OPT_STRING:
+ dest[i].type = OPT_STRING;
+ tmp = qemu_opt_get(opts, desc->name);
+ dest[i].value.s = g_strdup(tmp);
+ break;
+
+ case QEMU_OPT_BOOL:
+ dest[i].type = OPT_FLAG;
+ dest[i].value.n = qemu_opt_get_bool(opts, desc->name, 0) ? 1 : 0;
+ break;
+
+ case QEMU_OPT_NUMBER:
+ dest[i].type = OPT_NUMBER;
+ dest[i].value.n = qemu_opt_get_number(opts, desc->name, 0);
+ break;
+
+ case QEMU_OPT_SIZE:
+ dest[i].type = OPT_SIZE;
+ dest[i].value.n = qemu_opt_get_size(opts, desc->name, 0);
+ break;
+ }
+
+ i++;
+ desc++;
+ }
+
+ return dest;
+}
+
+void qemu_opts_free(QemuOptsList *list)
+{
+ /* List members point to new malloced space and need to be freed.
+ * FIXME:
+ * Introduced for QEMUOptionParamter->QemuOpts conversion.
+ * Will remove after all drivers switch to QemuOpts.
+ */
+ if (list && list->allocated) {
+ QemuOptDesc *desc = list->desc;
+ while (desc && desc->name) {
+ g_free((char *)desc->name);
+ g_free((char *)desc->help);
+ g_free((char *)desc->def_value_str);
+ desc++;
+ }
+ }
+
+ g_free(list);
+}
--
1.9.3
next prev parent reply other threads:[~2014-06-16 11:26 UTC|newest]
Thread overview: 42+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-06-16 11:23 [Qemu-devel] [PULL 00/39] Block patches Stefan Hajnoczi
2014-06-16 11:23 ` [Qemu-devel] [PULL 01/39] configure: Enable dead code (lzo, snappy, quorum) Stefan Hajnoczi
2014-06-16 11:23 ` [Qemu-devel] [PULL 02/39] block: Drop superfluous conditionals around g_free() Stefan Hajnoczi
2014-06-16 11:23 ` [Qemu-devel] [PULL 03/39] blockdev: Move 'serial' option to drive_init() Stefan Hajnoczi
2014-06-16 11:23 ` [Qemu-devel] [PULL 04/39] blockdev: Rename drive_init(), drive_uninit() to drive_new(), drive_del() Stefan Hajnoczi
2014-06-16 11:23 ` [Qemu-devel] [PULL 05/39] blockdev: Remove unused DriveInfo reference count Stefan Hajnoczi
2014-06-16 11:23 ` [Qemu-devel] [PULL 06/39] block/nfs: fix potential segfault on early callback Stefan Hajnoczi
2014-06-16 11:23 ` [Qemu-devel] [PULL 07/39] QemuOpts: move find_desc_by_name ahead for later calling Stefan Hajnoczi
2014-06-16 11:23 ` [Qemu-devel] [PULL 08/39] QemuOpts: repurpose qemu_opts_print to replace print_option_parameters Stefan Hajnoczi
2014-06-16 11:23 ` [Qemu-devel] [PULL 09/39] QemuOpts: add def_value_str to QemuOptDesc Stefan Hajnoczi
2014-06-16 11:23 ` [Qemu-devel] [PULL 10/39] qapi: output def_value_str when query command line options Stefan Hajnoczi
2014-06-16 11:23 ` [Qemu-devel] [PULL 11/39] QemuOpts: change opt->name|str from (const char *) to (char *) Stefan Hajnoczi
2014-06-16 11:23 ` [Qemu-devel] [PULL 12/39] QemuOpts: move qemu_opt_del ahead for later calling Stefan Hajnoczi
2014-06-16 11:23 ` [Qemu-devel] [PULL 13/39] QemuOpts: add qemu_opt_get_*_del functions for replace work Stefan Hajnoczi
2014-06-16 11:23 ` [Qemu-devel] [PULL 14/39] QemuOpts: add qemu_opts_print_help to replace print_option_help Stefan Hajnoczi
2014-06-16 11:23 ` Stefan Hajnoczi [this message]
2014-06-16 11:23 ` [Qemu-devel] [PULL 16/39] QemuOpts: add qemu_opts_append to replace append_option_parameters Stefan Hajnoczi
2014-06-16 11:23 ` [Qemu-devel] [PULL 17/39] QemuOpts: check NULL input for qemu_opts_del Stefan Hajnoczi
2014-06-16 11:23 ` [Qemu-devel] [PULL 18/39] change block layer to support both QemuOpts and QEMUOptionParamter Stefan Hajnoczi
2014-06-16 11:23 ` [Qemu-devel] [PULL 19/39] vvfat.c: handle cross_driver's create_options and create_opts Stefan Hajnoczi
2014-06-16 11:23 ` [Qemu-devel] [PULL 20/39] cow.c: replace QEMUOptionParameter with QemuOpts Stefan Hajnoczi
2014-06-30 17:52 ` Peter Maydell
2014-06-16 11:23 ` [Qemu-devel] [PULL 21/39] gluster.c: " Stefan Hajnoczi
2014-06-16 11:23 ` [Qemu-devel] [PULL 22/39] iscsi.c: " Stefan Hajnoczi
2014-06-16 11:23 ` [Qemu-devel] [PULL 23/39] nfs.c: " Stefan Hajnoczi
2014-06-16 11:23 ` [Qemu-devel] [PULL 24/39] qcow.c: " Stefan Hajnoczi
2014-06-16 11:23 ` [Qemu-devel] [PULL 25/39] QemuOpts: export qemu_opt_find Stefan Hajnoczi
2014-06-16 11:23 ` [Qemu-devel] [PULL 26/39] qcow2.c: replace QEMUOptionParameter with QemuOpts Stefan Hajnoczi
2014-06-16 11:23 ` [Qemu-devel] [PULL 27/39] qed.c: " Stefan Hajnoczi
2014-06-16 11:23 ` [Qemu-devel] [PULL 28/39] raw-posix.c: " Stefan Hajnoczi
2014-06-16 11:23 ` [Qemu-devel] [PULL 29/39] raw-win32.c: " Stefan Hajnoczi
2014-06-16 11:23 ` [Qemu-devel] [PULL 30/39] raw_bsd.c: " Stefan Hajnoczi
2014-06-16 11:23 ` [Qemu-devel] [PULL 31/39] rbd.c: " Stefan Hajnoczi
2014-06-16 11:23 ` [Qemu-devel] [PULL 32/39] sheepdog.c: " Stefan Hajnoczi
2014-06-16 11:23 ` [Qemu-devel] [PULL 33/39] ssh.c: " Stefan Hajnoczi
2014-06-16 11:23 ` [Qemu-devel] [PULL 34/39] vdi.c: " Stefan Hajnoczi
2014-06-16 11:23 ` [Qemu-devel] [PULL 35/39] vhdx.c: " Stefan Hajnoczi
2014-06-16 11:24 ` [Qemu-devel] [PULL 36/39] vmdk.c: " Stefan Hajnoczi
2014-06-16 11:24 ` [Qemu-devel] [PULL 37/39] vpc.c: " Stefan Hajnoczi
2014-06-16 11:24 ` [Qemu-devel] [PULL 38/39] cleanup QEMUOptionParameter Stefan Hajnoczi
2014-06-16 11:24 ` [Qemu-devel] [PULL 39/39] QemuOpts: cleanup tmp 'allocated' member from QemuOptsList Stefan Hajnoczi
2014-06-16 13:30 ` [Qemu-devel] [PULL 00/39] Block patches Peter Maydell
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=1402917843-6459-16-git-send-email-stefanha@redhat.com \
--to=stefanha@redhat.com \
--cc=cyliu@suse.com \
--cc=peter.maydell@linaro.org \
--cc=qemu-devel@nongnu.org \
/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).