From nobody Mon May 6 10:07:02 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=1604929489; cv=none; d=zohomail.com; s=zohoarc; b=A/r9GqqqPs4kcIdhxRc51hy5BgLdHiJ+EArhwRxfYsYiKFHZh4zFPP1c0pHxPlEk5ydi31i2hEnVlKr1kwUIIH1thUAlBquCFUkWtXMQPOmYe64GlGRd+On+fCUuufQnMAMFW/6fLN/pQuOFg4ciFXthoKO+E+SOgs1HqDUGnDI= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1604929489; 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=2i9yh38GZyNj64lBiN9zdfC8q/cs4LpcQhIxX3M+EjM=; b=gZcpg73ehzSGfBQOYhhyhTone48pUEmZPIYfcZHKWcF+SOFwWM4li6bkoV4JiRt9o9QfBqyg/MJWeA2Rbp/X55ddPefZIzBTVv160HkWekZlz+ytAM3vTA7CfJmEmkwH1qrftUGwOLzXXB7UeUPSVkq3uzfyeyL/3l3mM2qR8Uc= 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 1604929489621374.5423128328953; Mon, 9 Nov 2020 05:44:49 -0800 (PST) Received: from localhost ([::1]:37214 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1kc7TT-0001PD-UB for importer@patchew.org; Mon, 09 Nov 2020 08:44:48 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:58928) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1kc7OW-0004rP-3c for qemu-devel@nongnu.org; Mon, 09 Nov 2020 08:39:40 -0500 Received: from us-smtp-delivery-124.mimecast.com ([216.205.24.124]:50937) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.90_1) (envelope-from ) id 1kc7OS-0000hO-Kw for qemu-devel@nongnu.org; Mon, 09 Nov 2020 08:39: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-559-eIkX4TetM3if0VZJNoAF3g-1; Mon, 09 Nov 2020 08:39:33 -0500 Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.phx2.redhat.com [10.5.11.13]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id C029E188C12D for ; Mon, 9 Nov 2020 13:39: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 716676EF40; Mon, 9 Nov 2020 13:39:32 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1604929175; 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=2i9yh38GZyNj64lBiN9zdfC8q/cs4LpcQhIxX3M+EjM=; b=LXa3ly7f9BCaNcmaoM3yeltnBWxQQIhopZbw+zbuzv/BqthaFlIUbRQwnmCTOVXjQvmpQu nyyaip+cHLv7Rjc7auvt/CG2MQ0jDm36/oEl6oidXKRZGIURwMAHo4d6YL22ApF7vw4RoZ GhuHh13VpddZUg5HRy2O+OhwVrSMrko= X-MC-Unique: eIkX4TetM3if0VZJNoAF3g-1 From: Paolo Bonzini To: qemu-devel@nongnu.org Subject: [PATCH v2 1/6] qemu-option: simplify search for end of key Date: Mon, 9 Nov 2020 08:39:26 -0500 Message-Id: <20201109133931.979563-2-pbonzini@redhat.com> In-Reply-To: <20201109133931.979563-1-pbonzini@redhat.com> References: <20201109133931.979563-1-pbonzini@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.13 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-detected-operating-system: by eggs.gnu.org: First seen = 2020/11/09 00:04:29 X-ACL-Warn: Detected OS = Linux 2.2.x-3.x [generic] [fuzzy] X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, 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: 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" Use strcspn to find an equal or comma value, and pass the result directly to get_opt_name to avoid another strchr. Signed-off-by: Paolo Bonzini Reviewed-by: Markus Armbruster --- util/qemu-option.c | 35 +++++++++++++---------------------- 1 file changed, 13 insertions(+), 22 deletions(-) diff --git a/util/qemu-option.c b/util/qemu-option.c index acefbc23fa..ab3b58599e 100644 --- a/util/qemu-option.c +++ b/util/qemu-option.c @@ -38,27 +38,19 @@ #include "qemu/help_option.h" =20 /* - * Extracts the name of an option from the parameter string (p points at t= he + * Extracts the name of an option from the parameter string (@p points at = the * first byte of the option name) * - * The option name is delimited by delim (usually , or =3D) or the string = end - * and is copied into option. The caller is responsible for free'ing option - * when no longer required. + * The option name is @len characters long and is copied into @option. The + * caller is responsible for free'ing @option when no longer required. * * The return value is the position of the delimiter/zero byte after the o= ption - * name in p. + * name in @p. */ -static const char *get_opt_name(const char *p, char **option, char delim) +static const char *get_opt_name(const char *p, char **option, size_t len) { - char *offset =3D strchr(p, delim); - - if (offset) { - *option =3D g_strndup(p, offset - p); - return offset; - } else { - *option =3D g_strdup(p); - return p + strlen(p); - } + *option =3D g_strndup(p, len); + return p + len; } =20 /* @@ -769,12 +761,11 @@ static const char *get_opt_name_value(const char *par= ams, const char *firstname, char **name, char **value) { - const char *p, *pe, *pc; - - pe =3D strchr(params, '=3D'); - pc =3D strchr(params, ','); + const char *p; + size_t len; =20 - if (!pe || (pc && pc < pe)) { + len =3D strcspn(params, "=3D,"); + if (params[len] !=3D '=3D') { /* found "foo,more" */ if (firstname) { /* implicitly named first option */ @@ -782,7 +773,7 @@ static const char *get_opt_name_value(const char *param= s, p =3D get_opt_value(params, value); } else { /* option without value, must be a flag */ - p =3D get_opt_name(params, name, ','); + p =3D get_opt_name(params, name, len); if (strncmp(*name, "no", 2) =3D=3D 0) { memmove(*name, *name + 2, strlen(*name + 2) + 1); *value =3D g_strdup("off"); @@ -792,7 +783,7 @@ static const char *get_opt_name_value(const char *param= s, } } else { /* found "foo=3Dbar,more" */ - p =3D get_opt_name(params, name, '=3D'); + p =3D get_opt_name(params, name, len); assert(*p =3D=3D '=3D'); p++; p =3D get_opt_value(p, value); --=20 2.26.2 From nobody Mon May 6 10:07:02 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=1604929334; cv=none; d=zohomail.com; s=zohoarc; b=gTjumEXdjheg4PsS0bNqanhVI4gTZGsuQepIqsOnk8EVmeSyg4oR0lWxT+SpGvI67fjkklxyogr07Qq3yY225Sel49Jomn3+7Fe9JrmnK9UKwzK97BDYGVOfYy1lMFsVFdZiJDa9eauvs3M+EVI2abomMwkjK40NyGknjCl9zwM= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1604929334; 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=2CZ8yQvg+xOXbKZkzH788ZtdLmpBFxm4fzdsBms74W4=; b=UkQce4rP3JIfC1lOATaxBFgzr4I+B7qLDN97R+Lus5xuDDO/W4efU9dOUfiUQhog7ZKg2NB1E7qsNwdJOd/TPxxawfVi/hhpoTEVGj3xN0iCO1kUGJWtkGQZNtxahCVTzwkwAR2gCKca3Vtsned3esT6oLszVZnnSUXVoKXkZRk= 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 1604929334329644.1728964219591; Mon, 9 Nov 2020 05:42:14 -0800 (PST) Received: from localhost ([::1]:57868 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1kc7Qz-0006cF-5a for importer@patchew.org; Mon, 09 Nov 2020 08:42:13 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:58926) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1kc7OV-0004rC-TN for qemu-devel@nongnu.org; Mon, 09 Nov 2020 08:39:39 -0500 Received: from us-smtp-delivery-124.mimecast.com ([63.128.21.124]:21839) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.90_1) (envelope-from ) id 1kc7OS-0000ht-Lh for qemu-devel@nongnu.org; Mon, 09 Nov 2020 08:39: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-340-_SG1m1LNNxWqg3_vvL0Upg-1; Mon, 09 Nov 2020 08:39:34 -0500 Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.phx2.redhat.com [10.5.11.13]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 39329800683 for ; Mon, 9 Nov 2020 13:39: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 DFB2D6EF40; Mon, 9 Nov 2020 13:39:32 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1604929175; 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=2CZ8yQvg+xOXbKZkzH788ZtdLmpBFxm4fzdsBms74W4=; b=F99VY0dkVD6WLFD7ddCd13TxBKJekM0w6QoBEn9zsO4e2oln8Y6iXIl0cvJKpGIpypARf0 QRwV8UJdX1HiluHs7u+xKBK7nWcI4uoPsKlX0Y9SkuaOYatGIwKUEDVGQ+Icvqbb7Hj0rS JQAyNi3yLjOHGCJEEyK+zzF+6P1lIQU= X-MC-Unique: _SG1m1LNNxWqg3_vvL0Upg-1 From: Paolo Bonzini To: qemu-devel@nongnu.org Subject: [PATCH v2 2/6] qemu-option: pass QemuOptsList to opts_accepts_any Date: Mon, 9 Nov 2020 08:39:27 -0500 Message-Id: <20201109133931.979563-3-pbonzini@redhat.com> In-Reply-To: <20201109133931.979563-1-pbonzini@redhat.com> References: <20201109133931.979563-1-pbonzini@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.13 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-detected-operating-system: by eggs.gnu.org: First seen = 2020/11/09 01:25:23 X-ACL-Warn: Detected OS = Linux 2.2.x-3.x [generic] [fuzzy] X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H5=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: 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" A QemuOptsList can be of one of two kinds: either it is pre-validated, or it accepts any key and validation happens somewhere else (typically in a Visitor or against a list of QOM properties). opts_accepts_any returns true if a QemuOpts instance was created from a QemuOptsList of the latter kind, but there is no function to do the check on a QemuOptsList. We will need it in the next patch; since almost all callers of opts_accepts_any use opts->list anyway, simply repurpose it instead of adding a new function. Signed-off-by: Paolo Bonzini Reviewed-by: Markus Armbruster --- util/qemu-option.c | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/util/qemu-option.c b/util/qemu-option.c index ab3b58599e..59be4f9d21 100644 --- a/util/qemu-option.c +++ b/util/qemu-option.c @@ -460,16 +460,16 @@ static bool qemu_opt_parse(QemuOpt *opt, Error **errp) } } =20 -static bool opts_accepts_any(const QemuOpts *opts) +static bool opts_accepts_any(const QemuOptsList *list) { - return opts->list->desc[0].name =3D=3D NULL; + return list->desc[0].name =3D=3D NULL; } =20 int qemu_opt_unset(QemuOpts *opts, const char *name) { QemuOpt *opt =3D qemu_opt_find(opts, name); =20 - assert(opts_accepts_any(opts)); + assert(opts_accepts_any(opts->list)); =20 if (opt =3D=3D NULL) { return -1; @@ -500,9 +500,10 @@ static bool opt_validate(QemuOpt *opt, bool *help_want= ed, Error **errp) { const QemuOptDesc *desc; + const QemuOptsList *list =3D opt->opts->list; =20 - desc =3D find_desc_by_name(opt->opts->list->desc, opt->name); - if (!desc && !opts_accepts_any(opt->opts)) { + 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; @@ -535,9 +536,10 @@ bool qemu_opt_set_bool(QemuOpts *opts, const char *nam= e, bool val, { QemuOpt *opt; const QemuOptDesc *desc; + const QemuOptsList *list =3D opts->list; =20 - desc =3D find_desc_by_name(opts->list->desc, name); - if (!desc && !opts_accepts_any(opts)) { + desc =3D find_desc_by_name(list->desc, name); + if (!desc && !opts_accepts_any(list)) { error_setg(errp, QERR_INVALID_PARAMETER, name); return false; } @@ -557,9 +559,10 @@ bool qemu_opt_set_number(QemuOpts *opts, const char *n= ame, int64_t val, { QemuOpt *opt; const QemuOptDesc *desc; + const QemuOptsList *list =3D opts->list; =20 - desc =3D find_desc_by_name(opts->list->desc, name); - if (!desc && !opts_accepts_any(opts)) { + desc =3D find_desc_by_name(list->desc, name); + if (!desc && !opts_accepts_any(list)) { error_setg(errp, QERR_INVALID_PARAMETER, name); return false; } @@ -1110,7 +1113,7 @@ bool qemu_opts_validate(QemuOpts *opts, const QemuOpt= Desc *desc, Error **errp) { QemuOpt *opt; =20 - assert(opts_accepts_any(opts)); + assert(opts_accepts_any(opts->list)); =20 QTAILQ_FOREACH(opt, &opts->head, next) { opt->desc =3D find_desc_by_name(desc, opt->name); --=20 2.26.2 From nobody Mon May 6 10:07:02 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=1604929365; cv=none; d=zohomail.com; s=zohoarc; b=EM2mVOvNDSnxFb+BqT4FFYxk6ITD0UjicX3HW3w9D9Vb386Phk/5EbU4XKY+ULe4OIf5Kj2IFuWumw+zGxPwgLNQF8BI2n768A8OijU95Bxcw5EOp2MPbvBeHwKUpuVflQCkSqoIvEnYdjtcQwWEhc/4SgUJdwsgp2ppSmjaQXY= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1604929365; 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=mCDwkoAWBs5TBvHw5DNhs4UXxWuEbUL+YWIMbOieb+c=; b=WcNCM1RuGLIioMaOw1Jxs7ccm+sDBD5yMeHk7edtNr0pL03V+/c6WYEVoFcdjTklokXUra8iD9vnUSgTF7faaXBTnaU4cEc8fXCP8yvTQgMJp8qpL48N5kOnxAKyjt65bq5PLmfJ3RNa5rMhvU6mIe5yeD2T3JcT/LnlOwKvafs= 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 1604929365199518.5732609897689; Mon, 9 Nov 2020 05:42:45 -0800 (PST) Received: from localhost ([::1]:60872 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1kc7RU-0007tU-1k for importer@patchew.org; Mon, 09 Nov 2020 08:42:44 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:58914) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1kc7OV-0004r6-RJ for qemu-devel@nongnu.org; Mon, 09 Nov 2020 08:39:39 -0500 Received: from us-smtp-delivery-124.mimecast.com ([63.128.21.124]:44905) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.90_1) (envelope-from ) id 1kc7OS-0000iI-Ri for qemu-devel@nongnu.org; Mon, 09 Nov 2020 08:39:38 -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-500-QjgLzQqIPBWTVoahuYHA4w-1; Mon, 09 Nov 2020 08:39:34 -0500 Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.phx2.redhat.com [10.5.11.13]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id A7F5D809DC9 for ; Mon, 9 Nov 2020 13:39: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 59F656EF40; Mon, 9 Nov 2020 13:39:33 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1604929176; 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=mCDwkoAWBs5TBvHw5DNhs4UXxWuEbUL+YWIMbOieb+c=; b=iVb4idcJku6jGtKmJu8Vz8yt/jyQGAR5D6MVLc5ROV+M2qDarXkZqQmPK3eFojZjAWcI5Z 8WW224ARiEUPE4cnPH3ETcxbD52PPuMVFi7alkJXdpSy9Cvk5Ax4/h0L9xaAURjrp9Pz7v FqNTyr6gSqidhLg61WUAS5oSEMjSK5A= X-MC-Unique: QjgLzQqIPBWTVoahuYHA4w-1 From: Paolo Bonzini To: qemu-devel@nongnu.org Subject: [PATCH v2 3/6] qemu-option: restrict qemu_opts_set to merge-lists QemuOpts Date: Mon, 9 Nov 2020 08:39:28 -0500 Message-Id: <20201109133931.979563-4-pbonzini@redhat.com> In-Reply-To: <20201109133931.979563-1-pbonzini@redhat.com> References: <20201109133931.979563-1-pbonzini@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.13 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-detected-operating-system: by eggs.gnu.org: First seen = 2020/11/09 01:25:23 X-ACL-Warn: Detected OS = Linux 2.2.x-3.x [generic] [fuzzy] X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H5=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: 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" qemu_opts_set is used to create default network backends and to parse sugar options -kernel, -initrd, -append, -bios and -dtb. Switch the former to qemu_opts_parse, so that qemu_opts_set is now only used on merge-lists QemuOptsList (for which it makes the most sense indeed)... except in the testcase, which is changed to use a merge-list QemuOptsList. With this change we can remove the id parameter. With the parameter always NULL, we know that qemu_opts_create cannot fail and can pass &error_abort to it. Signed-off-by: Paolo Bonzini --- include/qemu/option.h | 3 +-- softmmu/vl.c | 19 +++++++------------ tests/test-qemu-opts.c | 24 +++++++++++++++++++++--- util/qemu-option.c | 9 +++------ 4 files changed, 32 insertions(+), 23 deletions(-) diff --git a/include/qemu/option.h b/include/qemu/option.h index ac69352e0e..f73e0dc7d9 100644 --- a/include/qemu/option.h +++ b/include/qemu/option.h @@ -119,8 +119,7 @@ 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 *id, - const char *name, const char *value, Error **errp); +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); diff --git a/softmmu/vl.c b/softmmu/vl.c index a71164494e..65607fe55e 100644 --- a/softmmu/vl.c +++ b/softmmu/vl.c @@ -3107,20 +3107,16 @@ void qemu_init(int argc, char **argv, char **envp) } break; case QEMU_OPTION_kernel: - qemu_opts_set(qemu_find_opts("machine"), NULL, "kernel", o= ptarg, - &error_abort); + qemu_opts_set(qemu_find_opts("machine"), "kernel", optarg,= &error_abort); break; case QEMU_OPTION_initrd: - qemu_opts_set(qemu_find_opts("machine"), NULL, "initrd", o= ptarg, - &error_abort); + qemu_opts_set(qemu_find_opts("machine"), "initrd", optarg,= &error_abort); break; case QEMU_OPTION_append: - qemu_opts_set(qemu_find_opts("machine"), NULL, "append", o= ptarg, - &error_abort); + qemu_opts_set(qemu_find_opts("machine"), "append", optarg,= &error_abort); break; case QEMU_OPTION_dtb: - qemu_opts_set(qemu_find_opts("machine"), NULL, "dtb", opta= rg, - &error_abort); + qemu_opts_set(qemu_find_opts("machine"), "dtb", optarg, &e= rror_abort); break; case QEMU_OPTION_cdrom: drive_add(IF_DEFAULT, 2, optarg, CDROM_OPTS); @@ -3230,8 +3226,7 @@ void qemu_init(int argc, char **argv, char **envp) } break; case QEMU_OPTION_bios: - qemu_opts_set(qemu_find_opts("machine"), NULL, "firmware",= optarg, - &error_abort); + qemu_opts_set(qemu_find_opts("machine"), "firmware", optar= g, &error_abort); break; case QEMU_OPTION_singlestep: singlestep =3D 1; @@ -4258,9 +4253,9 @@ void qemu_init(int argc, char **argv, char **envp) =20 if (default_net) { QemuOptsList *net =3D qemu_find_opts("net"); - qemu_opts_set(net, NULL, "type", "nic", &error_abort); + qemu_opts_parse(net, "nic", true, &error_abort); #ifdef CONFIG_SLIRP - qemu_opts_set(net, NULL, "type", "user", &error_abort); + qemu_opts_parse(net, "user", true, &error_abort); #endif } =20 diff --git a/tests/test-qemu-opts.c b/tests/test-qemu-opts.c index 297ffe79dd..322b32871b 100644 --- a/tests/test-qemu-opts.c +++ b/tests/test-qemu-opts.c @@ -84,11 +84,25 @@ static QemuOptsList opts_list_03 =3D { }, }; =20 +static QemuOptsList opts_list_04 =3D { + .name =3D "opts_list_04", + .head =3D QTAILQ_HEAD_INITIALIZER(opts_list_04.head), + .merge_lists =3D true, + .desc =3D { + { + .name =3D "str3", + .type =3D QEMU_OPT_STRING, + }, + { /* end of list */ } + }, +}; + static void register_opts(void) { qemu_add_opts(&opts_list_01); qemu_add_opts(&opts_list_02); qemu_add_opts(&opts_list_03); + qemu_add_opts(&opts_list_04); } =20 static void test_find_unknown_opts(void) @@ -402,17 +416,21 @@ static void test_qemu_opts_set(void) QemuOpts *opts; const char *opt; =20 - list =3D qemu_find_opts("opts_list_01"); + 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_01"); + g_assert_cmpstr(list->name, =3D=3D, "opts_list_04"); =20 /* should not find anything at this point */ opts =3D qemu_opts_find(list, NULL); g_assert(opts =3D=3D NULL); =20 /* implicitly create opts and set str3 value */ - qemu_opts_set(list, NULL, "str3", "value", &error_abort); + qemu_opts_set(list, "str3", "first_value", &error_abort); + g_assert(!QTAILQ_EMPTY(&list->head)); + + /* set it again */ + qemu_opts_set(list, "str3", "value", &error_abort); g_assert(!QTAILQ_EMPTY(&list->head)); =20 /* get the just created opts */ diff --git a/util/qemu-option.c b/util/qemu-option.c index 59be4f9d21..c88e159f18 100644 --- a/util/qemu-option.c +++ b/util/qemu-option.c @@ -665,15 +665,12 @@ void qemu_opts_loc_restore(QemuOpts *opts) loc_restore(&opts->loc); } =20 -bool qemu_opts_set(QemuOptsList *list, const char *id, - const char *name, const char *value, Error **errp) +bool qemu_opts_set(QemuOptsList *list, const char *name, const char *value= , Error **errp) { QemuOpts *opts; =20 - opts =3D qemu_opts_create(list, id, 1, errp); - if (!opts) { - return false; - } + assert(list->merge_lists); + opts =3D qemu_opts_create(list, NULL, 0, &error_abort); return qemu_opt_set(opts, name, value, errp); } =20 --=20 2.26.2 From nobody Mon May 6 10:07:02 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=1604929337; cv=none; d=zohomail.com; s=zohoarc; b=NdWFTAlroBREfuXltbEzB7r9WoHm9u3pao9ZKgPXX3xDtJY80gkuOZRw3vBfNXne2OIGjrdzUnqc7b98tMXBrYMLnxD1Mj4rU+w9OmU74Z6mMi5Aj3Ahpu4dJu4iBYLHOl5aCz8dHSNgmaotvfwakSZXhNzakXGvWrfdoSvugQE= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1604929337; 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=wbxehOKSDhrGNK6geBTGIUYU7aRINTLfEwPMIA62UFY=; b=iHGzr0Dl0IQexVn/GA/Mm1dhuuDwmyxFo+JWw/FwQ4t0WgAdYMhuFW7PplrZ3rPdtxxv0G8uUi9Vw85PQroGLOEocLKYoVHNYc/YurCWeTZckfhh3HCEEMal4yfOLmqybdCOa9oaNgsDMBgNuraLLO45XzYYUfexs5MXJb6ZMg8= 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 1604929337723964.4353166972458; Mon, 9 Nov 2020 05:42:17 -0800 (PST) Received: from localhost ([::1]:57990 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1kc7R2-0006fy-MC for importer@patchew.org; Mon, 09 Nov 2020 08:42:16 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:58952) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1kc7OY-0004se-7E for qemu-devel@nongnu.org; Mon, 09 Nov 2020 08:39:42 -0500 Received: from us-smtp-delivery-124.mimecast.com ([216.205.24.124]:30265) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.90_1) (envelope-from ) id 1kc7OW-0000jY-8k for qemu-devel@nongnu.org; Mon, 09 Nov 2020 08:39: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-281-1GkD06vrPIOYJajHZIefSA-1; Mon, 09 Nov 2020 08:39:38 -0500 Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.phx2.redhat.com [10.5.11.13]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 086E9800683 for ; Mon, 9 Nov 2020 13:39: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 C7E876EF40; Mon, 9 Nov 2020 13:39:33 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1604929179; 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=wbxehOKSDhrGNK6geBTGIUYU7aRINTLfEwPMIA62UFY=; b=RW9ior+eaG8eol/uKG6H97t5Fd6aD3zKPAG8Gpmkpmp2kM4sHuDRVLp54eUZw1lqIKsgQJ XCyWvCmyeULgzwYqgzYde1ebYiJDK07JG3mWwVMia/ZQ7a7OQPlLi51sFfFmFAKS4VoTsA +kVEGSBLcrl/8qITOcgXaSMPHAoXg2k= X-MC-Unique: 1GkD06vrPIOYJajHZIefSA-1 From: Paolo Bonzini To: qemu-devel@nongnu.org Subject: [PATCH v2 4/6] qemu-option: clean up id vs. list->merge_lists Date: Mon, 9 Nov 2020 08:39:29 -0500 Message-Id: <20201109133931.979563-5-pbonzini@redhat.com> In-Reply-To: <20201109133931.979563-1-pbonzini@redhat.com> References: <20201109133931.979563-1-pbonzini@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.13 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-detected-operating-system: by eggs.gnu.org: First seen = 2020/11/09 00:04:29 X-ACL-Warn: Detected OS = Linux 2.2.x-3.x [generic] [fuzzy] X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, 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: 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" Forbid ids if the option is intended to be a singleton, as indicated by list->merge_lists. This avoids that "./qemu-system-x86_64 -M q35,id=3Dff" uses a "pc" machine type. Instead it errors out. The affected options are "qemu-img reopen -o", "qemu-io open -o", -rtc, -M, -boot, -name, -m, -icount, -smp, -spice. 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. Signed-off-by: Paolo Bonzini --- 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 Mon May 6 10:07:02 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=1604929708; cv=none; d=zohomail.com; s=zohoarc; b=SkRhaQ1IeL7dJ9MLvvaoMLS//ojaN50QdbXNjnQu/wEFKOIobPOJZPYlovy7nO/c0ZwWvGDH+4wpolmIRc0cki7dN/8LPKHVJ6Em5jueyKU6O6TdHrFJ2zjTy1KR/kKkrJN1d/aMQTafsce5PYR1H4aGxTnuzZo7hFGGpyb1HWY= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1604929708; 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=RXVlYjkWIDTPgQ1cWDYyGJOAYR3NF9c8iypTqtyfM+s=; b=R2VZiyJBT+dmZ65Dym7xVpxo6T/HA0nRXmxoBnB/4asfQ3ZFB3IqIDO/411md15UknBDcAR2Vb6bcx9jbCJbMVyOtkQnKW1RiRRWAMDJd3ybEB7J00PAnarAmhAn/OTQk0iPWpMddbqG72/Pp5jHsnH5znkRjIpVKIZbDWwPCa8= 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 1604929708477463.09139680512953; Mon, 9 Nov 2020 05:48:28 -0800 (PST) Received: from localhost ([::1]:44628 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1kc7X1-0004xi-FA for importer@patchew.org; Mon, 09 Nov 2020 08:48:27 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:58954) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1kc7OY-0004sx-G7 for qemu-devel@nongnu.org; Mon, 09 Nov 2020 08:39:42 -0500 Received: from us-smtp-delivery-124.mimecast.com ([216.205.24.124]:59371) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.90_1) (envelope-from ) id 1kc7OW-0000jl-MV for qemu-devel@nongnu.org; Mon, 09 Nov 2020 08:39:42 -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-19-Jf_mrQfTMXegp8iC8Pr8zg-1; Mon, 09 Nov 2020 08:39:38 -0500 Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.phx2.redhat.com [10.5.11.13]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 76AAA809DCD for ; Mon, 9 Nov 2020 13:39: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 28AC86EF48; Mon, 9 Nov 2020 13:39:37 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1604929180; 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=RXVlYjkWIDTPgQ1cWDYyGJOAYR3NF9c8iypTqtyfM+s=; b=gWN4DrPkX5rjNpeNpWtlDwQ3UgHqNj2tuS3TYMOVG8+k23E0E690ZgSB0PLZaOL5eCG7l8 3uzE0jKLVfKjICub/DEhetBdTxzmGEeyBLPAFc4CAewZuCYvyUP2UB6vTozDmgnhGuMEmM wGompy9dgxXmFXpd8kvxFZQfqaJx8rY= X-MC-Unique: Jf_mrQfTMXegp8iC8Pr8zg-1 From: Paolo Bonzini To: qemu-devel@nongnu.org Subject: [PATCH v2 5/6] qemu-option: move help handling to get_opt_name_value Date: Mon, 9 Nov 2020 08:39:30 -0500 Message-Id: <20201109133931.979563-6-pbonzini@redhat.com> In-Reply-To: <20201109133931.979563-1-pbonzini@redhat.com> References: <20201109133931.979563-1-pbonzini@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.13 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-detected-operating-system: by eggs.gnu.org: First seen = 2020/11/09 00:04:29 X-ACL-Warn: Detected OS = Linux 2.2.x-3.x [generic] [fuzzy] X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, 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: 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. 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 --- util/qemu-option.c | 34 ++++++++++++++++++++-------------- 1 file changed, 20 insertions(+), 14 deletions(-) diff --git a/util/qemu-option.c b/util/qemu-option.c index 91f4120ce1..0ddf1f7b45 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,10 @@ 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) { + return false; + } firstname =3D NULL; =20 if (!strcmp(option, "id")) { @@ -817,7 +822,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 +837,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; @@ -851,8 +856,7 @@ bool has_help_option(const char *params) bool ret; =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 +941,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 Mon May 6 10:07:02 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=1604929821; cv=none; d=zohomail.com; s=zohoarc; b=n//Sx/ad7NrzT63vJe2zzdSR6aIgK2KaUgQrd0tbeGUsMn8XPr9jUERoMVSs6yQr8WfIGUFZpdmDGwIP7crUJ2DK77zt/B6gdBoxAV0FdTnUnZPdpGLUhKP+CjEnqpnY4BVK+4R3um09ydBog2eK0Td7XBbqFw7Rd7Pvyqu2Qk8= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1604929821; 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=wBcRfdslejd3RJsY6JwM1wVDqzPn+e9pnKz9YiNEbak=; b=GX90GYKFBU/X1JeiMEEjvzYOuJWHNskpCDfwbNLW2QAlO+ix0R2oPpnKhPEUCptxKCRSnRHMQHjF56PrjOHsZDmx52y7Q3HHAUGNPNEN9GQKBp/cMXO5g99EOqPd4PU5dXqjLstvBlW/w6/ac/P2Eqn0ir6Pj8NWRgSu2kNUZHc= 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 1604929821699276.8522460215178; Mon, 9 Nov 2020 05:50:21 -0800 (PST) Received: from localhost ([::1]:51302 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1kc7Yq-0007un-Ju for importer@patchew.org; Mon, 09 Nov 2020 08:50:20 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:58976) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1kc7Oe-00054c-E4 for qemu-devel@nongnu.org; Mon, 09 Nov 2020 08:39:48 -0500 Received: from us-smtp-delivery-124.mimecast.com ([216.205.24.124]:46716) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.90_1) (envelope-from ) id 1kc7Oc-0000mf-8b for qemu-devel@nongnu.org; Mon, 09 Nov 2020 08:39: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-111-OG2s4d_iPpy5ms4W7hx0CQ-1; Mon, 09 Nov 2020 08:39:39 -0500 Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.phx2.redhat.com [10.5.11.13]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id E3B954239D for ; Mon, 9 Nov 2020 13:39: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 96A8F6EF40; Mon, 9 Nov 2020 13:39:37 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1604929185; 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=wBcRfdslejd3RJsY6JwM1wVDqzPn+e9pnKz9YiNEbak=; b=Flm5sAA5LdGSEbbJZ0P/oTq6bKoldDAqD9wuxnhIbw8dLJ/MROz/6dTgjLPnCAtLRq/iq1 YuvLuW1HThcE5+qZtqqc61knEaIyiCUbkJDukwBb4f25Kw+dtIzd6fnx/cBDWiMmWHJNsG XNnWnJu+Jv0UJuSwjGSfdS42Cp2WAsM= X-MC-Unique: OG2s4d_iPpy5ms4W7hx0CQ-1 From: Paolo Bonzini To: qemu-devel@nongnu.org Subject: [PATCH v2 6/6] qemu-option: warn for short-form boolean options Date: Mon, 9 Nov 2020 08:39:31 -0500 Message-Id: <20201109133931.979563-7-pbonzini@redhat.com> In-Reply-To: <20201109133931.979563-1-pbonzini@redhat.com> References: <20201109133931.979563-1-pbonzini@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.13 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-detected-operating-system: by eggs.gnu.org: First seen = 2020/11/09 00:04:29 X-ACL-Warn: Detected OS = Linux 2.2.x-3.x [generic] [fuzzy] X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, 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: 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. The extra boolean argument is not my favorite. In 6.0 I plan to remove qemu_opts_set_defaults by switching -M to keyval, and therefore quite a bit of QemuOpts code will go away. 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 8c1dc7645d..f45938a5ff 100644 --- a/docs/system/deprecated.rst +++ b/docs/system/deprecated.rst @@ -146,6 +146,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 322b32871b..e12fb51032 100644 --- a/tests/test-qemu-opts.c +++ b/tests/test-qemu-opts.c @@ -519,7 +519,7 @@ static void test_opts_parse(void) error_free_or_abort(&err); g_assert(!opts); =20 - /* Implied value */ + /* Implied value (qemu_opts_parse does not warn) */ 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 0ddf1f7b45..23238f00ea 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) { return false; } @@ -837,7 +844,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; @@ -856,7 +863,7 @@ bool has_help_option(const char *params) bool ret; =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) { @@ -876,12 +883,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); @@ -904,8 +911,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; } @@ -923,7 +930,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 /** @@ -941,7 +948,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) { @@ -960,7 +967,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