[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH v24 08/31] QemuOpts: add conversion between QEMUOpti
From: |
Chunyan Liu |
Subject: |
[Qemu-devel] [PATCH v24 08/31] QemuOpts: add conversion between QEMUOptionParameter to QemuOpts |
Date: |
Thu, 3 Apr 2014 17:54:26 +0800 |
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.
Signed-off-by: Chunyan Liu <address@hidden>
---
Changes:
* fix two dead assignment
include/qemu/option.h | 8 +++
util/qemu-option.c | 153 ++++++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 161 insertions(+)
diff --git a/include/qemu/option.h b/include/qemu/option.h
index fbf5dc2..4e637b5 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 allocated;
+
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 26710d6..4bbaee0 100644
--- a/util/qemu-option.c
+++ b/util/qemu-option.c
@@ -1343,3 +1343,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 free.
+ * 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.7.12.4
- Re: [Qemu-devel] [PATCH v24 02/31] QemuOpts: add def_value_str to QemuOptDesc, (continued)
[Qemu-devel] [PATCH v24 03/31] qapi: output def_value_str when query command line options, Chunyan Liu, 2014/04/03
[Qemu-devel] [PATCH v24 09/31] QemuOpts: add qemu_opts_append to replace append_option_parameters, Chunyan Liu, 2014/04/03
[Qemu-devel] [PATCH v24 05/31] QemuOpts: move qemu_opt_del ahead for later calling, Chunyan Liu, 2014/04/03
[Qemu-devel] [PATCH v24 04/31] QemuOpts: change opt->name|str from (const char *) to (char *), Chunyan Liu, 2014/04/03
[Qemu-devel] [PATCH v24 08/31] QemuOpts: add conversion between QEMUOptionParameter to QemuOpts,
Chunyan Liu <=
[Qemu-devel] [PATCH v24 06/31] QemuOpts: add qemu_opt_get_*_del functions for replace work, Chunyan Liu, 2014/04/03
[Qemu-devel] [PATCH v24 07/31] QemuOpts: add qemu_opts_print_help to replace print_option_help, Chunyan Liu, 2014/04/03
[Qemu-devel] [PATCH v24 10/31] QemuOpts: check NULL input for qemu_opts_del, Chunyan Liu, 2014/04/03
[Qemu-devel] [PATCH v24 12/31] change block layer to support both QemuOpts and QEMUOptionParamter, Chunyan Liu, 2014/04/03
[Qemu-devel] [PATCH v24 11/31] qemu_opts_print: change fprintf stderr to printf, Chunyan Liu, 2014/04/03
[Qemu-devel] [PATCH v24 15/31] gluster.c: replace QEMUOptionParameter with QemuOpts, Chunyan Liu, 2014/04/03
[Qemu-devel] [PATCH v24 14/31] cow.c: replace QEMUOptionParameter with QemuOpts, Chunyan Liu, 2014/04/03
[Qemu-devel] [PATCH v24 13/31] vvfat.c: handle cross_driver's create_options and create_opts, Chunyan Liu, 2014/04/03
[Qemu-devel] [PATCH v24 16/31] iscsi.c: replace QEMUOptionParameter with QemuOpts, Chunyan Liu, 2014/04/03