From nobody Mon Nov 17 17:53:07 2025 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=1605105442; cv=none; d=zohomail.com; s=zohoarc; b=kI4+r6aukjhK41po0VgKjVZse4Gqx9xNvvyONJOrCl/B+pAo3fGDN42ZxgumAKn/LLm8iPG9WkbSafYs7Ha42A4bD3Zk9jQBDlDpoVh73CPl3sB+s8yVurVVnPIssMAEFsRYC6iNhnOUch4h+pjiSjCmolQpSiizK5d27ZqRuSg= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1605105442; 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=UBlS4AOyp3sikgOrvNbLNr6znEYXk5z7vSsYLmmalEwII4cn+xZtSYEeMAC/MCoVZvcb5yOWRSdRqBuvkb6vxvh39DVQjYz1JoW3Dy/BIktMEtQ6OhS3tbypbZaI05RozSTd5EL3tuC1WXSDDEvICaoaTOcDkHpPJR0qAPkKt+8= 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 1605105442881706.7583432774628; Wed, 11 Nov 2020 06:37:22 -0800 (PST) Received: from localhost ([::1]:47440 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1kcrFR-0005al-RI for importer@patchew.org; Wed, 11 Nov 2020 09:37:21 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:35918) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1kcr4K-0008WV-M5 for qemu-devel@nongnu.org; Wed, 11 Nov 2020 09:25:52 -0500 Received: from us-smtp-delivery-124.mimecast.com ([216.205.24.124]:26140) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.90_1) (envelope-from ) id 1kcr4H-0001sg-Oh for qemu-devel@nongnu.org; Wed, 11 Nov 2020 09:25:52 -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-527-o4hSevEiOXSd0nFx-KnhJw-1; Wed, 11 Nov 2020 09:25:39 -0500 Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 634F66417C for ; Wed, 11 Nov 2020 14:25: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 20A4B183AB; Wed, 11 Nov 2020 14:25:38 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1605104749; 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=DJylwnH2oSbWaVLDqUnpUAik/unawtYwUexBKZCsky87EYYeEp4WP4KpLq2dCqzmTBrMsD W+szaDJlj+s8VlLVpCl+o20MT63+ib+VJeHo4mCq/3RHJpLsL+fNtqNBcJDl02jryyXqVa ko4n3oU7bBhUW+M6z5PFXDgb2BUZBpE= X-MC-Unique: o4hSevEiOXSd0nFx-KnhJw-1 From: Paolo Bonzini To: qemu-devel@nongnu.org Subject: [PATCH 01/12] tests: convert check-qom-proplist to keyval Date: Wed, 11 Nov 2020 09:25:26 -0500 Message-Id: <20201111142537.1213209-2-pbonzini@redhat.com> In-Reply-To: <20201111142537.1213209-1-pbonzini@redhat.com> References: <20201111142537.1213209-1-pbonzini@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.12 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/11 01:49:01 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: kwolf@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 Mon Nov 17 17:53:07 2025 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=1605105034; cv=none; d=zohomail.com; s=zohoarc; b=US6ZGJaDM34MH8Up2pILYQ54XyEwSZz9EvI2zooTiD/EHclHZAvSwaz3y2a1w/L4xXWsL4/AzzI5pnU8tL9Mf+iZm4UMhWJMAVvf9X0BRe48h5oqDYSur9GqPAQuZw/5nRdvI8z9iTe8y4fQushqAQTJa1SSGF3n3yyiEnyRYNA= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1605105034; 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=5VGU8YeNop6jEEkY7KJOoGfCNOFKqfuSggD7Q1uIo28=; b=KxMeT1DUmp47WdbvpZkPfC0sar+d6WrXxsRbHpIkPaZmQeXgAREg6depKeH/+0ZalQ2taIT587QP2u5rTxBGlGx/GruabOrm4iFEX/52dlLaykXCZ6+1judSMumwizeK+THJaZJRjCAbNtS0EPrZnvrEmokmS1OCuEiRi4Ol8gU= 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 1605105034908797.7857523547162; Wed, 11 Nov 2020 06:30:34 -0800 (PST) Received: from localhost ([::1]:55196 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1kcr8p-0005Ap-SC for importer@patchew.org; Wed, 11 Nov 2020 09:30:31 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:35782) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1kcr4C-0008E0-Qs for qemu-devel@nongnu.org; Wed, 11 Nov 2020 09:25:44 -0500 Received: from us-smtp-delivery-124.mimecast.com ([216.205.24.124]:52709) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.90_1) (envelope-from ) id 1kcr4A-0001l1-In for qemu-devel@nongnu.org; Wed, 11 Nov 2020 09:25:44 -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-489-ynAeJH1PNPiSxNUqMExfgQ-1; Wed, 11 Nov 2020 09:25:39 -0500 Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id C36D5873113 for ; Wed, 11 Nov 2020 14:25: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 7EBE260CD0; Wed, 11 Nov 2020 14:25:38 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1605104741; 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=5VGU8YeNop6jEEkY7KJOoGfCNOFKqfuSggD7Q1uIo28=; b=cVkC265vtqZWwRV90FEzLSB2HlStdZbbK0imdqs4A/dgAx570NwnKczDVcDVEqkmDb7xJy 6zmYmkvCfl4t11LbQ5mFKuupIdIFWcOj3pKaZPQSoqb7aq3cHyWWw6hvhfI7giMJnGwv0H GNgHoj53ZjpT/81ss1RwUwoRrwPPxIg= X-MC-Unique: ynAeJH1PNPiSxNUqMExfgQ-1 From: Paolo Bonzini To: qemu-devel@nongnu.org Subject: [PATCH 02/12] keyval: introduce keyval_parse_into Date: Wed, 11 Nov 2020 09:25:27 -0500 Message-Id: <20201111142537.1213209-3-pbonzini@redhat.com> In-Reply-To: <20201111142537.1213209-1-pbonzini@redhat.com> References: <20201111142537.1213209-1-pbonzini@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.12 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/11 01:49:01 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: kwolf@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 (as will become useful for -M) or simply allow using a dictionary that came from somewhere else (e.g. in an HMP parsing handler). 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 76daab0885..dd93da1ce5 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 Mon Nov 17 17:53:07 2025 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=1605105032; cv=none; d=zohomail.com; s=zohoarc; b=SlgA8K9a47kPRUAWuZ+6nhVCXABHBl5d+nG1xIqoXaX3oZjFvJGApZ1nRPHjoR+Fa0/ezmsz9iVtQG3U+svb+zmuq6yb139thxrNBZvX0aItT0sqOcUOs71F1eg7ag3LcPstHdftVTzGyG0il2RKXifu7eitRz3+0eiqrwpo1lQ= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1605105032; 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=R6CbLiXR7NYBq9TCG7KTbewbet6drcXD7B7SSjw/JMA=; b=F2UOph4tPKADHf9m7Gs4/ibKQ+V4sdPyFeHUBth3sJTzehOzwy4BP9VYl+tZD5/5tNCDaxW8f5EGYRisYRpqCo1r08sUJfA/7Lz7sJT1/sX1Qtj5vadbj9+Jhs9hCA2Uib7pNBCcVDsmsCglq1spD9CyoJG1ywj4YCjkvWqaqEE= 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 1605105032744447.29665399021064; Wed, 11 Nov 2020 06:30:32 -0800 (PST) Received: from localhost ([::1]:54996 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1kcr8o-00053o-8G for importer@patchew.org; Wed, 11 Nov 2020 09:30:30 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:35848) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1kcr4F-0008IS-4I for qemu-devel@nongnu.org; Wed, 11 Nov 2020 09:25:47 -0500 Received: from us-smtp-delivery-124.mimecast.com ([63.128.21.124]:26359) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.90_1) (envelope-from ) id 1kcr4C-0001mZ-5j for qemu-devel@nongnu.org; Wed, 11 Nov 2020 09:25: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-516-5fEX0xm_O36G-M8-2knITQ-1; Wed, 11 Nov 2020 09:25:40 -0500 Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 2D7D610054FF for ; Wed, 11 Nov 2020 14:25: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 DF29F619B5; Wed, 11 Nov 2020 14:25:38 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1605104742; 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=R6CbLiXR7NYBq9TCG7KTbewbet6drcXD7B7SSjw/JMA=; b=ctVyRDBVAHglPsdVCrEOfX+0oTYMljFsB3TbwVBsBOIqd0zmwVtQ4tTUpaQYovQiYyz9h8 /1+hR3+yZRze4OMPBK9NGu7wKCgefD7XhQCNOwcmi6IJMUPJGNJApDrmZ8o+EnCmA/0t9u zowXMXOrDlMVytqQrRbKnB5rfN8rXps= X-MC-Unique: 5fEX0xm_O36G-M8-2knITQ-1 From: Paolo Bonzini To: qemu-devel@nongnu.org Subject: [PATCH 03/12] hmp: replace "O" parser with keyval Date: Wed, 11 Nov 2020 09:25:28 -0500 Message-Id: <20201111142537.1213209-4-pbonzini@redhat.com> In-Reply-To: <20201111142537.1213209-1-pbonzini@redhat.com> References: <20201111142537.1213209-1-pbonzini@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.12 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/11 01:42:46 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: kwolf@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 ff2d7aa8f3..35ecd0d9ca 100644 --- a/hmp-commands.hx +++ b/hmp-commands.hx @@ -668,7 +668,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, @@ -1314,7 +1314,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, @@ -1342,7 +1342,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 0027f1465d..e535baafd0 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 Mon Nov 17 17:53:07 2025 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=1605104852; cv=none; d=zohomail.com; s=zohoarc; b=AavSiUoQMEwJRgj/tlzihs670ZtSyyGoTtm3fCxdErU+Z09eG2jL60KrYkllGJJQ9D4OZ5s+FEyxQ0gJhWozyzVGcjEMDWwpnJf3qeASY92NOQwNbyG38XxwJWe2VdSBTJr6RlM0inbUe4X/bcVa7l/ISJGcI/5tjGUo5MZr6ms= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1605104852; 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=Lr+5b4p7qRTEk4cDzm0XIAe0S3nPS6MiisGwWtEmP+I=; b=il7ixeWxRzQI0ipIYYvvjpC2WNCRsgsHAOFY3cZEk1+IiOhKEhSpMRrOsnI9gCloCd9l4D8BG4XZCtadZlyVhEsuu0vfTa7g4BmiuUF5aGJ4BYXaBXoKoH9/RGuvyoMd1+YP2AxlIPXa1fj5F2IP7BeXPgPRRrLCBQUcEMcsQ6c= 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 1605104852157701.7449548091722; Wed, 11 Nov 2020 06:27:32 -0800 (PST) Received: from localhost ([::1]:46506 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1kcr5v-0001Xh-0X for importer@patchew.org; Wed, 11 Nov 2020 09:27:31 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:35810) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1kcr4D-0008Fb-KC for qemu-devel@nongnu.org; Wed, 11 Nov 2020 09:25:45 -0500 Received: from us-smtp-delivery-124.mimecast.com ([216.205.24.124]:46022) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.90_1) (envelope-from ) id 1kcr4A-0001mH-Vs for qemu-devel@nongnu.org; Wed, 11 Nov 2020 09:25: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-513-B0k56toFOz-W6ZsdhGnTIw-1; Wed, 11 Nov 2020 09:25:40 -0500 Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 8B8E210557CB for ; Wed, 11 Nov 2020 14:25: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 48C3E60CD0; Wed, 11 Nov 2020 14:25:39 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1605104742; 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=Lr+5b4p7qRTEk4cDzm0XIAe0S3nPS6MiisGwWtEmP+I=; b=Uv8ysKmnGy2wW7Sc0NvF+bJKudWQE4SBadFPm+Q6bmomPr47zOv7Or/b9HWmXkXkMI5cib /nDGTsQsjuGQsOoD7hsPUPGGqZmCztZipbufzb9g9n4e3nim5AWhXaO6FPcevaJ8IUKhCp I3pj1e8RxyPGg0sVxsxle0atdDDRjfU= X-MC-Unique: B0k56toFOz-W6ZsdhGnTIw-1 From: Paolo Bonzini To: qemu-devel@nongnu.org Subject: [PATCH 04/12] qom: use qemu_printf to print help for user-creatable objects Date: Wed, 11 Nov 2020 09:25:29 -0500 Message-Id: <20201111142537.1213209-5-pbonzini@redhat.com> In-Reply-To: <20201111142537.1213209-1-pbonzini@redhat.com> References: <20201111142537.1213209-1-pbonzini@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.12 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/11 01:49:01 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: kwolf@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 --- 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 ed896fe764..34edc3d1d8 100644 --- a/qom/object_interfaces.c +++ b/qom/object_interfaces.c @@ -13,6 +13,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 Mon Nov 17 17:53:07 2025 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=1605105096; cv=none; d=zohomail.com; s=zohoarc; b=Fsfe1k1wNZGeEKsneeVnUnObKdf5ei2sOOMVRbSr7LqMHyofAkLfSTrbzSO+f+/TaKYh4vqZ4ThTxD6Ifx9CZtHPGQhzYsMi8LIhXOkySGIMOQ40zQNbMIge/eTlkD/ZkcigKWjx1FUl+zRG8FyxropfC3KPcen/sfrG7neAr5U= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1605105096; 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=TAP/HF9F66LTUeTlSryBoA6ja8DnM0PX+A9pe06+0kE=; b=iA2dzQWNtZuIJWiLdc+eUJ9hS88A5SDrww8SQG8cxFKAeIGSH6s+f1X8I9l5DTdUS6ZxRG8g2+rKuHcnIwvnBIz7n9mXrfTwtUjQFObo3bFB4ZR0C2YybNq9fGQiezvFQYU2CgaV/sRDJw4wpdzj5FqfPouviAYNylKLY6FeDOg= 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 1605105096392987.4471474879289; Wed, 11 Nov 2020 06:31:36 -0800 (PST) Received: from localhost ([::1]:58728 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1kcr9q-0006kb-Cz for importer@patchew.org; Wed, 11 Nov 2020 09:31:34 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:35830) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1kcr4E-0008Gy-EP for qemu-devel@nongnu.org; Wed, 11 Nov 2020 09:25:46 -0500 Received: from us-smtp-delivery-124.mimecast.com ([63.128.21.124]:36432) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.90_1) (envelope-from ) id 1kcr4C-0001mW-5H for qemu-devel@nongnu.org; Wed, 11 Nov 2020 09:25: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-184-6VzlWT-VP76aFoDRZZsnlQ-1; Wed, 11 Nov 2020 09:25:41 -0500 Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id E96B41899421 for ; Wed, 11 Nov 2020 14:25: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 A65D16115F; Wed, 11 Nov 2020 14:25:39 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1605104742; 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=TAP/HF9F66LTUeTlSryBoA6ja8DnM0PX+A9pe06+0kE=; b=HS77VYRNeB5COoATNESXOKAzNFvLHGSltWU0N8GZnhq0hSnpKXRCJALIlV8lwcVihXhOwt sqVvxH0zXnfQ1RyM+k5X10s+mmKIeNgpA01tw8hKFxSBgZ+L9xfSk/LXB4FgPeQzKrYgqS OCTw81qSXpefcYpNqpZF6sg/uksUc9A= X-MC-Unique: 6VzlWT-VP76aFoDRZZsnlQ-1 From: Paolo Bonzini To: qemu-devel@nongnu.org Subject: [PATCH 05/12] hmp: special case help options for object_add Date: Wed, 11 Nov 2020 09:25:30 -0500 Message-Id: <20201111142537.1213209-6-pbonzini@redhat.com> In-Reply-To: <20201111142537.1213209-1-pbonzini@redhat.com> References: <20201111142537.1213209-1-pbonzini@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.12 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/11 01:42:46 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: kwolf@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 65d8ff4849..153ece8176 100644 --- a/monitor/hmp-cmds.c +++ b/monitor/hmp-cmds.c @@ -1664,23 +1664,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 34edc3d1d8..f7dcdf18e2 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 Mon Nov 17 17:53:07 2025 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=1605105312; cv=none; d=zohomail.com; s=zohoarc; b=OQTREfe/lT3rUCFIh/htIxdjWZdc2lV1KyaabINw77YKp5+iGX+e+aFbiwPa4xlr/ow/0nGjoM6IRGWe4G8IwjcjEcnOQ4kFq5NAouWVXnuer/MpHEcuQxnCi8Z+rFnx/azdg0/KwNoTcDaDXRiRfTn+BNg1BJw3kgJYkZffkFI= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1605105312; 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=WMYZ5beAUYpvXEZYIEWka+ObfYueWAqKFcRnb7bEWbCme47dIZeoKQLjvi2z93HBAd1E45b9MpyCPNkt2YDdGF7M1mWw4EFIIEtktduFdvphnWTX5gU2iAY/RQV/xnDTTc48L9O99WSgiQQM5STtUPe+rMcjRJ3vyJbX5V9C8zI= 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 160510531223718.401092016726807; Wed, 11 Nov 2020 06:35:12 -0800 (PST) Received: from localhost ([::1]:41446 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1kcrDK-0002tg-Hr for importer@patchew.org; Wed, 11 Nov 2020 09:35:10 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:35922) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1kcr4L-00007H-OA for qemu-devel@nongnu.org; Wed, 11 Nov 2020 09:25:53 -0500 Received: from us-smtp-delivery-124.mimecast.com ([216.205.24.124]:50160) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.90_1) (envelope-from ) id 1kcr4J-0001te-69 for qemu-devel@nongnu.org; Wed, 11 Nov 2020 09:25:53 -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-515-442cso6VNY6aT0uiwFXlQw-1; Wed, 11 Nov 2020 09:25:41 -0500 Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 53B7587311B for ; Wed, 11 Nov 2020 14:25: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 1129260CD0; Wed, 11 Nov 2020 14:25:40 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1605104750; 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=fDm4kO20pIPHEiIxC1OSg+jwy4rtlZ9XUyCmASrkg2xfZvuvJ13/xHBFOn8eEQVWLMA+mU GttOPxiDD8dB9Z6LndK3Gh53B1IYqE9aoHrUWRoIVYKPycHcAIyV4cDYDt9G1A451aagL9 wDjwRpxC/A/u2kcMMzStfjRMYWv7yKg= X-MC-Unique: 442cso6VNY6aT0uiwFXlQw-1 From: Paolo Bonzini To: qemu-devel@nongnu.org Subject: [PATCH 06/12] qemu-io: use keyval for -object parsing Date: Wed, 11 Nov 2020 09:25:31 -0500 Message-Id: <20201111142537.1213209-7-pbonzini@redhat.com> In-Reply-To: <20201111142537.1213209-1-pbonzini@redhat.com> References: <20201111142537.1213209-1-pbonzini@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.12 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/11 01:49:01 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: kwolf@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 Mon Nov 17 17:53:07 2025 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=1605104999; cv=none; d=zohomail.com; s=zohoarc; b=Ao7m4ZBXGPGGURjgZVo3wX+HpBKp/ansoHfjvT7k5/iEiiUyiB//uB30UN1C/RZqbneXHh9ABUKgbUa3EVTk5rRhdEeZ6v9LMGbdGr+guUtX7hh32R8pc2/FgD2YSRcOsDowckZH3l8BheTeC7TqBn2pIrDTXg7uQx3I3ICAmdc= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1605104999; 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=M3zIJIe+Rx7ymGNRMY+ryCy3IayLez1+0qHiPmYmZfhpnNWCj1Zf4WG+4+pjjolZQW3aMcHcoZMr6dV6F7TuBlo7bJcc52lEj1PbSLauC75pBJi8/CgWF8HX18B/48a/xe0vMoxpvAQit8wuElI5LTJGC4XZ2sj9Ikdv6SuLpuI= 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 1605104999473708.622974721036; Wed, 11 Nov 2020 06:29:59 -0800 (PST) Received: from localhost ([::1]:53796 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1kcr8F-0004ZY-Jn for importer@patchew.org; Wed, 11 Nov 2020 09:29:55 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:35820) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1kcr4E-0008GW-3n for qemu-devel@nongnu.org; Wed, 11 Nov 2020 09:25:46 -0500 Received: from us-smtp-delivery-124.mimecast.com ([216.205.24.124]:55582) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.90_1) (envelope-from ) id 1kcr4C-0001mt-53 for qemu-devel@nongnu.org; Wed, 11 Nov 2020 09:25: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-551-VHOw2UO0M2OtAuuRcb94Wg-1; Wed, 11 Nov 2020 09:25:41 -0500 Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id B37BD8CD801 for ; Wed, 11 Nov 2020 14:25: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 6F6FC6115F; Wed, 11 Nov 2020 14:25:40 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1605104743; 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=bwkSLWRrRiV6SXDmvwyoxqYhpfxHG/azwboPJ9JCDKYqupEpehdi+VKSk/EP8ktN6zSqZB a4TpwRVpOeeUW0OQaWtBPatEHAxUPcwQbV9/kHx+uxiHmZLWPVjnOheT8zoEViQkmOJJgS qHqJ34h9g/GCtUixa6HhtBt3b3TCFiA= X-MC-Unique: VHOw2UO0M2OtAuuRcb94Wg-1 From: Paolo Bonzini To: qemu-devel@nongnu.org Subject: [PATCH 07/12] qemu-nbd: use keyval for -object parsing Date: Wed, 11 Nov 2020 09:25:32 -0500 Message-Id: <20201111142537.1213209-8-pbonzini@redhat.com> In-Reply-To: <20201111142537.1213209-1-pbonzini@redhat.com> References: <20201111142537.1213209-1-pbonzini@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.12 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/11 01:49:01 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: kwolf@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 Mon Nov 17 17:53:07 2025 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=1605105284; cv=none; d=zohomail.com; s=zohoarc; b=cRxH9A6iXAFx/bzmlv6vW8u546eHrArSsSypVZb9XR1HapGEkwHHgv5AORI50N4dh1/PQgx1ubL+B5yAjYXnHJcws09lLc+hmni5C3ITqyK8ZFAGHlCYLsl+BQ99X0/9ImO93TCV3FrxL8Hd7vn6aaCMQGoSFX4kVi2Hed7ouQw= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1605105284; 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=y/I1UKAuFkhg4uNFK4p8T6uf6h2FIq3Qwbuil6+xSpM=; b=Abzh010QMX78TObVpsv09o0HwAoCzo8nD0ho+NG4f0wzwhEzHraDVQOkqZov8tE65B9Piwd/RVbm4F2aoE53FVZvJuelKZb8mKaNlAwuE1kHds/29OnLNOHq7PwWDiCdz+1DfeisYOkBcN2WUpcBDK1F51INfuIIbEXivXIa7Dc= 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 1605105284194344.05111902554097; Wed, 11 Nov 2020 06:34:44 -0800 (PST) Received: from localhost ([::1]:40492 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1kcrCs-0002VT-LH for importer@patchew.org; Wed, 11 Nov 2020 09:34:42 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:35894) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1kcr4J-0008Sv-Ds for qemu-devel@nongnu.org; Wed, 11 Nov 2020 09:25:51 -0500 Received: from us-smtp-delivery-124.mimecast.com ([63.128.21.124]:44895) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.90_1) (envelope-from ) id 1kcr4G-0001rg-Ot for qemu-devel@nongnu.org; Wed, 11 Nov 2020 09:25: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-458-m1YGykKWPuq39cyqOCV0Gg-1; Wed, 11 Nov 2020 09:25:41 -0500 Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 1D5C610557CC for ; Wed, 11 Nov 2020 14:25: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 CE89960CD0; Wed, 11 Nov 2020 14:25:40 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1605104748; 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=y/I1UKAuFkhg4uNFK4p8T6uf6h2FIq3Qwbuil6+xSpM=; b=Cc723DFQpO/ceJPy//2mrEP/dhpSI+a10RtH4pTWvnvRhjNqAeH/hm3jhZPDh2KOr/AjNL aXebldZfE4F4iw1bAzLL/PMPAi70MskgIBmbxJnkQ+peR9Fr2qw5H+ZqaRwJ49Y0fpyELU MsccvrgwsDIhjnQ83DNkw52sFhFRVRs= X-MC-Unique: m1YGykKWPuq39cyqOCV0Gg-1 From: Paolo Bonzini To: qemu-devel@nongnu.org Subject: [PATCH 08/12] qemu-img: use keyval for -object parsing Date: Wed, 11 Nov 2020 09:25:33 -0500 Message-Id: <20201111142537.1213209-9-pbonzini@redhat.com> In-Reply-To: <20201111142537.1213209-1-pbonzini@redhat.com> References: <20201111142537.1213209-1-pbonzini@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.12 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/11 01:42:46 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: kwolf@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 8bdea40b58..a91bbba4c6 100644 --- a/qemu-img.c +++ b/qemu-img.c @@ -227,21 +227,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 /* @@ -567,14 +573,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 @@ -590,12 +591,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; @@ -805,14 +800,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; @@ -832,12 +822,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); @@ -1035,14 +1019,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; @@ -1059,12 +1038,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) { @@ -1424,15 +1397,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; @@ -1451,13 +1418,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 @@ -1642,7 +1602,6 @@ out2: blk_unref(blk1); out3: qemu_progress_end(); -out4: return ret; } =20 @@ -2344,15 +2303,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; @@ -2380,12 +2333,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; @@ -2977,14 +2924,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; @@ -3004,12 +2946,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) { @@ -3219,14 +3155,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; @@ -3246,12 +3177,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; @@ -3390,14 +3315,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; @@ -3409,12 +3329,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); @@ -3548,14 +3462,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; @@ -3577,12 +3486,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 @@ -3973,14 +3876,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; @@ -4002,12 +3900,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 '+': @@ -4187,12 +4079,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; @@ -4207,13 +4094,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; } @@ -4672,7 +4552,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; @@ -4766,10 +4645,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; @@ -4777,12 +4653,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"); @@ -4878,7 +4748,6 @@ static int img_bitmap(int argc, char **argv) out: blk_unref(src); blk_unref(blk); - qemu_opts_del(opts); return ret; } =20 @@ -5040,10 +4909,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; @@ -5090,13 +4956,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 @@ -5272,7 +5131,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; @@ -5317,11 +5175,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; @@ -5351,12 +5205,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; @@ -5444,7 +5292,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); @@ -5496,7 +5343,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 Mon Nov 17 17:53:07 2025 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=1605105220; cv=none; d=zohomail.com; s=zohoarc; b=nVIPlSysrwZKjTyPmQeTRMgHOq2y13Jay40CThAAw9uSXGdQ6CUBT6TlNw5wjv+aIy15MBiOXDBrAk6+g+k/8NNEP7eDHOBAL2N0MyrGt8HtcuHH8whX1wHAlFByIX8EprUZJgCtXl5/xg7KMiDG14fnXVWizKUrZHJ6fmCFbuY= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1605105220; 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=eqXNXi9fRRDcGyqa+T4f046tjbOG5b6Vv23Q69MGA2Q=; b=QsAwClYTVfzOdHuIoFsHeWVYHPYlQ6lmwkT3NomNFEVqrYRSJo3dxmPS8FW1J7E3hL2WulJyqca0x/uSQXiibu21/3l1MB+N2cQ9iVjLViLHUEL/9x0cNLgsdklwEotpf5NwiDHBqeFqNz1gfo7Zz6uYTLhtP6A0EZsKMMS1MrM= 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 1605105220057499.6224254325331; Wed, 11 Nov 2020 06:33:40 -0800 (PST) Received: from localhost ([::1]:37688 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1kcrBq-0001In-Pf for importer@patchew.org; Wed, 11 Nov 2020 09:33:38 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:35858) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1kcr4F-0008KN-QO for qemu-devel@nongnu.org; Wed, 11 Nov 2020 09:25:47 -0500 Received: from us-smtp-delivery-124.mimecast.com ([63.128.21.124]:24849) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.90_1) (envelope-from ) id 1kcr4C-0001n4-Ms for qemu-devel@nongnu.org; Wed, 11 Nov 2020 09:25: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-584-nAluOhNdMaqf1OLpp13OmA-1; Wed, 11 Nov 2020 09:25:42 -0500 Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 7D2316417D for ; Wed, 11 Nov 2020 14:25: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 38EE16115F; Wed, 11 Nov 2020 14:25:41 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1605104744; 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=eqXNXi9fRRDcGyqa+T4f046tjbOG5b6Vv23Q69MGA2Q=; b=QfQkkfS1Kap6/ObsoXjvFtN8un4u9UuBUGnX1Y737sCwdePQScoOL84lAW+uYtd5i4go2c nlFSPAVgZEE65SrWqXHrhB8/r5gqACL4zPDHPCtm1XDUl8xC1HzXs3tVaOultldHMQIs3+ UFVaWNRQ3Uqy/CqEBr1aXR5xxh0RUmM= X-MC-Unique: nAluOhNdMaqf1OLpp13OmA-1 From: Paolo Bonzini To: qemu-devel@nongnu.org Subject: [PATCH 09/12] qemu-config: add error propagation to qemu_config_parse Date: Wed, 11 Nov 2020 09:25:34 -0500 Message-Id: <20201111142537.1213209-10-pbonzini@redhat.com> In-Reply-To: <20201111142537.1213209-1-pbonzini@redhat.com> References: <20201111142537.1213209-1-pbonzini@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.12 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/11 01:42:46 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: kwolf@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 | 24 +++++++----------------- util/qemu-config.c | 20 ++++++++++---------- 4 files changed, 20 insertions(+), 31 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 29226107bd..4e235f63ce 100644 --- a/include/qemu/config-file.h +++ b/include/qemu/config-file.h @@ -11,9 +11,9 @@ 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); +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 ac6fec732e..e46f286ad2 100644 --- a/softmmu/vl.c +++ b/softmmu/vl.c @@ -2041,17 +2041,16 @@ 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); + ret =3D qemu_read_config_file(file, &local_err); if (ret < 0 && ret !=3D -ENOENT) { - return ret; + error_propagate(errp, local_err); } - - return 0; } =20 static void user_register_global_props(void) @@ -2598,9 +2597,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 */ @@ -3292,15 +3289,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 725e3d7e4b..7804333b5a 100644 --- a/util/qemu-config.c +++ b/util/qemu-config.c @@ -356,7 +356,7 @@ void qemu_config_write(FILE *fp) } =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; @@ -381,7 +381,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); @@ -392,7 +392,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); @@ -404,20 +404,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; @@ -426,16 +425,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 Mon Nov 17 17:53:07 2025 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=1605105346; cv=none; d=zohomail.com; s=zohoarc; b=U3VO9z18KyDtfSQvPi5wV/9llWssTbs/6B4APMWbEpfEkoJv6MMzSDAHEfBLQcQ0zOd1SmlDrrxCd/FZ/g7pjtpsrwCUG4iD39tFlbA9tY1vZMFrfatCxcfENsdGosZNrXCOui+Oczk+Uqj/oGNf5IAPOxUgZNSSci0xckutTn8= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1605105346; 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=NkPmaDO5VTcgVIJ83PMxJipDPdPH/eeKYyjodlkyerE/uLDOaVyoU3b62GwIL9sbwejAl1vrg/38HUC6tWda/eHSPqQmt/MZSWh2MvIEg+d6hnzqhJp1wwkjCXU9VEpuemXy+QkxTH/NhVeBlLe56viMPY1RkYLJwSSrr2O9NGs= 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 1605105346031134.58019070285286; Wed, 11 Nov 2020 06:35:46 -0800 (PST) Received: from localhost ([::1]:44018 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1kcrDs-000442-BQ for importer@patchew.org; Wed, 11 Nov 2020 09:35:44 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:35888) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1kcr4I-0008RO-S5 for qemu-devel@nongnu.org; Wed, 11 Nov 2020 09:25:50 -0500 Received: from us-smtp-delivery-124.mimecast.com ([63.128.21.124]:20033) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.90_1) (envelope-from ) id 1kcr4H-0001rt-1Z for qemu-devel@nongnu.org; Wed, 11 Nov 2020 09:25: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-388-5QX32h0VO52VD2lSEcUpPw-1; Wed, 11 Nov 2020 09:25:43 -0500 Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.phx2.redhat.com [10.5.11.14]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 2597D10054FF for ; Wed, 11 Nov 2020 14:25:42 +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 D5D745DA74; Wed, 11 Nov 2020 14:25:41 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1605104748; 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=U8zmzBGHWZMUH/XezNwC0hETVe8zk/uhCksMY2XtH/XxiO+TIX/RjJ2h41GWylN4wGoSeC Qx33ii/QfZnvRgqV92lVtKTc0GTVav5FoGjGf7/FWOfOUctjqCT4hDkH1MR4AGwrldKg80 j9s36hCVsKauUVcr7Yov90Wj144e+bo= X-MC-Unique: 5QX32h0VO52VD2lSEcUpPw-1 From: Paolo Bonzini To: qemu-devel@nongnu.org Subject: [PATCH 10/12] qemu-option: support accept-any QemuOptsList in qemu_opts_absorb_qdict Date: Wed, 11 Nov 2020 09:25:35 -0500 Message-Id: <20201111142537.1213209-11-pbonzini@redhat.com> In-Reply-To: <20201111142537.1213209-1-pbonzini@redhat.com> References: <20201111142537.1213209-1-pbonzini@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.14 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/11 01:42:46 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: kwolf@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 Mon Nov 17 17:53:07 2025 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=1605105153; cv=none; d=zohomail.com; s=zohoarc; b=ADk1lV7hseHz9NAlRD+RUkiyPyuzpKUm00ujVSQ5urBOuByvqbx8oFUU/o0NkuwGp6Yki6HB/CjitzN+K5hiGOFbmnYPLcBpWS1cE771iXUaJm36VATnRfHXR9OaL+2zL1yrG8cnJoEhEKdIZp/2KMp7opU2VpVVAvsPRE7ONGs= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1605105153; 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=Ssrds8xhCBaw5zP7geCWAcvY0c+K7Vh0SO5XtI6ia7g=; b=GhP20Iv2201UmmCn4IXYMbIK9K7MyAPzeMnAPGSxpXUwiRLKpk13EYv76xbwhyUuLyfPkCL9B1yN1PnDTrKVCwyQYMeu2nu90oQSc8idDhqjEaoWl6XuknLuAZHzmLKjG5AqKWUjIXZbS7j4q6Ho7Tz8GTRYoicxEfuW46DY5jM= 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 16051051536131.468812601901618; Wed, 11 Nov 2020 06:32:33 -0800 (PST) Received: from localhost ([::1]:34006 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1kcrAl-0008Bt-CE for importer@patchew.org; Wed, 11 Nov 2020 09:32:31 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:35860) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1kcr4G-0008L1-4e for qemu-devel@nongnu.org; Wed, 11 Nov 2020 09:25:48 -0500 Received: from us-smtp-delivery-124.mimecast.com ([63.128.21.124]:36119) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.90_1) (envelope-from ) id 1kcr4E-0001oy-44 for qemu-devel@nongnu.org; Wed, 11 Nov 2020 09:25: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-16-_9jxOxyyO4Keryy7x2EMAA-1; Wed, 11 Nov 2020 09:25:43 -0500 Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.phx2.redhat.com [10.5.11.14]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 921C4876E3B for ; Wed, 11 Nov 2020 14:25:42 +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 4032A5DA74; Wed, 11 Nov 2020 14:25:42 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1605104745; 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=Ssrds8xhCBaw5zP7geCWAcvY0c+K7Vh0SO5XtI6ia7g=; b=YFkqG7+Gr9l8Y63WbIF69qACN4Ey30U38Rl4iPVIeD2KPVW5oESbnbDHmyqhLjlt5eyDIh eK067LZUs83O0LSOJgoGfp6BOzo0soNbrmih+7wlgLZB3KJeE7S0c8Jm/Zyl0KiDnaiVpY yTn9VoirM0mnp2qbGeVPm/Z41BntIMQ= X-MC-Unique: _9jxOxyyO4Keryy7x2EMAA-1 From: Paolo Bonzini To: qemu-devel@nongnu.org Subject: [PATCH 11/12] qemu-config: parse configuration files to a QDict Date: Wed, 11 Nov 2020 09:25:36 -0500 Message-Id: <20201111142537.1213209-12-pbonzini@redhat.com> In-Reply-To: <20201111142537.1213209-1-pbonzini@redhat.com> References: <20201111142537.1213209-1-pbonzini@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.14 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/11 01:42:46 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: kwolf@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. Note that the QemuOpts are now created at the _end_ of the group, rather than at the beginning. Therefore, loc_set_file is delayed until after the callback has been invoked. 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 4e235f63ce..6f9b511f48 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); @@ -13,7 +14,10 @@ int qemu_global_option(const char *str); void qemu_config_write(FILE *fp); 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 e46f286ad2..9b3b687a85 100644 --- a/softmmu/vl.c +++ b/softmmu/vl.c @@ -2047,7 +2047,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 && ret !=3D -ENOENT) { error_propagate(errp, local_err); } @@ -3289,7 +3289,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 7804333b5a..a1db99dcba 100644 --- a/util/qemu-config.c +++ b/util/qemu-config.c @@ -356,19 +356,19 @@ void qemu_config_write(FILE *fp) } =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; @@ -377,39 +377,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"); @@ -422,10 +422,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; @@ -435,7 +466,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 Mon Nov 17 17:53:07 2025 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=1605105167; cv=none; d=zohomail.com; s=zohoarc; b=Nbpkr0s2XvkglWNhmTREIm9yI+Qo/amw6CfuBgQoaCuOvjnMuNhy0QzMO0y9Eot3S6gBtMC6IVgiinlCvxSPZr9JPDXkuu1/VDu2uMoZqyxnKG0hSXP8ccySnKkpZytRawIX8AT571VScK+Em7INzq7CT8As1UODhP8HT1X+FkI= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1605105167; 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=RQXJSzQQfttjqwsE01yl5wP/l5XoHRDd+FvY3XMnwSI=; b=ZIYEwXftuPp0K+uU7OjGbbOjFKpFX9A3bAnVU6aWU3gCEF4t+TZbYQcsLVzYSXiFA1Nzarf5W1Tof/LVfdWnX0fCghlYkp608vPHcOrZ/6Vhn63YFYhUqePkqR4u4SVm0wOAC1sYlnCZlP9Z8VcjqQWS3x2JSKAvqWVi8LAKSGY= 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 160510516733288.3994668426684; Wed, 11 Nov 2020 06:32:47 -0800 (PST) Received: from localhost ([::1]:35090 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1kcrAz-0000C1-F0 for importer@patchew.org; Wed, 11 Nov 2020 09:32:45 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:35920) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1kcr4K-00005L-UU for qemu-devel@nongnu.org; Wed, 11 Nov 2020 09:25:52 -0500 Received: from us-smtp-delivery-124.mimecast.com ([216.205.24.124]:21790) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.90_1) (envelope-from ) id 1kcr4H-0001sd-O0 for qemu-devel@nongnu.org; Wed, 11 Nov 2020 09:25:52 -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-181-Xps8wpKFOqaqXIloXoOKVg-1; Wed, 11 Nov 2020 09:25:47 -0500 Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.phx2.redhat.com [10.5.11.14]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 4533B8CD801 for ; Wed, 11 Nov 2020 14:25:46 +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 AD7E25DA74; Wed, 11 Nov 2020 14:25:42 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1605104749; 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=RQXJSzQQfttjqwsE01yl5wP/l5XoHRDd+FvY3XMnwSI=; b=I4+Ejw34PirnB+2OEOC047H5rgjnJQXYExYVMjL7rWxYRt8Ue6r9oBMpPEde3skBmO4gyF TVHM/80Chtxh16Sm1z7oO8P7QtxPF2oed5UZywo9qIlcZLhXQjetSABl+t16sPQUhTbR5V iZvLCGtcuDzGrFQuEHp4Tv9wVJGfnXY= X-MC-Unique: Xps8wpKFOqaqXIloXoOKVg-1 From: Paolo Bonzini To: qemu-devel@nongnu.org Subject: [PATCH 12/12] qemu: use keyval for -object parsing Date: Wed, 11 Nov 2020 09:25:37 -0500 Message-Id: <20201111142537.1213209-13-pbonzini@redhat.com> In-Reply-To: <20201111142537.1213209-1-pbonzini@redhat.com> References: <20201111142537.1213209-1-pbonzini@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.14 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/11 01:49:01 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: kwolf@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 | 44 ---------------- qom/object_interfaces.c | 42 --------------- softmmu/vl.c | 93 ++++++++++++++++++++++----------- 3 files changed, 63 insertions(+), 116 deletions(-) diff --git a/include/qom/object_interfaces.h b/include/qom/object_interface= s.h index abb23eaea3..77a4d5cf98 100644 --- a/include/qom/object_interfaces.h +++ b/include/qom/object_interfaces.h @@ -119,36 +119,6 @@ bool user_creatable_add_dict(QDict *qdict, bool keyval= , Error **errp); */ Object *user_creatable_add_opts(QemuOpts *opts, Error **errp); =20 - -/** - * 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,20 +126,6 @@ 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 diff --git a/qom/object_interfaces.c b/qom/object_interfaces.c index f7dcdf18e2..08d1f5c0d5 100644 --- a/qom/object_interfaces.c +++ b/qom/object_interfaces.c @@ -171,27 +171,6 @@ Object *user_creatable_add_opts(QemuOpts *opts, Error = **errp) return obj; } =20 - -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) { @@ -266,20 +245,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"); @@ -306,13 +271,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 9b3b687a85..bb4dc87a29 100644 --- a/softmmu/vl.c +++ b/softmmu/vl.c @@ -116,6 +116,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" @@ -136,6 +137,7 @@ static const char *boot_order; static const char *boot_once; 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 +310,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", @@ -1678,12 +1671,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! @@ -1769,6 +1758,22 @@ static void qemu_apply_machine_options(void) current_machine->boot_order =3D boot_order; } =20 +static void user_creatable_add_dict_foreach(void *data, void *opaque) +{ + bool (*type_opt_predicate)(const char *) =3D opaque; + 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); @@ -1795,9 +1800,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 */ @@ -1826,9 +1831,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) @@ -1839,9 +1844,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); @@ -2041,13 +2046,32 @@ static int global_init_func(void *opaque, QemuOpts = *opts, Error **errp) return 0; } =20 +/* + * 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 (g_str_equal(group, "object")) { + QObject *crumpled =3D qdict_crumple(qdict, errp); + if (!crumpled) { + return; + } + object_opts_list =3D g_slist_prepend(object_opts_list, crumpled); + return; + } + + 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 && ret !=3D -ENOENT) { error_propagate(errp, local_err); } @@ -2561,7 +2585,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_realtime_opts); qemu_add_opts(&qemu_overcommit_opts); @@ -3289,7 +3312,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); @@ -3361,12 +3384,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); + } + object_opts_list =3D g_slist_prepend(object_opts_list,= args); + break; } - break; case QEMU_OPTION_realtime: warn_report("'-realtime mlock=3D...' is deprecated, please= use " "'-overcommit mem-lock=3D...' instead"); @@ -3424,6 +3453,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