From nobody Sun Apr 28 19:39:16 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1610987877; cv=none; d=zohomail.com; s=zohoarc; b=jXMkeE1rLlNjgGGVAFhTz6zjF+yafT7+tQQZjWkl2+WtIfO0jh34mmGfHlT3WFPw8CFxNBadoSo3foAw+NKpeIUvFSBhULGoVwL4DvggBLE7aRcgR50K7sp2pxieFlfrTfbWz3UhxeIEvM2YApRvEqU3RzxgkHP/0s7lxgW2bSQ= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1610987877; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=mJx4oSZ2lIqrX9yMtd+/IFkSWw+c8ZJke8PmhTZiQls=; b=TqTbEnEOL3UcvnZhWpBGPLjvl538Yd6O++tSJjGTlmYPwVmCrFkhr0q+f8vdx2n4ZvQOqjZUpiFHbiCONbXQ7iXOg3xUddnpYmL3umzJLngphhUvxnswdLpg2Yh558ztOIzfG+1s2icseUrlcZUT8dSoqpCrNaWjmqet0CJAc7o= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1610987877900545.3817836661756; Mon, 18 Jan 2021 08:37:57 -0800 (PST) Received: from localhost ([::1]:44708 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1l1XXQ-0006GC-O1 for importer@patchew.org; Mon, 18 Jan 2021 11:37:56 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:34724) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1l1XR2-00026f-Ec for qemu-devel@nongnu.org; Mon, 18 Jan 2021 11:31:21 -0500 Received: from us-smtp-delivery-124.mimecast.com ([216.205.24.124]:59173) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.90_1) (envelope-from ) id 1l1XR0-0001RY-Gf for qemu-devel@nongnu.org; Mon, 18 Jan 2021 11:31:20 -0500 Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-31-TEy2nCiwNSmdpa57xBFrdw-1; Mon, 18 Jan 2021 11:31:15 -0500 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.phx2.redhat.com [10.5.11.16]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id CA78084A5E5 for ; Mon, 18 Jan 2021 16:31:14 +0000 (UTC) Received: from virtlab701.virt.lab.eng.bos.redhat.com (virtlab701.virt.lab.eng.bos.redhat.com [10.19.152.228]) by smtp.corp.redhat.com (Postfix) with ESMTP id 58EA517B0B; Mon, 18 Jan 2021 16:31:14 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1610987477; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=mJx4oSZ2lIqrX9yMtd+/IFkSWw+c8ZJke8PmhTZiQls=; b=ZyGZzQ2BrxyxD/M4LjIsdRS220Utti/xMsg1GgBmajNaJ/rXWrz0LpRJ7RmrARRuD3Ku1L Ido92qklJfChNK5IeoF7L8j3AvJKgky4ONqVYbZjYBk03LzzvlCNsxdqziMmzZmsMqyYHJ U5APot+68SE1DEDnan7nbU4GgGAj9OY= X-MC-Unique: TEy2nCiwNSmdpa57xBFrdw-1 From: Paolo Bonzini To: qemu-devel@nongnu.org Subject: [PATCH 01/25] qemu-option: clean up id vs. list->merge_lists Date: Mon, 18 Jan 2021 11:30:49 -0500 Message-Id: <20210118163113.780171-2-pbonzini@redhat.com> In-Reply-To: <20210118163113.780171-1-pbonzini@redhat.com> References: <20210118163113.780171-1-pbonzini@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.16 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=pbonzini@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=216.205.24.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -29 X-Spam_score: -3.0 X-Spam_bar: --- X-Spam_report: (-3.0 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.175, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H3=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, imammedo@redhat.com, armbru@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @redhat.com) Content-Type: text/plain; charset="utf-8" Looking at all merge-lists QemuOptsList, here is how they access their QemuOpts: reopen_opts in qemu-io-cmds.c ("qemu-img reopen -o") qemu_opts_find(&reopen_opts, NULL) empty_opts in qemu-io.c ("qemu-io open -o") qemu_opts_find(&empty_opts, NULL) qemu_rtc_opts ("-rtc") qemu_find_opts_singleton("rtc") qemu_machine_opts ("-M") qemu_find_opts_singleton("machine") qemu_boot_opts ("-boot") QTAILQ_FIRST(&qemu_find_opts("bootopts")->head) qemu_name_opts ("-name") qemu_opts_foreach->parse_name parse_name does not use id qemu_mem_opts ("-m") qemu_find_opts_singleton("memory") qemu_icount_opts ("-icount") qemu_opts_foreach->do_configuree_icount do_configure_icount->icount_configure icount_configure does not use id qemu_smp_opts ("-smp") qemu_opts_find(qemu_find_opts("smp-opts"), NULL) qemu_spice_opts ("-spice") QTAILQ_FIRST(&qemu_spice_opts.head) i.e. they don't need an id. Sometimes its presence is ignored (e.g. when using qemu_opts_foreach), sometimes all the options with the id are skipped, sometimes only the first option on the command line is considered. With this patch we just forbid id on merge-lists QemuOptsLists; if the command line still works, it has the same semantics as before. qemu_opts_create's fail_if_exists parameter is now unnecessary: - it is unused if id is NULL - opts_parse only passes false if reached from qemu_opts_set_defaults, in which case this patch enforces that id must be NULL - other callers that can pass a non-NULL id always set it to true Assert that it is true in the only case where "fail_if_exists" matters, i.e. "id && !lists->merge_lists". This means that if an id is present, duplicates are always forbidden, which was already the status quo. Discounting the case that aborts as it's not user-controlled (it's "just" a matter of inspecting qemu_opts_create callers), the paths through qemu_opts_create can be summarized as: - merge_lists =3D true: singleton opts with NULL id; non-NULL id fails - merge_lists =3D false: always return new opts; non-NULL id fails if dup Signed-off-by: Paolo Bonzini Reviewed-by: Kevin Wolf --- util/qemu-option.c | 27 ++++++++++++++------------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/util/qemu-option.c b/util/qemu-option.c index c88e159f18..91f4120ce1 100644 --- a/util/qemu-option.c +++ b/util/qemu-option.c @@ -619,7 +619,17 @@ QemuOpts *qemu_opts_create(QemuOptsList *list, const c= har *id, { QemuOpts *opts =3D NULL; =20 - if (id) { + if (list->merge_lists) { + if (id) { + error_setg(errp, QERR_INVALID_PARAMETER, "id"); + return NULL; + } + opts =3D qemu_opts_find(list, NULL); + if (opts) { + return opts; + } + } else if (id) { + assert(fail_if_exists); if (!id_wellformed(id)) { error_setg(errp, QERR_INVALID_PARAMETER_VALUE, "id", "an identifier"); @@ -629,17 +639,8 @@ QemuOpts *qemu_opts_create(QemuOptsList *list, const c= har *id, } opts =3D qemu_opts_find(list, id); if (opts !=3D NULL) { - if (fail_if_exists && !list->merge_lists) { - error_setg(errp, "Duplicate ID '%s' for %s", id, list->nam= e); - return NULL; - } else { - return opts; - } - } - } else if (list->merge_lists) { - opts =3D qemu_opts_find(list, NULL); - if (opts) { - return opts; + error_setg(errp, "Duplicate ID '%s' for %s", id, list->name); + return NULL; } } opts =3D g_malloc0(sizeof(*opts)); @@ -893,7 +894,7 @@ static QemuOpts *opts_parse(QemuOptsList *list, const c= har *params, * (if unlikely) future misuse: */ assert(!defaults || list->merge_lists); - opts =3D qemu_opts_create(list, id, !defaults, errp); + opts =3D qemu_opts_create(list, id, !list->merge_lists, errp); g_free(id); if (opts =3D=3D NULL) { return NULL; --=20 2.26.2 From nobody Sun Apr 28 19:39:16 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1610988064; cv=none; d=zohomail.com; s=zohoarc; b=jxY5o44NGQj5v6118BwT79cAIQCJDypkaG9JldLL+P6EcTFCHKx2oykSy5emLQCwqhFPF5u14KVUI2XojOejFtV1sUWgMGWjb8/X18bpg6dJQhZ17QRJxWCh2qKuvKLMBzNtOqKea7+lHYaeG6JDsuGrakov8DxoOAyCRcbimaU= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1610988064; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=nJ8V3+fjVpvn8MatvjcW1uk//9o9ccm/MEgVoT3ufNI=; b=HhjUya7Xyrj5HTjo8GAwYHrNXAqcESNGP4XqoJxG26/3TCQteEeUdmv74dAGZ9ObKII4WgCxL4TEVaT2jqZUPy3ZYX+xP0lJgwSyZDeFEnEYlDUMsv9CC3lV/p7xUntBtGBjNjlRYwpqhH6dSO+hdzfw7DNgwDfEIcR0Bssz9js= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1610988064258500.03350090170557; Mon, 18 Jan 2021 08:41:04 -0800 (PST) Received: from localhost ([::1]:51856 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1l1XaR-00015Z-5V for importer@patchew.org; Mon, 18 Jan 2021 11:41:03 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:34728) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1l1XR4-00026q-4t for qemu-devel@nongnu.org; Mon, 18 Jan 2021 11:31:22 -0500 Received: from us-smtp-delivery-124.mimecast.com ([63.128.21.124]:34719) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.90_1) (envelope-from ) id 1l1XR0-0001RV-Uy for qemu-devel@nongnu.org; Mon, 18 Jan 2021 11:31:21 -0500 Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-118-XPpLAnBBNTq6srMop1rRbw-1; Mon, 18 Jan 2021 11:31:16 -0500 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.phx2.redhat.com [10.5.11.16]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 6A26959 for ; Mon, 18 Jan 2021 16:31:15 +0000 (UTC) Received: from virtlab701.virt.lab.eng.bos.redhat.com (virtlab701.virt.lab.eng.bos.redhat.com [10.19.152.228]) by smtp.corp.redhat.com (Postfix) with ESMTP id EB73617B0B; Mon, 18 Jan 2021 16:31:14 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1610987477; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=nJ8V3+fjVpvn8MatvjcW1uk//9o9ccm/MEgVoT3ufNI=; b=fF9aRSlcPU6vmOTOhIcOYdjuOOgVBtfFQ9Ehoq5k+CuTycfPN0DFGAMwf3/7GWULXms98+ KoXnAp0hB97oI+CBHSbEU//clwY79+l0y4LeF8L47Aw0BjrJyQqEJuqQw01rKJ1jOzLH2D r6wAd3zhcQG/ra7FhCTnxY2+wqd/EzU= X-MC-Unique: XPpLAnBBNTq6srMop1rRbw-1 From: Paolo Bonzini To: qemu-devel@nongnu.org Subject: [PATCH 02/25] qemu-option: move help handling to get_opt_name_value Date: Mon, 18 Jan 2021 11:30:50 -0500 Message-Id: <20210118163113.780171-3-pbonzini@redhat.com> In-Reply-To: <20210118163113.780171-1-pbonzini@redhat.com> References: <20210118163113.780171-1-pbonzini@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.16 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=pbonzini@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=63.128.21.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -29 X-Spam_score: -3.0 X-Spam_bar: --- X-Spam_report: (-3.0 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.175, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H4=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, imammedo@redhat.com, armbru@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @redhat.com) Content-Type: text/plain; charset="utf-8" Right now, help options are parsed normally and then checked specially in opt_validate, but only if coming from qemu_opts_parse_noisily. has_help_option does the check on its own. opt_validate() has two callers: qemu_opt_set(), which passes null and is therefore unaffected, and opts_do_parse(), which is affected. opts_do_parse() is called by qemu_opts_do_parse(), which passes null and is therefore unaffected, and opts_parse(). opts_parse() is called by qemu_opts_parse() and qemu_opts_set_defaults(), which pass null and are therefore unaffected, and qemu_opts_parse_noisily(). Move the check from opt_validate to the parsing workhorse of QemuOpts, get_opt_name_value. This will come in handy in the next patch, which will raise a warning for "-object memory-backend-ram,share" ("flag" option with no =3Don/=3Doff part) but not for "-object memory-backend-ram,help". As a result: - opts_parse and opts_do_parse do not return an error anymore when help is requested; qemu_opts_parse_noisily does not have to work around that anymore. - various crazy ways to request help are not recognized anymore: - "help=3D..." - "nohelp" (sugar for "help=3Doff") - "?=3D..." - "no?" (sugar for "?=3Doff") Signed-off-by: Paolo Bonzini Reviewed-by: Markus Armbruster --- util/qemu-option.c | 38 +++++++++++++++++++++++--------------- 1 file changed, 23 insertions(+), 15 deletions(-) diff --git a/util/qemu-option.c b/util/qemu-option.c index 91f4120ce1..5f27d4369d 100644 --- a/util/qemu-option.c +++ b/util/qemu-option.c @@ -496,8 +496,7 @@ static QemuOpt *opt_create(QemuOpts *opts, const char *= name, char *value, return opt; } =20 -static bool opt_validate(QemuOpt *opt, bool *help_wanted, - Error **errp) +static bool opt_validate(QemuOpt *opt, Error **errp) { const QemuOptDesc *desc; const QemuOptsList *list =3D opt->opts->list; @@ -505,9 +504,6 @@ static bool opt_validate(QemuOpt *opt, bool *help_wante= d, desc =3D find_desc_by_name(list->desc, opt->name); if (!desc && !opts_accepts_any(list)) { error_setg(errp, QERR_INVALID_PARAMETER, opt->name); - if (help_wanted && is_help_option(opt->name)) { - *help_wanted =3D true; - } return false; } =20 @@ -524,7 +520,7 @@ bool qemu_opt_set(QemuOpts *opts, const char *name, con= st char *value, { QemuOpt *opt =3D opt_create(opts, name, g_strdup(value), false); =20 - if (!opt_validate(opt, NULL, errp)) { + if (!opt_validate(opt, errp)) { qemu_opt_del(opt); return false; } @@ -760,10 +756,12 @@ void qemu_opts_print(QemuOpts *opts, const char *sepa= rator) =20 static const char *get_opt_name_value(const char *params, const char *firstname, + bool *help_wanted, char **name, char **value) { const char *p; size_t len; + bool is_help =3D false; =20 len =3D strcspn(params, "=3D,"); if (params[len] !=3D '=3D') { @@ -780,6 +778,7 @@ static const char *get_opt_name_value(const char *param= s, *value =3D g_strdup("off"); } else { *value =3D g_strdup("on"); + is_help =3D is_help_option(*name); } } } else { @@ -791,6 +790,9 @@ static const char *get_opt_name_value(const char *param= s, } =20 assert(!*p || *p =3D=3D ','); + if (help_wanted && is_help) { + *help_wanted =3D true; + } if (*p =3D=3D ',') { p++; } @@ -806,7 +808,12 @@ static bool opts_do_parse(QemuOpts *opts, const char *= params, QemuOpt *opt; =20 for (p =3D params; *p;) { - p =3D get_opt_name_value(p, firstname, &option, &value); + p =3D get_opt_name_value(p, firstname, help_wanted, &option, &valu= e); + if (help_wanted && *help_wanted) { + g_free(option); + g_free(value); + return false; + } firstname =3D NULL; =20 if (!strcmp(option, "id")) { @@ -817,7 +824,7 @@ static bool opts_do_parse(QemuOpts *opts, const char *p= arams, =20 opt =3D opt_create(opts, option, value, prepend); g_free(option); - if (!opt_validate(opt, help_wanted, errp)) { + if (!opt_validate(opt, errp)) { qemu_opt_del(opt); return false; } @@ -832,7 +839,7 @@ static char *opts_parse_id(const char *params) char *name, *value; =20 for (p =3D params; *p;) { - p =3D get_opt_name_value(p, NULL, &name, &value); + p =3D get_opt_name_value(p, NULL, NULL, &name, &value); if (!strcmp(name, "id")) { g_free(name); return value; @@ -848,11 +855,10 @@ bool has_help_option(const char *params) { const char *p; char *name, *value; - bool ret; + bool ret =3D false; =20 for (p =3D params; *p;) { - p =3D get_opt_name_value(p, NULL, &name, &value); - ret =3D is_help_option(name); + p =3D get_opt_name_value(p, NULL, &ret, &name, &value); g_free(name); g_free(value); if (ret) { @@ -937,11 +943,13 @@ QemuOpts *qemu_opts_parse_noisily(QemuOptsList *list,= const char *params, QemuOpts *opts; bool help_wanted =3D false; =20 - opts =3D opts_parse(list, params, permit_abbrev, false, &help_wanted, = &err); - if (err) { + opts =3D opts_parse(list, params, permit_abbrev, false, + opts_accepts_any(list) ? NULL : &help_wanted, + &err); + if (!opts) { + assert(!!err + !!help_wanted =3D=3D 1); if (help_wanted) { qemu_opts_print_help(list, true); - error_free(err); } else { error_report_err(err); } --=20 2.26.2 From nobody Sun Apr 28 19:39:16 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1610988275; cv=none; d=zohomail.com; s=zohoarc; b=AIq4eoc0gYZropS/1N1nDCGNo8bJ/Gyqy6fQ+Oc7o7uvn+3i0ST3zQz46oDpVkbU5yt1NiKtGc4SS6Okcpe5xaEBskNI4E71AWQQeg9wdZBdVPM5M1GtzzcdHQXbPkZac8kNdhe4qezZtV3iodScB1KQtwRouM/I/hRDzCkjVNo= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1610988275; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=g+ziezKQHOA7nAOL1qkukwVvY64I/jKaJ2A6tbeG+Zk=; b=mVbIWaCTobZfFYpsSESn8LYYB3KotbgclgsQfYSMnM0ERZSBN2ATnGgRMreJrU0I8hsIjsu6ehXtps44vPAeD6Dh0CiYUo8SltuH4tLEgAy1iE1tSTqEMEOM0Vpdu3APgPACckDt35uap/aRBWxdSVNEdS4n5hpz7fmsJinK2FQ= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1610988275351581.2683903937748; Mon, 18 Jan 2021 08:44:35 -0800 (PST) Received: from localhost ([::1]:58642 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1l1Xdq-0004OM-4c for importer@patchew.org; Mon, 18 Jan 2021 11:44:34 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:34804) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1l1XR9-0002GY-PX for qemu-devel@nongnu.org; Mon, 18 Jan 2021 11:31:27 -0500 Received: from us-smtp-delivery-124.mimecast.com ([63.128.21.124]:21055) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.90_1) (envelope-from ) id 1l1XR6-0001SE-RP for qemu-devel@nongnu.org; Mon, 18 Jan 2021 11:31:27 -0500 Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-310-X44kZd4TPr-DNomLohyoOA-1; Mon, 18 Jan 2021 11:31:22 -0500 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.phx2.redhat.com [10.5.11.16]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 9917E84A5E0 for ; Mon, 18 Jan 2021 16:31:21 +0000 (UTC) Received: from virtlab701.virt.lab.eng.bos.redhat.com (virtlab701.virt.lab.eng.bos.redhat.com [10.19.152.228]) by smtp.corp.redhat.com (Postfix) with ESMTP id 8A47C17B0B; Mon, 18 Jan 2021 16:31:15 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1610987484; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=g+ziezKQHOA7nAOL1qkukwVvY64I/jKaJ2A6tbeG+Zk=; b=UCJBbVZ46zjU8/3kxgL50eolqvP7axsmLSYWDznv0Je+nMPhFKaaZhraq6+qX9UjM5z9jx DjJpeRILuPPRh7WnWKxBwSOuG5ybZokJcC4IjbEqI9LAa6p/Rex5hd8tGHkvWKcA8gl1TW AvnRwRKEMLWBgEWQg5w8F79iH/UHj64= X-MC-Unique: X44kZd4TPr-DNomLohyoOA-1 From: Paolo Bonzini To: qemu-devel@nongnu.org Subject: [PATCH 03/25] qemu-option: warn for short-form boolean options Date: Mon, 18 Jan 2021 11:30:51 -0500 Message-Id: <20210118163113.780171-4-pbonzini@redhat.com> In-Reply-To: <20210118163113.780171-1-pbonzini@redhat.com> References: <20210118163113.780171-1-pbonzini@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.16 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=pbonzini@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=63.128.21.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -29 X-Spam_score: -3.0 X-Spam_bar: --- X-Spam_report: (-3.0 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.175, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H4=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, imammedo@redhat.com, armbru@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @redhat.com) Content-Type: text/plain; charset="utf-8" Options such as "server" or "nowait", that are commonly found in -chardev, are sugar for "server=3Don" and "wait=3Doff". This is quite surprising and also does not have any notion of typing attached. It is even possible to do "-device e1000,noid" and get a device with "id=3Doff". Deprecate it and print a warning when it is encountered. In general, this short form for boolean options only seems to be in wide use for -chardev and -spice. Signed-off-by: Paolo Bonzini --- docs/system/deprecated.rst | 6 ++++++ tests/test-qemu-opts.c | 2 +- util/qemu-option.c | 29 ++++++++++++++++++----------- 3 files changed, 25 insertions(+), 12 deletions(-) diff --git a/docs/system/deprecated.rst b/docs/system/deprecated.rst index e20bfcb17a..e71faefbe5 100644 --- a/docs/system/deprecated.rst +++ b/docs/system/deprecated.rst @@ -127,6 +127,12 @@ Drives with interface types other than ``if=3Dnone`` a= re for onboard devices. It is possible to use drives the board doesn't pick up with -device. This usage is now deprecated. Use ``if=3Dnone`` instead. =20 +Short-form boolean options (since 5.2) +'''''''''''''''''''''''''''''''''''''' + +Boolean options such as ``share=3Don``/``share=3Doff`` can be written +in short form as ``share`` and ``noshare``. This is deprecated +and will cause a warning. =20 QEMU Machine Protocol (QMP) commands ------------------------------------ diff --git a/tests/test-qemu-opts.c b/tests/test-qemu-opts.c index 2aab831d10..8bbb17b1c7 100644 --- a/tests/test-qemu-opts.c +++ b/tests/test-qemu-opts.c @@ -515,7 +515,7 @@ static void test_opts_parse(void) error_free_or_abort(&err); g_assert(!opts); =20 - /* Implied value */ + /* Implied value (qemu_opts_parse warns but accepts it) */ opts =3D qemu_opts_parse(&opts_list_03, "an,noaus,noaus=3D", false, &error_abort); g_assert_cmpuint(opts_count(opts), =3D=3D, 3); diff --git a/util/qemu-option.c b/util/qemu-option.c index 5f27d4369d..40564a12eb 100644 --- a/util/qemu-option.c +++ b/util/qemu-option.c @@ -756,10 +756,12 @@ void qemu_opts_print(QemuOpts *opts, const char *sepa= rator) =20 static const char *get_opt_name_value(const char *params, const char *firstname, + bool warn_on_flag, bool *help_wanted, char **name, char **value) { const char *p; + const char *prefix =3D ""; size_t len; bool is_help =3D false; =20 @@ -776,10 +778,15 @@ static const char *get_opt_name_value(const char *par= ams, if (strncmp(*name, "no", 2) =3D=3D 0) { memmove(*name, *name + 2, strlen(*name + 2) + 1); *value =3D g_strdup("off"); + prefix =3D "no"; } else { *value =3D g_strdup("on"); is_help =3D is_help_option(*name); } + if (!is_help && warn_on_flag) { + warn_report("short-form boolean option '%s%s' deprecated",= prefix, *name); + error_printf("Please use %s=3D%s instead\n", *name, *value= ); + } } } else { /* found "foo=3Dbar,more" */ @@ -801,14 +808,14 @@ static const char *get_opt_name_value(const char *par= ams, =20 static bool opts_do_parse(QemuOpts *opts, const char *params, const char *firstname, bool prepend, - bool *help_wanted, Error **errp) + bool warn_on_flag, bool *help_wanted, Error **er= rp) { char *option, *value; const char *p; QemuOpt *opt; =20 for (p =3D params; *p;) { - p =3D get_opt_name_value(p, firstname, help_wanted, &option, &valu= e); + p =3D get_opt_name_value(p, firstname, warn_on_flag, help_wanted, = &option, &value); if (help_wanted && *help_wanted) { g_free(option); g_free(value); @@ -839,7 +846,7 @@ static char *opts_parse_id(const char *params) char *name, *value; =20 for (p =3D params; *p;) { - p =3D get_opt_name_value(p, NULL, NULL, &name, &value); + p =3D get_opt_name_value(p, NULL, false, NULL, &name, &value); if (!strcmp(name, "id")) { g_free(name); return value; @@ -858,7 +865,7 @@ bool has_help_option(const char *params) bool ret =3D false; =20 for (p =3D params; *p;) { - p =3D get_opt_name_value(p, NULL, &ret, &name, &value); + p =3D get_opt_name_value(p, NULL, false, &ret, &name, &value); g_free(name); g_free(value); if (ret) { @@ -878,12 +885,12 @@ bool has_help_option(const char *params) bool qemu_opts_do_parse(QemuOpts *opts, const char *params, const char *firstname, Error **errp) { - return opts_do_parse(opts, params, firstname, false, NULL, errp); + return opts_do_parse(opts, params, firstname, false, false, NULL, errp= ); } =20 static QemuOpts *opts_parse(QemuOptsList *list, const char *params, bool permit_abbrev, bool defaults, - bool *help_wanted, Error **errp) + bool warn_on_flag, bool *help_wanted, Error **= errp) { const char *firstname; char *id =3D opts_parse_id(params); @@ -906,8 +913,8 @@ static QemuOpts *opts_parse(QemuOptsList *list, const c= har *params, return NULL; } =20 - if (!opts_do_parse(opts, params, firstname, defaults, help_wanted, - errp)) { + if (!opts_do_parse(opts, params, firstname, defaults, + warn_on_flag, help_wanted, errp)) { qemu_opts_del(opts); return NULL; } @@ -925,7 +932,7 @@ static QemuOpts *opts_parse(QemuOptsList *list, const c= har *params, QemuOpts *qemu_opts_parse(QemuOptsList *list, const char *params, bool permit_abbrev, Error **errp) { - return opts_parse(list, params, permit_abbrev, false, NULL, errp); + return opts_parse(list, params, permit_abbrev, false, false, NULL, err= p); } =20 /** @@ -943,7 +950,7 @@ QemuOpts *qemu_opts_parse_noisily(QemuOptsList *list, c= onst char *params, QemuOpts *opts; bool help_wanted =3D false; =20 - opts =3D opts_parse(list, params, permit_abbrev, false, + opts =3D opts_parse(list, params, permit_abbrev, false, true, opts_accepts_any(list) ? NULL : &help_wanted, &err); if (!opts) { @@ -962,7 +969,7 @@ void qemu_opts_set_defaults(QemuOptsList *list, const c= har *params, { QemuOpts *opts; =20 - opts =3D opts_parse(list, params, permit_abbrev, true, NULL, NULL); + opts =3D opts_parse(list, params, permit_abbrev, true, false, NULL, NU= LL); assert(opts); } =20 --=20 2.26.2 From nobody Sun Apr 28 19:39:16 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1610988554; cv=none; d=zohomail.com; s=zohoarc; b=OCPnBqC9jPg4eIboaa/T7cnlkM3yASh3XeiL6DrjC5bCcVjXVJ/HMn00qSGvkD+V/i4Jl3gY0Dac531uc91zpwojA1Sm8lYNEhlNXvmTMFqoZqEeVFnTtn3HkMwJw8DIqEe++bXtsVQu6H7AJmKxXH7oa+lXYPhiq7Evmc8Wh/0= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1610988554; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=noy79EvYM/u0kxF7Cga+UjabI3ZZskOaA4kQSysyXuk=; b=am7ekqY6BpzHnBmwyOmDHABDSOwYupFPKtaSeSkako7U9ySv5K8aCgTsDJmIyfKBDEq36/i0PS5jDgIJmquDB1bklqQpmbk+C6iVh23Cdk01QsE1WZfuy3FqV49byfOkHTDUgLHJ02s8/fv20ICXGcgbv0FBj+RH38gwQGoZfNY= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 16109885546617.085933403883928; Mon, 18 Jan 2021 08:49:14 -0800 (PST) Received: from localhost ([::1]:38274 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1l1XiL-0007yn-IP for importer@patchew.org; Mon, 18 Jan 2021 11:49:13 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:34820) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1l1XRB-0002Gw-N5 for qemu-devel@nongnu.org; Mon, 18 Jan 2021 11:31:29 -0500 Received: from us-smtp-delivery-124.mimecast.com ([63.128.21.124]:22783) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.90_1) (envelope-from ) id 1l1XR7-0001SI-Fq for qemu-devel@nongnu.org; Mon, 18 Jan 2021 11:31:28 -0500 Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-358-nCLM8egvP1WVz0yZ1qgU3g-1; Mon, 18 Jan 2021 11:31:23 -0500 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.phx2.redhat.com [10.5.11.16]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 37F8D107ACF5 for ; Mon, 18 Jan 2021 16:31:22 +0000 (UTC) Received: from virtlab701.virt.lab.eng.bos.redhat.com (virtlab701.virt.lab.eng.bos.redhat.com [10.19.152.228]) by smtp.corp.redhat.com (Postfix) with ESMTP id B915D1820E; Mon, 18 Jan 2021 16:31:21 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1610987484; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=noy79EvYM/u0kxF7Cga+UjabI3ZZskOaA4kQSysyXuk=; b=G6S2XbTzySH2QHcaRJ9O17zIodEXj9D/c3BUFMEuOYIlvfZ4CMDLogritg+YRJrTKK0Qwu yOXfIeS4YonknhW0KxSmhuTLUK08WZGeYgEyjKRiTjMJJc84l5I9NtpxteI8Qdf5hqSaPR 6BpsbWqAKAO8svtKL3y6y/1lIZBDQh0= X-MC-Unique: nCLM8egvP1WVz0yZ1qgU3g-1 From: Paolo Bonzini To: qemu-devel@nongnu.org Subject: [PATCH 04/25] keyval: accept escaped commas in implied option Date: Mon, 18 Jan 2021 11:30:52 -0500 Message-Id: <20210118163113.780171-5-pbonzini@redhat.com> In-Reply-To: <20210118163113.780171-1-pbonzini@redhat.com> References: <20210118163113.780171-1-pbonzini@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.16 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=pbonzini@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=63.128.21.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -29 X-Spam_score: -3.0 X-Spam_bar: --- X-Spam_report: (-3.0 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.175, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H4=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, imammedo@redhat.com, armbru@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @redhat.com) Content-Type: text/plain; charset="utf-8" This is used with the weirdly-named device "SUNFD,fdtwo": $ qemu-system-sparc -device SUNW,,fdtwo,help SUNW,fdtwo options: drive=3D - Node name or ID of a block device to use as = a backend fallback=3D - FDC drive type, 144/288/120/none/auto (defa= ult: "144") ... Therefore, accepting it is a preparatory step towards keyval-ifying -device and the device_add monitor command. In general, however, this unexpected wart of the keyval syntax leads to suboptimal errors compared to QemuOpts: $ ./qemu-system-x86_64 -object foo,,bar,id=3Dobj qemu-system-x86_64: -object foo,,bar,id=3Dobj: invalid object type: foo,b= ar $ storage-daemon/qemu-storage-daemon --object foo,,bar,id=3Dobj qemu-storage-daemon: Invalid parameter '' To implement this, the flow of the parser is changed to first unescape everything up to the next comma or equal sign. This is done in a new function keyval_fetch_string for both the key and value part. Keys therefore are now parsed in unescaped form, but this makes no difference in practice because a comma is an invalid character for a QAPI name. Thus keys with a comma in them are rejected anyway, as demonstrated by the new testcase. As a side effect of the new code, parse errors are slightly improved as well: "Invalid parameter ''" becomes "Expected parameter before '=3D'" when keyval is fed a string starting with an equal sign. The slightly baroque interface of keyval_fetch_string lets me keep the key parsing loop mostly untouched. It is simplified in the next patch, however. Signed-off-by: Paolo Bonzini --- include/qemu/help_option.h | 11 --- tests/test-keyval.c | 21 ++++-- util/keyval.c | 145 ++++++++++++++++++++----------------- 3 files changed, 92 insertions(+), 85 deletions(-) diff --git a/include/qemu/help_option.h b/include/qemu/help_option.h index ca6389a154..328d2a89fd 100644 --- a/include/qemu/help_option.h +++ b/include/qemu/help_option.h @@ -19,15 +19,4 @@ static inline bool is_help_option(const char *s) return !strcmp(s, "?") || !strcmp(s, "help"); } =20 -static inline int starts_with_help_option(const char *s) -{ - if (*s =3D=3D '?') { - return 1; - } - if (g_str_has_prefix(s, "help")) { - return 4; - } - return 0; -} - #endif diff --git a/tests/test-keyval.c b/tests/test-keyval.c index ee927fe4e4..19f664f535 100644 --- a/tests/test-keyval.c +++ b/tests/test-keyval.c @@ -89,6 +89,11 @@ static void test_keyval_parse(void) error_free_or_abort(&err); g_assert(!qdict); =20 + /* Keys must be QAPI identifiers */ + qdict =3D keyval_parse("weird,,=3Dkey", NULL, NULL, &err); + error_free_or_abort(&err); + g_assert(!qdict); + /* Multiple keys, last one wins */ qdict =3D keyval_parse("a=3D1,b=3D2,,x,a=3D3", NULL, NULL, &error_abor= t); g_assert_cmpuint(qdict_size(qdict), =3D=3D, 2); @@ -178,15 +183,15 @@ static void test_keyval_parse(void) error_free_or_abort(&err); g_assert(!qdict); =20 - /* Likewise (qemu_opts_parse(): implied key with comma value) */ - qdict =3D keyval_parse(",,,a=3D1", "implied", NULL, &err); - error_free_or_abort(&err); - g_assert(!qdict); + /* Implied key's value can have a comma */ + qdict =3D keyval_parse(",,,a=3D1", "implied", NULL, &error_abort); + g_assert_cmpstr(qdict_get_try_str(qdict, "implied"), =3D=3D, ","); + g_assert_cmpstr(qdict_get_try_str(qdict, "a"), =3D=3D, "1"); + qobject_unref(qdict); =20 - /* Implied key's value can't have comma (qemu_opts_parse(): it can) */ - qdict =3D keyval_parse("val,,ue", "implied", NULL, &err); - error_free_or_abort(&err); - g_assert(!qdict); + qdict =3D keyval_parse("val,,ue", "implied", NULL, &error_abort); + g_assert_cmpstr(qdict_get_try_str(qdict, "implied"), =3D=3D, "val,ue"); + qobject_unref(qdict); =20 /* Empty key is not an implied key */ qdict =3D keyval_parse("=3Dval", "implied", NULL, &err); diff --git a/util/keyval.c b/util/keyval.c index be34928813..eb9b9c55ec 100644 --- a/util/keyval.c +++ b/util/keyval.c @@ -16,8 +16,8 @@ * key-vals =3D [ key-val { ',' key-val } [ ',' ] ] * key-val =3D key '=3D' val | help * key =3D key-fragment { '.' key-fragment } - * key-fragment =3D / [^=3D,.]+ / - * val =3D { / [^,]+ / | ',,' } + * key-fragment =3D { / [^=3D,.] / | ',,' } + * val =3D { / [^,] / | ',,' } * help =3D 'help' | '?' * * Semantics defined by reduction to JSON: @@ -78,13 +78,13 @@ * Alternative syntax for use with an implied key: * * key-vals =3D [ key-val-1st { ',' key-val } [ ',' ] ] - * key-val-1st =3D val-no-key | key-val - * val-no-key =3D / [^=3D,]+ / - help + * key-val-1st =3D (val-no-key - help) | key-val + * val-no-key =3D { / [^=3D,] / | ',,' } * * where val-no-key is syntactic sugar for implied-key=3Dval-no-key. * - * Note that you can't use the sugared form when the value contains - * '=3D' or ','. + * Note that you can't use the sugared form when the value is empty + * or contains '=3D'. */ =20 #include "qemu/osdep.h" @@ -141,7 +141,7 @@ static int key_to_index(const char *key, const char **e= nd) * On failure, store an error through @errp and return NULL. */ static QObject *keyval_parse_put(QDict *cur, - const char *key_in_cur, QString *value, + const char *key_in_cur, const char *value, const char *key, const char *key_cursor, Error **errp) { @@ -152,20 +152,56 @@ static QObject *keyval_parse_put(QDict *cur, if (qobject_type(old) !=3D (value ? QTYPE_QSTRING : QTYPE_QDICT)) { error_setg(errp, "Parameters '%.*s.*' used inconsistently", (int)(key_cursor - key), key); - qobject_unref(value); return NULL; } if (!value) { return old; /* already QDict, do nothing */ } - new =3D QOBJECT(value); /* replacement */ - } else { - new =3D value ? QOBJECT(value) : QOBJECT(qdict_new()); } + new =3D value ? QOBJECT(qstring_from_str(value)) : QOBJECT(qdict_new()= ); qdict_put_obj(cur, key_in_cur, new); return new; } =20 +/* + * Parse and unescape the string (key or value) pointed to by @start, + * stopping at a single comma or if @key is true an equal sign. + * The string is unescaped and NUL-terminated in place. + * + * On return: + * - either NUL or the separator (comma or equal sign) is returned. + * - the length of the string is stored in @len. + * - @start is advanced to either the NUL or the first character past the + * separator. + */ +static char keyval_fetch_string(char **start, size_t *len, bool key) +{ + char sep; + char *p, *unescaped; + p =3D unescaped =3D *start; + for (;;) { + sep =3D *p; + if (!sep) { + break; + } + if (key && sep =3D=3D '=3D') { + ++p; + break; + } + if (sep =3D=3D ',') { + if (*++p !=3D ',') { + break; + } + } + *unescaped++ =3D *p++; + } + + *unescaped =3D 0; + *len =3D unescaped - *start; + *start =3D p; + return sep; +} + /* * Parse one parameter from @params. * @@ -179,35 +215,42 @@ static QObject *keyval_parse_put(QDict *cur, * On success, return a pointer to the next parameter, or else to '\0'. * On failure, return NULL. */ -static const char *keyval_parse_one(QDict *qdict, const char *params, - const char *implied_key, bool *help, - Error **errp) +static char *keyval_parse_one(QDict *qdict, char *params, + const char *implied_key, bool *help, + Error **errp) { - const char *key, *key_end, *val_end, *s, *end; + const char *key, *key_end, *s, *end; + const char *val =3D NULL; + char sep; size_t len; char key_in_cur[128]; QDict *cur; int ret; QObject *next; - GString *val; =20 key =3D params; - val_end =3D NULL; - len =3D strcspn(params, "=3D,"); - if (len && key[len] !=3D '=3D') { - if (starts_with_help_option(key) =3D=3D len) { + sep =3D keyval_fetch_string(¶ms, &len, true); + if (!len) { + if (sep) { + error_setg(errp, "Expected parameter before '%c%s'", sep, para= ms); + } else { + error_setg(errp, "Expected parameter at end of string"); + } + return NULL; + } + if (sep !=3D '=3D') { + if (is_help_option(key)) { *help =3D true; - s =3D key + len; - if (*s =3D=3D ',') { - s++; - } - return s; + return params; } if (implied_key) { /* Desugar implied key */ + val =3D key; key =3D implied_key; - val_end =3D params + len; len =3D strlen(implied_key); + } else { + error_setg(errp, "No implicit parameter name for value '%s'", = key); + return NULL; } } key_end =3D key + len; @@ -218,7 +261,7 @@ static const char *keyval_parse_one(QDict *qdict, const= char *params, */ cur =3D qdict; s =3D key; - for (;;) { + do { /* Want a key index (unless it's first) or a QAPI name */ if (s !=3D key && key_to_index(s, &end) >=3D 0) { len =3D end - s; @@ -254,47 +297,16 @@ static const char *keyval_parse_one(QDict *qdict, con= st char *params, memcpy(key_in_cur, s, len); key_in_cur[len] =3D 0; s +=3D len; + } while (*s++ =3D=3D '.'); =20 - if (*s !=3D '.') { - break; - } - s++; - } - - if (key =3D=3D implied_key) { - assert(!*s); - val =3D g_string_new_len(params, val_end - params); - s =3D val_end; - if (*s =3D=3D ',') { - s++; - } - } else { - if (*s !=3D '=3D') { - error_setg(errp, "Expected '=3D' after parameter '%.*s'", - (int)(s - key), key); - return NULL; - } - s++; - - val =3D g_string_new(NULL); - for (;;) { - if (!*s) { - break; - } else if (*s =3D=3D ',') { - s++; - if (*s !=3D ',') { - break; - } - } - g_string_append_c(val, *s++); - } + if (key !=3D implied_key) { + val =3D params; + keyval_fetch_string(¶ms, &len, false); } - - if (!keyval_parse_put(cur, key_in_cur, qstring_from_gstring(val), - key, key_end, errp)) { + if (!keyval_parse_put(cur, key_in_cur, val, key, key_end, errp)) { return NULL; } - return s; + return params; } =20 static char *reassemble_key(GSList *key) @@ -439,10 +451,11 @@ QDict *keyval_parse(const char *params, const char *i= mplied_key, { QDict *qdict =3D qdict_new(); QObject *listified; - const char *s; + g_autofree char *dup; + char *s; bool help =3D false; =20 - s =3D params; + s =3D dup =3D g_strdup(params); while (*s) { s =3D keyval_parse_one(qdict, s, implied_key, &help, errp); if (!s) { --=20 2.26.2 From nobody Sun Apr 28 19:39:16 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1610988851; cv=none; d=zohomail.com; s=zohoarc; b=Sd7SCwdSPcUuoZPRYGkumcn5UvWxkMfH6CrwTDOmWBZntGh+gEN6VMFfkc+MflbC+sV1wI0XOu3uzc7RmgIW3CPRDo/5MPPBoU17eSaqohTe/AlkmahSaWQOXqjRpI9EYU6RyI7rtW8Pkgo446zgBqu7BZ2mMPvqTtiRHUjgi2I= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1610988851; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=w/ft4yHW6Gu6rk+/3kyhPjUQ5KEBud0S4dG0X/WbxI0=; b=SnoABHDq93/OyVatiLM+Iu0KCFBJDIqj46av1uV0mZr93PbXNJ8QemcZWw6sOsibyILbCZ5AJvl2RPpgueznjIXOSz4EFfqKvNNswEUuBQNiy0cahK5+Os07LZ8Dv4VJrMc+E3UsrYbivv1PDp4vo000kZ8d49pfv3Tk8g8lHiU= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1610988851402175.05978410285513; Mon, 18 Jan 2021 08:54:11 -0800 (PST) Received: from localhost ([::1]:46852 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1l1Xn8-0003Sw-C2 for importer@patchew.org; Mon, 18 Jan 2021 11:54:10 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:34828) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1l1XRD-0002Hg-Bd for qemu-devel@nongnu.org; Mon, 18 Jan 2021 11:31:31 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]:59376) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.90_1) (envelope-from ) id 1l1XRA-0001SY-NA for qemu-devel@nongnu.org; Mon, 18 Jan 2021 11:31:31 -0500 Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-2-06TKiUWDO0u0XA_5leS1Uw-1; Mon, 18 Jan 2021 11:31:23 -0500 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.phx2.redhat.com [10.5.11.16]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id CC401EC1A4 for ; Mon, 18 Jan 2021 16:31:22 +0000 (UTC) Received: from virtlab701.virt.lab.eng.bos.redhat.com (virtlab701.virt.lab.eng.bos.redhat.com [10.19.152.228]) by smtp.corp.redhat.com (Postfix) with ESMTP id 58BE817B0B; Mon, 18 Jan 2021 16:31:22 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1610987487; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=w/ft4yHW6Gu6rk+/3kyhPjUQ5KEBud0S4dG0X/WbxI0=; b=KLzpRL6Nsog/YTphToc9CXKLkfuKgbv7AABhfFElrzjdSp27ZFoIbmFd17szVLG84oA4Ls nulGhWy6JA3IqC7cxuXi5zzi3p5DyHPVV/i6uDlRRvNnX5tmuYT+cuZJ4HaoM8k0NTPWJm rorZGzglYFprkmhPGyaw7zxgfizi2hc= X-MC-Unique: 06TKiUWDO0u0XA_5leS1Uw-1 From: Paolo Bonzini To: qemu-devel@nongnu.org Subject: [PATCH 05/25] keyval: simplify keyval_parse_one Date: Mon, 18 Jan 2021 11:30:53 -0500 Message-Id: <20210118163113.780171-6-pbonzini@redhat.com> In-Reply-To: <20210118163113.780171-1-pbonzini@redhat.com> References: <20210118163113.780171-1-pbonzini@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.16 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=pbonzini@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=170.10.133.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -22 X-Spam_score: -2.3 X-Spam_bar: -- X-Spam_report: (-2.3 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.175, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, imammedo@redhat.com, armbru@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @redhat.com) Content-Type: text/plain; charset="utf-8" Now that the key is NULL terminated, we can remove some of the contortions that were done to operate on possibly '=3D'-terminated strings in keyval_parse_one. Signed-off-by: Paolo Bonzini --- util/keyval.c | 27 ++++++++++----------------- 1 file changed, 10 insertions(+), 17 deletions(-) diff --git a/util/keyval.c b/util/keyval.c index eb9b9c55ec..e7f708cd1e 100644 --- a/util/keyval.c +++ b/util/keyval.c @@ -170,11 +170,10 @@ static QObject *keyval_parse_put(QDict *cur, * * On return: * - either NUL or the separator (comma or equal sign) is returned. - * - the length of the string is stored in @len. * - @start is advanced to either the NUL or the first character past the * separator. */ -static char keyval_fetch_string(char **start, size_t *len, bool key) +static char keyval_fetch_string(char **start, bool key) { char sep; char *p, *unescaped; @@ -197,7 +196,6 @@ static char keyval_fetch_string(char **start, size_t *l= en, bool key) } =20 *unescaped =3D 0; - *len =3D unescaped - *start; *start =3D p; return sep; } @@ -219,7 +217,7 @@ static char *keyval_parse_one(QDict *qdict, char *param= s, const char *implied_key, bool *help, Error **errp) { - const char *key, *key_end, *s, *end; + const char *key, *s, *end; const char *val =3D NULL; char sep; size_t len; @@ -229,8 +227,8 @@ static char *keyval_parse_one(QDict *qdict, char *param= s, QObject *next; =20 key =3D params; - sep =3D keyval_fetch_string(¶ms, &len, true); - if (!len) { + sep =3D keyval_fetch_string(¶ms, true); + if (!*key) { if (sep) { error_setg(errp, "Expected parameter before '%c%s'", sep, para= ms); } else { @@ -247,13 +245,11 @@ static char *keyval_parse_one(QDict *qdict, char *par= ams, /* Desugar implied key */ val =3D key; key =3D implied_key; - len =3D strlen(implied_key); } else { error_setg(errp, "No implicit parameter name for value '%s'", = key); return NULL; } } - key_end =3D key + len; =20 /* * Loop over key fragments: @s points to current fragment, it @@ -269,24 +265,21 @@ static char *keyval_parse_one(QDict *qdict, char *par= ams, ret =3D parse_qapi_name(s, false); len =3D ret < 0 ? 0 : ret; } - assert(s + len <=3D key_end); - if (!len || (s + len < key_end && s[len] !=3D '.')) { + if (!len || (s[len] !=3D '\0' && s[len] !=3D '.')) { assert(key !=3D implied_key); - error_setg(errp, "Invalid parameter '%.*s'", - (int)(key_end - key), key); + error_setg(errp, "Invalid parameter '%s'", key); return NULL; } if (len >=3D sizeof(key_in_cur)) { assert(key !=3D implied_key); error_setg(errp, "Parameter%s '%.*s' is too long", - s !=3D key || s + len !=3D key_end ? " fragment" : = "", + s !=3D key || s[len] =3D=3D '.' ? " fragment" : "", (int)len, s); return NULL; } =20 if (s !=3D key) { - next =3D keyval_parse_put(cur, key_in_cur, NULL, - key, s - 1, errp); + next =3D keyval_parse_put(cur, key_in_cur, NULL, key, s - 1, e= rrp); if (!next) { return NULL; } @@ -301,9 +294,9 @@ static char *keyval_parse_one(QDict *qdict, char *param= s, =20 if (key !=3D implied_key) { val =3D params; - keyval_fetch_string(¶ms, &len, false); + keyval_fetch_string(¶ms, false); } - if (!keyval_parse_put(cur, key_in_cur, val, key, key_end, errp)) { + if (!keyval_parse_put(cur, key_in_cur, val, key, s - 1, errp)) { return NULL; } return params; --=20 2.26.2 From nobody Sun Apr 28 19:39:16 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1610989202; cv=none; d=zohomail.com; s=zohoarc; b=YCtipk8h4XdVHdZmbPELZjq+wO24Yynh9a+U3yjaCOnvyYukN25lNzkU/hpzzm2r6PYtTPTQED/MhRap4rmCy+O8ttLyapO53ZVeKX1riNgk3XdqxnyGjWyUAwzs0AUOefkgRH6caeuxCGU6YuN4ViItXFPT3GeGbJebK/pWxno= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1610989202; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=uiS6KOmd7H1sPc3gbqBmKtrc6fLRgZnUjSZLjTWXsJk=; b=eafPlAsWUqrhJNH8CeMe0CSnm/4uVjVbQg7XkKzuBaEUNgPKOPZLHdwH0AUcDH1CAHSBFpR/tdsYwGmV1wcMwmscrePQOJhJgQ1srxoU+OmLfjOMQnRgLgB1SIw1CmBDG0eziP/4BXjLhMeUQJwbQ6V4Kx/jjh3Yw9EeQB5xjTw= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1610989202375480.38531245383285; Mon, 18 Jan 2021 09:00:02 -0800 (PST) Received: from localhost ([::1]:35458 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1l1Xsn-0002K9-9E for importer@patchew.org; Mon, 18 Jan 2021 12:00:01 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:34972) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1l1XRN-0002NA-BG for qemu-devel@nongnu.org; Mon, 18 Jan 2021 11:31:42 -0500 Received: from us-smtp-delivery-124.mimecast.com ([63.128.21.124]:39960) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.90_1) (envelope-from ) id 1l1XRF-0001US-7P for qemu-devel@nongnu.org; Mon, 18 Jan 2021 11:31:41 -0500 Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-476-k9fVbDcEPLyprG59gsv86g-1; Mon, 18 Jan 2021 11:31:29 -0500 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.phx2.redhat.com [10.5.11.16]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 8543584A5E4 for ; Mon, 18 Jan 2021 16:31:28 +0000 (UTC) Received: from virtlab701.virt.lab.eng.bos.redhat.com (virtlab701.virt.lab.eng.bos.redhat.com [10.19.152.228]) by smtp.corp.redhat.com (Postfix) with ESMTP id EC1B217B0B; Mon, 18 Jan 2021 16:31:22 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1610987492; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=uiS6KOmd7H1sPc3gbqBmKtrc6fLRgZnUjSZLjTWXsJk=; b=MAxPkgDBJVqO/11MYWa29YisWVe6Qm84xYQ1Q8NI2hf2tNRbi06c1pT6m7qeGf5lMKCEUu 2poyfDIFw/8OMKDa2nTuCqmZuhB87JeBtE2H44ME3NVdU4vSIVSu6C1x3GEZAYTWfc4ZEJ wueTeMi2K1mx2jvJZL8N7hLujxxR67o= X-MC-Unique: k9fVbDcEPLyprG59gsv86g-1 From: Paolo Bonzini To: qemu-devel@nongnu.org Subject: [PATCH 06/25] tests: convert check-qom-proplist to keyval Date: Mon, 18 Jan 2021 11:30:54 -0500 Message-Id: <20210118163113.780171-7-pbonzini@redhat.com> In-Reply-To: <20210118163113.780171-1-pbonzini@redhat.com> References: <20210118163113.780171-1-pbonzini@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.16 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=pbonzini@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=63.128.21.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -29 X-Spam_score: -3.0 X-Spam_bar: --- X-Spam_report: (-3.0 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.175, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H4=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, imammedo@redhat.com, armbru@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @redhat.com) Content-Type: text/plain; charset="utf-8" The command-line creation test is using QemuOpts. Switch it to keyval, since all the -object command line options will follow qemu-storage-daemon and do the same. Signed-off-by: Paolo Bonzini --- tests/check-qom-proplist.c | 58 +++++++++++++++++++++++++------------- 1 file changed, 38 insertions(+), 20 deletions(-) diff --git a/tests/check-qom-proplist.c b/tests/check-qom-proplist.c index 1b76581980..8dba26fb3c 100644 --- a/tests/check-qom-proplist.c +++ b/tests/check-qom-proplist.c @@ -21,6 +21,8 @@ #include "qemu/osdep.h" =20 #include "qapi/error.h" +#include "qapi/qmp/qdict.h" +#include "qapi/qmp/qobject.h" #include "qom/object.h" #include "qemu/module.h" #include "qemu/option.h" @@ -400,42 +402,58 @@ static void test_dummy_createlist(void) =20 static void test_dummy_createcmdl(void) { - QemuOpts *opts; + QDict *qdict; DummyObject *dobj; Error *err =3D NULL; + bool help; const char *params =3D TYPE_DUMMY \ ",id=3Ddev0," \ "bv=3Dyes,sv=3DHiss hiss hiss,av=3Dplatypus"; =20 - qemu_add_opts(&qemu_object_opts); - opts =3D qemu_opts_parse(&qemu_object_opts, params, true, &err); + qdict =3D keyval_parse(params, "qom-type", &help, &err); g_assert(err =3D=3D NULL); - g_assert(opts); + g_assert(qdict); + g_assert(!help); =20 - dobj =3D DUMMY_OBJECT(user_creatable_add_opts(opts, &err)); + g_assert(user_creatable_add_dict(qdict, true, &err)); g_assert(err =3D=3D NULL); + qobject_unref(qdict); + + dobj =3D DUMMY_OBJECT(object_resolve_path_component(object_get_objects= _root(), + "dev0")); g_assert(dobj); g_assert_cmpstr(dobj->sv, =3D=3D, "Hiss hiss hiss"); g_assert(dobj->bv =3D=3D true); g_assert(dobj->av =3D=3D DUMMY_PLATYPUS); =20 + qdict =3D keyval_parse(params, "qom-type", &help, &err); + g_assert(!user_creatable_add_dict(qdict, true, &err)); + g_assert(err); + g_assert(object_resolve_path_component(object_get_objects_root(), "dev= 0") + =3D=3D OBJECT(dobj)); + qobject_unref(qdict); + error_free(err); + err =3D NULL; + + qdict =3D keyval_parse(params, "qom-type", &help, &err); user_creatable_del("dev0", &error_abort); + g_assert(object_resolve_path_component(object_get_objects_root(), "dev= 0") + =3D=3D NULL); =20 - object_unref(OBJECT(dobj)); - - /* - * cmdline-parsing via qemu_opts_parse() results in a QemuOpts entry - * corresponding to the Object's ID to be added to the QemuOptsList - * for objects. To avoid having this entry conflict with future - * Objects using the same ID (which can happen in cases where - * qemu_opts_parse() is used to parse the object params, such as - * with hmp_object_add() at the time of this comment), we need to - * check for this in user_creatable_del() and remove the QemuOpts if - * it is present. - * - * The below check ensures this works as expected. - */ - g_assert_null(qemu_opts_find(&qemu_object_opts, "dev0")); + g_assert(user_creatable_add_dict(qdict, true, &err)); + g_assert(err =3D=3D NULL); + qobject_unref(qdict); + + dobj =3D DUMMY_OBJECT(object_resolve_path_component(object_get_objects= _root(), + "dev0")); + g_assert(dobj); + g_assert_cmpstr(dobj->sv, =3D=3D, "Hiss hiss hiss"); + g_assert(dobj->bv =3D=3D true); + g_assert(dobj->av =3D=3D DUMMY_PLATYPUS); + g_assert(object_resolve_path_component(object_get_objects_root(), "dev= 0") + =3D=3D OBJECT(dobj)); + + object_unparent(OBJECT(dobj)); } =20 static void test_dummy_badenum(void) --=20 2.26.2 From nobody Sun Apr 28 19:39:16 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1610987902; cv=none; d=zohomail.com; s=zohoarc; b=i3zS5IS8eNUpbUyrqRI5X7RGmLOnSnY82yCZLA3PuLwoPdZT8Ww4GfXmnch8DyXsoU0fPcTtH79YJbOG4xvfYqje/h1yaJT8igzxIvv72zGtmEVBjime91vuIeKo5MIB3Qcc5zO+S2Cyw8kSeeLCem+hgZL+xoy26byhspaU4v0= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1610987902; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=TEAlKqwM+60ep7QN+s9ZMLJy18GtUzwQAfwiX+zsRjs=; b=b7+nBgqDE1eO9CH5dq0zpKX6u9kKvQ0IkMDcGXv0U8K7EOs7q3VUbRlqClpXU+l3+6HQO3Hgx7K63oypdH+uIPKLerphXPJgaUszRINnKpjJ82FVko4PTtopSQQZA1ssaytwvZ9KUhfVdwLdN65jUj5N7xClE+pCSnXGxK1J1XQ= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1610987902588985.3346880298261; Mon, 18 Jan 2021 08:38:22 -0800 (PST) Received: from localhost ([::1]:45488 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1l1XXp-0006aB-HC for importer@patchew.org; Mon, 18 Jan 2021 11:38:21 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:34908) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1l1XRH-0002LX-Qe for qemu-devel@nongnu.org; Mon, 18 Jan 2021 11:31:37 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]:42253) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.90_1) (envelope-from ) id 1l1XRE-0001UN-HR for qemu-devel@nongnu.org; Mon, 18 Jan 2021 11:31:35 -0500 Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-6-KM21l27fPTyUahEtnicPCg-1; Mon, 18 Jan 2021 11:31:30 -0500 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.phx2.redhat.com [10.5.11.16]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 29D398066E8 for ; Mon, 18 Jan 2021 16:31:29 +0000 (UTC) Received: from virtlab701.virt.lab.eng.bos.redhat.com (virtlab701.virt.lab.eng.bos.redhat.com [10.19.152.228]) by smtp.corp.redhat.com (Postfix) with ESMTP id A651517B0B; Mon, 18 Jan 2021 16:31:28 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1610987492; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=TEAlKqwM+60ep7QN+s9ZMLJy18GtUzwQAfwiX+zsRjs=; b=JSlm6TQvy2Aqc2vWoZ1giPKHvW7MuI+iU8UCGjS34Ot4rnAiOlBUhmynVPH4iGDb2EF4dT 03UtBUjH/P+m/DpoNHTcyaQU1hrQr01u150CZY09ncV2N1Y7TR5pcsPl2YJwnR9EdkISLt al5J9Gor3vHqm7VdFOzq9B6MRnprdIo= X-MC-Unique: KM21l27fPTyUahEtnicPCg-1 From: Paolo Bonzini To: qemu-devel@nongnu.org Subject: [PATCH 07/25] keyval: introduce keyval_parse_into Date: Mon, 18 Jan 2021 11:30:55 -0500 Message-Id: <20210118163113.780171-8-pbonzini@redhat.com> In-Reply-To: <20210118163113.780171-1-pbonzini@redhat.com> References: <20210118163113.780171-1-pbonzini@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.16 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=pbonzini@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=170.10.133.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -22 X-Spam_score: -2.3 X-Spam_bar: -- X-Spam_report: (-2.3 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.175, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, imammedo@redhat.com, armbru@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @redhat.com) Content-Type: text/plain; charset="utf-8" Allow parsing multiple keyval sequences into the same dictionary. Signed-off-by: Paolo Bonzini --- include/qemu/option.h | 2 ++ util/keyval.c | 39 ++++++++++++++++++++++++++++++++------- 2 files changed, 34 insertions(+), 7 deletions(-) diff --git a/include/qemu/option.h b/include/qemu/option.h index f73e0dc7d9..092e291c37 100644 --- a/include/qemu/option.h +++ b/include/qemu/option.h @@ -147,6 +147,8 @@ void qemu_opts_print_help(QemuOptsList *list, bool prin= t_caption); void qemu_opts_free(QemuOptsList *list); QemuOptsList *qemu_opts_append(QemuOptsList *dst, QemuOptsList *list); =20 +QDict *keyval_parse_into(QDict *qdict, const char *params, const char *imp= lied_key, + bool *p_help, Error **errp); QDict *keyval_parse(const char *params, const char *implied_key, bool *help, Error **errp); =20 diff --git a/util/keyval.c b/util/keyval.c index e7f708cd1e..1d4ca12129 100644 --- a/util/keyval.c +++ b/util/keyval.c @@ -436,13 +436,12 @@ static QObject *keyval_listify(QDict *cur, GSList *ke= y_of_cur, Error **errp) * If @p_help is not NULL, store whether help is requested there. * If @p_help is NULL and help is requested, fail. * - * On success, return a dictionary of the parsed keys and values. + * On success, return @dict, now filled with the parsed keys and values. * On failure, store an error through @errp and return NULL. */ -QDict *keyval_parse(const char *params, const char *implied_key, - bool *p_help, Error **errp) +QDict *keyval_parse_into(QDict *qdict, const char *params, const char *imp= lied_key, + bool *p_help, Error **errp) { - QDict *qdict =3D qdict_new(); QObject *listified; g_autofree char *dup; char *s; @@ -452,7 +451,6 @@ QDict *keyval_parse(const char *params, const char *imp= lied_key, while (*s) { s =3D keyval_parse_one(qdict, s, implied_key, &help, errp); if (!s) { - qobject_unref(qdict); return NULL; } implied_key =3D NULL; @@ -462,15 +460,42 @@ QDict *keyval_parse(const char *params, const char *i= mplied_key, *p_help =3D help; } else if (help) { error_setg(errp, "Help is not available for this option"); - qobject_unref(qdict); return NULL; } =20 listified =3D keyval_listify(qdict, NULL, errp); if (!listified) { - qobject_unref(qdict); return NULL; } assert(listified =3D=3D QOBJECT(qdict)); return qdict; } + +/* + * Parse @params in QEMU's traditional KEY=3DVALUE,... syntax. + * + * If @implied_key, the first KEY=3D can be omitted. @implied_key is + * implied then, and VALUE can't be empty or contain ',' or '=3D'. + * + * A parameter "help" or "?" without a value isn't added to the + * resulting dictionary, but instead is interpreted as help request. + * All other options are parsed and returned normally so that context + * specific help can be printed. + * + * If @p_help is not NULL, store whether help is requested there. + * If @p_help is NULL and help is requested, fail. + * + * On success, return a dictionary of the parsed keys and values. + * On failure, store an error through @errp and return NULL. + */ +QDict *keyval_parse(const char *params, const char *implied_key, + bool *p_help, Error **errp) +{ + QDict *qdict =3D qdict_new(); + QDict *ret =3D keyval_parse_into(qdict, params, implied_key, p_help, e= rrp); + + if (!ret) { + qobject_unref(qdict); + } + return ret; +} --=20 2.26.2 From nobody Sun Apr 28 19:39:16 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1610988167; cv=none; d=zohomail.com; s=zohoarc; b=h2iXkRxc9ZI/Nl6mdegHq4+3RGeWeRoFj1kyeL38Y0c9N8TFRl/g4rWMmtvIdsKdzBPlgg5kABigFUdZbOlfZbq2jLuJ1TaKOMnUyg5rjHeIMaW5Kf9+3Tw0y2cs7JO1uFJO0eLoj/q0SbY+ATPIgRKnXKA2geUppwMZDl6YkNU= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1610988167; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=kmJyIGDPdWHaMt7OEmKZFXb9XT1fbaCB/fWfKNelDxc=; b=duOY/cZNLKL+cPLeZ4/LkpofcfZcflUq/VJbixdlve8DxrC6J63med/oeAdlkMvJhNq/EJVPPXC1M6yWhBzfGTqJbC48sb45hlQ4cVmwk5XSYwJqEqYxN4t7QpKV2OaWflesQzhjVslN+cp4WZH+qw9iUhewOCBdY/NN/NEm2UE= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1610988167279739.6827371808955; Mon, 18 Jan 2021 08:42:47 -0800 (PST) Received: from localhost ([::1]:55352 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1l1Xc6-00030A-AV for importer@patchew.org; Mon, 18 Jan 2021 11:42:46 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:35028) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1l1XRR-0002OB-3d for qemu-devel@nongnu.org; Mon, 18 Jan 2021 11:31:45 -0500 Received: from us-smtp-delivery-124.mimecast.com ([63.128.21.124]:21597) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.90_1) (envelope-from ) id 1l1XRF-0001UU-B4 for qemu-devel@nongnu.org; Mon, 18 Jan 2021 11:31:43 -0500 Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-482-W-OpiRmWM2iR_uyj-WYB8A-1; Mon, 18 Jan 2021 11:31:30 -0500 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.phx2.redhat.com [10.5.11.16]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id BA9458066E5 for ; Mon, 18 Jan 2021 16:31:29 +0000 (UTC) Received: from virtlab701.virt.lab.eng.bos.redhat.com (virtlab701.virt.lab.eng.bos.redhat.com [10.19.152.228]) by smtp.corp.redhat.com (Postfix) with ESMTP id 48C3F17B0B; Mon, 18 Jan 2021 16:31:29 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1610987492; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=kmJyIGDPdWHaMt7OEmKZFXb9XT1fbaCB/fWfKNelDxc=; b=f9s33qRItgmGUBy7HXjzHKWQVPy0oC+Y+CMyVsH6ZY85r6CkPf+jY07zUmVmF5cB+o0Isz XUWI0B8oDV6U6nbfsd9DVxASDJws5KqBfG2A0GRF/kLnfjN/M48dsgf2TSb/5p+S4iqwy2 NWi0Q/+OA1zM7XNO8kchVsSF7uROrf8= X-MC-Unique: W-OpiRmWM2iR_uyj-WYB8A-1 From: Paolo Bonzini To: qemu-devel@nongnu.org Subject: [PATCH 08/25] hmp: replace "O" parser with keyval Date: Mon, 18 Jan 2021 11:30:56 -0500 Message-Id: <20210118163113.780171-9-pbonzini@redhat.com> In-Reply-To: <20210118163113.780171-1-pbonzini@redhat.com> References: <20210118163113.780171-1-pbonzini@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.16 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=pbonzini@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=63.128.21.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -29 X-Spam_score: -3.0 X-Spam_bar: --- X-Spam_report: (-3.0 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.175, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H4=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, imammedo@redhat.com, armbru@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @redhat.com) Content-Type: text/plain; charset="utf-8" HMP is using QemuOpts to parse free-form commands device_add, netdev_add and object_add. However, none of these need QemuOpts for validation (these three QemuOptsLists are all of the catch-all kind), and keyval is already able to parse into QDict. So use keyval directly, avoiding the detour from string to QemuOpts to QDict. The args_type now stores the implied key. This arguably makes more sense than storing the QemuOptsList name; at least, it _is_ a key that might end up in the arguments QDict. Signed-off-by: Paolo Bonzini --- hmp-commands.hx | 6 +++--- monitor/hmp.c | 20 +++++++++----------- 2 files changed, 12 insertions(+), 14 deletions(-) diff --git a/hmp-commands.hx b/hmp-commands.hx index 73e0832ea1..6ee746b53e 100644 --- a/hmp-commands.hx +++ b/hmp-commands.hx @@ -669,7 +669,7 @@ ERST =20 { .name =3D "device_add", - .args_type =3D "device:O", + .args_type =3D "driver:O", .params =3D "driver[,prop=3Dvalue][,...]", .help =3D "add device, like -device on the command line", .cmd =3D hmp_device_add, @@ -1315,7 +1315,7 @@ ERST =20 { .name =3D "netdev_add", - .args_type =3D "netdev:O", + .args_type =3D "type:O", .params =3D "[user|tap|socket|vde|bridge|hubport|netmap|vhost-= user],id=3Dstr[,prop=3Dvalue][,...]", .help =3D "add host network device", .cmd =3D hmp_netdev_add, @@ -1343,7 +1343,7 @@ ERST =20 { .name =3D "object_add", - .args_type =3D "object:O", + .args_type =3D "qom-type:O", .params =3D "[qom-type=3D]type,id=3Dstr[,prop=3Dvalue][,...]", .help =3D "create QOM object", .cmd =3D hmp_object_add, diff --git a/monitor/hmp.c b/monitor/hmp.c index 6c0b33a0b1..d2cb886da5 100644 --- a/monitor/hmp.c +++ b/monitor/hmp.c @@ -744,13 +744,9 @@ static QDict *monitor_parse_arguments(Monitor *mon, break; case 'O': { - QemuOptsList *opts_list; - QemuOpts *opts; + Error *errp; + bool help; =20 - opts_list =3D qemu_find_opts(key); - if (!opts_list || opts_list->desc->name) { - goto bad_type; - } while (qemu_isspace(*p)) { p++; } @@ -760,12 +756,14 @@ static QDict *monitor_parse_arguments(Monitor *mon, if (get_str(buf, sizeof(buf), &p) < 0) { goto fail; } - opts =3D qemu_opts_parse_noisily(opts_list, buf, true); - if (!opts) { - goto fail; + keyval_parse_into(qdict, buf, key, &help, &errp); + if (help) { + if (qdict_haskey(qdict, key)) { + qdict_put_bool(qdict, "help", true); + } else { + qdict_put_str(qdict, key, "help"); + } } - qemu_opts_to_qdict(opts, qdict); - qemu_opts_del(opts); } break; case '/': --=20 2.26.2 From nobody Sun Apr 28 19:39:16 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1610989009; cv=none; d=zohomail.com; s=zohoarc; b=ItI9+jlx9HTuOeEtXWVW9osG3kSNWL/JgS+jMmVgqJkb5npH2bwqEjdssJRmxrzCBUJBxIqlk+Kx6UUFTAMc4I9G0KhK0SKVgbU9BK5Oa0VD6xa+T2hG0eLLTA4DSI9VH8j0KGiuIjAg+k9BRjSl8YCRkqvKJfYW6Wu6ocnTISk= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1610989009; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=+gHfaZ6j/dvuzR7oX/IMeMfZe+RXSB33GfA3YgC1AY4=; b=Hi37BvzjPZE1+z1lfVH0SMPLPEhpl5zWccQAC1qa30v2cgaGAisWvfzUuDheDrTqmYHjPVyVPWuG/asxl7tghpjtzCcnbslbsfNzMUOpRdp8eH57evEwzR6Psc7BAepjF7RlSulei9dvEAMEPrWOAK7NbGmkWxQ+CtU4SWwM5Jk= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1610989009024725.397162613058; Mon, 18 Jan 2021 08:56:49 -0800 (PST) Received: from localhost ([::1]:55178 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1l1Xpf-00076V-SE for importer@patchew.org; Mon, 18 Jan 2021 11:56:47 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:34930) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1l1XRJ-0002Lv-BQ for qemu-devel@nongnu.org; Mon, 18 Jan 2021 11:31:37 -0500 Received: from us-smtp-delivery-124.mimecast.com ([216.205.24.124]:24938) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.90_1) (envelope-from ) id 1l1XRF-0001Ua-M0 for qemu-devel@nongnu.org; Mon, 18 Jan 2021 11:31:37 -0500 Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-197-PjsIeL9fOpmgulwuLNu3NQ-1; Mon, 18 Jan 2021 11:31:31 -0500 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.phx2.redhat.com [10.5.11.16]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 59A4A190B2A1 for ; Mon, 18 Jan 2021 16:31:30 +0000 (UTC) Received: from virtlab701.virt.lab.eng.bos.redhat.com (virtlab701.virt.lab.eng.bos.redhat.com [10.19.152.228]) by smtp.corp.redhat.com (Postfix) with ESMTP id DB1B71820E; Mon, 18 Jan 2021 16:31:29 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1610987493; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=+gHfaZ6j/dvuzR7oX/IMeMfZe+RXSB33GfA3YgC1AY4=; b=UpG6oLnckxulDezuGSx7dS2M2CnvmFRuQQASR0fbYruIUhIyZjISBMUtF4NZ+f5crdm+jx OKp3vgOIIGt6sMrf8uXJeLo5QXZamYDeDBD6eKH8LCA+avLMGTQ8YLcDZltkjqS1dLhH/e ltcav0PlFdVGkk5QMti2T8udhpaWy8w= X-MC-Unique: PjsIeL9fOpmgulwuLNu3NQ-1 From: Paolo Bonzini To: qemu-devel@nongnu.org Subject: [PATCH 09/25] qom: use qemu_printf to print help for user-creatable objects Date: Mon, 18 Jan 2021 11:30:57 -0500 Message-Id: <20210118163113.780171-10-pbonzini@redhat.com> In-Reply-To: <20210118163113.780171-1-pbonzini@redhat.com> References: <20210118163113.780171-1-pbonzini@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.16 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=pbonzini@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=216.205.24.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -29 X-Spam_score: -3.0 X-Spam_bar: --- X-Spam_report: (-3.0 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.175, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H3=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, imammedo@redhat.com, armbru@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @redhat.com) Content-Type: text/plain; charset="utf-8" This is needed when we add help support for object_add. Signed-off-by: Paolo Bonzini Reviewed-by: Markus Armbruster --- qom/object_interfaces.c | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/qom/object_interfaces.c b/qom/object_interfaces.c index 1e9ad6f08a..6c7bd025dd 100644 --- a/qom/object_interfaces.c +++ b/qom/object_interfaces.c @@ -12,6 +12,7 @@ #include "qemu/option.h" #include "qapi/opts-visitor.h" #include "qemu/config-file.h" +#include "qemu/qemu-print.h" =20 bool user_creatable_complete(UserCreatable *uc, Error **errp) { @@ -214,15 +215,15 @@ char *object_property_help(const char *name, const ch= ar *type, return g_string_free(str, false); } =20 -static void user_creatable_print_types(void) +void user_creatable_print_types(void) { GSList *l, *list; =20 - printf("List of user creatable objects:\n"); + qemu_printf("List of user creatable objects:\n"); list =3D object_class_get_list_sorted(TYPE_USER_CREATABLE, false); for (l =3D list; l !=3D NULL; l =3D l->next) { ObjectClass *oc =3D OBJECT_CLASS(l->data); - printf(" %s\n", object_class_get_name(oc)); + qemu_printf(" %s\n", object_class_get_name(oc)); } g_slist_free(list); } @@ -253,12 +254,12 @@ static bool user_creatable_print_type_properites(cons= t char *type) } g_ptr_array_sort(array, (GCompareFunc)qemu_pstrcmp0); if (array->len > 0) { - printf("%s options:\n", type); + qemu_printf("%s options:\n", type); } else { - printf("There are no options for %s.\n", type); + qemu_printf("There are no options for %s.\n", type); } for (i =3D 0; i < array->len; i++) { - printf("%s\n", (char *)array->pdata[i]); + qemu_printf("%s\n", (char *)array->pdata[i]); } g_ptr_array_set_free_func(array, g_free); g_ptr_array_free(array, true); --=20 2.26.2 From nobody Sun Apr 28 19:39:16 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1610987911; cv=none; d=zohomail.com; s=zohoarc; b=L+MG975hp9t5Rh4A0K+N+8zGw1oK0vofFoAQ0TxH31eWgOEI7v3AkzsiO5w3IToeaiQ17FtVkG3GwTqC2eycRJSCF6mb5WBPKovQhw9mhMZqLNOG0uFkvLeLo021gMOEzo4jN/MFymVpLOBXEbTgdIREY7bJVwIZUAg0WgOlxCo= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1610987911; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=7a51AIiGsbV1vzqxm2tJbIxu/iDyMDz6sfAiTAVaQXg=; b=R24VL0xQ/wTm+x4TWICO4V9GfXIP1zuiOxGBYFvNEkC8ErPZIkOCLHBAASByOCCjd2zlI3+3U3C/dlVVik5RTzsRXimTqBU7oAnayRYMxtUytGJDMWagNqb7HIemMZAjoVEPPb2ZoA0MwqlQsV8siEAY6hNivBnuFUagVno4+UI= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1610987911932867.2324654551488; Mon, 18 Jan 2021 08:38:31 -0800 (PST) Received: from localhost ([::1]:45818 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1l1XXy-0006lr-R1 for importer@patchew.org; Mon, 18 Jan 2021 11:38:30 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:34970) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1l1XRN-0002N3-92 for qemu-devel@nongnu.org; Mon, 18 Jan 2021 11:31:42 -0500 Received: from us-smtp-delivery-124.mimecast.com ([216.205.24.124]:28488) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.90_1) (envelope-from ) id 1l1XRG-0001Un-Pq for qemu-devel@nongnu.org; Mon, 18 Jan 2021 11:31:40 -0500 Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-161-jDXCTsnmM8mifM5ruN8Dfg-1; Mon, 18 Jan 2021 11:31:32 -0500 Received: from smtp.corp.redhat.com (int-mx07.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 59E7B190B2A2 for ; Mon, 18 Jan 2021 16:31:31 +0000 (UTC) Received: from virtlab701.virt.lab.eng.bos.redhat.com (virtlab701.virt.lab.eng.bos.redhat.com [10.19.152.228]) by smtp.corp.redhat.com (Postfix) with ESMTP id D703E10023AE; Mon, 18 Jan 2021 16:31:30 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1610987493; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=7a51AIiGsbV1vzqxm2tJbIxu/iDyMDz6sfAiTAVaQXg=; b=QaGBKK6MgQ4WQasself83m/UkkvBu436s1jkSw4gtjq+m8WwGpMNJ8uOtfnWBJG2X1SIVV 0btbQ5BRLElFvHqBalpfrMREql6R99g2Rmz88tmZffKPjCJ8rUPTHOxzvVoNmHgW3FQKeL GU5qD//XNgAliAgMyp6PVCN1lgTZcBk= X-MC-Unique: jDXCTsnmM8mifM5ruN8Dfg-1 From: Paolo Bonzini To: qemu-devel@nongnu.org Subject: [PATCH 10/25] hmp: special case help options for object_add Date: Mon, 18 Jan 2021 11:30:58 -0500 Message-Id: <20210118163113.780171-11-pbonzini@redhat.com> In-Reply-To: <20210118163113.780171-1-pbonzini@redhat.com> References: <20210118163113.780171-1-pbonzini@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.84 on 10.5.11.22 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=pbonzini@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=216.205.24.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -29 X-Spam_score: -3.0 X-Spam_bar: --- X-Spam_report: (-3.0 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.175, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H3=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, imammedo@redhat.com, armbru@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @redhat.com) Content-Type: text/plain; charset="utf-8" Fix "object_add help" and "object_add TYPE,help". Signed-off-by: Paolo Bonzini --- include/qom/object_interfaces.h | 9 ++++++++- monitor/hmp-cmds.c | 22 ++++++++-------------- qom/object_interfaces.c | 2 +- 3 files changed, 17 insertions(+), 16 deletions(-) diff --git a/include/qom/object_interfaces.h b/include/qom/object_interface= s.h index 07d5cc8832..abb23eaea3 100644 --- a/include/qom/object_interfaces.h +++ b/include/qom/object_interfaces.h @@ -149,6 +149,13 @@ typedef bool (*user_creatable_add_opts_predicate)(cons= t char *type); int user_creatable_add_opts_foreach(void *opaque, QemuOpts *opts, Error **errp); =20 +/** + * user_creatable_print_types: + * + * Prints a list of user-creatable objects to stdout or the monitor. + */ +void user_creatable_print_types(void); + /** * user_creatable_print_help: * @type: the QOM type to be added @@ -174,7 +181,7 @@ bool user_creatable_print_help(const char *type, QemuOp= ts *opts); * no help was requested. It should only be called if we know that help is * requested and it will always print some help. */ -void user_creatable_print_help_from_qdict(QDict *args); +void user_creatable_print_help_from_qdict(const QDict *args); =20 /** * user_creatable_del: diff --git a/monitor/hmp-cmds.c b/monitor/hmp-cmds.c index fd4d77e246..90dd91c6f5 100644 --- a/monitor/hmp-cmds.c +++ b/monitor/hmp-cmds.c @@ -1663,23 +1663,17 @@ void hmp_netdev_del(Monitor *mon, const QDict *qdic= t) void hmp_object_add(Monitor *mon, const QDict *qdict) { Error *err =3D NULL; - QemuOpts *opts; - Object *obj =3D NULL; =20 - opts =3D qemu_opts_from_qdict(qemu_find_opts("object"), qdict, &err); - if (err) { - goto end; + if (is_help_option(qdict_get_str(qdict, "qom-type"))) { + user_creatable_print_types(); + return; } - - obj =3D user_creatable_add_opts(opts, &err); - qemu_opts_del(opts); - -end: - hmp_handle_error(mon, err); - - if (obj) { - object_unref(obj); + if (qdict_haskey(qdict, "help")) { + user_creatable_print_help_from_qdict(qdict); + return; } + user_creatable_add_dict((QDict *)qdict, true, &err); + hmp_handle_error(mon, err); } =20 void hmp_getfd(Monitor *mon, const QDict *qdict) diff --git a/qom/object_interfaces.c b/qom/object_interfaces.c index 6c7bd025dd..97bf88908e 100644 --- a/qom/object_interfaces.c +++ b/qom/object_interfaces.c @@ -280,7 +280,7 @@ bool user_creatable_print_help(const char *type, QemuOp= ts *opts) return false; } =20 -void user_creatable_print_help_from_qdict(QDict *args) +void user_creatable_print_help_from_qdict(const QDict *args) { const char *type =3D qdict_get_try_str(args, "qom-type"); =20 --=20 2.26.2 From nobody Sun Apr 28 19:39:16 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1610987670; cv=none; d=zohomail.com; s=zohoarc; b=LoJ+J0n0zihT9JQdSr0EDhYyXZM3ZQr3IoKU5LXKVd9NMUZ3YE6ycje+eQwHfw/LJxm65epLINGdk2CORX6itqUxQU7BA6DIS3r3b02l/ReJUps+TDyJ4DYTiJDF3kNlJKzqPNJGiY6MZLQyTGvnOmLjuOfZhQcoqxtx/fIpep0= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1610987670; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=6hlZhZNXWJc8nDFw5zGOXLxt5Q7vfiv6Wvtc2nUuAqU=; b=kpiQnzaP/ihxfOmJlcOUZpYv0p+QCiBusLDFFcf6jiPeyVZViZ5Yojb5WaFzriH7ZQ5tD70+DfohCjtKkNJd96MXvUehv/4YdMpuHBzjPjZTX1Led/SLxv+hjo5CHc741zUDsGO/VMxoEogc5JlPKkFyMG6JeEiQLaFGET/hjLk= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1610987670181148.84346873158484; Mon, 18 Jan 2021 08:34:30 -0800 (PST) Received: from localhost ([::1]:39200 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1l1XU5-0003nv-3V for importer@patchew.org; Mon, 18 Jan 2021 11:34:29 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:34952) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1l1XRL-0002Mm-IC for qemu-devel@nongnu.org; Mon, 18 Jan 2021 11:31:41 -0500 Received: from us-smtp-delivery-124.mimecast.com ([216.205.24.124]:54022) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.90_1) (envelope-from ) id 1l1XRH-0001Uy-Fy for qemu-devel@nongnu.org; Mon, 18 Jan 2021 11:31:39 -0500 Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-165-WuMxWptfNFaQyu8R5lgeAg-1; Mon, 18 Jan 2021 11:31:32 -0500 Received: from smtp.corp.redhat.com (int-mx07.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id EEC59800D53 for ; Mon, 18 Jan 2021 16:31:31 +0000 (UTC) Received: from virtlab701.virt.lab.eng.bos.redhat.com (virtlab701.virt.lab.eng.bos.redhat.com [10.19.152.228]) by smtp.corp.redhat.com (Postfix) with ESMTP id 792AD10013C0; Mon, 18 Jan 2021 16:31:31 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1610987494; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=6hlZhZNXWJc8nDFw5zGOXLxt5Q7vfiv6Wvtc2nUuAqU=; b=Hu8nJv7jCebFOxxFxvUMHWSBmrjKVXxUptYio5jYZCEG+ZcM6CTJoRq0o9g+jA+cDVRCpV CECCMFBbIAkFsJ4fr1cKVnJqOh2qrk4zZNvL/P7+iky1TWqgzarF805fjcCOt0nxk+WXJN iZmK9/XztrFpQ4XN9IPNTy6PU/Iw7CI= X-MC-Unique: WuMxWptfNFaQyu8R5lgeAg-1 From: Paolo Bonzini To: qemu-devel@nongnu.org Subject: [PATCH 11/25] remove -writeconfig Date: Mon, 18 Jan 2021 11:30:59 -0500 Message-Id: <20210118163113.780171-12-pbonzini@redhat.com> In-Reply-To: <20210118163113.780171-1-pbonzini@redhat.com> References: <20210118163113.780171-1-pbonzini@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.84 on 10.5.11.22 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=pbonzini@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=216.205.24.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -29 X-Spam_score: -3.0 X-Spam_bar: --- X-Spam_report: (-3.0 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.175, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H3=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, imammedo@redhat.com, armbru@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @redhat.com) Content-Type: text/plain; charset="utf-8" Like -set and -readconfig, it would not really be too hard to extend -writeconfig to parsing mechanisms other than QemuOpts. However, the uses of -writeconfig are substantially more limited, as it is generally easier to write the configuration by hand in the first place. In addition, -writeconfig does not even try to detect cases where it prints incorrect syntax (for example if values have a quote in them, since qemu_config_parse does not support any kind of escaping. Just remove it. Signed-off-by: Paolo Bonzini --- include/qemu/config-file.h | 1 - qemu-options.hx | 13 ++---------- softmmu/vl.c | 19 ----------------- util/qemu-config.c | 42 -------------------------------------- 4 files changed, 2 insertions(+), 73 deletions(-) diff --git a/include/qemu/config-file.h b/include/qemu/config-file.h index 29226107bd..7d26fe3816 100644 --- a/include/qemu/config-file.h +++ b/include/qemu/config-file.h @@ -10,7 +10,6 @@ void qemu_add_opts(QemuOptsList *list); void qemu_add_drive_opts(QemuOptsList *list); int qemu_global_option(const char *str); =20 -void qemu_config_write(FILE *fp); int qemu_config_parse(FILE *fp, QemuOptsList **lists, const char *fname); =20 int qemu_read_config_file(const char *filename); diff --git a/qemu-options.hx b/qemu-options.hx index 62791f56d8..7480b6a03f 100644 --- a/qemu-options.hx +++ b/qemu-options.hx @@ -4301,23 +4301,14 @@ SRST ERST =20 DEF("readconfig", HAS_ARG, QEMU_OPTION_readconfig, - "-readconfig \n", QEMU_ARCH_ALL) + "-readconfig \n" + " read config file\n", QEMU_ARCH_ALL) SRST ``-readconfig file`` Read device configuration from file. This approach is useful when you want to spawn QEMU process with many command line options but you don't want to exceed the command line character limit. ERST -DEF("writeconfig", HAS_ARG, QEMU_OPTION_writeconfig, - "-writeconfig \n" - " read/write config file\n", QEMU_ARCH_ALL) -SRST -``-writeconfig file`` - Write device configuration to file. The file can be either filename - to save command line and device configuration into file or dash - ``-``) character to print the output to stdout. This can be later - used as input file for ``-readconfig`` option. -ERST =20 DEF("no-user-config", 0, QEMU_OPTION_nouserconfig, "-no-user-config\n" diff --git a/softmmu/vl.c b/softmmu/vl.c index 7ddf405d76..d34307bf11 100644 --- a/softmmu/vl.c +++ b/softmmu/vl.c @@ -3337,25 +3337,6 @@ void qemu_init(int argc, char **argv, char **envp) } display_remote++; break; - case QEMU_OPTION_writeconfig: - { - FILE *fp; - if (strcmp(optarg, "-") =3D=3D 0) { - fp =3D stdout; - } else { - fp =3D fopen(optarg, "w"); - if (fp =3D=3D NULL) { - error_report("open %s: %s", optarg, - strerror(errno)); - exit(1); - } - } - qemu_config_write(fp); - if (fp !=3D stdout) { - fclose(fp); - } - break; - } case QEMU_OPTION_qtest: qtest_chrdev =3D optarg; break; diff --git a/util/qemu-config.c b/util/qemu-config.c index e2a700b284..a4a1324c68 100644 --- a/util/qemu-config.c +++ b/util/qemu-config.c @@ -307,48 +307,6 @@ void qemu_add_opts(QemuOptsList *list) abort(); } =20 -struct ConfigWriteData { - QemuOptsList *list; - FILE *fp; -}; - -static int config_write_opt(void *opaque, const char *name, const char *va= lue, - Error **errp) -{ - struct ConfigWriteData *data =3D opaque; - - fprintf(data->fp, " %s =3D \"%s\"\n", name, value); - return 0; -} - -static int config_write_opts(void *opaque, QemuOpts *opts, Error **errp) -{ - struct ConfigWriteData *data =3D opaque; - const char *id =3D qemu_opts_id(opts); - - if (id) { - fprintf(data->fp, "[%s \"%s\"]\n", data->list->name, id); - } else { - fprintf(data->fp, "[%s]\n", data->list->name); - } - qemu_opt_foreach(opts, config_write_opt, data, NULL); - fprintf(data->fp, "\n"); - return 0; -} - -void qemu_config_write(FILE *fp) -{ - struct ConfigWriteData data =3D { .fp =3D fp }; - QemuOptsList **lists =3D vm_config_groups; - int i; - - fprintf(fp, "# qemu config file\n\n"); - for (i =3D 0; lists[i] !=3D NULL; i++) { - data.list =3D lists[i]; - qemu_opts_foreach(data.list, config_write_opts, &data, NULL); - } -} - /* Returns number of config groups on success, -errno on error */ int qemu_config_parse(FILE *fp, QemuOptsList **lists, const char *fname) { --=20 2.26.2 From nobody Sun Apr 28 19:39:16 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1610988705; cv=none; d=zohomail.com; s=zohoarc; b=ahYIljncTbYHEwUX4rR6nx6VQAgVxJgx3Cg6Ok+gIR9uwgkOmd9TwNhF5EC+v9bVblTRUEaSE/hyBlKp2xDWwjMqdSOeIt43b7vaE/bbSVh6Kv+mi6yGzM74pQodbhuVyw4r3wYjyruzzRs6kxoZriigmw9HT9KEloNXkmFv97U= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1610988705; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=lW0TiJdadx8IwKGZP+oSId/5ie9shy1Wn9Gkycwb1GA=; b=hPjwdiDdKOyLdZfq0TpqIWdNJRWuZeIrggjkfTioLSMzwBYp8sWJhVeAleDrwNJuJEyr7vnirouGPo9MMF7n6y5bxxPPFUO0zx1D5JlleiMb2R0VW3O0ZiSclJDSVqSFHYppdaK/sxZdjHq45l8CuuR4/f5grBEE5OwACFqSCwM= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1610988705802579.4906362091958; Mon, 18 Jan 2021 08:51:45 -0800 (PST) Received: from localhost ([::1]:42802 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1l1Xkm-0001Yl-7p for importer@patchew.org; Mon, 18 Jan 2021 11:51:44 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:35072) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1l1XRT-0002R3-Gb for qemu-devel@nongnu.org; Mon, 18 Jan 2021 11:31:47 -0500 Received: from us-smtp-delivery-124.mimecast.com ([63.128.21.124]:40850) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.90_1) (envelope-from ) id 1l1XRI-0001VD-Te for qemu-devel@nongnu.org; Mon, 18 Jan 2021 11:31:47 -0500 Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-258-vWNQ1-RhO06WUs7rKrUzhw-1; Mon, 18 Jan 2021 11:31:33 -0500 Received: from smtp.corp.redhat.com (int-mx07.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 91116190B2A0 for ; Mon, 18 Jan 2021 16:31:32 +0000 (UTC) Received: from virtlab701.virt.lab.eng.bos.redhat.com (virtlab701.virt.lab.eng.bos.redhat.com [10.19.152.228]) by smtp.corp.redhat.com (Postfix) with ESMTP id 1A8C110013C0; Mon, 18 Jan 2021 16:31:32 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1610987495; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=lW0TiJdadx8IwKGZP+oSId/5ie9shy1Wn9Gkycwb1GA=; b=UFsvmOhtuUioy2Gv6bzex+zwErLQaate9LI/alOz8Sad6Y7knw9gAFmj7OBj/QvInnQbFK SyaQSz81tuMwTLcmyebH548qAchg3P00PiBEnxMlrvmfu27p9IvpuGCjmD5K0iz8LbUwSj hV0J/YWVSdhMywg0K6G6Zd2qs3OTpFE= X-MC-Unique: vWNQ1-RhO06WUs7rKrUzhw-1 From: Paolo Bonzini To: qemu-devel@nongnu.org Subject: [PATCH 12/25] qemu-config: add error propagation to qemu_config_parse Date: Mon, 18 Jan 2021 11:31:00 -0500 Message-Id: <20210118163113.780171-13-pbonzini@redhat.com> In-Reply-To: <20210118163113.780171-1-pbonzini@redhat.com> References: <20210118163113.780171-1-pbonzini@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.84 on 10.5.11.22 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=pbonzini@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=63.128.21.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -29 X-Spam_score: -3.0 X-Spam_bar: --- X-Spam_report: (-3.0 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.175, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H4=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, imammedo@redhat.com, armbru@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @redhat.com) Content-Type: text/plain; charset="utf-8" This enables some simplification of vl.c via error_fatal. Signed-off-by: Paolo Bonzini --- block/blkdebug.c | 3 +-- include/qemu/config-file.h | 4 ++-- softmmu/vl.c | 30 ++++++++++++------------------ util/qemu-config.c | 20 ++++++++++---------- 4 files changed, 25 insertions(+), 32 deletions(-) diff --git a/block/blkdebug.c b/block/blkdebug.c index 5fe6172da9..7eaa8a28bf 100644 --- a/block/blkdebug.c +++ b/block/blkdebug.c @@ -279,9 +279,8 @@ static int read_config(BDRVBlkdebugState *s, const char= *filename, return -errno; } =20 - ret =3D qemu_config_parse(f, config_groups, filename); + ret =3D qemu_config_parse(f, config_groups, filename, errp); if (ret < 0) { - error_setg(errp, "Could not parse blkdebug config file"); goto fail; } } diff --git a/include/qemu/config-file.h b/include/qemu/config-file.h index 7d26fe3816..da6f4690b7 100644 --- a/include/qemu/config-file.h +++ b/include/qemu/config-file.h @@ -10,9 +10,9 @@ void qemu_add_opts(QemuOptsList *list); void qemu_add_drive_opts(QemuOptsList *list); int qemu_global_option(const char *str); =20 -int qemu_config_parse(FILE *fp, QemuOptsList **lists, const char *fname); +int qemu_config_parse(FILE *fp, QemuOptsList **lists, const char *fname, E= rror **errp); =20 -int qemu_read_config_file(const char *filename); +int qemu_read_config_file(const char *filename, Error **errp); =20 /* Parse QDict options as a replacement for a config file (allowing multip= le enumerated (0..(n-1)) configuration "sections") */ diff --git a/softmmu/vl.c b/softmmu/vl.c index d34307bf11..d991919155 100644 --- a/softmmu/vl.c +++ b/softmmu/vl.c @@ -2056,17 +2056,20 @@ static int global_init_func(void *opaque, QemuOpts = *opts, Error **errp) return 0; } =20 -static int qemu_read_default_config_file(void) +static void qemu_read_default_config_file(Error **errp) { int ret; + Error *local_err =3D NULL; g_autofree char *file =3D get_relocated_path(CONFIG_QEMU_CONFDIR "/qem= u.conf"); =20 - ret =3D qemu_read_config_file(file); - if (ret < 0 && ret !=3D -ENOENT) { - return ret; + ret =3D qemu_read_config_file(file, &local_err); + if (ret < 0) { + if (ret =3D=3D -ENOENT) { + error_free(local_err); + } else { + error_propagate(errp, local_err); + } } - - return 0; } =20 static int qemu_set_option(const char *str) @@ -2622,9 +2625,7 @@ void qemu_init(int argc, char **argv, char **envp) } =20 if (userconfig) { - if (qemu_read_default_config_file() < 0) { - exit(1); - } + qemu_read_default_config_file(&error_fatal); } =20 /* second pass of option parsing */ @@ -3312,15 +3313,8 @@ void qemu_init(int argc, char **argv, char **envp) qemu_plugin_opt_parse(optarg, &plugin_list); break; case QEMU_OPTION_readconfig: - { - int ret =3D qemu_read_config_file(optarg); - if (ret < 0) { - error_report("read config %s: %s", optarg, - strerror(-ret)); - exit(1); - } - break; - } + qemu_read_config_file(optarg, &error_fatal); + break; case QEMU_OPTION_spice: olist =3D qemu_find_opts_err("spice", NULL); if (!olist) { diff --git a/util/qemu-config.c b/util/qemu-config.c index a4a1324c68..d0629f4960 100644 --- a/util/qemu-config.c +++ b/util/qemu-config.c @@ -308,7 +308,7 @@ void qemu_add_opts(QemuOptsList *list) } =20 /* Returns number of config groups on success, -errno on error */ -int qemu_config_parse(FILE *fp, QemuOptsList **lists, const char *fname) +int qemu_config_parse(FILE *fp, QemuOptsList **lists, const char *fname, E= rror **errp) { char line[1024], group[64], id[64], arg[64], value[1024]; Location loc; @@ -333,7 +333,7 @@ int qemu_config_parse(FILE *fp, QemuOptsList **lists, c= onst char *fname) /* group with id */ list =3D find_list(lists, group, &local_err); if (local_err) { - error_report_err(local_err); + error_propagate(errp, local_err); goto out; } opts =3D qemu_opts_create(list, id, 1, NULL); @@ -344,7 +344,7 @@ int qemu_config_parse(FILE *fp, QemuOptsList **lists, c= onst char *fname) /* group without id */ list =3D find_list(lists, group, &local_err); if (local_err) { - error_report_err(local_err); + error_propagate(errp, local_err); goto out; } opts =3D qemu_opts_create(list, NULL, 0, &error_abort); @@ -356,20 +356,19 @@ int qemu_config_parse(FILE *fp, QemuOptsList **lists,= const char *fname) sscanf(line, " %63s =3D \"\"", arg) =3D=3D 1) { /* arg =3D value */ if (opts =3D=3D NULL) { - error_report("no group defined"); + error_setg(errp, "no group defined"); goto out; } - if (!qemu_opt_set(opts, arg, value, &local_err)) { - error_report_err(local_err); + if (!qemu_opt_set(opts, arg, value, errp)) { goto out; } continue; } - error_report("parse error"); + error_setg(errp, "parse error"); goto out; } if (ferror(fp)) { - error_report("error reading file"); + error_setg(errp, "error reading file"); goto out; } res =3D count; @@ -378,16 +377,17 @@ out: return res; } =20 -int qemu_read_config_file(const char *filename) +int qemu_read_config_file(const char *filename, Error **errp) { FILE *f =3D fopen(filename, "r"); int ret; =20 if (f =3D=3D NULL) { + error_setg_errno(errp, errno, "Cannot read config file %s", filena= me); return -errno; } =20 - ret =3D qemu_config_parse(f, vm_config_groups, filename); + ret =3D qemu_config_parse(f, vm_config_groups, filename, errp); fclose(f); return ret; } --=20 2.26.2 From nobody Sun Apr 28 19:39:16 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1610988904; cv=none; d=zohomail.com; s=zohoarc; b=fkL69k+Ud5Xktw+n3appqDmuHnWX0tZPTfF6uIoOg2BIK1qtSmP7hFNrsKAmTy8KrRSfe1IBBG3l0xBb59ruHBOi4lF+hYYCPD0B7Itr7+RhBn7PW1KLt64Up7AQ/JTyoACIiBncvrp5PFBGzpSqmcZlb1m2XAcZyS8DKwPLO6o= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1610988904; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=bn0aEtSA7/6AIa3yXVYBo0IMB9TDOyxEVD++X/cdsI4=; b=bXLaXAsdYHWxdOoyUfkJSJnPof/ONJ39CGkoV7jF4nMULa/hXx+yvTq/ep6zQ8eh9gXm7/nZKZaHFyOhC1DlC2WC+sR60fuP3+NwWtMB8joTTlnHEvOfOJziGEYr1E9lSxvNDiaBGEL6SrkCs8yJEyaqoy1NPehcaybpUHhRFRM= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1610988904340804.2561992664606; Mon, 18 Jan 2021 08:55:04 -0800 (PST) Received: from localhost ([::1]:51198 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1l1Xnz-0005Jo-0W for importer@patchew.org; Mon, 18 Jan 2021 11:55:03 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:35080) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1l1XRT-0002RZ-NZ for qemu-devel@nongnu.org; Mon, 18 Jan 2021 11:31:47 -0500 Received: from us-smtp-delivery-124.mimecast.com ([216.205.24.124]:46043) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.90_1) (envelope-from ) id 1l1XRJ-0001VM-3M for qemu-devel@nongnu.org; Mon, 18 Jan 2021 11:31:47 -0500 Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-531-deG3aiHZNQ2UVFMN0ndh3A-1; Mon, 18 Jan 2021 11:31:34 -0500 Received: from smtp.corp.redhat.com (int-mx07.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 32CF1107ACE8 for ; Mon, 18 Jan 2021 16:31:33 +0000 (UTC) Received: from virtlab701.virt.lab.eng.bos.redhat.com (virtlab701.virt.lab.eng.bos.redhat.com [10.19.152.228]) by smtp.corp.redhat.com (Postfix) with ESMTP id B18C010013C0; Mon, 18 Jan 2021 16:31:32 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1610987495; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=bn0aEtSA7/6AIa3yXVYBo0IMB9TDOyxEVD++X/cdsI4=; b=f7AtHr6R1Fz0pnK1wp1Xlj06f/F3aRLUo6csX5ueJU5Rooa08uVUx9WH3tCHiW3ceik09S 8hq1wly0x9Nm4Fmp09Nj2PHjG6hFmUFlXkGGjKvKGLi2num3maRtorb09JykzdOfA7M8dF aIGFZdAuA+bUldOHqSgnBfPWNnyHU/Q= X-MC-Unique: deG3aiHZNQ2UVFMN0ndh3A-1 From: Paolo Bonzini To: qemu-devel@nongnu.org Subject: [PATCH 13/25] qemu-option: support accept-any QemuOptsList in qemu_opts_absorb_qdict Date: Mon, 18 Jan 2021 11:31:01 -0500 Message-Id: <20210118163113.780171-14-pbonzini@redhat.com> In-Reply-To: <20210118163113.780171-1-pbonzini@redhat.com> References: <20210118163113.780171-1-pbonzini@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.84 on 10.5.11.22 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=pbonzini@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=216.205.24.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -29 X-Spam_score: -3.0 X-Spam_bar: --- X-Spam_report: (-3.0 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.175, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H3=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, imammedo@redhat.com, armbru@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @redhat.com) Content-Type: text/plain; charset="utf-8" Signed-off-by: Paolo Bonzini --- util/qemu-option.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/util/qemu-option.c b/util/qemu-option.c index 40564a12eb..afba08d92e 100644 --- a/util/qemu-option.c +++ b/util/qemu-option.c @@ -1052,7 +1052,8 @@ bool qemu_opts_absorb_qdict(QemuOpts *opts, QDict *qd= ict, Error **errp) while (entry !=3D NULL) { next =3D qdict_next(qdict, entry); =20 - if (find_desc_by_name(opts->list->desc, entry->key)) { + if (opts_accepts_any(opts->list) || + find_desc_by_name(opts->list->desc, entry->key)) { if (!qemu_opts_from_qdict_entry(opts, entry, errp)) { return false; } --=20 2.26.2 From nobody Sun Apr 28 19:39:16 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1610988588; cv=none; d=zohomail.com; s=zohoarc; b=CF183uRiMzaY+EYENI9Rra6BveMQCFiCuKpK+3dnXJiMrGGdIsKIWwgXt4FHpvz2+v/asHY/ylWxzwJ+gWOyBht1GALlnLXQI1BDaSXmGVRySOkXe2NFIyWQFXRDAdm1VUUb/CC3ddL2tsx+AhHGtBxt9LO0zZLB5FTE8gu/zX8= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1610988588; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=yDbCdtDMt7dXq1u4+4Z1DeBwwS/nIO7b4p9rAhVMpuw=; b=oAVvveo14yAmwDF2BH1ByTRorRahnokwIVBRQ5SlbKrOFqOaJ8bYwv9VPBUlhR2khnIAw2XgbcNlVfNc36KqowFbmxWNw47/JiBH+aZytp+efT/2gK4k/soFpr1m1azjlVmN4gBk97Go/KRXoJEYjdrtZOX5KuE7eTLXarEtAAU= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1610988588141293.23474515029545; Mon, 18 Jan 2021 08:49:48 -0800 (PST) Received: from localhost ([::1]:39746 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1l1Xip-000093-Mp for importer@patchew.org; Mon, 18 Jan 2021 11:49:46 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:35062) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1l1XRS-0002Pd-NG for qemu-devel@nongnu.org; Mon, 18 Jan 2021 11:31:46 -0500 Received: from us-smtp-delivery-124.mimecast.com ([216.205.24.124]:43855) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.90_1) (envelope-from ) id 1l1XRJ-0001Vc-T5 for qemu-devel@nongnu.org; Mon, 18 Jan 2021 11:31:46 -0500 Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-353-v2skbk_dNSiN-dd026kP6Q-1; Mon, 18 Jan 2021 11:31:34 -0500 Received: from smtp.corp.redhat.com (int-mx07.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id CA0068066E6 for ; Mon, 18 Jan 2021 16:31:33 +0000 (UTC) Received: from virtlab701.virt.lab.eng.bos.redhat.com (virtlab701.virt.lab.eng.bos.redhat.com [10.19.152.228]) by smtp.corp.redhat.com (Postfix) with ESMTP id 536A910013C0; Mon, 18 Jan 2021 16:31:33 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1610987497; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=yDbCdtDMt7dXq1u4+4Z1DeBwwS/nIO7b4p9rAhVMpuw=; b=hsdorMd/Pb5PMcYp+kxsSyIWCGl1fx/aiVM4NpVydVcOHi3H920yCpcApg9LbW8m6JHBB4 zcUDUdjv//HiEl2gZADlDRwWq0u5bNoJblHH5twuTEgFD1gizhv/AAMsKLYAEeV8VkbuZ8 oLX6ktywMFZMu45qsvLVglgQUOab8oI= X-MC-Unique: v2skbk_dNSiN-dd026kP6Q-1 From: Paolo Bonzini To: qemu-devel@nongnu.org Subject: [PATCH 14/25] qemu-config: parse configuration files to a QDict Date: Mon, 18 Jan 2021 11:31:02 -0500 Message-Id: <20210118163113.780171-15-pbonzini@redhat.com> In-Reply-To: <20210118163113.780171-1-pbonzini@redhat.com> References: <20210118163113.780171-1-pbonzini@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.84 on 10.5.11.22 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=pbonzini@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=216.205.24.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -29 X-Spam_score: -3.0 X-Spam_bar: --- X-Spam_report: (-3.0 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.175, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H3=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, imammedo@redhat.com, armbru@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @redhat.com) Content-Type: text/plain; charset="utf-8" Change the parser to put the values into a QDict and pass them to a callback. qemu_config_parse's QemuOpts creation is itself turned into a callback function. Signed-off-by: Paolo Bonzini --- include/qemu/config-file.h | 6 ++- softmmu/vl.c | 4 +- util/qemu-config.c | 91 +++++++++++++++++++++++++------------- 3 files changed, 68 insertions(+), 33 deletions(-) diff --git a/include/qemu/config-file.h b/include/qemu/config-file.h index da6f4690b7..dcf2948435 100644 --- a/include/qemu/config-file.h +++ b/include/qemu/config-file.h @@ -1,6 +1,7 @@ #ifndef QEMU_CONFIG_FILE_H #define QEMU_CONFIG_FILE_H =20 +typedef void QEMUConfigCB(const char *group, QDict *qdict, void *opaque, E= rror **errp); =20 QemuOptsList *qemu_find_opts(const char *group); QemuOptsList *qemu_find_opts_err(const char *group, Error **errp); @@ -12,7 +13,10 @@ int qemu_global_option(const char *str); =20 int qemu_config_parse(FILE *fp, QemuOptsList **lists, const char *fname, E= rror **errp); =20 -int qemu_read_config_file(const char *filename, Error **errp); +/* A default callback for qemu_read_config_file(). */ +void qemu_config_do_parse(const char *group, QDict *qdict, void *opaque, E= rror **errp); + +int qemu_read_config_file(const char *filename, QEMUConfigCB *f, Error **e= rrp); =20 /* Parse QDict options as a replacement for a config file (allowing multip= le enumerated (0..(n-1)) configuration "sections") */ diff --git a/softmmu/vl.c b/softmmu/vl.c index d991919155..e4fe1b33e3 100644 --- a/softmmu/vl.c +++ b/softmmu/vl.c @@ -2062,7 +2062,7 @@ static void qemu_read_default_config_file(Error **err= p) Error *local_err =3D NULL; g_autofree char *file =3D get_relocated_path(CONFIG_QEMU_CONFDIR "/qem= u.conf"); =20 - ret =3D qemu_read_config_file(file, &local_err); + ret =3D qemu_read_config_file(file, qemu_config_do_parse, &local_err); if (ret < 0) { if (ret =3D=3D -ENOENT) { error_free(local_err); @@ -3313,7 +3313,7 @@ void qemu_init(int argc, char **argv, char **envp) qemu_plugin_opt_parse(optarg, &plugin_list); break; case QEMU_OPTION_readconfig: - qemu_read_config_file(optarg, &error_fatal); + qemu_read_config_file(optarg, qemu_config_do_parse, &error= _fatal); break; case QEMU_OPTION_spice: olist =3D qemu_find_opts_err("spice", NULL); diff --git a/util/qemu-config.c b/util/qemu-config.c index d0629f4960..ce7c9469b8 100644 --- a/util/qemu-config.c +++ b/util/qemu-config.c @@ -308,19 +308,19 @@ void qemu_add_opts(QemuOptsList *list) } =20 /* Returns number of config groups on success, -errno on error */ -int qemu_config_parse(FILE *fp, QemuOptsList **lists, const char *fname, E= rror **errp) +static int qemu_config_foreach(FILE *fp, QEMUConfigCB *cb, void *opaque, + const char *fname, Error **errp) { - char line[1024], group[64], id[64], arg[64], value[1024]; + char line[1024], prev_group[64], group[64], arg[64], value[1024]; Location loc; - QemuOptsList *list =3D NULL; Error *local_err =3D NULL; - QemuOpts *opts =3D NULL; + QDict *qdict =3D NULL; int res =3D -EINVAL, lno =3D 0; int count =3D 0; =20 loc_push_none(&loc); while (fgets(line, sizeof(line), fp) !=3D NULL) { - loc_set_file(fname, ++lno); + ++lno; if (line[0] =3D=3D '\n') { /* skip empty lines */ continue; @@ -329,39 +329,39 @@ int qemu_config_parse(FILE *fp, QemuOptsList **lists,= const char *fname, Error * /* comment */ continue; } - if (sscanf(line, "[%63s \"%63[^\"]\"]", group, id) =3D=3D 2) { - /* group with id */ - list =3D find_list(lists, group, &local_err); - if (local_err) { - error_propagate(errp, local_err); - goto out; + if (line[0] =3D=3D '[') { + QDict *prev =3D qdict; + if (sscanf(line, "[%63s \"%63[^\"]\"]", group, value) =3D=3D 2= ) { + qdict =3D qdict_new(); + qdict_put_str(qdict, "id", value); + count++; + } else if (sscanf(line, "[%63[^]]]", group) =3D=3D 1) { + qdict =3D qdict_new(); + count++; } - opts =3D qemu_opts_create(list, id, 1, NULL); - count++; - continue; - } - if (sscanf(line, "[%63[^]]]", group) =3D=3D 1) { - /* group without id */ - list =3D find_list(lists, group, &local_err); - if (local_err) { - error_propagate(errp, local_err); - goto out; + if (qdict !=3D prev) { + if (prev) { + cb(prev_group, prev, opaque, &local_err); + qobject_unref(prev); + if (local_err) { + error_propagate(errp, local_err); + goto out; + } + } + strcpy(prev_group, group); + continue; } - opts =3D qemu_opts_create(list, NULL, 0, &error_abort); - count++; - continue; } + loc_set_file(fname, lno); value[0] =3D '\0'; if (sscanf(line, " %63s =3D \"%1023[^\"]\"", arg, value) =3D=3D 2 = || sscanf(line, " %63s =3D \"\"", arg) =3D=3D 1) { /* arg =3D value */ - if (opts =3D=3D NULL) { + if (qdict =3D=3D NULL) { error_setg(errp, "no group defined"); goto out; } - if (!qemu_opt_set(opts, arg, value, errp)) { - goto out; - } + qdict_put_str(qdict, arg, value); continue; } error_setg(errp, "parse error"); @@ -374,10 +374,41 @@ int qemu_config_parse(FILE *fp, QemuOptsList **lists,= const char *fname, Error * res =3D count; out: loc_pop(&loc); + if (qdict) { + cb(group, qdict, opaque, errp); + qobject_unref(qdict); + } return res; } =20 -int qemu_read_config_file(const char *filename, Error **errp) +void qemu_config_do_parse(const char *group, QDict *qdict, void *opaque, E= rror **errp) +{ + QemuOptsList **lists =3D opaque; + const char *id =3D qdict_get_try_str(qdict, "id"); + QemuOptsList *list; + QemuOpts *opts; + + list =3D find_list(lists, group, errp); + if (!list) { + return; + } + + opts =3D qemu_opts_create(list, id, 1, errp); + if (!opts) { + return; + } + if (id) { + qdict_del(qdict, "id"); + } + qemu_opts_absorb_qdict(opts, qdict, errp); +} + +int qemu_config_parse(FILE *fp, QemuOptsList **lists, const char *fname, E= rror **errp) +{ + return qemu_config_foreach(fp, qemu_config_do_parse, lists, fname, err= p); +} + +int qemu_read_config_file(const char *filename, QEMUConfigCB *cb, Error **= errp) { FILE *f =3D fopen(filename, "r"); int ret; @@ -387,7 +418,7 @@ int qemu_read_config_file(const char *filename, Error *= *errp) return -errno; } =20 - ret =3D qemu_config_parse(f, vm_config_groups, filename, errp); + ret =3D qemu_config_foreach(f, cb, vm_config_groups, filename, errp); fclose(f); return ret; } --=20 2.26.2 From nobody Sun Apr 28 19:39:16 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1610988095; cv=none; d=zohomail.com; s=zohoarc; b=A1FLthx0K+GI6PDthdGkYKQi41sA109xaXE/FJ5l3XpWevGz9T9gcDY82lkd15FfJRI0eF+25MnKqayFeeftEr07Kzo1KxDov40jGpAfyIkHSrD/i3VTaQA1NiPI2hAja3NesrTTIZlgl2kxaIpZAPJkP00lR5NsG7jQVN/Pi94= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1610988095; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=GxiSAz7uPB2TQGa+xXfFYOL39oAUXOKa4fkw+NKJNGk=; b=YCIJ+DuuH680vSmd8FjnFOTo2m2H1s6lg/LVYSdyhBNJI1qew9DOQ03URfRvSA2Jt3ub3Mct1DWKU414L6tu1tOsocwtP0JF8R9KpDzQ5Awr9gG+yP/GRXHThOzKA90Sn/c1pNRl7QVGJd6Vg11M1Bfay0b1JbG5pA8950ma5Qw= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1610988095854692.0677042294794; Mon, 18 Jan 2021 08:41:35 -0800 (PST) Received: from localhost ([::1]:52834 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1l1Xaw-0001WX-Q1 for importer@patchew.org; Mon, 18 Jan 2021 11:41:34 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:35036) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1l1XRR-0002Ow-Ko for qemu-devel@nongnu.org; Mon, 18 Jan 2021 11:31:46 -0500 Received: from us-smtp-delivery-124.mimecast.com ([63.128.21.124]:31525) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.90_1) (envelope-from ) id 1l1XRJ-0001VU-Hj for qemu-devel@nongnu.org; Mon, 18 Jan 2021 11:31:45 -0500 Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-418-SFRB9Xk6NUuwripoCb1Hsg-1; Mon, 18 Jan 2021 11:31:35 -0500 Received: from smtp.corp.redhat.com (int-mx07.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 6D67AEC1A0 for ; Mon, 18 Jan 2021 16:31:34 +0000 (UTC) Received: from virtlab701.virt.lab.eng.bos.redhat.com (virtlab701.virt.lab.eng.bos.redhat.com [10.19.152.228]) by smtp.corp.redhat.com (Postfix) with ESMTP id EA87310013C0; Mon, 18 Jan 2021 16:31:33 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1610987496; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=GxiSAz7uPB2TQGa+xXfFYOL39oAUXOKa4fkw+NKJNGk=; b=XIdouLu0+ue01EeJSRE3O4rCanhexWGipwE2fJ9So76IHryLsJ77wYT466LBdutJKKYxt6 7txMfCoy49Aeljuwfu9VJON5afz85DkL5vylklxtsfsH+MUN95cPyRb/O/r4mE7+PHmser BA9iH4z2S6++DQkJE/rduSqNqDROins= X-MC-Unique: SFRB9Xk6NUuwripoCb1Hsg-1 From: Paolo Bonzini To: qemu-devel@nongnu.org Subject: [PATCH 15/25] vl: plumb keyval-based options into -set and -readconfig Date: Mon, 18 Jan 2021 11:31:03 -0500 Message-Id: <20210118163113.780171-16-pbonzini@redhat.com> In-Reply-To: <20210118163113.780171-1-pbonzini@redhat.com> References: <20210118163113.780171-1-pbonzini@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.84 on 10.5.11.22 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=pbonzini@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=63.128.21.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -29 X-Spam_score: -3.0 X-Spam_bar: --- X-Spam_report: (-3.0 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.175, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H4=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, imammedo@redhat.com, armbru@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @redhat.com) Content-Type: text/plain; charset="utf-8" Add generic machinery to support parsing command line options with keyval in -set and -readconfig, choosing between QDict and QemuOpts as the underlying data structure. The keyval_merge function is slightly heavyweight as a way to do qemu_set_option for QDict-based options, but it will be put to further use later to merge entire -readconfig sections together with their command-line equivalents. Signed-off-by: Paolo Bonzini --- include/block/qdict.h | 2 - include/qapi/qmp/qdict.h | 3 + include/qemu/option.h | 1 + softmmu/vl.c | 131 ++++++++++++++++++++++++++++++++------- tests/test-keyval.c | 37 +++++++++++ util/keyval.c | 36 +++++++++++ 6 files changed, 187 insertions(+), 23 deletions(-) diff --git a/include/block/qdict.h b/include/block/qdict.h index d8cb502d7d..ced2acfb92 100644 --- a/include/block/qdict.h +++ b/include/block/qdict.h @@ -20,8 +20,6 @@ void qdict_join(QDict *dest, QDict *src, bool overwrite); void qdict_extract_subqdict(QDict *src, QDict **dst, const char *start); void qdict_array_split(QDict *src, QList **dst); int qdict_array_entries(QDict *src, const char *subqdict); -QObject *qdict_crumple(const QDict *src, Error **errp); -void qdict_flatten(QDict *qdict); =20 typedef struct QDictRenames { const char *from; diff --git a/include/qapi/qmp/qdict.h b/include/qapi/qmp/qdict.h index 9934539c1b..d5b5430e21 100644 --- a/include/qapi/qmp/qdict.h +++ b/include/qapi/qmp/qdict.h @@ -64,4 +64,7 @@ const char *qdict_get_try_str(const QDict *qdict, const c= har *key); =20 QDict *qdict_clone_shallow(const QDict *src); =20 +QObject *qdict_crumple(const QDict *src, Error **errp); +void qdict_flatten(QDict *qdict); + #endif /* QDICT_H */ diff --git a/include/qemu/option.h b/include/qemu/option.h index 092e291c37..fffb03d848 100644 --- a/include/qemu/option.h +++ b/include/qemu/option.h @@ -151,5 +151,6 @@ QDict *keyval_parse_into(QDict *qdict, const char *para= ms, const char *implied_k bool *p_help, Error **errp); QDict *keyval_parse(const char *params, const char *implied_key, bool *help, Error **errp); +void keyval_merge(QDict *old, const QDict *new, Error **errp); =20 #endif diff --git a/softmmu/vl.c b/softmmu/vl.c index e4fe1b33e3..ce0693cdda 100644 --- a/softmmu/vl.c +++ b/softmmu/vl.c @@ -117,6 +117,7 @@ #include "qapi/qapi-commands-migration.h" #include "qapi/qapi-commands-misc.h" #include "qapi/qapi-commands-ui.h" +#include "qapi/qmp/qdict.h" #include "qapi/qmp/qerror.h" #include "sysemu/iothread.h" #include "qemu/guest-random.h" @@ -2056,13 +2057,94 @@ static int global_init_func(void *opaque, QemuOpts = *opts, Error **errp) return 0; } =20 +/* + * Return whether configuration group @group is stored in QemuOpts or + * in a list of QDicts. + */ +static bool is_qemuopts_group(const char *group) +{ + return true; +} + +/* + * Return a pointer to a list of QDicts, used to store options for + * "-set GROUP.*". + */ +static GSList **qemu_config_list(const char *group) +{ + return NULL; +} + +/* + * Return a pointer to a QDict inside the list starting at @head, + * used to store options for "-GROUP id=3D...". + */ +static QDict *qemu_find_config(GSList *head, const char *id) +{ + assert(id); + while (head) { + QDict *dict =3D head->data; + if (g_strcmp0(qdict_get_try_str(dict, "id"), id) =3D=3D 0) { + return dict; + } + head =3D head->next; + } + return NULL; +} + +static void qemu_record_config_group(const char *group, QDict *dict, Error= **errp) +{ + GSList **p_head; + + p_head =3D qemu_config_list(group); + if (p_head) { + *p_head =3D g_slist_prepend(*p_head, dict); + } else { + abort(); + } +} + +static void qemu_set_qdict_option(QDict *dict, const char *key, const char= *value, + Error **errp) +{ + QDict *merge_dict; + + merge_dict =3D qdict_new(); + qdict_put_str(merge_dict, key, value); + keyval_merge(dict, merge_dict, errp); + qobject_unref(merge_dict); +} + +/* + * Parse non-QemuOpts config file groups, pass the rest to + * qemu_config_do_parse. + */ +static void qemu_parse_config_group(const char *group, QDict *qdict, + void *opaque, Error **errp) +{ + if (is_qemuopts_group(group)) { + QObject *crumpled =3D qdict_crumple(qdict, errp); + if (!crumpled) { + return; + } + if (qobject_type(crumpled) !=3D QTYPE_QDICT) { + assert(qobject_type(crumpled) =3D=3D QTYPE_QLIST); + error_setg(errp, "Lists cannot be at top level of a configurat= ion section"); + return; + } + qemu_record_config_group(group, qobject_to(QDict, crumpled), errp); + } else { + qemu_config_do_parse(group, qdict, opaque, errp); + } +} + static void qemu_read_default_config_file(Error **errp) { int ret; Error *local_err =3D NULL; g_autofree char *file =3D get_relocated_path(CONFIG_QEMU_CONFDIR "/qem= u.conf"); =20 - ret =3D qemu_read_config_file(file, qemu_config_do_parse, &local_err); + ret =3D qemu_read_config_file(file, qemu_parse_config_group, &local_er= r); if (ret < 0) { if (ret =3D=3D -ENOENT) { error_free(local_err); @@ -2072,37 +2154,45 @@ static void qemu_read_default_config_file(Error **e= rrp) } } =20 -static int qemu_set_option(const char *str) +static void qemu_set_option(const char *str, Error **errp) { - Error *local_err =3D NULL; char group[64], id[64], arg[64]; QemuOptsList *list; QemuOpts *opts; + GSList **p_head; + QDict *dict; int rc, offset; =20 rc =3D sscanf(str, "%63[^.].%63[^.].%63[^=3D]%n", group, id, arg, &off= set); if (rc < 3 || str[offset] !=3D '=3D') { - error_report("can't parse: \"%s\"", str); - return -1; + error_setg(errp, "can't parse: \"%s\"", str); + return; } =20 - list =3D qemu_find_opts(group); - if (list =3D=3D NULL) { - return -1; + p_head =3D qemu_config_list(group); + if (p_head) { + dict =3D qemu_find_config(*p_head, id); + if (!dict) { + goto not_found; + } + qemu_set_qdict_option(dict, arg, str + offset + 1, errp); + return; } =20 - opts =3D qemu_opts_find(list, id); - if (!opts) { - error_report("there is no %s \"%s\" defined", - list->name, id); - return -1; + list =3D qemu_find_opts_err(group, errp); + if (list) { + opts =3D qemu_opts_find(list, id); + if (!opts) { + goto not_found; + } + qemu_opt_set(opts, arg, str + offset + 1, errp); + return; } =20 - if (!qemu_opt_set(opts, arg, str + offset + 1, &local_err)) { - error_report_err(local_err); - return -1; - } - return 0; + return; + +not_found: + error_setg(errp, "there is no %s \"%s\" defined", group, id); } =20 static void user_register_global_props(void) @@ -2678,8 +2768,7 @@ void qemu_init(int argc, char **argv, char **envp) } break; case QEMU_OPTION_set: - if (qemu_set_option(optarg) !=3D 0) - exit(1); + qemu_set_option(optarg, &error_fatal); break; case QEMU_OPTION_global: if (qemu_global_option(optarg) !=3D 0) @@ -3313,7 +3402,7 @@ void qemu_init(int argc, char **argv, char **envp) qemu_plugin_opt_parse(optarg, &plugin_list); break; case QEMU_OPTION_readconfig: - qemu_read_config_file(optarg, qemu_config_do_parse, &error= _fatal); + qemu_read_config_file(optarg, qemu_parse_config_group, &er= ror_fatal); break; case QEMU_OPTION_spice: olist =3D qemu_find_opts_err("spice", NULL); diff --git a/tests/test-keyval.c b/tests/test-keyval.c index 19f664f535..2353c707bf 100644 --- a/tests/test-keyval.c +++ b/tests/test-keyval.c @@ -737,6 +737,41 @@ static void test_keyval_visit_any(void) visit_free(v); } =20 +static void test_keyval_merge_success(void) +{ + QDict *old =3D keyval_parse("opt1=3Dabc,opt2.sub1=3Ddef,opt2.sub2=3Dgh= i,opt3=3Dxyz", + NULL, NULL, &error_abort); + QDict *new =3D keyval_parse("opt1=3DABC,opt2.sub2=3DGHI,opt2.sub3=3DJK= L", + NULL, NULL, &error_abort); + QDict *combined =3D keyval_parse("opt1=3DABC,opt2.sub1=3Ddef,opt2.sub2= =3DGHI,opt2.sub3=3DJKL,opt3=3Dxyz", + NULL, NULL, &error_abort); + Error *err =3D NULL; + + keyval_merge(old, new, &err); + g_assert(!err); + g_assert(qobject_is_equal(QOBJECT(combined), QOBJECT(old))); + qobject_unref(old); + qobject_unref(new); + qobject_unref(combined); +} + +static void test_keyval_merge_conflict(void) +{ + QDict *old =3D keyval_parse("opt2.sub1=3Ddef,opt2.sub2=3Dghi", + NULL, NULL, &error_abort); + QDict *new =3D keyval_parse("opt2=3DABC", + NULL, NULL, &error_abort); + Error *err =3D NULL; + + keyval_merge(new, old, &err); + error_free_or_abort(&err); + keyval_merge(old, new, &err); + error_free_or_abort(&err); + + qobject_unref(old); + qobject_unref(new); +} + int main(int argc, char *argv[]) { g_test_init(&argc, &argv, NULL); @@ -750,6 +785,8 @@ int main(int argc, char *argv[]) g_test_add_func("/keyval/visit/optional", test_keyval_visit_optional); g_test_add_func("/keyval/visit/alternate", test_keyval_visit_alternate= ); g_test_add_func("/keyval/visit/any", test_keyval_visit_any); + g_test_add_func("/keyval/merge/success", test_keyval_merge_success); + g_test_add_func("/keyval/merge/conflict", test_keyval_merge_conflict); g_test_run(); return 0; } diff --git a/util/keyval.c b/util/keyval.c index 1d4ca12129..7c886dd402 100644 --- a/util/keyval.c +++ b/util/keyval.c @@ -315,6 +315,42 @@ static char *reassemble_key(GSList *key) return g_string_free(s, FALSE); } =20 +/* Merge two dictionaries. */ +static void keyval_do_merge(QDict *old, const QDict *new, GString *str, Er= ror **errp) +{ + size_t save_len =3D str->len; + const QDictEntry *ent; + QObject *old_value; + + for (ent =3D qdict_first(new); ent; ent =3D qdict_next(new, ent)) { + old_value =3D qdict_get(old, ent->key); + if (old_value && qobject_type(old_value) !=3D qobject_type(ent->va= lue)) { + error_setg(errp, "Parameter '%s%s' used inconsistently", str->= str, ent->key); + return; + } + if (!old_value || qobject_type(ent->value) !=3D QTYPE_QDICT) { + qobject_ref(ent->value); + qdict_put_obj(old, ent->key, ent->value); + continue; + } + + /* Merge sub-dictionaries. */ + g_string_append(str, ent->key); + g_string_append_c(str, '.'); + keyval_do_merge(qobject_to(QDict, old_value), + qobject_to(QDict, ent->value), + str, errp); + g_string_truncate(str, save_len); + } +} + +void keyval_merge(QDict *old, const QDict *new, Error **errp) +{ + GString *str =3D g_string_new(""); + keyval_do_merge(old, new, str, errp); + g_string_free(str, TRUE); +} + /* * Listify @cur recursively. * Replace QDicts whose keys are all valid list indexes by QLists. --=20 2.26.2 From nobody Sun Apr 28 19:39:16 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1610988302; cv=none; d=zohomail.com; s=zohoarc; b=mM9YQACVcgSfZaNSVk9p/N548+Qs+eGwKDaweZejl5EiwwEX+LcFTEHVl3XsK9txaW5ftmDIFC+u2fxyv0/ugRGvyuiCMldV9u7FnbNpYPQKndpe57D5NtOmzFJQMo4PCSqMKhYHoTgoBFMmJqGHgWJjrDKUyx8/H6uzIw5RvkA= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1610988302; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=/l66c/uMNUcein0za809TJUNXOq6gAF1uDOgM6Sx+dg=; b=eYmHQSJw0VsQ4OGyBb1TAuClD61joAmcyyDVfny7wIL76swWAEzvAsB3Q1bNHiiQuu2skaAtXpAv0Zat6E2dSFI05yQgFkxurdNMZw3oA3ErerlrmGEqBIdF1TLEwvW8VY6Xc/Ess7D2mQM8HeK36iWDj3Yf+gbFw8LArXOKWQo= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1610988302309819.5076803729012; Mon, 18 Jan 2021 08:45:02 -0800 (PST) Received: from localhost ([::1]:59664 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1l1XeG-0004nn-Rb for importer@patchew.org; Mon, 18 Jan 2021 11:45:01 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:35052) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1l1XRS-0002P5-6q for qemu-devel@nongnu.org; Mon, 18 Jan 2021 11:31:46 -0500 Received: from us-smtp-delivery-124.mimecast.com ([216.205.24.124]:39872) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.90_1) (envelope-from ) id 1l1XRL-0001Vr-7a for qemu-devel@nongnu.org; Mon, 18 Jan 2021 11:31:45 -0500 Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-435-1Tj6zroYNSWXpKtKt4JVfQ-1; Mon, 18 Jan 2021 11:31:35 -0500 Received: from smtp.corp.redhat.com (int-mx07.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 0EF8A800D62 for ; Mon, 18 Jan 2021 16:31:35 +0000 (UTC) Received: from virtlab701.virt.lab.eng.bos.redhat.com (virtlab701.virt.lab.eng.bos.redhat.com [10.19.152.228]) by smtp.corp.redhat.com (Postfix) with ESMTP id 8D7B610023AE; Mon, 18 Jan 2021 16:31:34 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1610987497; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=/l66c/uMNUcein0za809TJUNXOq6gAF1uDOgM6Sx+dg=; b=KSjK7oq+ZRsT6YR4YXHk2wd+QGCOYXeYRr9V31/aOQa1Lql9Tub6WXVsYJONZLz3BzJmoX qcdlQxqHMqx883+a2sofDyjxk2NAiSO0sQxU4k+/Oo6s70EniH3eRFuIqytWBNy9pK04dK J8UAxh/o3DUNej3g5Y+sOga8/Uk6AgA= X-MC-Unique: 1Tj6zroYNSWXpKtKt4JVfQ-1 From: Paolo Bonzini To: qemu-devel@nongnu.org Subject: [PATCH 16/25] qom: do not modify QDict argument in user_creatable_add_dict Date: Mon, 18 Jan 2021 11:31:04 -0500 Message-Id: <20210118163113.780171-17-pbonzini@redhat.com> In-Reply-To: <20210118163113.780171-1-pbonzini@redhat.com> References: <20210118163113.780171-1-pbonzini@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.84 on 10.5.11.22 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=pbonzini@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=216.205.24.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -29 X-Spam_score: -3.0 X-Spam_bar: --- X-Spam_report: (-3.0 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.175, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H3=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, imammedo@redhat.com, armbru@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @redhat.com) Content-Type: text/plain; charset="utf-8" -object will process its QDicts in two steps, first for the "early" objects= and then for the "late" objects. If qom-type is removed by the "early" pass, t= he late pass fails. So just create a shallow copy of the QDict in user_creatable_add_dict. Signed-off-by: Paolo Bonzini --- include/qom/object_interfaces.h | 2 +- qom/object_interfaces.c | 11 +++++++---- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/include/qom/object_interfaces.h b/include/qom/object_interface= s.h index abb23eaea3..ed0d7d663b 100644 --- a/include/qom/object_interfaces.h +++ b/include/qom/object_interfaces.h @@ -102,7 +102,7 @@ Object *user_creatable_add_type(const char *type, const= char *id, * * Returns: %true on success, %false on failure. */ -bool user_creatable_add_dict(QDict *qdict, bool keyval, Error **errp); +bool user_creatable_add_dict(const QDict *qdict, bool keyval, Error **errp= ); =20 /** * user_creatable_add_opts: diff --git a/qom/object_interfaces.c b/qom/object_interfaces.c index 97bf88908e..fbbf5e8ad3 100644 --- a/qom/object_interfaces.c +++ b/qom/object_interfaces.c @@ -105,24 +105,25 @@ out: return obj; } =20 -bool user_creatable_add_dict(QDict *qdict, bool keyval, Error **errp) +bool user_creatable_add_dict(const QDict *dict, bool keyval, Error **errp) { Visitor *v; - Object *obj; + Object *obj =3D NULL; + QDict *qdict =3D qdict_clone_shallow(dict); g_autofree char *type =3D NULL; g_autofree char *id =3D NULL; =20 type =3D g_strdup(qdict_get_try_str(qdict, "qom-type")); if (!type) { error_setg(errp, QERR_MISSING_PARAMETER, "qom-type"); - return false; + goto out; } qdict_del(qdict, "qom-type"); =20 id =3D g_strdup(qdict_get_try_str(qdict, "id")); if (!id) { error_setg(errp, QERR_MISSING_PARAMETER, "id"); - return false; + goto out; } qdict_del(qdict, "id"); =20 @@ -134,6 +135,8 @@ bool user_creatable_add_dict(QDict *qdict, bool keyval,= Error **errp) obj =3D user_creatable_add_type(type, id, qdict, v, errp); visit_free(v); object_unref(obj); +out: + qobject_unref(qdict); return !!obj; } =20 --=20 2.26.2 From nobody Sun Apr 28 19:39:16 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1610988383; cv=none; d=zohomail.com; s=zohoarc; b=m7c3YeClRMKqntPmhN0pW97rOcRe8cMAvNpAFB/UB3qJHmOLW8cfwd0h75HdKoCjJ1Vjcesj1dbyeSsx5UrlpCxl65FBGEz3yn0QF1/4cYJz9ONDZyB9zNUmuYK9xArDfx4eRrk7y7CtFU6chGl400iQUVK9cfhieRuQZnDJeTc= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1610988383; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=8aL1b7WwqTyIDej+PdsviYOcvQcOFJwTIWoYWkKCTlU=; b=Z7/cem2OC0uJGLEn8dsGrhzeayh9zt7Be2OKmTwcxl32C/uDKmIMyq16+5GpSadOT0gThlb2xYSUCVuMGJrXCcMmQ9EQ2UaxlNJ6avwUlrUvWSUAsZVxBf1wdcEzXtIlM8nFUBZJY9VVKnNHvXIS5hgf5rrNkpDUtdnxpx1982M= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1610988383352200.555408454185; Mon, 18 Jan 2021 08:46:23 -0800 (PST) Received: from localhost ([::1]:34188 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1l1Xfa-000677-4u for importer@patchew.org; Mon, 18 Jan 2021 11:46:22 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:35068) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1l1XRT-0002QH-4d for qemu-devel@nongnu.org; Mon, 18 Jan 2021 11:31:47 -0500 Received: from us-smtp-delivery-124.mimecast.com ([63.128.21.124]:57085) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.90_1) (envelope-from ) id 1l1XRM-0001W0-4m for qemu-devel@nongnu.org; Mon, 18 Jan 2021 11:31:46 -0500 Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-494-onWdjSoZMbGJMT3M92NzTQ-1; Mon, 18 Jan 2021 11:31:36 -0500 Received: from smtp.corp.redhat.com (int-mx07.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id A3F8E107ACE3 for ; Mon, 18 Jan 2021 16:31:35 +0000 (UTC) Received: from virtlab701.virt.lab.eng.bos.redhat.com (virtlab701.virt.lab.eng.bos.redhat.com [10.19.152.228]) by smtp.corp.redhat.com (Postfix) with ESMTP id 2EE1110023AE; Mon, 18 Jan 2021 16:31:35 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1610987498; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=8aL1b7WwqTyIDej+PdsviYOcvQcOFJwTIWoYWkKCTlU=; b=dfTjlvPTVb763Soe9SQs4XR4tci+RX/8cbw85Ar5EtzdpYlS+iUxIl9TeMsYFuzvO+/kaO bf3uUOYu1Jiv8D3YwETCY9ClgYUo3LuvciuRhrWbcbmfbffELipxDCv5b4zSIq6LB4alMt V6gHbo1rHHuoZf5uS2ACgoVHLOow6TQ= X-MC-Unique: onWdjSoZMbGJMT3M92NzTQ-1 From: Paolo Bonzini To: qemu-devel@nongnu.org Subject: [PATCH 17/25] qemu-io: use keyval for -object parsing Date: Mon, 18 Jan 2021 11:31:05 -0500 Message-Id: <20210118163113.780171-18-pbonzini@redhat.com> In-Reply-To: <20210118163113.780171-1-pbonzini@redhat.com> References: <20210118163113.780171-1-pbonzini@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.84 on 10.5.11.22 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=pbonzini@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=63.128.21.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -29 X-Spam_score: -3.0 X-Spam_bar: --- X-Spam_report: (-3.0 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.175, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H4=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, imammedo@redhat.com, armbru@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @redhat.com) Content-Type: text/plain; charset="utf-8" Enable creation of object with non-scalar properties. Signed-off-by: Paolo Bonzini --- qemu-io.c | 42 +++++++++++++----------------------------- 1 file changed, 13 insertions(+), 29 deletions(-) diff --git a/qemu-io.c b/qemu-io.c index ac88d8bd40..306086f767 100644 --- a/qemu-io.c +++ b/qemu-io.c @@ -477,23 +477,6 @@ enum { OPTION_IMAGE_OPTS =3D 257, }; =20 -static QemuOptsList qemu_object_opts =3D { - .name =3D "object", - .implied_opt_name =3D "qom-type", - .head =3D QTAILQ_HEAD_INITIALIZER(qemu_object_opts.head), - .desc =3D { - { } - }, -}; - -static bool qemu_io_object_print_help(const char *type, QemuOpts *opts) -{ - if (user_creatable_print_help(type, opts)) { - exit(0); - } - return true; -} - static QemuOptsList file_opts =3D { .name =3D "file", .implied_opt_name =3D "file", @@ -550,7 +533,6 @@ int main(int argc, char **argv) qcrypto_init(&error_fatal); =20 module_call_init(MODULE_INIT_QOM); - qemu_add_opts(&qemu_object_opts); qemu_add_opts(&qemu_trace_opts); bdrv_init(); =20 @@ -612,14 +594,20 @@ int main(int argc, char **argv) case 'U': force_share =3D true; break; - case OPTION_OBJECT: { - QemuOpts *qopts; - qopts =3D qemu_opts_parse_noisily(&qemu_object_opts, - optarg, true); - if (!qopts) { - exit(1); + case OPTION_OBJECT: + { + QDict *args; + bool help; + + args =3D keyval_parse(optarg, "qom-type", &help, &error_fa= tal); + if (help) { + user_creatable_print_help_from_qdict(args); + exit(EXIT_SUCCESS); + } + user_creatable_add_dict(args, true, &error_fatal); + qobject_unref(args); + break; } - } break; case OPTION_IMAGE_OPTS: imageOpts =3D true; break; @@ -644,10 +632,6 @@ int main(int argc, char **argv) exit(1); } =20 - qemu_opts_foreach(&qemu_object_opts, - user_creatable_add_opts_foreach, - qemu_io_object_print_help, &error_fatal); - if (!trace_init_backends()) { exit(1); } --=20 2.26.2 From nobody Sun Apr 28 19:39:16 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1610988868; cv=none; d=zohomail.com; s=zohoarc; b=NrpveqAmZMdgFDdHK756uRn65AFIL/mEHRKf4DqFn2Nu93h4wuO/FpCxOOumhm09S1aqWOGEe0ehAO2KFLoochJ1nSLOkDdwqpg7Hqk/E+cICeQRSL/+KacTsyIL1mLrecE6vIh7AYVZO5TIBgx00rrJxayZg2bPfQxrt7w9VbY= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1610988868; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=hbj7WtOxbzc0bZiQUOnwGOkB9Nshb+E+LIixao81N7o=; b=lRC9eVAplywg3JzCuJYadik8HxCogmo7+rJJdXE4RomzMx2QjXU+Plgkzp/OzGFGVQsFX54jTaCFQ6GHUfycAB1DQXfEEkz/I3QP2uFG81KhElSgSHhyFSqDXp0fS6I+mvtOuRzbTzxblhs00lmLtrwh3tW8wzyQASu9dPGhrDQ= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1610988868539137.1563879732031; Mon, 18 Jan 2021 08:54:28 -0800 (PST) Received: from localhost ([::1]:48220 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1l1XnP-000444-HR for importer@patchew.org; Mon, 18 Jan 2021 11:54:27 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:35108) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1l1XRU-0002SQ-3m for qemu-devel@nongnu.org; Mon, 18 Jan 2021 11:31:48 -0500 Received: from us-smtp-delivery-124.mimecast.com ([216.205.24.124]:53468) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.90_1) (envelope-from ) id 1l1XRM-0001W6-HA for qemu-devel@nongnu.org; Mon, 18 Jan 2021 11:31:47 -0500 Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-451-D9UjCkjmP5aLjq92XaG8SQ-1; Mon, 18 Jan 2021 11:31:37 -0500 Received: from smtp.corp.redhat.com (int-mx07.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 5158B190B2A0 for ; Mon, 18 Jan 2021 16:31:36 +0000 (UTC) Received: from virtlab701.virt.lab.eng.bos.redhat.com (virtlab701.virt.lab.eng.bos.redhat.com [10.19.152.228]) by smtp.corp.redhat.com (Postfix) with ESMTP id C4B3410013C0; Mon, 18 Jan 2021 16:31:35 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1610987499; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=hbj7WtOxbzc0bZiQUOnwGOkB9Nshb+E+LIixao81N7o=; b=LiVzp90qygXBhgF2kvDcLIKfohyFnH3VfgmAmgYKe4/0rZ74U9slxOezTy3QKswqVxXkqd mLKu5ZAkYTb/xlc/6pjNW2NBycpqHB8UN3/ZAfDSGNptp7QMeQLWu8BkK23sS2+dDOK3P8 KvvXz/Dqx36QS3d37f6aTL4EjivpqKo= X-MC-Unique: D9UjCkjmP5aLjq92XaG8SQ-1 From: Paolo Bonzini To: qemu-devel@nongnu.org Subject: [PATCH 18/25] qemu-nbd: use keyval for -object parsing Date: Mon, 18 Jan 2021 11:31:06 -0500 Message-Id: <20210118163113.780171-19-pbonzini@redhat.com> In-Reply-To: <20210118163113.780171-1-pbonzini@redhat.com> References: <20210118163113.780171-1-pbonzini@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.84 on 10.5.11.22 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=pbonzini@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=216.205.24.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -29 X-Spam_score: -3.0 X-Spam_bar: --- X-Spam_report: (-3.0 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.175, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H3=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, imammedo@redhat.com, armbru@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @redhat.com) Content-Type: text/plain; charset="utf-8" Enable creation of object with non-scalar properties. Signed-off-by: Paolo Bonzini --- qemu-nbd.c | 42 +++++++++++++----------------------------- 1 file changed, 13 insertions(+), 29 deletions(-) diff --git a/qemu-nbd.c b/qemu-nbd.c index a7075c5419..b4bd21a21e 100644 --- a/qemu-nbd.c +++ b/qemu-nbd.c @@ -407,23 +407,6 @@ static QemuOptsList file_opts =3D { }, }; =20 -static QemuOptsList qemu_object_opts =3D { - .name =3D "object", - .implied_opt_name =3D "qom-type", - .head =3D QTAILQ_HEAD_INITIALIZER(qemu_object_opts.head), - .desc =3D { - { } - }, -}; - -static bool qemu_nbd_object_print_help(const char *type, QemuOpts *opts) -{ - if (user_creatable_print_help(type, opts)) { - exit(0); - } - return true; -} - =20 static QCryptoTLSCreds *nbd_get_tls_creds(const char *id, bool list, Error **errp) @@ -599,7 +582,6 @@ int main(int argc, char **argv) qcrypto_init(&error_fatal); =20 module_call_init(MODULE_INIT_QOM); - qemu_add_opts(&qemu_object_opts); qemu_add_opts(&qemu_trace_opts); qemu_init_exec_dir(argv[0]); =20 @@ -752,14 +734,20 @@ int main(int argc, char **argv) case '?': error_report("Try `%s --help' for more information.", argv[0]); exit(EXIT_FAILURE); - case QEMU_NBD_OPT_OBJECT: { - QemuOpts *opts; - opts =3D qemu_opts_parse_noisily(&qemu_object_opts, - optarg, true); - if (!opts) { - exit(EXIT_FAILURE); + case QEMU_NBD_OPT_OBJECT: + { + QDict *args; + bool help; + + args =3D keyval_parse(optarg, "qom-type", &help, &error_fa= tal); + if (help) { + user_creatable_print_help_from_qdict(args); + exit(EXIT_SUCCESS); + } + user_creatable_add_dict(args, true, &error_fatal); + qobject_unref(args); + break; } - } break; case QEMU_NBD_OPT_TLSCREDS: tlscredsid =3D optarg; break; @@ -807,10 +795,6 @@ int main(int argc, char **argv) export_name =3D ""; } =20 - qemu_opts_foreach(&qemu_object_opts, - user_creatable_add_opts_foreach, - qemu_nbd_object_print_help, &error_fatal); - if (!trace_init_backends()) { exit(1); } --=20 2.26.2 From nobody Sun Apr 28 19:39:16 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1610989064; cv=none; d=zohomail.com; s=zohoarc; b=g5CbxkJ6pRvzTLzceHF9O8uYP040b5iLnXv5QFrcBfmNrag9H1vJ/osOfZcx8n6wfx0HFHke/BlSqijCj6P5a0A6hVfSyKRja8nkxpCeMjW2+uJ9TXBGdEnFDU7m+qIFi92XDrY/EyH+zb0xznq97IhhRQcrxKoRXCimE70siQw= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1610989064; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=YYTiOyCxOIcltjhC+6tXZQrbcVLx6viAR2L/FMaCavU=; b=OvmrrLPrwyjrHK6M5gCBQAVIwl0IoP3qs6vekZQMHaOApvCehsRubNBPn1IigNbPYiqMmFyRkkIb9ehS730/xZwOaTUVRaBHcTXAbSWoejxelcTUvwieegdGNh4Q98pJ7cizu9pFL9ddZozUmrDpuHub2rWYvLxjHvrx9hHgC58= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1610989064118456.38262381450727; Mon, 18 Jan 2021 08:57:44 -0800 (PST) Received: from localhost ([::1]:56596 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1l1XqY-0007hA-Q1 for importer@patchew.org; Mon, 18 Jan 2021 11:57:42 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:35136) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1l1XRV-0002VN-HM for qemu-devel@nongnu.org; Mon, 18 Jan 2021 11:31:49 -0500 Received: from us-smtp-delivery-124.mimecast.com ([63.128.21.124]:52915) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.90_1) (envelope-from ) id 1l1XRM-0001WI-HM for qemu-devel@nongnu.org; Mon, 18 Jan 2021 11:31:49 -0500 Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-142-tsBX5HBvOnyKGdo2KSq-AQ-1; Mon, 18 Jan 2021 11:31:37 -0500 Received: from smtp.corp.redhat.com (int-mx07.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id E28AB1005513 for ; Mon, 18 Jan 2021 16:31:36 +0000 (UTC) Received: from virtlab701.virt.lab.eng.bos.redhat.com (virtlab701.virt.lab.eng.bos.redhat.com [10.19.152.228]) by smtp.corp.redhat.com (Postfix) with ESMTP id 694AE10013C0; Mon, 18 Jan 2021 16:31:36 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1610987499; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=YYTiOyCxOIcltjhC+6tXZQrbcVLx6viAR2L/FMaCavU=; b=cFCgvbo6MWn4y5law6rJm3leA/Kn8GjYiKoCAdg6r9ulFZ1mI4ArKGpcnT/iJ9FEx4P1rS kAp6Afe/hpCsPjHRuDAF6rOoPOsDmJ/zWScs2uieL7XAmCzKJR47IZnuuaVR5uMPmWy1nA BxzWLKVUveEyY4CvfvRnwxlaXxNmCjg= X-MC-Unique: tsBX5HBvOnyKGdo2KSq-AQ-1 From: Paolo Bonzini To: qemu-devel@nongnu.org Subject: [PATCH 19/25] qemu-img: use keyval for -object parsing Date: Mon, 18 Jan 2021 11:31:07 -0500 Message-Id: <20210118163113.780171-20-pbonzini@redhat.com> In-Reply-To: <20210118163113.780171-1-pbonzini@redhat.com> References: <20210118163113.780171-1-pbonzini@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.84 on 10.5.11.22 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=pbonzini@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=63.128.21.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -29 X-Spam_score: -3.0 X-Spam_bar: --- X-Spam_report: (-3.0 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.175, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H4=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, imammedo@redhat.com, armbru@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @redhat.com) Content-Type: text/plain; charset="utf-8" Enable creation of object with non-scalar properties. Signed-off-by: Paolo Bonzini --- qemu-img.c | 258 +++++++++++------------------------------------------ 1 file changed, 52 insertions(+), 206 deletions(-) diff --git a/qemu-img.c b/qemu-img.c index 8597d069af..639a7b0256 100644 --- a/qemu-img.c +++ b/qemu-img.c @@ -226,21 +226,27 @@ static void QEMU_NORETURN help(void) exit(EXIT_SUCCESS); } =20 -static QemuOptsList qemu_object_opts =3D { - .name =3D "object", - .implied_opt_name =3D "qom-type", - .head =3D QTAILQ_HEAD_INITIALIZER(qemu_object_opts.head), - .desc =3D { - { } - }, -}; - -static bool qemu_img_object_print_help(const char *type, QemuOpts *opts) +static void qemu_img_object_parse(const char *optarg, int exit_code) { - if (user_creatable_print_help(type, opts)) { - exit(0); + QDict *args; + bool help; + Error *local_error =3D NULL; + + args =3D keyval_parse(optarg, "qom-type", &help, &local_error); + if (local_error) { + error_report_err(local_error); + exit(exit_code); } - return true; + if (help) { + user_creatable_print_help_from_qdict(args); + exit(EXIT_SUCCESS); + } + user_creatable_add_dict(args, true, &local_error); + if (local_error) { + error_report_err(local_error); + exit(exit_code); + } + qobject_unref(args); } =20 /* @@ -566,14 +572,9 @@ static int img_create(int argc, char **argv) case 'u': flags |=3D BDRV_O_NO_BACKING; break; - case OPTION_OBJECT: { - QemuOpts *opts; - opts =3D qemu_opts_parse_noisily(&qemu_object_opts, - optarg, true); - if (!opts) { - goto fail; - } - } break; + case OPTION_OBJECT: + qemu_img_object_parse(optarg, 1); + break; } } =20 @@ -589,12 +590,6 @@ static int img_create(int argc, char **argv) } optind++; =20 - if (qemu_opts_foreach(&qemu_object_opts, - user_creatable_add_opts_foreach, - qemu_img_object_print_help, &error_fatal)) { - goto fail; - } - /* Get image size, if specified */ if (optind < argc) { int64_t sval; @@ -804,14 +799,9 @@ static int img_check(int argc, char **argv) case 'U': force_share =3D true; break; - case OPTION_OBJECT: { - QemuOpts *opts; - opts =3D qemu_opts_parse_noisily(&qemu_object_opts, - optarg, true); - if (!opts) { - return 1; - } - } break; + case OPTION_OBJECT: + qemu_img_object_parse(optarg, 1); + break; case OPTION_IMAGE_OPTS: image_opts =3D true; break; @@ -831,12 +821,6 @@ static int img_check(int argc, char **argv) return 1; } =20 - if (qemu_opts_foreach(&qemu_object_opts, - user_creatable_add_opts_foreach, - qemu_img_object_print_help, &error_fatal)) { - return 1; - } - ret =3D bdrv_parse_cache_mode(cache, &flags, &writethrough); if (ret < 0) { error_report("Invalid source cache option: %s", cache); @@ -1034,14 +1018,9 @@ static int img_commit(int argc, char **argv) return 1; } break; - case OPTION_OBJECT: { - QemuOpts *opts; - opts =3D qemu_opts_parse_noisily(&qemu_object_opts, - optarg, true); - if (!opts) { - return 1; - } - } break; + case OPTION_OBJECT: + qemu_img_object_parse(optarg, 1); + break; case OPTION_IMAGE_OPTS: image_opts =3D true; break; @@ -1058,12 +1037,6 @@ static int img_commit(int argc, char **argv) } filename =3D argv[optind++]; =20 - if (qemu_opts_foreach(&qemu_object_opts, - user_creatable_add_opts_foreach, - qemu_img_object_print_help, &error_fatal)) { - return 1; - } - flags =3D BDRV_O_RDWR | BDRV_O_UNMAP; ret =3D bdrv_parse_cache_mode(cache, &flags, &writethrough); if (ret < 0) { @@ -1423,15 +1396,9 @@ static int img_compare(int argc, char **argv) case 'U': force_share =3D true; break; - case OPTION_OBJECT: { - QemuOpts *opts; - opts =3D qemu_opts_parse_noisily(&qemu_object_opts, - optarg, true); - if (!opts) { - ret =3D 2; - goto out4; - } - } break; + case OPTION_OBJECT: + qemu_img_object_parse(optarg, 2); + break; case OPTION_IMAGE_OPTS: image_opts =3D true; break; @@ -1450,13 +1417,6 @@ static int img_compare(int argc, char **argv) filename1 =3D argv[optind++]; filename2 =3D argv[optind++]; =20 - if (qemu_opts_foreach(&qemu_object_opts, - user_creatable_add_opts_foreach, - qemu_img_object_print_help, &error_fatal)) { - ret =3D 2; - goto out4; - } - /* Initialize before goto out */ qemu_progress_init(progress, 2.0); =20 @@ -1641,7 +1601,6 @@ out2: blk_unref(blk1); out3: qemu_progress_end(); -out4: return ret; } =20 @@ -2342,15 +2301,9 @@ static int img_convert(int argc, char **argv) goto fail_getopt; } break; - case OPTION_OBJECT: { - QemuOpts *object_opts; - object_opts =3D qemu_opts_parse_noisily(&qemu_object_opts, - optarg, true); - if (!object_opts) { - goto fail_getopt; - } + case OPTION_OBJECT: + qemu_img_object_parse(optarg, 1); break; - } case OPTION_IMAGE_OPTS: image_opts =3D true; break; @@ -2378,12 +2331,6 @@ static int img_convert(int argc, char **argv) out_fmt =3D "raw"; } =20 - if (qemu_opts_foreach(&qemu_object_opts, - user_creatable_add_opts_foreach, - qemu_img_object_print_help, &error_fatal)) { - goto fail_getopt; - } - if (s.compressed && s.copy_range) { error_report("Cannot enable copy offloading when -c is used"); goto fail_getopt; @@ -2975,14 +2922,9 @@ static int img_info(int argc, char **argv) case OPTION_BACKING_CHAIN: chain =3D true; break; - case OPTION_OBJECT: { - QemuOpts *opts; - opts =3D qemu_opts_parse_noisily(&qemu_object_opts, - optarg, true); - if (!opts) { - return 1; - } - } break; + case OPTION_OBJECT: + qemu_img_object_parse(optarg, 1); + break; case OPTION_IMAGE_OPTS: image_opts =3D true; break; @@ -3002,12 +2944,6 @@ static int img_info(int argc, char **argv) return 1; } =20 - if (qemu_opts_foreach(&qemu_object_opts, - user_creatable_add_opts_foreach, - qemu_img_object_print_help, &error_fatal)) { - return 1; - } - list =3D collect_image_info_list(image_opts, filename, fmt, chain, force_share); if (!list) { @@ -3217,14 +3153,9 @@ static int img_map(int argc, char **argv) return 1; } break; - case OPTION_OBJECT: { - QemuOpts *opts; - opts =3D qemu_opts_parse_noisily(&qemu_object_opts, - optarg, true); - if (!opts) { - return 1; - } - } break; + case OPTION_OBJECT: + qemu_img_object_parse(optarg, 1); + break; case OPTION_IMAGE_OPTS: image_opts =3D true; break; @@ -3244,12 +3175,6 @@ static int img_map(int argc, char **argv) return 1; } =20 - if (qemu_opts_foreach(&qemu_object_opts, - user_creatable_add_opts_foreach, - qemu_img_object_print_help, &error_fatal)) { - return 1; - } - blk =3D img_open(image_opts, filename, fmt, 0, false, false, force_sha= re); if (!blk) { return 1; @@ -3388,14 +3313,9 @@ static int img_snapshot(int argc, char **argv) case 'U': force_share =3D true; break; - case OPTION_OBJECT: { - QemuOpts *opts; - opts =3D qemu_opts_parse_noisily(&qemu_object_opts, - optarg, true); - if (!opts) { - return 1; - } - } break; + case OPTION_OBJECT: + qemu_img_object_parse(optarg, 1); + break; case OPTION_IMAGE_OPTS: image_opts =3D true; break; @@ -3407,12 +3327,6 @@ static int img_snapshot(int argc, char **argv) } filename =3D argv[optind++]; =20 - if (qemu_opts_foreach(&qemu_object_opts, - user_creatable_add_opts_foreach, - qemu_img_object_print_help, &error_fatal)) { - return 1; - } - /* Open the image */ blk =3D img_open(image_opts, filename, NULL, bdrv_oflags, false, quiet, force_share); @@ -3546,14 +3460,9 @@ static int img_rebase(int argc, char **argv) case 'q': quiet =3D true; break; - case OPTION_OBJECT: { - QemuOpts *opts; - opts =3D qemu_opts_parse_noisily(&qemu_object_opts, - optarg, true); - if (!opts) { - return 1; - } - } break; + case OPTION_OBJECT: + qemu_img_object_parse(optarg, 1); + break; case OPTION_IMAGE_OPTS: image_opts =3D true; break; @@ -3575,12 +3484,6 @@ static int img_rebase(int argc, char **argv) } filename =3D argv[optind++]; =20 - if (qemu_opts_foreach(&qemu_object_opts, - user_creatable_add_opts_foreach, - qemu_img_object_print_help, &error_fatal)) { - return 1; - } - qemu_progress_init(progress, 2.0); qemu_progress_print(0, 100); =20 @@ -3971,14 +3874,9 @@ static int img_resize(int argc, char **argv) case 'q': quiet =3D true; break; - case OPTION_OBJECT: { - QemuOpts *opts; - opts =3D qemu_opts_parse_noisily(&qemu_object_opts, - optarg, true); - if (!opts) { - return 1; - } - } break; + case OPTION_OBJECT: + qemu_img_object_parse(optarg, 1); + break; case OPTION_IMAGE_OPTS: image_opts =3D true; break; @@ -4000,12 +3898,6 @@ static int img_resize(int argc, char **argv) } filename =3D argv[optind++]; =20 - if (qemu_opts_foreach(&qemu_object_opts, - user_creatable_add_opts_foreach, - qemu_img_object_print_help, &error_fatal)) { - return 1; - } - /* Choose grow, shrink, or absolute resize mode */ switch (size[0]) { case '+': @@ -4185,12 +4077,7 @@ static int img_amend(int argc, char **argv) quiet =3D true; break; case OPTION_OBJECT: - opts =3D qemu_opts_parse_noisily(&qemu_object_opts, - optarg, true); - if (!opts) { - ret =3D -1; - goto out_no_progress; - } + qemu_img_object_parse(optarg, 1); break; case OPTION_IMAGE_OPTS: image_opts =3D true; @@ -4205,13 +4092,6 @@ static int img_amend(int argc, char **argv) error_exit("Must specify options (-o)"); } =20 - if (qemu_opts_foreach(&qemu_object_opts, - user_creatable_add_opts_foreach, - qemu_img_object_print_help, &error_fatal)) { - ret =3D -1; - goto out_no_progress; - } - if (quiet) { progress =3D false; } @@ -4670,7 +4550,6 @@ static int img_bitmap(int argc, char **argv) { Error *err =3D NULL; int c, ret =3D 1; - QemuOpts *opts =3D NULL; const char *fmt =3D NULL, *src_fmt =3D NULL, *src_filename =3D NULL; const char *filename, *bitmap; BlockBackend *blk =3D NULL, *src =3D NULL; @@ -4764,10 +4643,7 @@ static int img_bitmap(int argc, char **argv) merge =3D true; break; case OPTION_OBJECT: - opts =3D qemu_opts_parse_noisily(&qemu_object_opts, optarg, tr= ue); - if (!opts) { - goto out; - } + qemu_img_object_parse(optarg, 1); break; case OPTION_IMAGE_OPTS: image_opts =3D true; @@ -4775,12 +4651,6 @@ static int img_bitmap(int argc, char **argv) } } =20 - if (qemu_opts_foreach(&qemu_object_opts, - user_creatable_add_opts_foreach, - qemu_img_object_print_help, &error_fatal)) { - goto out; - } - if (QSIMPLEQ_EMPTY(&actions)) { error_report("Need at least one of --add, --remove, --clear, " "--enable, --disable, or --merge"); @@ -4876,7 +4746,6 @@ static int img_bitmap(int argc, char **argv) out: blk_unref(src); blk_unref(blk); - qemu_opts_del(opts); return ret; } =20 @@ -5038,10 +4907,7 @@ static int img_dd(int argc, char **argv) force_share =3D true; break; case OPTION_OBJECT: - if (!qemu_opts_parse_noisily(&qemu_object_opts, optarg, true))= { - ret =3D -1; - goto out; - } + qemu_img_object_parse(optarg, 1); break; case OPTION_IMAGE_OPTS: image_opts =3D true; @@ -5088,13 +4954,6 @@ static int img_dd(int argc, char **argv) goto out; } =20 - if (qemu_opts_foreach(&qemu_object_opts, - user_creatable_add_opts_foreach, - qemu_img_object_print_help, &error_fatal)) { - ret =3D -1; - goto out; - } - blk1 =3D img_open(image_opts, in.filename, fmt, 0, false, false, force_share); =20 @@ -5270,7 +5129,6 @@ static int img_measure(int argc, char **argv) char *snapshot_name =3D NULL; bool force_share =3D false; QemuOpts *opts =3D NULL; - QemuOpts *object_opts =3D NULL; QemuOpts *sn_opts =3D NULL; QemuOptsList *create_opts =3D NULL; bool image_opts =3D false; @@ -5315,11 +5173,7 @@ static int img_measure(int argc, char **argv) force_share =3D true; break; case OPTION_OBJECT: - object_opts =3D qemu_opts_parse_noisily(&qemu_object_opts, - optarg, true); - if (!object_opts) { - goto out; - } + qemu_img_object_parse(optarg, 1); break; case OPTION_IMAGE_OPTS: image_opts =3D true; @@ -5349,12 +5203,6 @@ static int img_measure(int argc, char **argv) } } =20 - if (qemu_opts_foreach(&qemu_object_opts, - user_creatable_add_opts_foreach, - qemu_img_object_print_help, &error_fatal)) { - goto out; - } - if (argc - optind > 1) { error_report("At most one filename argument is allowed."); goto out; @@ -5442,7 +5290,6 @@ static int img_measure(int argc, char **argv) =20 out: qapi_free_BlockMeasureInfo(info); - qemu_opts_del(object_opts); qemu_opts_del(opts); qemu_opts_del(sn_opts); qemu_opts_free(create_opts); @@ -5494,7 +5341,6 @@ int main(int argc, char **argv) error_exit("Not enough arguments"); } =20 - qemu_add_opts(&qemu_object_opts); qemu_add_opts(&qemu_source_opts); qemu_add_opts(&qemu_trace_opts); =20 --=20 2.26.2 From nobody Sun Apr 28 19:39:16 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1610989137; cv=none; d=zohomail.com; s=zohoarc; b=AesXyxh8ryX7SjeXBC20fWgaRWYIdYwQdEv9JX4othkKqYNK+LMdryA6vWLDtbelhceRjo5/MDBM6AMmehIQpEb62IGh7/3URwFB0X+lZQH759i05XcOCW0ylEN+nfdtyoijOaWeA80GzDQ+z4PHNbiZb666LPAKebMlJIeKbyc= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1610989137; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=VusMVIcUlpdEPythzKcO4qpmlu4Q6CLiHFYFhyW/ObY=; b=XtdlmUxBbkw5ngwFyCnpbh5s7KpBs9mYe/y6D4NeNBF9XdWzKGlm6ObebT7muTzRvybjl1Gi0csgv5JuCS8UpjNfEgvLNv2WgKmaciDSU6R9u24TvaNxTx5CgQWqF4V6SNoa44BQnDDQsI7Cm2A6D9UQ9eV0/pnPs6aLF4+FNF8= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1610989137600592.443669806027; Mon, 18 Jan 2021 08:58:57 -0800 (PST) Received: from localhost ([::1]:59710 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1l1Xri-0000eS-56 for importer@patchew.org; Mon, 18 Jan 2021 11:58:54 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:35128) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1l1XRV-0002UM-1W for qemu-devel@nongnu.org; Mon, 18 Jan 2021 11:31:49 -0500 Received: from us-smtp-delivery-124.mimecast.com ([216.205.24.124]:36105) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.90_1) (envelope-from ) id 1l1XRO-0001WR-SE for qemu-devel@nongnu.org; Mon, 18 Jan 2021 11:31:48 -0500 Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-325-JK6NYIfTOhmiVgVEUqtX3Q-1; Mon, 18 Jan 2021 11:31:38 -0500 Received: from smtp.corp.redhat.com (int-mx08.intmail.prod.int.phx2.redhat.com [10.5.11.23]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id E4E5F107ACF5 for ; Mon, 18 Jan 2021 16:31:37 +0000 (UTC) Received: from virtlab701.virt.lab.eng.bos.redhat.com (virtlab701.virt.lab.eng.bos.redhat.com [10.19.152.228]) by smtp.corp.redhat.com (Postfix) with ESMTP id 5A23C19C66; Mon, 18 Jan 2021 16:31:37 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1610987500; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=VusMVIcUlpdEPythzKcO4qpmlu4Q6CLiHFYFhyW/ObY=; b=NnJFfi471+X/ljBmhXiPRT9o1wIup+HafElyjnOhy8Fvnjl+TIsHYcBkMZekeZFOzK2/cp uhH4fJIiu1RRj2cB2bCHQs8UaBlJVApNIhzjlmRxZB98fN+SMyFNP6KCAS3nJCXgcITCkC vD/b/GEKeTeqSUhqg5pbVqStd7VcPFs= X-MC-Unique: JK6NYIfTOhmiVgVEUqtX3Q-1 From: Paolo Bonzini To: qemu-devel@nongnu.org Subject: [PATCH 20/25] qemu: use keyval for -object parsing Date: Mon, 18 Jan 2021 11:31:08 -0500 Message-Id: <20210118163113.780171-21-pbonzini@redhat.com> In-Reply-To: <20210118163113.780171-1-pbonzini@redhat.com> References: <20210118163113.780171-1-pbonzini@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.84 on 10.5.11.23 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=pbonzini@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=216.205.24.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -29 X-Spam_score: -3.0 X-Spam_bar: --- X-Spam_report: (-3.0 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.175, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H3=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, imammedo@redhat.com, armbru@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @redhat.com) Content-Type: text/plain; charset="utf-8" Signed-off-by: Paolo Bonzini --- include/qom/object_interfaces.h | 65 +--------------------------- qom/object_interfaces.c | 75 --------------------------------- softmmu/vl.c | 75 +++++++++++++++++++++------------ 3 files changed, 48 insertions(+), 167 deletions(-) diff --git a/include/qom/object_interfaces.h b/include/qom/object_interface= s.h index ed0d7d663b..1caa4fca57 100644 --- a/include/qom/object_interfaces.h +++ b/include/qom/object_interfaces.h @@ -104,51 +104,6 @@ Object *user_creatable_add_type(const char *type, cons= t char *id, */ bool user_creatable_add_dict(const QDict *qdict, bool keyval, Error **errp= ); =20 -/** - * user_creatable_add_opts: - * @opts: the object definition - * @errp: if an error occurs, a pointer to an area to store the error - * - * Create an instance of the user creatable object whose type - * is defined in @opts by the 'qom-type' option, placing it - * in the object composition tree with name provided by the - * 'id' field. The remaining options in @opts are used to - * initialize the object properties. - * - * Returns: the newly created object or NULL on error - */ -Object *user_creatable_add_opts(QemuOpts *opts, Error **errp); - - -/** - * user_creatable_add_opts_predicate: - * @type: the QOM type to be added - * - * A callback function to determine whether an object - * of type @type should be created. Instances of this - * callback should be passed to user_creatable_add_opts_foreach - */ -typedef bool (*user_creatable_add_opts_predicate)(const char *type); - -/** - * user_creatable_add_opts_foreach: - * @opaque: a user_creatable_add_opts_predicate callback or NULL - * @opts: options to create - * @errp: unused - * - * An iterator callback to be used in conjunction with - * the qemu_opts_foreach() method for creating a list of - * objects from a set of QemuOpts - * - * The @opaque parameter can be passed a user_creatable_add_opts_predicate - * callback to filter which types of object are created during iteration. - * When it fails, report the error. - * - * Returns: 0 on success, -1 when an error was reported. - */ -int user_creatable_add_opts_foreach(void *opaque, - QemuOpts *opts, Error **errp); - /** * user_creatable_print_types: * @@ -156,30 +111,12 @@ int user_creatable_add_opts_foreach(void *opaque, */ void user_creatable_print_types(void); =20 -/** - * user_creatable_print_help: - * @type: the QOM type to be added - * @opts: options to create - * - * Prints help if requested in @type or @opts. Note that if @type is neith= er - * "help"/"?" nor a valid user creatable type, no help will be printed - * regardless of @opts. - * - * Returns: true if a help option was found and help was printed, false - * otherwise. - */ -bool user_creatable_print_help(const char *type, QemuOpts *opts); - /** * user_creatable_print_help_from_qdict: * @args: options to create * * Prints help considering the other options given in @args (if "qom-type"= is - * given and valid, print properties for the type, otherwise print valid t= ypes) - * - * In contrast to user_creatable_print_help(), this function can't return = that - * no help was requested. It should only be called if we know that help is - * requested and it will always print some help. + * given and valid, print properties for the type, otherwise print valid t= ypes). */ void user_creatable_print_help_from_qdict(const QDict *args); =20 diff --git a/qom/object_interfaces.c b/qom/object_interfaces.c index fbbf5e8ad3..654f717431 100644 --- a/qom/object_interfaces.c +++ b/qom/object_interfaces.c @@ -140,60 +140,6 @@ out: return !!obj; } =20 -Object *user_creatable_add_opts(QemuOpts *opts, Error **errp) -{ - Visitor *v; - QDict *pdict; - Object *obj; - const char *id =3D qemu_opts_id(opts); - char *type =3D qemu_opt_get_del(opts, "qom-type"); - - if (!type) { - error_setg(errp, QERR_MISSING_PARAMETER, "qom-type"); - return NULL; - } - if (!id) { - error_setg(errp, QERR_MISSING_PARAMETER, "id"); - qemu_opt_set(opts, "qom-type", type, &error_abort); - g_free(type); - return NULL; - } - - qemu_opts_set_id(opts, NULL); - pdict =3D qemu_opts_to_qdict(opts, NULL); - - v =3D opts_visitor_new(opts); - obj =3D user_creatable_add_type(type, id, pdict, v, errp); - visit_free(v); - - qemu_opts_set_id(opts, (char *) id); - qemu_opt_set(opts, "qom-type", type, &error_abort); - g_free(type); - qobject_unref(pdict); - return obj; -} - - -int user_creatable_add_opts_foreach(void *opaque, QemuOpts *opts, Error **= errp) -{ - bool (*type_opt_predicate)(const char *, QemuOpts *) =3D opaque; - Object *obj =3D NULL; - const char *type; - - type =3D qemu_opt_get(opts, "qom-type"); - if (type && type_opt_predicate && - !type_opt_predicate(type, opts)) { - return 0; - } - - obj =3D user_creatable_add_opts(opts, errp); - if (!obj) { - return -1; - } - object_unref(obj); - return 0; -} - char *object_property_help(const char *name, const char *type, QObject *defval, const char *description) { @@ -269,20 +215,6 @@ static bool user_creatable_print_type_properites(const= char *type) return true; } =20 -bool user_creatable_print_help(const char *type, QemuOpts *opts) -{ - if (is_help_option(type)) { - user_creatable_print_types(); - return true; - } - - if (qemu_opt_has_help_opt(opts)) { - return user_creatable_print_type_properites(type); - } - - return false; -} - void user_creatable_print_help_from_qdict(const QDict *args) { const char *type =3D qdict_get_try_str(args, "qom-type"); @@ -309,13 +241,6 @@ bool user_creatable_del(const char *id, Error **errp) return false; } =20 - /* - * if object was defined on the command-line, remove its corresponding - * option group entry - */ - qemu_opts_del(qemu_opts_find(qemu_find_opts_err("object", &error_abort= ), - id)); - object_unparent(obj); return true; } diff --git a/softmmu/vl.c b/softmmu/vl.c index ce0693cdda..f8b28618c9 100644 --- a/softmmu/vl.c +++ b/softmmu/vl.c @@ -136,6 +136,7 @@ static const char *cpu_option; static const char *mem_path; static const char *incoming; static const char *loadvm; +static GSList *object_opts_list =3D NULL; static ram_addr_t maxram_size; static uint64_t ram_slots; static int display_remote; @@ -308,15 +309,6 @@ static QemuOptsList qemu_add_fd_opts =3D { }, }; =20 -static QemuOptsList qemu_object_opts =3D { - .name =3D "object", - .implied_opt_name =3D "qom-type", - .head =3D QTAILQ_HEAD_INITIALIZER(qemu_object_opts.head), - .desc =3D { - { } - }, -}; - static QemuOptsList qemu_tpmdev_opts =3D { .name =3D "tpmdev", .implied_opt_name =3D "type", @@ -1687,12 +1679,8 @@ static int machine_set_property(void *opaque, * cannot be created here, as it depends on the chardev * already existing. */ -static bool object_create_early(const char *type, QemuOpts *opts) +static bool object_create_early(const char *type) { - if (user_creatable_print_help(type, opts)) { - exit(0); - } - /* * Objects should not be made "delayed" without a reason. If you * add one, state the reason in a comment! @@ -1784,6 +1772,22 @@ static void qemu_apply_machine_options(void) } } =20 +static void user_creatable_add_dict_foreach(void *data, void *opaque) +{ + bool (*type_opt_predicate)(const char *) =3D opaque; + const QDict *dict =3D data; + const char *type =3D qdict_get_try_str(dict, "qom-type"); + + if (!type) { + error_report("Parameter 'qom-type' is missing"); + } + if (type_opt_predicate && !type_opt_predicate(type)) { + return; + } + + user_creatable_add_dict(dict, true, &error_fatal); +} + static void qemu_create_early_backends(void) { MachineClass *machine_class =3D MACHINE_GET_CLASS(current_machine); @@ -1810,9 +1814,9 @@ static void qemu_create_early_backends(void) exit(1); } =20 - qemu_opts_foreach(qemu_find_opts("object"), - user_creatable_add_opts_foreach, - object_create_early, &error_fatal); + g_slist_foreach(object_opts_list, + user_creatable_add_dict_foreach, + object_create_early); =20 /* spice needs the timers to be initialized by this point */ /* spice must initialize before audio as it changes the default auiode= v */ @@ -1841,9 +1845,9 @@ static void qemu_create_early_backends(void) * The remainder of object creation happens after the * creation of chardev, fsdev, net clients and device data types. */ -static bool object_create_late(const char *type, QemuOpts *opts) +static bool object_create_late(const char *type) { - return !object_create_early(type, opts); + return !object_create_early(type); } =20 static void qemu_create_late_backends(void) @@ -1854,9 +1858,9 @@ static void qemu_create_late_backends(void) =20 net_init_clients(&error_fatal); =20 - qemu_opts_foreach(qemu_find_opts("object"), - user_creatable_add_opts_foreach, - object_create_late, &error_fatal); + g_slist_foreach(object_opts_list, + user_creatable_add_dict_foreach, + object_create_late); =20 if (tpm_init() < 0) { exit(1); @@ -2063,6 +2067,9 @@ static int global_init_func(void *opaque, QemuOpts *o= pts, Error **errp) */ static bool is_qemuopts_group(const char *group) { + if (g_str_equal(group, "object")) { + return false; + } return true; } =20 @@ -2072,6 +2079,9 @@ static bool is_qemuopts_group(const char *group) */ static GSList **qemu_config_list(const char *group) { + if (g_str_equal(group, "object")) { + return &object_opts_list; + } return NULL; } =20 @@ -2679,7 +2689,6 @@ void qemu_init(int argc, char **argv, char **envp) qemu_add_opts(&qemu_smp_opts); qemu_add_opts(&qemu_boot_opts); qemu_add_opts(&qemu_add_fd_opts); - qemu_add_opts(&qemu_object_opts); qemu_add_opts(&qemu_tpmdev_opts); qemu_add_opts(&qemu_overcommit_opts); qemu_add_opts(&qemu_msg_opts); @@ -3455,12 +3464,18 @@ void qemu_init(int argc, char **argv, char **envp) #endif break; case QEMU_OPTION_object: - opts =3D qemu_opts_parse_noisily(qemu_find_opts("object"), - optarg, true); - if (!opts) { - exit(1); + { + QDict *args; + bool help; + + args =3D keyval_parse(optarg, "qom-type", &help, &erro= r_fatal); + if (help) { + user_creatable_print_help_from_qdict(args); + exit(EXIT_SUCCESS); + } + qemu_record_config_group("object", args, &error_abort); + break; } - break; case QEMU_OPTION_overcommit: opts =3D qemu_opts_parse_noisily(qemu_find_opts("overcommi= t"), optarg, false); @@ -3504,6 +3519,10 @@ void qemu_init(int argc, char **argv, char **envp) } } } + + /* Cleanup after option parsing loop. */ + object_opts_list =3D g_slist_reverse(object_opts_list); + /* * Clear error location left behind by the loop. * Best done right after the loop. Do not insert code here! --=20 2.26.2 From nobody Sun Apr 28 19:39:16 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1610989452; cv=none; d=zohomail.com; s=zohoarc; b=Hb9/kfSoNiPKUBcU/R9c6fOIYoRjZqxgkBaiemnJNaFV5dttEZnsJqkHy9WBmmp/wKPHW1tTc6HNP70SmsW1imcIxeTekKCik2FlVCC53q45h+r3dPlGAohu8mFcnAqa+Q5EktokEvd0hPKC1iYhBFRRuYvsRyycScKeuvCA20o= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1610989452; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=fBAPT2jXJkw4xqsBK+Mpk1vCpRSUqv74XDzNlY0t/ho=; b=LLcE2O+MqOLv1fsZ1ykBaAjeS891fdAbYxbEQNP6RjAXGfjuR/6Gnj93J4eyhDd0QkQT+2A9c7dfxIpZS8OQAthebB8dCGc/LAsulBXCKzbINqQDSQhmXDOv4qDw9T6GFNA4Dq0WcgUaGC+717KAZm+DHD9YukKDMjDfkaQAog8= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1610989452498773.3833624665049; Mon, 18 Jan 2021 09:04:12 -0800 (PST) Received: from localhost ([::1]:43814 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1l1Xwp-0006PK-6U for importer@patchew.org; Mon, 18 Jan 2021 12:04:11 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:35148) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1l1XRV-0002W8-Sy for qemu-devel@nongnu.org; Mon, 18 Jan 2021 11:31:49 -0500 Received: from us-smtp-delivery-124.mimecast.com ([63.128.21.124]:24496) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.90_1) (envelope-from ) id 1l1XRP-0001Wg-54 for qemu-devel@nongnu.org; Mon, 18 Jan 2021 11:31:49 -0500 Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-264-yR0DzUAeMK6qc3dZPOta8A-1; Mon, 18 Jan 2021 11:31:39 -0500 Received: from smtp.corp.redhat.com (int-mx08.intmail.prod.int.phx2.redhat.com [10.5.11.23]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 8592C107ACE4 for ; Mon, 18 Jan 2021 16:31:38 +0000 (UTC) Received: from virtlab701.virt.lab.eng.bos.redhat.com (virtlab701.virt.lab.eng.bos.redhat.com [10.19.152.228]) by smtp.corp.redhat.com (Postfix) with ESMTP id 0F33719C66; Mon, 18 Jan 2021 16:31:37 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1610987501; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=fBAPT2jXJkw4xqsBK+Mpk1vCpRSUqv74XDzNlY0t/ho=; b=dt676KkD4ad9BxnVPdiwU87ZoHdsLQvMw7bDwDI/V8IgxS17b66yySRyOAa7b/Ac1q6zJ2 dNvuMssAJ2HQGp3xVsg8KplRPML98zFXWGEou07VrML307UT2bxm0KJB/yGZ2BWSYCQuVx 0Q7meiTWeyJA36vU5OU0njrNqow2uIs= X-MC-Unique: yR0DzUAeMK6qc3dZPOta8A-1 From: Paolo Bonzini To: qemu-devel@nongnu.org Subject: [PATCH 21/25] storage-daemon: do not register the "object" group with QemuOpts Date: Mon, 18 Jan 2021 11:31:09 -0500 Message-Id: <20210118163113.780171-22-pbonzini@redhat.com> In-Reply-To: <20210118163113.780171-1-pbonzini@redhat.com> References: <20210118163113.780171-1-pbonzini@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.84 on 10.5.11.23 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=pbonzini@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=63.128.21.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -29 X-Spam_score: -3.0 X-Spam_bar: --- X-Spam_report: (-3.0 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.175, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H4=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, imammedo@redhat.com, armbru@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @redhat.com) Content-Type: text/plain; charset="utf-8" Since qsd uses keyval instead of -object, do not bother registering qemu_object_opts. It used to be necessary for object-del; that requirement is not there anymore since emulators have switched to keyval. Signed-off-by: Paolo Bonzini --- storage-daemon/qemu-storage-daemon.c | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/storage-daemon/qemu-storage-daemon.c b/storage-daemon/qemu-sto= rage-daemon.c index e0c87edbdd..8e891d56f5 100644 --- a/storage-daemon/qemu-storage-daemon.c +++ b/storage-daemon/qemu-storage-daemon.c @@ -130,15 +130,6 @@ enum { =20 extern QemuOptsList qemu_chardev_opts; =20 -static QemuOptsList qemu_object_opts =3D { - .name =3D "object", - .implied_opt_name =3D "qom-type", - .head =3D QTAILQ_HEAD_INITIALIZER(qemu_object_opts.head), - .desc =3D { - { } - }, -}; - static void init_qmp_commands(void) { qmp_init_marshal(&qmp_commands); @@ -295,7 +286,6 @@ int main(int argc, char *argv[]) =20 module_call_init(MODULE_INIT_QOM); module_call_init(MODULE_INIT_TRACE); - qemu_add_opts(&qemu_object_opts); qemu_add_opts(&qemu_trace_opts); qcrypto_init(&error_fatal); bdrv_init(); --=20 2.26.2 From nobody Sun Apr 28 19:39:16 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1610989377; cv=none; d=zohomail.com; s=zohoarc; b=NXosJfyx51n0ulU54aqyuQBfQLRRJ3y4RXo9hWSwLJz2FIftsoSPnH0WRIdH7GLY6ii8K3apJk3mVl7HyZXUSedsqXLhdh6ZIFZg3aLjVYJbbPofMt4MJojDtdWl5JCUU7Xb2PC6SO2na9nQY92QzwacvLGcug1HTQEWI5lL4fA= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1610989377; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=Shhn7vKc2ipuhBBRT1BgItsROvR5A+86lilzex1Fcb4=; b=S0j2o39aISVvz5WSBPG5cE5aLlfaDJm5NXLburLMYQMDmQaTuZ05kHMitLeXBMtVW3mV+M9HUonfrVAoLx5GbhNEOIrLDWMJMMvxEiZhuvTCc6M+tqn2tuLhb9glFqnLmhmtry1vTaUZtEeOqHdnG8AzyDGfusT1WTk3v5ve/pQ= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1610989377447320.22072334172594; Mon, 18 Jan 2021 09:02:57 -0800 (PST) Received: from localhost ([::1]:40054 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1l1Xvc-0004bo-66 for importer@patchew.org; Mon, 18 Jan 2021 12:02:56 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:35144) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1l1XRV-0002Vq-P6 for qemu-devel@nongnu.org; Mon, 18 Jan 2021 11:31:49 -0500 Received: from us-smtp-delivery-124.mimecast.com ([216.205.24.124]:51008) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.90_1) (envelope-from ) id 1l1XRP-0001Wn-ST for qemu-devel@nongnu.org; Mon, 18 Jan 2021 11:31:49 -0500 Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-191-MZTKVSovM1KL-nQCM1j3ZQ-1; Mon, 18 Jan 2021 11:31:40 -0500 Received: from smtp.corp.redhat.com (int-mx08.intmail.prod.int.phx2.redhat.com [10.5.11.23]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 2A95E1005504 for ; Mon, 18 Jan 2021 16:31:39 +0000 (UTC) Received: from virtlab701.virt.lab.eng.bos.redhat.com (virtlab701.virt.lab.eng.bos.redhat.com [10.19.152.228]) by smtp.corp.redhat.com (Postfix) with ESMTP id A64DE19C66; Mon, 18 Jan 2021 16:31:38 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1610987501; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=Shhn7vKc2ipuhBBRT1BgItsROvR5A+86lilzex1Fcb4=; b=avFhEO1I2nPc5Er3Tyy7+b0vwvLKuqXYGq2YoqvDgCIB1eRM/iiHYy8ZHG9HChNuLVIv+D QRK3tm4EQuhPy1txJoyE2QwWDFpl2q8VF/BG9wN7dbGPSlMmVG+UXTttxEUUR5v0IhTm4N aMQJqOXgkdMeiSJJGCmlkXuhJxeP4Zk= X-MC-Unique: MZTKVSovM1KL-nQCM1j3ZQ-1 From: Paolo Bonzini To: qemu-devel@nongnu.org Subject: [PATCH 22/25] qom: export more functions for use with non-UserCreatable objects Date: Mon, 18 Jan 2021 11:31:10 -0500 Message-Id: <20210118163113.780171-23-pbonzini@redhat.com> In-Reply-To: <20210118163113.780171-1-pbonzini@redhat.com> References: <20210118163113.780171-1-pbonzini@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.84 on 10.5.11.23 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=pbonzini@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=216.205.24.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -29 X-Spam_score: -3.0 X-Spam_bar: --- X-Spam_report: (-3.0 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.175, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H3=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, imammedo@redhat.com, armbru@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @redhat.com) Content-Type: text/plain; charset="utf-8" Machines and accelerators are not user-creatable but they share similar parsing machinery. Export functions that will be used with -machine and -accel in softmmu/vl.c. Signed-off-by: Paolo Bonzini --- include/qom/object.h | 21 +++++++++++++++++ qom/object_interfaces.c | 51 +++++++++++++++++++++++++++++------------ 2 files changed, 57 insertions(+), 15 deletions(-) diff --git a/include/qom/object.h b/include/qom/object.h index d378f13a11..cd27facd8a 100644 --- a/include/qom/object.h +++ b/include/qom/object.h @@ -860,6 +860,27 @@ static void do_qemu_init_ ## type_array(void) = \ } = \ type_init(do_qemu_init_ ## type_array) =20 +/** + * type_print_class_properties: + * @type: a QOM class name + * + * Print the object's class properties to stdout or the monitor. + * Return whether an object was found. + */ +bool type_print_class_properties(const char *type); + +/** + * object_set_properties_from_keyval: + * @obj: a QOM object + * @qdict: a dictionary whose leaf values are strings + * @errp: pointer to error object + * + * For each key in the dictionary, parse the value string and set the + * corresponding property in @obj. + */ +void object_set_properties_from_keyval(Object *obj, const QDict *qdict, + Error **errp); + /** * object_class_dynamic_cast_assert: * @klass: The #ObjectClass to attempt to cast. diff --git a/qom/object_interfaces.c b/qom/object_interfaces.c index 654f717431..80efea2ca9 100644 --- a/qom/object_interfaces.c +++ b/qom/object_interfaces.c @@ -38,13 +38,45 @@ bool user_creatable_can_be_deleted(UserCreatable *uc) } } =20 +static void object_set_properties_from_qdict(Object *obj, const QDict *qdi= ct, + Visitor *v, Error **errp) +{ + const QDictEntry *e; + Error *local_err =3D NULL; + + if (!visit_start_struct(v, NULL, NULL, 0, &local_err)) { + goto out; + } + for (e =3D qdict_first(qdict); e; e =3D qdict_next(qdict, e)) { + if (!object_property_set(obj, e->key, v, &local_err)) { + break; + } + } + if (!local_err) { + visit_check_struct(v, &local_err); + } + visit_end_struct(v, NULL); + +out: + if (local_err) { + error_propagate(errp, local_err); + } +} + +void object_set_properties_from_keyval(Object *obj, const QDict *qdict, + Error **errp) +{ + Visitor *v =3D qobject_input_visitor_new_keyval(QOBJECT(qdict)); + object_set_properties_from_qdict(obj, qdict, v, errp); + visit_free(v); +} + Object *user_creatable_add_type(const char *type, const char *id, const QDict *qdict, Visitor *v, Error **errp) { Object *obj; ObjectClass *klass; - const QDictEntry *e; Error *local_err =3D NULL; =20 klass =3D object_class_by_name(type); @@ -66,18 +98,7 @@ Object *user_creatable_add_type(const char *type, const = char *id, =20 assert(qdict); obj =3D object_new(type); - if (!visit_start_struct(v, NULL, NULL, 0, &local_err)) { - goto out; - } - for (e =3D qdict_first(qdict); e; e =3D qdict_next(qdict, e)) { - if (!object_property_set(obj, e->key, v, &local_err)) { - break; - } - } - if (!local_err) { - visit_check_struct(v, &local_err); - } - visit_end_struct(v, NULL); + object_set_properties_from_qdict(obj, qdict, v, &local_err); if (local_err) { goto out; } @@ -177,7 +198,7 @@ void user_creatable_print_types(void) g_slist_free(list); } =20 -static bool user_creatable_print_type_properites(const char *type) +bool type_print_class_properties(const char *type) { ObjectClass *klass; ObjectPropertyIterator iter; @@ -219,7 +240,7 @@ void user_creatable_print_help_from_qdict(const QDict *= args) { const char *type =3D qdict_get_try_str(args, "qom-type"); =20 - if (!type || !user_creatable_print_type_properites(type)) { + if (!type || !type_print_class_properties(type)) { user_creatable_print_types(); } } --=20 2.26.2 From nobody Sun Apr 28 19:39:16 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1610989294; cv=none; d=zohomail.com; s=zohoarc; b=gauXK1a4rzB7MkCLfH9kjb5Ir3wtpqgfjBqN6w/HYeEoyIb4l9BcN21e/WZAFzb4Cwg7VkjGOTey0k6T0whYzt+33sT0WaPZg9lpO90al/QaDNp17SEhP9PD6LHQPy7BYPmnxeQ/0vCB1/Tn9nqXPXwGOdxyiga7Gts6unS7PGc= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1610989294; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=Z8E+RRMhRhbIYkvph+TjcQ2hT43RCYgnyRS8Fb3iimA=; b=Jq9Waq75CBEXdNxaR8TbeDdjp4x20gXQxACcsVYPjSYascTUt3J+KfM05LZ20UPDuv7GNAEJbpGkh0Tk43171+hFhg7KCJ9Mnz6zCaHoZc2rQHCxtJRsEmg9GxedD8trXYVcZrm9Kb5m+xxAnxpDjLtoYRBVj1KR8nPUsyNii6s= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1610989294726876.4757758902841; Mon, 18 Jan 2021 09:01:34 -0800 (PST) Received: from localhost ([::1]:37082 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1l1XuF-0002z4-16 for importer@patchew.org; Mon, 18 Jan 2021 12:01:32 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:35190) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1l1XRX-0002Zl-W1 for qemu-devel@nongnu.org; Mon, 18 Jan 2021 11:31:52 -0500 Received: from us-smtp-delivery-124.mimecast.com ([63.128.21.124]:49326) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.90_1) (envelope-from ) id 1l1XRQ-0001Wu-Qu for qemu-devel@nongnu.org; Mon, 18 Jan 2021 11:31:51 -0500 Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-576-2mNlWSpQMA2as8Iq-mSnFQ-1; Mon, 18 Jan 2021 11:31:40 -0500 Received: from smtp.corp.redhat.com (int-mx08.intmail.prod.int.phx2.redhat.com [10.5.11.23]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id C0A8E190B2A0 for ; Mon, 18 Jan 2021 16:31:39 +0000 (UTC) Received: from virtlab701.virt.lab.eng.bos.redhat.com (virtlab701.virt.lab.eng.bos.redhat.com [10.19.152.228]) by smtp.corp.redhat.com (Postfix) with ESMTP id 49A4719C66; Mon, 18 Jan 2021 16:31:39 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1610987502; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=Z8E+RRMhRhbIYkvph+TjcQ2hT43RCYgnyRS8Fb3iimA=; b=OJ56FWzIY6YmEQXvbRZGrFrOIcCeGo91HlX1Sav9j5deXiVDoKZrqjpAWBtfy2d8HpnqTB 4Bt/rr4tk4rzU/bo/t9hmp/Rt4Yf2zpASvra9QHcozhgHH55LPKkZGCjA9eXJQictC4O8S qXNuOj5aIi5wj8XZy5Q/nj9FEI/uXPI= X-MC-Unique: 2mNlWSpQMA2as8Iq-mSnFQ-1 From: Paolo Bonzini To: qemu-devel@nongnu.org Subject: [PATCH 23/25] vl: switch -M parsing to keyval Date: Mon, 18 Jan 2021 11:31:11 -0500 Message-Id: <20210118163113.780171-24-pbonzini@redhat.com> In-Reply-To: <20210118163113.780171-1-pbonzini@redhat.com> References: <20210118163113.780171-1-pbonzini@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.84 on 10.5.11.23 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=pbonzini@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=63.128.21.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -29 X-Spam_score: -3.0 X-Spam_bar: --- X-Spam_report: (-3.0 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.175, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H4=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, imammedo@redhat.com, armbru@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @redhat.com) Content-Type: text/plain; charset="utf-8" Switch from QemuOpts to keyval. This enables non-scalar machine properties. Signed-off-by: Paolo Bonzini --- softmmu/vl.c | 296 +++++++++++++++++++++++---------------------------- 1 file changed, 132 insertions(+), 164 deletions(-) diff --git a/softmmu/vl.c b/softmmu/vl.c index f8b28618c9..ff906d541d 100644 --- a/softmmu/vl.c +++ b/softmmu/vl.c @@ -136,6 +136,8 @@ static const char *cpu_option; static const char *mem_path; static const char *incoming; static const char *loadvm; +static const char *accelerators; +static QDict *machine_opts_dict; static GSList *object_opts_list =3D NULL; static ram_addr_t maxram_size; static uint64_t ram_slots; @@ -227,21 +229,6 @@ static QemuOptsList qemu_option_rom_opts =3D { }, }; =20 -static QemuOptsList qemu_machine_opts =3D { - .name =3D "machine", - .implied_opt_name =3D "type", - .merge_lists =3D true, - .head =3D QTAILQ_HEAD_INITIALIZER(qemu_machine_opts.head), - .desc =3D { - /* - * no elements =3D> accept any - * sanity checking will happen later - * when setting machine properties - */ - { } - }, -}; - static QemuOptsList qemu_accel_opts =3D { .name =3D "accel", .implied_opt_name =3D "accel", @@ -481,16 +468,6 @@ static QemuOptsList qemu_action_opts =3D { }, }; =20 -/** - * Get machine options - * - * Returns: machine options (never null). - */ -static QemuOpts *qemu_get_machine_opts(void) -{ - return qemu_find_opts_singleton("machine"); -} - const char *qemu_get_vm_name(void) { return qemu_name; @@ -798,33 +775,6 @@ static MachineClass *find_default_machine(GSList *mach= ines) return default_machineclass; } =20 -static int machine_help_func(QemuOpts *opts, MachineState *machine) -{ - ObjectProperty *prop; - ObjectPropertyIterator iter; - - if (!qemu_opt_has_help_opt(opts)) { - return 0; - } - - object_property_iter_init(&iter, OBJECT(machine)); - while ((prop =3D object_property_iter_next(&iter))) { - if (!prop->set) { - continue; - } - - printf("%s.%s=3D%s", MACHINE_GET_CLASS(machine)->name, - prop->name, prop->type); - if (prop->description) { - printf(" (%s)\n", prop->description); - } else { - printf("\n"); - } - } - - return 1; -} - static void version(void) { printf("QEMU emulator version " QEMU_FULL_VERSION "\n" @@ -1515,33 +1465,28 @@ static gint machine_class_cmp(gconstpointer a, gcon= stpointer b) object_class_get_name(OBJECT_CLASS(mc1))); } =20 -static MachineClass *machine_parse(const char *name, GSList *machines) +static void machine_help_func(const QDict *qdict) { - MachineClass *mc; - GSList *el; + GSList *machines, *el; + const char *type =3D qdict_get_try_str(qdict, "type"); =20 - if (is_help_option(name)) { - printf("Supported machines are:\n"); - machines =3D g_slist_sort(machines, machine_class_cmp); - for (el =3D machines; el; el =3D el->next) { - MachineClass *mc =3D el->data; - if (mc->alias) { - printf("%-20s %s (alias of %s)\n", mc->alias, mc->desc, mc= ->name); - } - printf("%-20s %s%s%s\n", mc->name, mc->desc, - mc->is_default ? " (default)" : "", - mc->deprecation_reason ? " (deprecated)" : ""); - } - exit(0); + if (type) { + type_print_class_properties(type); + return; } =20 - mc =3D find_machine(name, machines); - if (!mc) { - error_report("unsupported machine type"); - error_printf("Use -machine help to list supported machines\n"); - exit(1); + printf("Supported machines are:\n"); + machines =3D object_class_get_list(TYPE_MACHINE, false); + machines =3D g_slist_sort(machines, machine_class_cmp); + for (el =3D machines; el; el =3D el->next) { + MachineClass *mc =3D el->data; + if (mc->alias) { + printf("%-20s %s (alias of %s)\n", mc->alias, mc->desc, mc->na= me); + } + printf("%-20s %s%s%s\n", mc->name, mc->desc, + mc->is_default ? " (default)" : "", + mc->deprecation_reason ? " (deprecated)" : ""); } - return mc; } =20 static const char *pid_file; @@ -1594,32 +1539,31 @@ static const QEMUOption *lookup_opt(int argc, char = **argv, return popt; } =20 -static MachineClass *select_machine(void) +static MachineClass *select_machine(QDict *qdict, Error **errp) { + const char *optarg =3D qdict_get_try_str(qdict, "type"); GSList *machines =3D object_class_get_list(TYPE_MACHINE, false); - MachineClass *machine_class =3D find_default_machine(machines); - const char *optarg; - QemuOpts *opts; - Location loc; - - loc_push_none(&loc); - - opts =3D qemu_get_machine_opts(); - qemu_opts_loc_restore(opts); + MachineClass *machine_class; + Error *local_err =3D NULL; =20 - optarg =3D qemu_opt_get(opts, "type"); if (optarg) { - machine_class =3D machine_parse(optarg, machines); - } - - if (!machine_class) { - error_report("No machine specified, and there is no default"); - error_printf("Use -machine help to list supported machines\n"); - exit(1); + machine_class =3D find_machine(optarg, machines); + qdict_del(qdict, "type"); + if (!machine_class) { + error_setg(&local_err, "unsupported machine type"); + } + } else { + machine_class =3D find_default_machine(machines); + if (!machine_class) { + error_setg(&local_err, "No machine specified, and there is no = default"); + } } =20 - loc_pop(&loc); g_slist_free(machines); + if (local_err) { + error_append_hint(&local_err, "Use -machine help to list supported= machines\n"); + error_propagate(errp, local_err); + } return machine_class; } =20 @@ -1638,38 +1582,66 @@ static int object_parse_property_opt(Object *obj, return 0; } =20 -static int machine_set_property(void *opaque, - const char *name, const char *value, - Error **errp) +/* *Non*recursively replace underscores with dashes in QDict keys. */ +static void keyval_dashify(QDict *qdict, Error **errp) { - g_autofree char *qom_name =3D g_strdup(name); + const QDictEntry *ent, *next; char *p; =20 - for (p =3D qom_name; *p; p++) { - if (*p =3D=3D '_') { - *p =3D '-'; + for (ent =3D qdict_first(qdict); ent; ent =3D next) { + g_autofree char *new_key =3D NULL; + + next =3D qdict_next(qdict, ent); + if (!strchr(ent->key, '_')) { + continue; + } + new_key =3D g_strdup(ent->key); + for (p =3D new_key; *p; p++) { + if (*p =3D=3D '_') { + *p =3D '-'; + } } + if (qdict_haskey(qdict, new_key)) { + error_setg(errp, "Conflict between '%s' and '%s'", ent->key, n= ew_key); + return; + } + qobject_ref(ent->value); + qdict_put_obj(qdict, new_key, ent->value); + qdict_del(qdict, ent->key); } +} + +static void qemu_apply_legacy_machine_options(QDict *qdict) +{ + const char *value; + + keyval_dashify(qdict, &error_fatal); =20 /* Legacy options do not correspond to MachineState properties. */ - if (g_str_equal(qom_name, "accel")) { - return 0; - } - if (g_str_equal(qom_name, "igd-passthru")) { - object_register_sugar_prop(ACCEL_CLASS_NAME("xen"), qom_name, valu= e); - return 0; + value =3D qdict_get_try_str(qdict, "accel"); + if (value) { + accelerators =3D g_strdup(value); + qdict_del(qdict, "accel"); } - if (g_str_equal(qom_name, "kvm-shadow-mem")) { - object_register_sugar_prop(ACCEL_CLASS_NAME("kvm"), qom_name, valu= e); - return 0; + + value =3D qdict_get_try_str(qdict, "igd-passthru"); + if (value) { + object_register_sugar_prop(ACCEL_CLASS_NAME("xen"), "igd-passthru"= , value); + qdict_del(qdict, "igd-passthru"); } - if (g_str_equal(qom_name, "kernel-irqchip")) { - object_register_sugar_prop(ACCEL_CLASS_NAME("kvm"), qom_name, valu= e); - object_register_sugar_prop(ACCEL_CLASS_NAME("whpx"), qom_name, val= ue); - return 0; + + value =3D qdict_get_try_str(qdict, "kvm-shadow-mem"); + if (value) { + object_register_sugar_prop(ACCEL_CLASS_NAME("kvm"), "kvm-shadow-me= m", value); + qdict_del(qdict, "kvm-shadow-mem"); } =20 - return object_parse_property_opt(opaque, name, value, "type", errp); + value =3D qdict_get_try_str(qdict, "kernel-irqchip"); + if (value) { + object_register_sugar_prop(ACCEL_CLASS_NAME("kvm"), "kernel-irqchi= p", value); + object_register_sugar_prop(ACCEL_CLASS_NAME("whpx"), "kernel-irqch= ip", value); + qdict_del(qdict, "kernel-irqchip"); + } } =20 /* @@ -1727,16 +1699,14 @@ static bool object_create_early(const char *type) return true; } =20 -static void qemu_apply_machine_options(void) +static void qemu_apply_machine_options(QDict *qdict) { MachineClass *machine_class =3D MACHINE_GET_CLASS(current_machine); - QemuOpts *machine_opts =3D qemu_get_machine_opts(); const char *boot_order =3D NULL; const char *boot_once =3D NULL; QemuOpts *opts; =20 - qemu_opt_foreach(machine_opts, machine_set_property, current_machine, - &error_fatal); + object_set_properties_from_keyval(OBJECT(current_machine), qdict, &err= or_fatal); current_machine->ram_size =3D ram_size; current_machine->maxram_size =3D maxram_size; current_machine->ram_slots =3D ram_slots; @@ -1765,10 +1735,8 @@ static void qemu_apply_machine_options(void) current_machine->boot_once =3D boot_once; =20 if (semihosting_enabled() && !semihosting_get_argc()) { - const char *kernel_filename =3D qemu_opt_get(machine_opts, "kernel= "); - const char *kernel_cmdline =3D qemu_opt_get(machine_opts, "append"= ) ?: ""; /* fall back to the -kernel/-append */ - semihosting_arg_fallback(kernel_filename, kernel_cmdline); + semihosting_arg_fallback(current_machine->kernel_filename, current= _machine->kernel_cmdline); } } =20 @@ -1833,8 +1801,7 @@ static void qemu_create_early_backends(void) =20 /* * Note: we need to create audio and block backends before - * machine_set_property(), so machine properties can refer to - * them. + * setting machine properties, so they can be referred to. */ configure_blockdev(&bdo_queue, machine_class, snapshot); audio_init_audiodevs(); @@ -2004,16 +1971,14 @@ static void set_memory_options(MachineClass *mc) loc_pop(&loc); } =20 -static void qemu_create_machine(MachineClass *machine_class) +static void qemu_create_machine(QDict *qdict) { + MachineClass *machine_class =3D select_machine(qdict, &error_fatal); object_set_machine_compat_props(machine_class->compat_props); =20 set_memory_options(machine_class); =20 current_machine =3D MACHINE(object_new_with_class(OBJECT_CLASS(machine= _class))); - if (machine_help_func(qemu_get_machine_opts(), current_machine)) { - exit(0); - } object_property_add_child(object_get_root(), "machine", OBJECT(current_machine)); object_property_add_child(container_get(OBJECT(current_machine), @@ -2044,8 +2009,11 @@ static void qemu_create_machine(MachineClass *machin= e_class) * specified either by the configuration file or by the command line. */ if (machine_class->default_machine_opts) { - qemu_opts_set_defaults(qemu_find_opts("machine"), - machine_class->default_machine_opts, 0); + QDict *default_opts =3D + keyval_parse(machine_class->default_machine_opts, NULL, NULL, + &error_abort); + object_set_properties_from_keyval(OBJECT(current_machine), default= _opts, &error_abort); + qobject_unref(default_opts); } } =20 @@ -2067,7 +2035,8 @@ static int global_init_func(void *opaque, QemuOpts *o= pts, Error **errp) */ static bool is_qemuopts_group(const char *group) { - if (g_str_equal(group, "object")) { + if (g_str_equal(group, "object") || + g_str_equal(group, "machine")) { return false; } return true; @@ -2109,6 +2078,8 @@ static void qemu_record_config_group(const char *grou= p, QDict *dict, Error **err p_head =3D qemu_config_list(group); if (p_head) { *p_head =3D g_slist_prepend(*p_head, dict); + } else if (g_str_equal(group, "machine")) { + keyval_merge(machine_opts_dict, dict, errp); } else { abort(); } @@ -2262,13 +2233,11 @@ static int do_configure_accelerator(void *opaque, Q= emuOpts *opts, Error **errp) =20 static void configure_accelerators(const char *progname) { - const char *accelerators; bool init_failed =3D false; =20 qemu_opts_foreach(qemu_find_opts("icount"), do_configure_icount, NULL, &error_fatal); =20 - accelerators =3D qemu_opt_get(qemu_get_machine_opts(), "accel"); if (QTAILQ_EMPTY(&qemu_accel_opts.head)) { char **accel_list, **tmp; =20 @@ -2356,12 +2325,11 @@ static void create_default_memdev(MachineState *ms,= const char *path) &error_fatal); } =20 -static void qemu_validate_options(void) +static void qemu_validate_options(const QDict *machine_opts) { - QemuOpts *machine_opts =3D qemu_get_machine_opts(); - const char *kernel_filename =3D qemu_opt_get(machine_opts, "kernel"); - const char *initrd_filename =3D qemu_opt_get(machine_opts, "initrd"); - const char *kernel_cmdline =3D qemu_opt_get(machine_opts, "append"); + const char *kernel_filename =3D qdict_get_try_str(machine_opts, "kerne= l"); + const char *initrd_filename =3D qdict_get_try_str(machine_opts, "initr= d"); + const char *kernel_cmdline =3D qdict_get_try_str(machine_opts, "append= "); =20 if (kernel_filename =3D=3D NULL) { if (kernel_cmdline !=3D NULL) { @@ -2683,7 +2651,6 @@ void qemu_init(int argc, char **argv, char **envp) qemu_add_opts(&qemu_trace_opts); qemu_plugin_add_opts(); qemu_add_opts(&qemu_option_rom_opts); - qemu_add_opts(&qemu_machine_opts); qemu_add_opts(&qemu_accel_opts); qemu_add_opts(&qemu_mem_opts); qemu_add_opts(&qemu_smp_opts); @@ -2723,6 +2690,7 @@ void qemu_init(int argc, char **argv, char **envp) } } =20 + machine_opts_dict =3D qdict_new(); if (userconfig) { qemu_read_default_config_file(&error_fatal); } @@ -2812,8 +2780,7 @@ void qemu_init(int argc, char **argv, char **envp) parse_display(optarg); break; case QEMU_OPTION_nographic: - olist =3D qemu_find_opts("machine"); - qemu_opts_parse_noisily(olist, "graphics=3Doff", false); + qdict_put_str(machine_opts_dict, "graphics", "off"); nographic =3D true; dpy.type =3D DISPLAY_TYPE_NONE; break; @@ -2837,16 +2804,16 @@ void qemu_init(int argc, char **argv, char **envp) } break; case QEMU_OPTION_kernel: - qemu_opts_set(qemu_find_opts("machine"), "kernel", optarg,= &error_abort); + qdict_put_str(machine_opts_dict, "kernel", optarg); break; case QEMU_OPTION_initrd: - qemu_opts_set(qemu_find_opts("machine"), "initrd", optarg,= &error_abort); + qdict_put_str(machine_opts_dict, "initrd", optarg); break; case QEMU_OPTION_append: - qemu_opts_set(qemu_find_opts("machine"), "append", optarg,= &error_abort); + qdict_put_str(machine_opts_dict, "append", optarg); break; case QEMU_OPTION_dtb: - qemu_opts_set(qemu_find_opts("machine"), "dtb", optarg, &e= rror_abort); + qdict_put_str(machine_opts_dict, "dtb", optarg); break; case QEMU_OPTION_cdrom: drive_add(IF_DEFAULT, 2, optarg, CDROM_OPTS); @@ -2956,7 +2923,7 @@ void qemu_init(int argc, char **argv, char **envp) } break; case QEMU_OPTION_bios: - qemu_opts_set(qemu_find_opts("machine"), "firmware", optar= g, &error_abort); + qdict_put_str(machine_opts_dict, "firmware", optarg); break; case QEMU_OPTION_singlestep: singlestep =3D 1; @@ -3225,17 +3192,20 @@ void qemu_init(int argc, char **argv, char **envp) preconfig_requested =3D true; break; case QEMU_OPTION_enable_kvm: - olist =3D qemu_find_opts("machine"); - qemu_opts_parse_noisily(olist, "accel=3Dkvm", false); + qdict_put_str(machine_opts_dict, "accel", "kvm"); break; case QEMU_OPTION_M: case QEMU_OPTION_machine: - olist =3D qemu_find_opts("machine"); - opts =3D qemu_opts_parse_noisily(olist, optarg, true); - if (!opts) { - exit(1); + { + bool help; + + keyval_parse_into(machine_opts_dict, optarg, "type", &= help, &error_fatal); + if (help) { + machine_help_func(machine_opts_dict); + exit(EXIT_SUCCESS); + } + break; } - break; case QEMU_OPTION_accel: accel_opts =3D qemu_opts_parse_noisily(qemu_find_opts("acc= el"), optarg, true); @@ -3262,14 +3232,12 @@ void qemu_init(int argc, char **argv, char **envp) } break; case QEMU_OPTION_usb: - olist =3D qemu_find_opts("machine"); - qemu_opts_parse_noisily(olist, "usb=3Don", false); + qdict_put_str(machine_opts_dict, "usb", "on"); break; case QEMU_OPTION_usbdevice: error_report("'-usbdevice' is deprecated, please use " "'-device usb-...' instead"); - olist =3D qemu_find_opts("machine"); - qemu_opts_parse_noisily(olist, "usb=3Don", false); + qdict_put_str(machine_opts_dict, "usb", "on"); add_device_config(DEV_USB, optarg); break; case QEMU_OPTION_device: @@ -3288,12 +3256,10 @@ void qemu_init(int argc, char **argv, char **envp) vnc_parse(optarg, &error_fatal); break; case QEMU_OPTION_no_acpi: - olist =3D qemu_find_opts("machine"); - qemu_opts_parse_noisily(olist, "acpi=3Doff", false); + qdict_put_str(machine_opts_dict, "acpi", "off"); break; case QEMU_OPTION_no_hpet: - olist =3D qemu_find_opts("machine"); - qemu_opts_parse_noisily(olist, "hpet=3Doff", false); + qdict_put_str(machine_opts_dict, "hpet", "off"); break; case QEMU_OPTION_no_reboot: olist =3D qemu_find_opts("action"); @@ -3529,7 +3495,7 @@ void qemu_init(int argc, char **argv, char **envp) */ loc_set_none(); =20 - qemu_validate_options(); + qemu_validate_options(machine_opts_dict); qemu_process_sugar_options(); =20 /* @@ -3549,7 +3515,7 @@ void qemu_init(int argc, char **argv, char **envp) =20 configure_rtc(qemu_find_opts_singleton("rtc")); =20 - qemu_create_machine(select_machine()); + qemu_create_machine(machine_opts_dict); =20 suspend_mux_open(); =20 @@ -3557,12 +3523,14 @@ void qemu_init(int argc, char **argv, char **envp) qemu_create_default_devices(); qemu_create_early_backends(); =20 - qemu_apply_machine_options(); + qemu_apply_legacy_machine_options(machine_opts_dict); + qemu_apply_machine_options(machine_opts_dict); + qobject_unref(machine_opts_dict); phase_advance(PHASE_MACHINE_CREATED); =20 /* * Note: uses machine properties such as kernel-irqchip, must run - * after machine_set_property(). + * after qemu_apply_machine_options. */ configure_accelerators(argv[0]); phase_advance(PHASE_ACCEL_CREATED); --=20 2.26.2 From nobody Sun Apr 28 19:39:16 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1610989680; cv=none; d=zohomail.com; s=zohoarc; b=T8fIDRGAa5qsX0QEQACaSP3OBEMMTLXK+6g+VMXaj8uxb4rovFko7zeUA4S5DHd2m3QfQqUYvqEv5cik6wWMkS0rEtGTAjcRO6E2dLF8GJgkksiVPhls5otaAdhxS9ALDy1fwBqVHbrL+G0WQieM28e0iLTzaw2UvtkvbLqx5WU= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1610989680; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=VVSAt+JC/EVUcBHcgT4IPILlkgKmN3CFwJcHNPkAiRI=; b=Fd8R6VFWK2wXIzmkUfTeZwYnqsl146jLsGtzJFj892p6k79MHhzLRNzL16IBJjVfzjAvPmuCI6gvghh7iiEYka8MiWEldrX0aVI4b+afyL8nbjdiol8d8vRCGH1YEJ/vjxyWFGEpQcpmnX+w8Z/9oCAE2tH7Om0SPWT/BjcIfX4= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1610989680931604.267215641613; Mon, 18 Jan 2021 09:08:00 -0800 (PST) Received: from localhost ([::1]:48890 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1l1Y0V-0000fZ-7l for importer@patchew.org; Mon, 18 Jan 2021 12:07:59 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:35182) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1l1XRX-0002Yy-K1 for qemu-devel@nongnu.org; Mon, 18 Jan 2021 11:31:51 -0500 Received: from us-smtp-delivery-124.mimecast.com ([216.205.24.124]:24357) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.90_1) (envelope-from ) id 1l1XRQ-0001XA-RO for qemu-devel@nongnu.org; Mon, 18 Jan 2021 11:31:51 -0500 Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-331-bzp2RwOQO8OQThnz0f_P4A-1; Mon, 18 Jan 2021 11:31:41 -0500 Received: from smtp.corp.redhat.com (int-mx08.intmail.prod.int.phx2.redhat.com [10.5.11.23]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 66426800D53 for ; Mon, 18 Jan 2021 16:31:40 +0000 (UTC) Received: from virtlab701.virt.lab.eng.bos.redhat.com (virtlab701.virt.lab.eng.bos.redhat.com [10.19.152.228]) by smtp.corp.redhat.com (Postfix) with ESMTP id E105A19C66; Mon, 18 Jan 2021 16:31:39 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1610987503; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=VVSAt+JC/EVUcBHcgT4IPILlkgKmN3CFwJcHNPkAiRI=; b=UvKaZJ8Ubjh1hxk6Csrk8KVbIbRgl33Iki4BFgTKjEwbNzLBVW4YpEWnikMJ5FcTK/wjlL SMfU+Jg6vqJoeMmAJv2cDhUHqm1QEXha6enTnLCYLH76PMw1+uGRn2hghepcOpFcNNme4Z LVhO8aCIzZ0eyhEgHczRJgfYis3qT70= X-MC-Unique: bzp2RwOQO8OQThnz0f_P4A-1 From: Paolo Bonzini To: qemu-devel@nongnu.org Subject: [PATCH 24/25] qemu-option: remove now-dead code Date: Mon, 18 Jan 2021 11:31:12 -0500 Message-Id: <20210118163113.780171-25-pbonzini@redhat.com> In-Reply-To: <20210118163113.780171-1-pbonzini@redhat.com> References: <20210118163113.780171-1-pbonzini@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.84 on 10.5.11.23 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=pbonzini@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=216.205.24.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -29 X-Spam_score: -3.0 X-Spam_bar: --- X-Spam_report: (-3.0 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.175, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H3=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, imammedo@redhat.com, armbru@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @redhat.com) Content-Type: text/plain; charset="utf-8" -M was the sole user of qemu_opts_set and qemu_opts_set_defaults, remove them and the arguments that they used. Signed-off-by: Paolo Bonzini --- include/qemu/option.h | 3 --- tests/test-qemu-opts.c | 35 ----------------------------- util/qemu-option.c | 51 +++++++++--------------------------------- 3 files changed, 10 insertions(+), 79 deletions(-) diff --git a/include/qemu/option.h b/include/qemu/option.h index fffb03d848..306bf07575 100644 --- a/include/qemu/option.h +++ b/include/qemu/option.h @@ -119,7 +119,6 @@ QemuOpts *qemu_opts_create(QemuOptsList *list, const ch= ar *id, int fail_if_exists, Error **errp); void qemu_opts_reset(QemuOptsList *list); void qemu_opts_loc_restore(QemuOpts *opts); -bool qemu_opts_set(QemuOptsList *list, const char *name, const char *value= , Error **errp); const char *qemu_opts_id(QemuOpts *opts); void qemu_opts_set_id(QemuOpts *opts, char *id); void qemu_opts_del(QemuOpts *opts); @@ -130,8 +129,6 @@ QemuOpts *qemu_opts_parse_noisily(QemuOptsList *list, c= onst char *params, bool permit_abbrev); QemuOpts *qemu_opts_parse(QemuOptsList *list, const char *params, bool permit_abbrev, Error **errp); -void qemu_opts_set_defaults(QemuOptsList *list, const char *params, - int permit_abbrev); QemuOpts *qemu_opts_from_qdict(QemuOptsList *list, const QDict *qdict, Error **errp); QDict *qemu_opts_to_qdict_filtered(QemuOpts *opts, QDict *qdict, diff --git a/tests/test-qemu-opts.c b/tests/test-qemu-opts.c index 8bbb17b1c7..0239876e36 100644 --- a/tests/test-qemu-opts.c +++ b/tests/test-qemu-opts.c @@ -410,40 +410,6 @@ static void test_qemu_opts_reset(void) g_assert(opts =3D=3D NULL); } =20 -static void test_qemu_opts_set(void) -{ - QemuOptsList *list; - QemuOpts *opts; - const char *opt; - - list =3D qemu_find_opts("opts_list_04"); - g_assert(list !=3D NULL); - g_assert(QTAILQ_EMPTY(&list->head)); - g_assert_cmpstr(list->name, =3D=3D, "opts_list_04"); - - /* should not find anything at this point */ - opts =3D qemu_opts_find(list, NULL); - g_assert(opts =3D=3D NULL); - - /* implicitly create opts and set str3 value */ - qemu_opts_set(list, "str3", "value", &error_abort); - g_assert(!QTAILQ_EMPTY(&list->head)); - - /* get the just created opts */ - opts =3D qemu_opts_find(list, NULL); - g_assert(opts !=3D NULL); - - /* check the str3 value */ - opt =3D qemu_opt_get(opts, "str3"); - g_assert_cmpstr(opt, =3D=3D, "value"); - - qemu_opts_del(opts); - - /* should not find anything at this point */ - opts =3D qemu_opts_find(list, NULL); - g_assert(opts =3D=3D NULL); -} - static int opts_count_iter(void *opaque, const char *name, const char *val= ue, Error **errp) { @@ -1030,7 +996,6 @@ int main(int argc, char *argv[]) g_test_add_func("/qemu-opts/opt_get_size", test_qemu_opt_get_size); g_test_add_func("/qemu-opts/opt_unset", test_qemu_opt_unset); g_test_add_func("/qemu-opts/opts_reset", test_qemu_opts_reset); - g_test_add_func("/qemu-opts/opts_set", test_qemu_opts_set); g_test_add_func("/qemu-opts/opts_parse/general", test_opts_parse); g_test_add_func("/qemu-opts/opts_parse/bool", test_opts_parse_bool); g_test_add_func("/qemu-opts/opts_parse/number", test_opts_parse_number= ); diff --git a/util/qemu-option.c b/util/qemu-option.c index afba08d92e..94a6bea767 100644 --- a/util/qemu-option.c +++ b/util/qemu-option.c @@ -479,19 +479,14 @@ int qemu_opt_unset(QemuOpts *opts, const char *name) } } =20 -static QemuOpt *opt_create(QemuOpts *opts, const char *name, char *value, - bool prepend) +static QemuOpt *opt_create(QemuOpts *opts, const char *name, char *value) { QemuOpt *opt =3D g_malloc0(sizeof(*opt)); =20 opt->name =3D g_strdup(name); opt->str =3D value; opt->opts =3D opts; - if (prepend) { - QTAILQ_INSERT_HEAD(&opts->head, opt, next); - } else { - QTAILQ_INSERT_TAIL(&opts->head, opt, next); - } + QTAILQ_INSERT_TAIL(&opts->head, opt, next); =20 return opt; } @@ -518,7 +513,7 @@ static bool opt_validate(QemuOpt *opt, Error **errp) bool qemu_opt_set(QemuOpts *opts, const char *name, const char *value, Error **errp) { - QemuOpt *opt =3D opt_create(opts, name, g_strdup(value), false); + QemuOpt *opt =3D opt_create(opts, name, g_strdup(value)); =20 if (!opt_validate(opt, errp)) { qemu_opt_del(opt); @@ -662,15 +657,6 @@ void qemu_opts_loc_restore(QemuOpts *opts) loc_restore(&opts->loc); } =20 -bool qemu_opts_set(QemuOptsList *list, const char *name, const char *value= , Error **errp) -{ - QemuOpts *opts; - - assert(list->merge_lists); - opts =3D qemu_opts_create(list, NULL, 0, &error_abort); - return qemu_opt_set(opts, name, value, errp); -} - const char *qemu_opts_id(QemuOpts *opts) { return opts->id; @@ -807,7 +793,7 @@ static const char *get_opt_name_value(const char *param= s, } =20 static bool opts_do_parse(QemuOpts *opts, const char *params, - const char *firstname, bool prepend, + const char *firstname, bool warn_on_flag, bool *help_wanted, Error **er= rp) { char *option, *value; @@ -829,7 +815,7 @@ static bool opts_do_parse(QemuOpts *opts, const char *p= arams, continue; } =20 - opt =3D opt_create(opts, option, value, prepend); + opt =3D opt_create(opts, option, value); g_free(option); if (!opt_validate(opt, errp)) { qemu_opt_del(opt); @@ -885,11 +871,11 @@ bool has_help_option(const char *params) bool qemu_opts_do_parse(QemuOpts *opts, const char *params, const char *firstname, Error **errp) { - return opts_do_parse(opts, params, firstname, false, false, NULL, errp= ); + return opts_do_parse(opts, params, firstname, false, NULL, errp); } =20 static QemuOpts *opts_parse(QemuOptsList *list, const char *params, - bool permit_abbrev, bool defaults, + bool permit_abbrev, bool warn_on_flag, bool *help_wanted, Error **= errp) { const char *firstname; @@ -899,21 +885,13 @@ static QemuOpts *opts_parse(QemuOptsList *list, const= char *params, assert(!permit_abbrev || list->implied_opt_name); firstname =3D permit_abbrev ? list->implied_opt_name : NULL; =20 - /* - * This code doesn't work for defaults && !list->merge_lists: when - * params has no id=3D, and list has an element with !opts->id, it - * appends a new element instead of returning the existing opts. - * However, we got no use for this case. Guard against possible - * (if unlikely) future misuse: - */ - assert(!defaults || list->merge_lists); opts =3D qemu_opts_create(list, id, !list->merge_lists, errp); g_free(id); if (opts =3D=3D NULL) { return NULL; } =20 - if (!opts_do_parse(opts, params, firstname, defaults, + if (!opts_do_parse(opts, params, firstname, warn_on_flag, help_wanted, errp)) { qemu_opts_del(opts); return NULL; @@ -932,7 +910,7 @@ static QemuOpts *opts_parse(QemuOptsList *list, const c= har *params, QemuOpts *qemu_opts_parse(QemuOptsList *list, const char *params, bool permit_abbrev, Error **errp) { - return opts_parse(list, params, permit_abbrev, false, false, NULL, err= p); + return opts_parse(list, params, permit_abbrev, false, NULL, errp); } =20 /** @@ -950,7 +928,7 @@ QemuOpts *qemu_opts_parse_noisily(QemuOptsList *list, c= onst char *params, QemuOpts *opts; bool help_wanted =3D false; =20 - opts =3D opts_parse(list, params, permit_abbrev, false, true, + opts =3D opts_parse(list, params, permit_abbrev, true, opts_accepts_any(list) ? NULL : &help_wanted, &err); if (!opts) { @@ -964,15 +942,6 @@ QemuOpts *qemu_opts_parse_noisily(QemuOptsList *list, = const char *params, return opts; } =20 -void qemu_opts_set_defaults(QemuOptsList *list, const char *params, - int permit_abbrev) -{ - QemuOpts *opts; - - opts =3D opts_parse(list, params, permit_abbrev, true, false, NULL, NU= LL); - assert(opts); -} - static bool qemu_opts_from_qdict_entry(QemuOpts *opts, const QDictEntry *entry, Error **errp) --=20 2.26.2 From nobody Sun Apr 28 19:39:16 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1610989774; cv=none; d=zohomail.com; s=zohoarc; b=fk5WKjTi9TYie+4l8Jhk5L3UekLWBLvIfhi32T0ODYyPs6bSjWRk3k0Z+7l4t46d/Da3izuz1bbh+6oweHRfutPF1hbBUozE8wpZHAnUURoQoO92Ji/EMMkquh7v3Ufe3kuC9XqKpdOe24VMtAdrosJfdyEyBvtV+BvtmAOSf88= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1610989774; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=8W9OdTC9JXFXVy+TmMTW+M6jXNMM1l1yzEIIravvNl8=; b=PeZUVQ2xeG7G62SX/2qHuUXBx3vvDjevEs1mSHstV6y6czsF8cpLIcMxpFmSfkrRozHkzdqH/3VHGzDxuCW8JDd88UFIvAzOzjydyzu/q3Cu6FYkVKS0nJIZuaCm5WAvsKO9wExMZ+NJttHazvTBV0HGEZyFtBoAwB6hKbYdyas= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1610989774208875.4979955420358; Mon, 18 Jan 2021 09:09:34 -0800 (PST) Received: from localhost ([::1]:52554 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1l1Y20-0002QD-T4 for importer@patchew.org; Mon, 18 Jan 2021 12:09:32 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:35178) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1l1XRW-0002YP-U9 for qemu-devel@nongnu.org; Mon, 18 Jan 2021 11:31:51 -0500 Received: from us-smtp-delivery-124.mimecast.com ([63.128.21.124]:33003) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.90_1) (envelope-from ) id 1l1XRQ-0001XC-Qv for qemu-devel@nongnu.org; Mon, 18 Jan 2021 11:31:50 -0500 Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-376-Z79reHwoPPKLXKy9ZXiw-g-1; Mon, 18 Jan 2021 11:31:41 -0500 Received: from smtp.corp.redhat.com (int-mx08.intmail.prod.int.phx2.redhat.com [10.5.11.23]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 09B221005504 for ; Mon, 18 Jan 2021 16:31:41 +0000 (UTC) Received: from virtlab701.virt.lab.eng.bos.redhat.com (virtlab701.virt.lab.eng.bos.redhat.com [10.19.152.228]) by smtp.corp.redhat.com (Postfix) with ESMTP id 863F719C66; Mon, 18 Jan 2021 16:31:40 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1610987503; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=8W9OdTC9JXFXVy+TmMTW+M6jXNMM1l1yzEIIravvNl8=; b=QhBN3WB1v5gSSWFawoICAXe2+lSA7uoP9z6iewIfLL7FM/1HFrvLFe5gT+as8MKpA6e8Ot fa+c+wEI9pbTnV4Q/WG5rhMRsG6t1CakiiH2whO1WcPNaYzM9fFCDLLhmry8L36ToFKete qP3r8ojxwigd5JoPaItIVUqk90TRJZg= X-MC-Unique: Z79reHwoPPKLXKy9ZXiw-g-1 From: Paolo Bonzini To: qemu-devel@nongnu.org Subject: [PATCH 25/25] vl: switch -accel parsing to keyval Date: Mon, 18 Jan 2021 11:31:13 -0500 Message-Id: <20210118163113.780171-26-pbonzini@redhat.com> In-Reply-To: <20210118163113.780171-1-pbonzini@redhat.com> References: <20210118163113.780171-1-pbonzini@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.84 on 10.5.11.23 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=pbonzini@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=63.128.21.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -29 X-Spam_score: -3.0 X-Spam_bar: --- X-Spam_report: (-3.0 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.175, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H4=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, imammedo@redhat.com, armbru@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @redhat.com) Content-Type: text/plain; charset="utf-8" Switch from QemuOpts to keyval. This enables compound options for accelerators. Signed-off-by: Paolo Bonzini --- accel/accel.c | 6 ++ include/sysemu/accel.h | 1 + softmmu/vl.c | 134 ++++++++++++++++++----------------------- 3 files changed, 67 insertions(+), 74 deletions(-) diff --git a/accel/accel.c b/accel/accel.c index cb555e3b06..f7fdc2f5a8 100644 --- a/accel/accel.c +++ b/accel/accel.c @@ -46,6 +46,12 @@ AccelClass *accel_find(const char *opt_name) return ac; } =20 +bool accel_print_class_properties(const char *opt_name) +{ + g_autofree char *class_name =3D g_strdup_printf(ACCEL_CLASS_NAME("%s")= , opt_name); + return type_print_class_properties(class_name); +} + int accel_init_machine(AccelState *accel, MachineState *ms) { AccelClass *acc =3D ACCEL_GET_CLASS(accel); diff --git a/include/sysemu/accel.h b/include/sysemu/accel.h index e08b8ab8fa..737db49d21 100644 --- a/include/sysemu/accel.h +++ b/include/sysemu/accel.h @@ -67,6 +67,7 @@ typedef struct AccelClass { OBJECT_GET_CLASS(AccelClass, (obj), TYPE_ACCEL) =20 AccelClass *accel_find(const char *opt_name); +bool accel_print_class_properties(const char *opt_name); int accel_init_machine(AccelState *accel, MachineState *ms); =20 /* Called just before os_setup_post (ie just before drop OS privs) */ diff --git a/softmmu/vl.c b/softmmu/vl.c index ff906d541d..b87ab08ea6 100644 --- a/softmmu/vl.c +++ b/softmmu/vl.c @@ -139,6 +139,7 @@ static const char *loadvm; static const char *accelerators; static QDict *machine_opts_dict; static GSList *object_opts_list =3D NULL; +static GSList *accel_opts_list =3D NULL; static ram_addr_t maxram_size; static uint64_t ram_slots; static int display_remote; @@ -229,20 +230,6 @@ static QemuOptsList qemu_option_rom_opts =3D { }, }; =20 -static QemuOptsList qemu_accel_opts =3D { - .name =3D "accel", - .implied_opt_name =3D "accel", - .head =3D QTAILQ_HEAD_INITIALIZER(qemu_accel_opts.head), - .desc =3D { - /* - * no elements =3D> accept any - * sanity checking will happen later - * when setting accelerator properties - */ - { } - }, -}; - static QemuOptsList qemu_boot_opts =3D { .name =3D "boot-opts", .implied_opt_name =3D "order", @@ -1567,21 +1554,6 @@ static MachineClass *select_machine(QDict *qdict, Er= ror **errp) return machine_class; } =20 -static int object_parse_property_opt(Object *obj, - const char *name, const char *value, - const char *skip, Error **errp) -{ - if (g_str_equal(name, skip)) { - return 0; - } - - if (!object_property_parse(obj, name, value, errp)) { - return -1; - } - - return 0; -} - /* *Non*recursively replace underscores with dashes in QDict keys. */ static void keyval_dashify(QDict *qdict, Error **errp) { @@ -2036,7 +2008,8 @@ static int global_init_func(void *opaque, QemuOpts *o= pts, Error **errp) static bool is_qemuopts_group(const char *group) { if (g_str_equal(group, "object") || - g_str_equal(group, "machine")) { + g_str_equal(group, "machine") || + g_str_equal(group, "accel")) { return false; } return true; @@ -2050,6 +2023,8 @@ static GSList **qemu_config_list(const char *group) { if (g_str_equal(group, "object")) { return &object_opts_list; + } else if (g_str_equal(group, "accel")) { + return &accel_opts_list; } return NULL; } @@ -2188,22 +2163,20 @@ static int do_configure_icount(void *opaque, QemuOp= ts *opts, Error **errp) return 0; } =20 -static int accelerator_set_property(void *opaque, - const char *name, const char *value, - Error **errp) -{ - return object_parse_property_opt(opaque, name, value, "accel", errp); -} - -static int do_configure_accelerator(void *opaque, QemuOpts *opts, Error **= errp) +static void do_configure_accelerator(void *data, void *opaque) { bool *p_init_failed =3D opaque; - const char *acc =3D qemu_opt_get(opts, "accel"); + QDict *qdict =3D data; + const char *acc =3D qdict_get_try_str(qdict, "accel"); AccelClass *ac =3D accel_find(acc); AccelState *accel; int ret; bool qtest_with_kvm; =20 + if (current_accel()) { + return; + } + qtest_with_kvm =3D g_str_equal(acc, "kvm") && qtest_chrdev !=3D NULL; =20 if (!ac) { @@ -2211,24 +2184,20 @@ static int do_configure_accelerator(void *opaque, Q= emuOpts *opts, Error **errp) if (!qtest_with_kvm) { error_report("invalid accelerator %s", acc); } - return 0; + return; } accel =3D ACCEL(object_new_with_class(OBJECT_CLASS(ac))); object_apply_compat_props(OBJECT(accel)); - qemu_opt_foreach(opts, accelerator_set_property, - accel, - &error_fatal); + qdict_del(qdict, "accel"); + object_set_properties_from_keyval(OBJECT(accel), qdict, &error_fatal); =20 ret =3D accel_init_machine(accel, current_machine); if (ret < 0) { *p_init_failed =3D true; if (!qtest_with_kvm || ret !=3D -ENOENT) { - error_report("failed to initialize %s: %s", acc, strerror(-ret= )); + error_report("failed to initialize %s: %s", ac->name, strerror= (-ret)); } - return 0; } - - return 1; } =20 static void configure_accelerators(const char *progname) @@ -2238,7 +2207,7 @@ static void configure_accelerators(const char *progna= me) qemu_opts_foreach(qemu_find_opts("icount"), do_configure_icount, NULL, &error_fatal); =20 - if (QTAILQ_EMPTY(&qemu_accel_opts.head)) { + if (!accel_opts_list) { char **accel_list, **tmp; =20 if (accelerators =3D=3D NULL) { @@ -2271,7 +2240,9 @@ static void configure_accelerators(const char *progna= me) * such as "-machine accel=3Dtcg,,thread=3Dsingle". */ if (accel_find(*tmp)) { - qemu_opts_parse_noisily(qemu_find_opts("accel"), *tmp, tru= e); + QDict *qdict =3D qdict_new(); + qdict_put_str(qdict, "accel", *tmp); + accel_opts_list =3D g_slist_prepend(accel_opts_list, qdict= ); } else { init_failed =3D true; error_report("invalid accelerator %s", *tmp); @@ -2285,8 +2256,12 @@ static void configure_accelerators(const char *progn= ame) } } =20 - if (!qemu_opts_foreach(qemu_find_opts("accel"), - do_configure_accelerator, &init_failed, &error_= fatal)) { + accel_opts_list =3D g_slist_reverse(accel_opts_list); + g_slist_foreach(accel_opts_list, + do_configure_accelerator, + &init_failed); + + if (!current_accel()) { if (!init_failed) { error_report("no accelerator found"); } @@ -2304,6 +2279,27 @@ static void configure_accelerators(const char *progn= ame) } } =20 +static void list_accelerators(void) +{ + printf("Accelerators supported in QEMU binary:\n"); + GSList *el, *accel_list =3D object_class_get_list(TYPE_ACCEL, + false); + for (el =3D accel_list; el; el =3D el->next) { + gchar *typename =3D g_strdup(object_class_get_name( + OBJECT_CLASS(el->data))); + /* omit qtest which is used for tests only */ + if (g_strcmp0(typename, ACCEL_CLASS_NAME("qtest")) && + g_str_has_suffix(typename, ACCEL_CLASS_SUFFIX)) { + gchar **optname =3D g_strsplit(typename, + ACCEL_CLASS_SUFFIX, 0); + printf("%s\n", optname[0]); + g_strfreev(optname); + } + g_free(typename); + } + g_slist_free(accel_list); +} + static void create_default_memdev(MachineState *ms, const char *path) { Object *obj; @@ -2627,7 +2623,7 @@ void qmp_x_exit_preconfig(Error **errp) void qemu_init(int argc, char **argv, char **envp) { QemuOpts *opts; - QemuOpts *icount_opts =3D NULL, *accel_opts =3D NULL; + QemuOpts *icount_opts =3D NULL; QemuOptsList *olist; int optind; const char *optarg; @@ -2651,7 +2647,6 @@ void qemu_init(int argc, char **argv, char **envp) qemu_add_opts(&qemu_trace_opts); qemu_plugin_add_opts(); qemu_add_opts(&qemu_option_rom_opts); - qemu_add_opts(&qemu_accel_opts); qemu_add_opts(&qemu_mem_opts); qemu_add_opts(&qemu_smp_opts); qemu_add_opts(&qemu_boot_opts); @@ -3207,30 +3202,21 @@ void qemu_init(int argc, char **argv, char **envp) break; } case QEMU_OPTION_accel: - accel_opts =3D qemu_opts_parse_noisily(qemu_find_opts("acc= el"), - optarg, true); - optarg =3D qemu_opt_get(accel_opts, "accel"); - if (!optarg || is_help_option(optarg)) { - printf("Accelerators supported in QEMU binary:\n"); - GSList *el, *accel_list =3D object_class_get_list(TYPE= _ACCEL, - false); - for (el =3D accel_list; el; el =3D el->next) { - gchar *typename =3D g_strdup(object_class_get_name( - OBJECT_CLASS(el->data))= ); - /* omit qtest which is used for tests only */ - if (g_strcmp0(typename, ACCEL_CLASS_NAME("qtest"))= && - g_str_has_suffix(typename, ACCEL_CLASS_SUFFIX)= ) { - gchar **optname =3D g_strsplit(typename, - ACCEL_CLASS_SUFFI= X, 0); - printf("%s\n", optname[0]); - g_strfreev(optname); + { + QDict *args; + bool help; + + args =3D keyval_parse(optarg, "accel", &help, &error_f= atal); + if (help) { + const char *type =3D qdict_get_try_str(args, "acce= l"); + if (!type || !accel_print_class_properties(type)) { + list_accelerators(); } - g_free(typename); + exit(0); } - g_slist_free(accel_list); - exit(0); + qemu_record_config_group("accel", args, &error_abort); + break; } - break; case QEMU_OPTION_usb: qdict_put_str(machine_opts_dict, "usb", "on"); break; --=20 2.26.2