From patchwork Fri Mar 21 10:12:20 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Chunyan Liu X-Patchwork-Id: 332529 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id D57232C00B3 for ; Fri, 21 Mar 2014 21:16:41 +1100 (EST) Received: from localhost ([::1]:51726 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1WQwVD-0002SE-1d for incoming@patchwork.ozlabs.org; Fri, 21 Mar 2014 06:16:39 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:54569) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1WQwR6-00064l-TB for qemu-devel@nongnu.org; Fri, 21 Mar 2014 06:12:32 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1WQwQy-0007Tu-FP for qemu-devel@nongnu.org; Fri, 21 Mar 2014 06:12:24 -0400 Received: from victor.provo.novell.com ([137.65.250.26]:51540) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1WQwQy-0007Tc-75 for qemu-devel@nongnu.org; Fri, 21 Mar 2014 06:12:16 -0400 Received: from linux-cyliu.lab.bej.apac.novell.com (prv-ext-foundry1int.gns.novell.com [137.65.251.240]) by victor.provo.novell.com with ESMTP (NOT encrypted); Fri, 21 Mar 2014 04:12:02 -0600 From: Chunyan Liu To: qemu-devel@nongnu.org Date: Fri, 21 Mar 2014 18:12:20 +0800 Message-Id: <1395396763-26081-10-git-send-email-cyliu@suse.com> X-Mailer: git-send-email 1.7.12.4 In-Reply-To: <1395396763-26081-1-git-send-email-cyliu@suse.com> References: <1395396763-26081-1-git-send-email-cyliu@suse.com> X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x X-Received-From: 137.65.250.26 Cc: stefanha@redhat.com Subject: [Qemu-devel] [PATCH v23 09/32] add qemu_opts_append to repalce append_option_parameters X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org For later merge .create_opts of drv and proto_drv in qemu-img commands. Signed-off-by: Chunyan Liu Reviewed-by: Leandro Dorileo --- Changes: * Following Eric's suggestion, qemu_opts_append() will accept a pair of parameters (QEMUOptionParameter and QemuOpts), to handle the inconsistency that some driver uses QemuOpts while some driver uses QEMUOptionParameter. * using g_realloc of first parameter 'dst' and return it, instead of malloc a new list and copy data from all parameters to the new list, and return the new malloced list. Solving memory free effort for multiple append(s), and no naming problem as in previous version. include/qemu/option.h | 5 ++++ util/qemu-option.c | 65 +++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 70 insertions(+) diff --git a/include/qemu/option.h b/include/qemu/option.h index fd6f075..120c998 100644 --- a/include/qemu/option.h +++ b/include/qemu/option.h @@ -175,5 +175,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 diff --git a/util/qemu-option.c b/util/qemu-option.c index 4bdcfbf..6c304b2 100644 --- a/util/qemu-option.c +++ b/util/qemu-option.c @@ -1477,3 +1477,68 @@ void qemu_opts_free(QemuOptsList *list) g_free(list); } + +/* Realloc dst option list and append options either from an option list (list) + * or an 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; + QemuOptsList *tmp_list = NULL; + QemuOptDesc *desc; + bool need_init = false; + + assert(!(list && param)); + if (!param &&!list) { + return dst; + } + + if (param) { + list = tmp_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->mallocd = true; + } + dst->desc[num_dst_opts].name = NULL; + + /* (const char *) members of result dst are malloced, need free. */ + assert(dst->mallocd); + /* 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++; + } + } + + g_free(tmp_list); + return dst; +}