Skip to content

Commit

Permalink
QemuOpts: add qemu_opts_append to replace append_option_parameters
Browse files Browse the repository at this point in the history
For later merge .create_opts of drv and proto_drv in qemu-img commands.

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>
  • Loading branch information
Chunyan Liu authored and stefanhaRH committed Jun 16, 2014
1 parent 8559e45 commit a1097a2
Show file tree
Hide file tree
Showing 2 changed files with 72 additions and 0 deletions.
5 changes: 5 additions & 0 deletions include/qemu/option.h
Expand Up @@ -176,5 +176,10 @@ 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);
/* FIXME: will remove QEMUOptionParameter after all drivers switch to QemuOpts.
*/
QemuOptsList *qemu_opts_append(QemuOptsList *dst,
QemuOptsList *list,
QEMUOptionParameter *param);

#endif
67 changes: 67 additions & 0 deletions util/qemu-option.c
Expand Up @@ -1499,3 +1499,70 @@ void qemu_opts_free(QemuOptsList *list)

g_free(list);
}

/* Realloc dst option list and append options either from an option list (list)
* or a QEMUOptionParameter (param) to it. dst could be NULL or a malloced list.
* FIXME: will remove QEMUOptionParameter after all drivers switch to QemuOpts.
*/
QemuOptsList *qemu_opts_append(QemuOptsList *dst,
QemuOptsList *list,
QEMUOptionParameter *param)
{
size_t num_opts, num_dst_opts;
QemuOptDesc *desc;
bool need_init = false;

assert(!(list && param));
if (!param && !list) {
return dst;
}

if (param) {
list = params_to_opts(param);
}

/* If dst is NULL, after realloc, some area of dst should be initialized
* before adding options to it.
*/
if (!dst) {
need_init = true;
}

num_opts = count_opts_list(dst);
num_dst_opts = num_opts;
num_opts += count_opts_list(list);
dst = g_realloc(dst, sizeof(QemuOptsList) +
(num_opts + 1) * sizeof(QemuOptDesc));
if (need_init) {
dst->name = NULL;
dst->implied_opt_name = NULL;
QTAILQ_INIT(&dst->head);
dst->allocated = true;
dst->merge_lists = false;
}
dst->desc[num_dst_opts].name = NULL;

/* (const char *) members of result dst are malloced, need free. */
assert(dst->allocated);
/* append list->desc to dst->desc */
if (list) {
desc = list->desc;
while (desc && desc->name) {
if (find_desc_by_name(dst->desc, desc->name) == NULL) {
dst->desc[num_dst_opts].name = g_strdup(desc->name);
dst->desc[num_dst_opts].type = desc->type;
dst->desc[num_dst_opts].help = g_strdup(desc->help);
dst->desc[num_dst_opts].def_value_str =
g_strdup(desc->def_value_str);
num_dst_opts++;
dst->desc[num_dst_opts].name = NULL;
}
desc++;
}
}

if (param) {
qemu_opts_free(list);
}
return dst;
}

0 comments on commit a1097a2

Please sign in to comment.