From: Chunyan Liu <cyliu@suse.com>
To: qemu-devel@nongnu.org
Cc: stefanha@redhat.com
Subject: [Qemu-devel] [PATCH v23 08/32] add convert functions between QEMUOptionParameter to QemuOpts
Date: Fri, 21 Mar 2014 18:12:19 +0800 [thread overview]
Message-ID: <1395396763-26081-9-git-send-email-cyliu@suse.com> (raw)
In-Reply-To: <1395396763-26081-1-git-send-email-cyliu@suse.com>
Add two temp convert 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.
Signed-off-by: Chunyan Liu <cyliu@suse.com>
---
Finally not following Eric's suggestion of adding char tmp[] to QemuOptList
to store stringized uint value, but choosing g_strdup and add flag 'mallocd'
to QemuOptList to indicate free the mallocd space, since:
1. there could be many unit options need to store, so, adding char tmp[] in
QemuOptList couldn't solve problem, but should add char tmp[] in QemuOptDesc.
Then, for those not unit type, the char tmp[] space is wasted.
2. in later qemu_opts_append() function, since it accept both QemuOptsList and
QEMUOptionParameter as input, for QEMUOptionParamter, it will temp converted
to QemuOpts, then append to result list; after that, the converted QemuOpts
should be freed. It's risky that some memory that the result list members
point to might be freed.
So, simply g_strdup is safer, the only thing is to free in this case.
include/qemu/option.h | 8 +++
util/qemu-option.c | 154 ++++++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 162 insertions(+)
diff --git a/include/qemu/option.h b/include/qemu/option.h
index fbf5dc2..fd6f075 100644
--- a/include/qemu/option.h
+++ b/include/qemu/option.h
@@ -103,6 +103,11 @@ typedef struct QemuOptDesc {
} QemuOptDesc;
struct QemuOptsList {
+ /* FIXME: Temp used for QEMUOptionParamter->QemuOpts conversion to
+ * indicate free memory. Will remove after all drivers switch to QemuOpts.
+ */
+ bool mallocd;
+
const char *name;
const char *implied_opt_name;
bool merge_lists; /* Merge multiple uses of option into a single list? */
@@ -167,5 +172,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 315a7bb..4bdcfbf 100644
--- a/util/qemu-option.c
+++ b/util/qemu-option.c
@@ -1323,3 +1323,157 @@ 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->mallocd = 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++;
+ opts->desc[i].name = NULL;
+ }
+
+ return opts;
+}
+
+/* convert QemuOpts to QEMUOptionParamter
+ * 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;
+ 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++;
+ dest[i].name = NULL;
+ }
+
+ return dest;
+}
+
+void qemu_opts_free(QemuOptsList *list)
+{
+ /* List members point to new malloced space and need to free.
+ * FIXME:
+ * Introduced for QEMUOptionParamter->QemuOpts conversion.
+ * Will remove after all drivers switch to QemuOpts.
+ */
+ if (list && list->mallocd) {
+ 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.7.12.4
next prev parent reply other threads:[~2014-03-21 10:12 UTC|newest]
Thread overview: 59+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-03-21 10:12 [Qemu-devel] [PATCH v23 00/32] replace QEMUOptionParameter with QemuOpts Chunyan Liu
2014-03-21 10:12 ` [Qemu-devel] [PATCH v23 01/32] move find_desc_by_name ahead for later calling Chunyan Liu
2014-03-21 23:16 ` Eric Blake
2014-03-21 10:12 ` [Qemu-devel] [PATCH v23 02/32] add def_value_str to QemuOptDesc Chunyan Liu
2014-03-21 10:12 ` [Qemu-devel] [PATCH v23 03/32] qapi: output def_value_str when query command line options Chunyan Liu
2014-03-21 23:27 ` Eric Blake
2014-03-24 3:18 ` Chun Yan Liu
2014-03-21 10:12 ` [Qemu-devel] [PATCH v23 04/32] change opt->name and opt->str from (const char *) to (char *) Chunyan Liu
2014-03-25 19:00 ` Leandro Dorileo
2014-03-25 19:23 ` Eric Blake
2014-03-21 10:12 ` [Qemu-devel] [PATCH v23 05/32] move qemu_opt_del ahead for later calling Chunyan Liu
2014-03-25 19:29 ` Eric Blake
2014-03-21 10:12 ` [Qemu-devel] [PATCH v23 06/32] add qemu_opt_get_*_del functions for replace work Chunyan Liu
2014-03-25 20:33 ` Eric Blake
2014-03-21 10:12 ` [Qemu-devel] [PATCH v23 07/32] add qemu_opts_print_help to replace print_option_help Chunyan Liu
2014-03-25 19:07 ` Leandro Dorileo
2014-03-25 20:43 ` Eric Blake
2014-03-26 2:58 ` Chunyan Liu
2014-03-21 10:12 ` Chunyan Liu [this message]
2014-03-25 21:35 ` [Qemu-devel] [PATCH v23 08/32] add convert functions between QEMUOptionParameter to QemuOpts Eric Blake
2014-03-26 3:26 ` Chunyan Liu
2014-03-26 6:30 ` Chunyan Liu
2014-03-21 10:12 ` [Qemu-devel] [PATCH v23 09/32] add qemu_opts_append to repalce append_option_parameters Chunyan Liu
2014-03-25 19:13 ` Leandro Dorileo
2014-03-25 21:40 ` Eric Blake
2014-03-21 10:12 ` [Qemu-devel] [PATCH v23 10/32] check NULL input for qemu_opts_del Chunyan Liu
2014-03-25 21:41 ` Eric Blake
2014-03-21 10:12 ` [Qemu-devel] [PATCH v23 11/32] qemu_opts_print: change fprintf stderr to printf Chunyan Liu
2014-03-25 20:10 ` Leandro Dorileo
2014-03-21 10:12 ` [Qemu-devel] [PATCH v23 12/32] qcow2.c: remove 'assigned' check in amend Chunyan Liu
2014-03-25 19:25 ` Leandro Dorileo
2014-03-26 7:37 ` Chunyan Liu
2014-03-27 7:27 ` Chunyan Liu
2014-03-21 10:12 ` [Qemu-devel] [PATCH v23 13/32] change block layer to support both QemuOpts and QEMUOptionParamter Chunyan Liu
2014-03-21 10:12 ` [Qemu-devel] [PATCH v23 14/32] vvfat.c: handle cross_driver's create_options and create_opts Chunyan Liu
2014-03-25 19:17 ` Leandro Dorileo
2014-03-21 10:12 ` [Qemu-devel] [PATCH v23 15/32] cow.c: replace QEMUOptionParameter with QemuOpts Chunyan Liu
2014-03-21 10:12 ` [Qemu-devel] [PATCH v23 16/32] gluster.c: " Chunyan Liu
2014-03-21 10:12 ` [Qemu-devel] [PATCH v23 17/32] iscsi.c: " Chunyan Liu
2014-03-21 10:12 ` [Qemu-devel] [PATCH v23 18/32] qcow.c: " Chunyan Liu
2014-03-21 10:12 ` [Qemu-devel] [PATCH v23 19/32] qcow2.c: " Chunyan Liu
2014-03-21 10:12 ` [Qemu-devel] [PATCH v23 20/32] qed.c: " Chunyan Liu
2014-03-21 10:12 ` [Qemu-devel] [PATCH v23 21/32] raw-posix.c: " Chunyan Liu
2014-03-21 10:12 ` [Qemu-devel] [PATCH v23 22/32] raw-win32.c: " Chunyan Liu
2014-03-21 10:12 ` [Qemu-devel] [PATCH v23 23/32] raw_bsd.c: " Chunyan Liu
2014-03-21 10:12 ` [Qemu-devel] [PATCH v23 24/32] rbd.c: " Chunyan Liu
2014-03-21 10:12 ` [Qemu-devel] [PATCH v23 25/32] sheepdog.c: " Chunyan Liu
2014-03-21 10:12 ` [Qemu-devel] [PATCH v23 26/32] ssh.c: " Chunyan Liu
2014-03-21 10:12 ` [Qemu-devel] [PATCH v23 27/32] vdi.c: " Chunyan Liu
2014-03-21 10:12 ` [Qemu-devel] [PATCH v23 28/32] vhdx.c: " Chunyan Liu
2014-03-21 10:12 ` [Qemu-devel] [PATCH v23 29/32] vmdk.c: " Chunyan Liu
2014-03-21 10:12 ` [Qemu-devel] [PATCH v23 30/32] vpc.c: " Chunyan Liu
2014-03-21 10:12 ` [Qemu-devel] [PATCH v23 31/32] cleanup QEMUOptionParameter Chunyan Liu
2014-03-25 18:02 ` Leandro Dorileo
2014-03-21 10:12 ` [Qemu-devel] [PATCH v23 32/32] cleanup tmp 'mallocd' member from QemuOptsList Chunyan Liu
2014-03-25 18:09 ` [Qemu-devel] [PATCH v23 00/32] replace QEMUOptionParameter with QemuOpts Leandro Dorileo
2014-03-25 20:22 ` Leandro Dorileo
2014-03-26 15:18 ` Stefan Hajnoczi
2014-03-27 7:20 ` Chunyan Liu
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=1395396763-26081-9-git-send-email-cyliu@suse.com \
--to=cyliu@suse.com \
--cc=qemu-devel@nongnu.org \
--cc=stefanha@redhat.com \
/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).