From patchwork Wed Nov 11 14:25:26 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paolo Bonzini X-Patchwork-Id: 11897943 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 1A398139F for ; Wed, 11 Nov 2020 14:37:13 +0000 (UTC) Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id B48B02067D for ; Wed, 11 Nov 2020 14:37:12 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b="DJylwnH2" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org B48B02067D Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=redhat.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Received: from localhost ([::1]:47440 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1kcrFH-0005al-Jl for patchwork-qemu-devel@patchwork.kernel.org; Wed, 11 Nov 2020 09:37:11 -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 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= 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 X-MC-Unique: o4hSevEiOXSd0nFx-KnhJw-1 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) 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 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+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Sender: "Qemu-devel" 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" #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) static void test_dummy_createcmdl(void) { - QemuOpts *opts; + QDict *qdict; DummyObject *dobj; Error *err = NULL; + bool help; const char *params = TYPE_DUMMY \ ",id=dev0," \ "bv=yes,sv=Hiss hiss hiss,av=platypus"; - qemu_add_opts(&qemu_object_opts); - opts = qemu_opts_parse(&qemu_object_opts, params, true, &err); + qdict = keyval_parse(params, "qom-type", &help, &err); g_assert(err == NULL); - g_assert(opts); + g_assert(qdict); + g_assert(!help); - dobj = DUMMY_OBJECT(user_creatable_add_opts(opts, &err)); + g_assert(user_creatable_add_dict(qdict, true, &err)); g_assert(err == NULL); + qobject_unref(qdict); + + dobj = DUMMY_OBJECT(object_resolve_path_component(object_get_objects_root(), + "dev0")); g_assert(dobj); g_assert_cmpstr(dobj->sv, ==, "Hiss hiss hiss"); g_assert(dobj->bv == true); g_assert(dobj->av == DUMMY_PLATYPUS); + qdict = 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(), "dev0") + == OBJECT(dobj)); + qobject_unref(qdict); + error_free(err); + err = NULL; + + qdict = keyval_parse(params, "qom-type", &help, &err); user_creatable_del("dev0", &error_abort); + g_assert(object_resolve_path_component(object_get_objects_root(), "dev0") + == NULL); - 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 == NULL); + qobject_unref(qdict); + + dobj = DUMMY_OBJECT(object_resolve_path_component(object_get_objects_root(), + "dev0")); + g_assert(dobj); + g_assert_cmpstr(dobj->sv, ==, "Hiss hiss hiss"); + g_assert(dobj->bv == true); + g_assert(dobj->av == DUMMY_PLATYPUS); + g_assert(object_resolve_path_component(object_get_objects_root(), "dev0") + == OBJECT(dobj)); + + object_unparent(OBJECT(dobj)); } static void test_dummy_badenum(void) From patchwork Wed Nov 11 14:25:27 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paolo Bonzini X-Patchwork-Id: 11897927 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 69A41921 for ; Wed, 11 Nov 2020 14:29:45 +0000 (UTC) Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 120922068D for ; Wed, 11 Nov 2020 14:29:44 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b="cVkC265v" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 120922068D Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=redhat.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Received: from localhost ([::1]:55196 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1kcr83-0005Ap-Sa for patchwork-qemu-devel@patchwork.kernel.org; Wed, 11 Nov 2020 09:29:43 -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 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= 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 X-MC-Unique: ynAeJH1PNPiSxNUqMExfgQ-1 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) 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 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+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Sender: "Qemu-devel" 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 print_caption); void qemu_opts_free(QemuOptsList *list); QemuOptsList *qemu_opts_append(QemuOptsList *dst, QemuOptsList *list); +QDict *keyval_parse_into(QDict *qdict, const char *params, const char *implied_key, + bool *p_help, Error **errp); QDict *keyval_parse(const char *params, const char *implied_key, bool *help, Error **errp); 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 *key_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 *implied_key, + bool *p_help, Error **errp) { - QDict *qdict = qdict_new(); QObject *listified; g_autofree char *dup; char *s; @@ -452,7 +451,6 @@ QDict *keyval_parse(const char *params, const char *implied_key, while (*s) { s = keyval_parse_one(qdict, s, implied_key, &help, errp); if (!s) { - qobject_unref(qdict); return NULL; } implied_key = NULL; @@ -462,15 +460,42 @@ QDict *keyval_parse(const char *params, const char *implied_key, *p_help = help; } else if (help) { error_setg(errp, "Help is not available for this option"); - qobject_unref(qdict); return NULL; } listified = keyval_listify(qdict, NULL, errp); if (!listified) { - qobject_unref(qdict); return NULL; } assert(listified == QOBJECT(qdict)); return qdict; } + +/* + * Parse @params in QEMU's traditional KEY=VALUE,... syntax. + * + * If @implied_key, the first KEY= can be omitted. @implied_key is + * implied then, and VALUE can't be empty or contain ',' or '='. + * + * 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 = qdict_new(); + QDict *ret = keyval_parse_into(qdict, params, implied_key, p_help, errp); + + if (!ret) { + qobject_unref(qdict); + } + return ret; +} From patchwork Wed Nov 11 14:25:28 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paolo Bonzini X-Patchwork-Id: 11897925 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 93A99921 for ; Wed, 11 Nov 2020 14:29:27 +0000 (UTC) Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 299B32068D for ; Wed, 11 Nov 2020 14:29:27 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b="ctVyRDBV" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 299B32068D Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=redhat.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Received: from localhost ([::1]:54996 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1kcr7l-00053o-VH for patchwork-qemu-devel@patchwork.kernel.org; Wed, 11 Nov 2020 09:29:25 -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 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= 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 X-MC-Unique: 5fEX0xm_O36G-M8-2knITQ-1 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) 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 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+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Sender: "Qemu-devel" 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 { .name = "device_add", - .args_type = "device:O", + .args_type = "driver:O", .params = "driver[,prop=value][,...]", .help = "add device, like -device on the command line", .cmd = hmp_device_add, @@ -1314,7 +1314,7 @@ ERST { .name = "netdev_add", - .args_type = "netdev:O", + .args_type = "type:O", .params = "[user|tap|socket|vde|bridge|hubport|netmap|vhost-user],id=str[,prop=value][,...]", .help = "add host network device", .cmd = hmp_netdev_add, @@ -1342,7 +1342,7 @@ ERST { .name = "object_add", - .args_type = "object:O", + .args_type = "qom-type:O", .params = "[qom-type=]type,id=str[,prop=value][,...]", .help = "create QOM object", .cmd = 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; - opts_list = 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 = 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 '/': From patchwork Wed Nov 11 14:25:29 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paolo Bonzini X-Patchwork-Id: 11897919 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 0BDDF139F for ; Wed, 11 Nov 2020 14:26:57 +0000 (UTC) Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id A86EC2068D for ; Wed, 11 Nov 2020 14:26:56 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b="Uv8ysKmn" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org A86EC2068D Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=redhat.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Received: from localhost ([::1]:46506 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1kcr5J-0001Xh-UV for patchwork-qemu-devel@patchwork.kernel.org; Wed, 11 Nov 2020 09:26:54 -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 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= 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 X-MC-Unique: B0k56toFOz-W6ZsdhGnTIw-1 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) 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 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+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Sender: "Qemu-devel" 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" bool user_creatable_complete(UserCreatable *uc, Error **errp) { @@ -214,15 +215,15 @@ char *object_property_help(const char *name, const char *type, return g_string_free(str, false); } -static void user_creatable_print_types(void) +void user_creatable_print_types(void) { GSList *l, *list; - printf("List of user creatable objects:\n"); + qemu_printf("List of user creatable objects:\n"); list = object_class_get_list_sorted(TYPE_USER_CREATABLE, false); for (l = list; l != NULL; l = l->next) { ObjectClass *oc = 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(const 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 = 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); From patchwork Wed Nov 11 14:25:30 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paolo Bonzini X-Patchwork-Id: 11897929 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 2F45D139F for ; Wed, 11 Nov 2020 14:31:16 +0000 (UTC) Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id ABB1D20795 for ; Wed, 11 Nov 2020 14:31:15 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b="HS77VYRN" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org ABB1D20795 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=redhat.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Received: from localhost ([::1]:58728 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1kcr9W-0006kb-Ic for patchwork-qemu-devel@patchwork.kernel.org; Wed, 11 Nov 2020 09:31:14 -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 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= 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 X-MC-Unique: 6VzlWT-VP76aFoDRZZsnlQ-1 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) 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 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+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Sender: "Qemu-devel" 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_interfaces.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)(const char *type); int user_creatable_add_opts_foreach(void *opaque, QemuOpts *opts, Error **errp); +/** + * 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, QemuOpts *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); /** * 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 *qdict) void hmp_object_add(Monitor *mon, const QDict *qdict) { Error *err = NULL; - QemuOpts *opts; - Object *obj = NULL; - opts = 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 = 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); } 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, QemuOpts *opts) return false; } -void user_creatable_print_help_from_qdict(QDict *args) +void user_creatable_print_help_from_qdict(const QDict *args) { const char *type = qdict_get_try_str(args, "qom-type"); From patchwork Wed Nov 11 14:25:31 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paolo Bonzini X-Patchwork-Id: 11897939 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id A8E71139F for ; Wed, 11 Nov 2020 14:34:26 +0000 (UTC) Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 4141F2067D for ; Wed, 11 Nov 2020 14:34:26 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b="fDm4kO20" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 4141F2067D Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=redhat.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Received: from localhost ([::1]:41446 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1kcrCb-0002tg-1N for patchwork-qemu-devel@patchwork.kernel.org; Wed, 11 Nov 2020 09:34:25 -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 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= 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 X-MC-Unique: 442cso6VNY6aT0uiwFXlQw-1 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) 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 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+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Sender: "Qemu-devel" 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 = 257, }; -static QemuOptsList qemu_object_opts = { - .name = "object", - .implied_opt_name = "qom-type", - .head = QTAILQ_HEAD_INITIALIZER(qemu_object_opts.head), - .desc = { - { } - }, -}; - -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 = { .name = "file", .implied_opt_name = "file", @@ -550,7 +533,6 @@ int main(int argc, char **argv) qcrypto_init(&error_fatal); module_call_init(MODULE_INIT_QOM); - qemu_add_opts(&qemu_object_opts); qemu_add_opts(&qemu_trace_opts); bdrv_init(); @@ -612,14 +594,20 @@ int main(int argc, char **argv) case 'U': force_share = true; break; - case OPTION_OBJECT: { - QemuOpts *qopts; - qopts = qemu_opts_parse_noisily(&qemu_object_opts, - optarg, true); - if (!qopts) { - exit(1); + case OPTION_OBJECT: + { + QDict *args; + bool help; + + args = keyval_parse(optarg, "qom-type", &help, &error_fatal); + 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 = true; break; @@ -644,10 +632,6 @@ int main(int argc, char **argv) exit(1); } - qemu_opts_foreach(&qemu_object_opts, - user_creatable_add_opts_foreach, - qemu_io_object_print_help, &error_fatal); - if (!trace_init_backends()) { exit(1); } From patchwork Wed Nov 11 14:25:32 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paolo Bonzini X-Patchwork-Id: 11897923 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 634B8921 for ; Wed, 11 Nov 2020 14:29:16 +0000 (UTC) Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id CCE282068D for ; Wed, 11 Nov 2020 14:29:15 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b="bwkSLWRr" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org CCE282068D Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=redhat.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Received: from localhost ([::1]:53796 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1kcr7a-0004ZY-GN for patchwork-qemu-devel@patchwork.kernel.org; Wed, 11 Nov 2020 09:29:14 -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 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= 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 X-MC-Unique: VHOw2UO0M2OtAuuRcb94Wg-1 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) 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 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+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Sender: "Qemu-devel" 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 = { }, }; -static QemuOptsList qemu_object_opts = { - .name = "object", - .implied_opt_name = "qom-type", - .head = QTAILQ_HEAD_INITIALIZER(qemu_object_opts.head), - .desc = { - { } - }, -}; - -static bool qemu_nbd_object_print_help(const char *type, QemuOpts *opts) -{ - if (user_creatable_print_help(type, opts)) { - exit(0); - } - return true; -} - 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); module_call_init(MODULE_INIT_QOM); - qemu_add_opts(&qemu_object_opts); qemu_add_opts(&qemu_trace_opts); qemu_init_exec_dir(argv[0]); @@ -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 = qemu_opts_parse_noisily(&qemu_object_opts, - optarg, true); - if (!opts) { - exit(EXIT_FAILURE); + case QEMU_NBD_OPT_OBJECT: + { + QDict *args; + bool help; + + args = keyval_parse(optarg, "qom-type", &help, &error_fatal); + 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 = optarg; break; @@ -807,10 +795,6 @@ int main(int argc, char **argv) export_name = ""; } - qemu_opts_foreach(&qemu_object_opts, - user_creatable_add_opts_foreach, - qemu_nbd_object_print_help, &error_fatal); - if (!trace_init_backends()) { exit(1); } From patchwork Wed Nov 11 14:25:33 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paolo Bonzini X-Patchwork-Id: 11897937 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 45C1C1391 for ; Wed, 11 Nov 2020 14:34:14 +0000 (UTC) Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id AB9392067D for ; Wed, 11 Nov 2020 14:34:13 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b="Cc723DFQ" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org AB9392067D Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=redhat.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Received: from localhost ([::1]:40492 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1kcrCO-0002VT-HQ for patchwork-qemu-devel@patchwork.kernel.org; Wed, 11 Nov 2020 09:34:12 -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 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= 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 X-MC-Unique: m1YGykKWPuq39cyqOCV0Gg-1 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) 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 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+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Sender: "Qemu-devel" 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); } -static QemuOptsList qemu_object_opts = { - .name = "object", - .implied_opt_name = "qom-type", - .head = QTAILQ_HEAD_INITIALIZER(qemu_object_opts.head), - .desc = { - { } - }, -}; - -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 = NULL; + + args = 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); } /* @@ -567,14 +573,9 @@ static int img_create(int argc, char **argv) case 'u': flags |= BDRV_O_NO_BACKING; break; - case OPTION_OBJECT: { - QemuOpts *opts; - opts = qemu_opts_parse_noisily(&qemu_object_opts, - optarg, true); - if (!opts) { - goto fail; - } - } break; + case OPTION_OBJECT: + qemu_img_object_parse(optarg, 1); + break; } } @@ -590,12 +591,6 @@ static int img_create(int argc, char **argv) } optind++; - 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 = true; break; - case OPTION_OBJECT: { - QemuOpts *opts; - opts = 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 = true; break; @@ -832,12 +822,6 @@ static int img_check(int argc, char **argv) return 1; } - if (qemu_opts_foreach(&qemu_object_opts, - user_creatable_add_opts_foreach, - qemu_img_object_print_help, &error_fatal)) { - return 1; - } - ret = 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 = 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 = true; break; @@ -1059,12 +1038,6 @@ static int img_commit(int argc, char **argv) } filename = argv[optind++]; - if (qemu_opts_foreach(&qemu_object_opts, - user_creatable_add_opts_foreach, - qemu_img_object_print_help, &error_fatal)) { - return 1; - } - flags = BDRV_O_RDWR | BDRV_O_UNMAP; ret = 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 = true; break; - case OPTION_OBJECT: { - QemuOpts *opts; - opts = qemu_opts_parse_noisily(&qemu_object_opts, - optarg, true); - if (!opts) { - ret = 2; - goto out4; - } - } break; + case OPTION_OBJECT: + qemu_img_object_parse(optarg, 2); + break; case OPTION_IMAGE_OPTS: image_opts = true; break; @@ -1451,13 +1418,6 @@ static int img_compare(int argc, char **argv) filename1 = argv[optind++]; filename2 = argv[optind++]; - if (qemu_opts_foreach(&qemu_object_opts, - user_creatable_add_opts_foreach, - qemu_img_object_print_help, &error_fatal)) { - ret = 2; - goto out4; - } - /* Initialize before goto out */ qemu_progress_init(progress, 2.0); @@ -1642,7 +1602,6 @@ out2: blk_unref(blk1); out3: qemu_progress_end(); -out4: return ret; } @@ -2344,15 +2303,9 @@ static int img_convert(int argc, char **argv) goto fail_getopt; } break; - case OPTION_OBJECT: { - QemuOpts *object_opts; - object_opts = 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 = true; break; @@ -2380,12 +2333,6 @@ static int img_convert(int argc, char **argv) out_fmt = "raw"; } - 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 = true; break; - case OPTION_OBJECT: { - QemuOpts *opts; - opts = 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 = true; break; @@ -3004,12 +2946,6 @@ static int img_info(int argc, char **argv) return 1; } - if (qemu_opts_foreach(&qemu_object_opts, - user_creatable_add_opts_foreach, - qemu_img_object_print_help, &error_fatal)) { - return 1; - } - list = 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 = 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 = true; break; @@ -3246,12 +3177,6 @@ static int img_map(int argc, char **argv) return 1; } - if (qemu_opts_foreach(&qemu_object_opts, - user_creatable_add_opts_foreach, - qemu_img_object_print_help, &error_fatal)) { - return 1; - } - blk = img_open(image_opts, filename, fmt, 0, false, false, force_share); if (!blk) { return 1; @@ -3390,14 +3315,9 @@ static int img_snapshot(int argc, char **argv) case 'U': force_share = true; break; - case OPTION_OBJECT: { - QemuOpts *opts; - opts = 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 = true; break; @@ -3409,12 +3329,6 @@ static int img_snapshot(int argc, char **argv) } filename = argv[optind++]; - 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 = 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 = true; break; - case OPTION_OBJECT: { - QemuOpts *opts; - opts = 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 = true; break; @@ -3577,12 +3486,6 @@ static int img_rebase(int argc, char **argv) } filename = argv[optind++]; - 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); @@ -3973,14 +3876,9 @@ static int img_resize(int argc, char **argv) case 'q': quiet = true; break; - case OPTION_OBJECT: { - QemuOpts *opts; - opts = 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 = true; break; @@ -4002,12 +3900,6 @@ static int img_resize(int argc, char **argv) } filename = argv[optind++]; - 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 = true; break; case OPTION_OBJECT: - opts = qemu_opts_parse_noisily(&qemu_object_opts, - optarg, true); - if (!opts) { - ret = -1; - goto out_no_progress; - } + qemu_img_object_parse(optarg, 1); break; case OPTION_IMAGE_OPTS: image_opts = true; @@ -4207,13 +4094,6 @@ static int img_amend(int argc, char **argv) error_exit("Must specify options (-o)"); } - if (qemu_opts_foreach(&qemu_object_opts, - user_creatable_add_opts_foreach, - qemu_img_object_print_help, &error_fatal)) { - ret = -1; - goto out_no_progress; - } - if (quiet) { progress = false; } @@ -4672,7 +4552,6 @@ static int img_bitmap(int argc, char **argv) { Error *err = NULL; int c, ret = 1; - QemuOpts *opts = NULL; const char *fmt = NULL, *src_fmt = NULL, *src_filename = NULL; const char *filename, *bitmap; BlockBackend *blk = NULL, *src = NULL; @@ -4766,10 +4645,7 @@ static int img_bitmap(int argc, char **argv) merge = true; break; case OPTION_OBJECT: - opts = qemu_opts_parse_noisily(&qemu_object_opts, optarg, true); - if (!opts) { - goto out; - } + qemu_img_object_parse(optarg, 1); break; case OPTION_IMAGE_OPTS: image_opts = true; @@ -4777,12 +4653,6 @@ static int img_bitmap(int argc, char **argv) } } - 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; } @@ -5040,10 +4909,7 @@ static int img_dd(int argc, char **argv) force_share = true; break; case OPTION_OBJECT: - if (!qemu_opts_parse_noisily(&qemu_object_opts, optarg, true)) { - ret = -1; - goto out; - } + qemu_img_object_parse(optarg, 1); break; case OPTION_IMAGE_OPTS: image_opts = true; @@ -5090,13 +4956,6 @@ static int img_dd(int argc, char **argv) goto out; } - if (qemu_opts_foreach(&qemu_object_opts, - user_creatable_add_opts_foreach, - qemu_img_object_print_help, &error_fatal)) { - ret = -1; - goto out; - } - blk1 = img_open(image_opts, in.filename, fmt, 0, false, false, force_share); @@ -5272,7 +5131,6 @@ static int img_measure(int argc, char **argv) char *snapshot_name = NULL; bool force_share = false; QemuOpts *opts = NULL; - QemuOpts *object_opts = NULL; QemuOpts *sn_opts = NULL; QemuOptsList *create_opts = NULL; bool image_opts = false; @@ -5317,11 +5175,7 @@ static int img_measure(int argc, char **argv) force_share = true; break; case OPTION_OBJECT: - object_opts = 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 = true; @@ -5351,12 +5205,6 @@ static int img_measure(int argc, char **argv) } } - 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) 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"); } - qemu_add_opts(&qemu_object_opts); qemu_add_opts(&qemu_source_opts); qemu_add_opts(&qemu_trace_opts); From patchwork Wed Nov 11 14:25:34 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paolo Bonzini X-Patchwork-Id: 11897935 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 0B9BB1391 for ; Wed, 11 Nov 2020 14:33:08 +0000 (UTC) Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id ABE4C2067D for ; Wed, 11 Nov 2020 14:33:07 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b="QfQkkfS1" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org ABE4C2067D Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=redhat.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Received: from localhost ([::1]:37688 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1kcrBI-0001In-T2 for patchwork-qemu-devel@patchwork.kernel.org; Wed, 11 Nov 2020 09:33:04 -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 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= 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 X-MC-Unique: nAluOhNdMaqf1OLpp13OmA-1 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) 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 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+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Sender: "Qemu-devel" 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; } - ret = qemu_config_parse(f, config_groups, filename); + ret = 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); 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, Error **errp); -int qemu_read_config_file(const char *filename); +int qemu_read_config_file(const char *filename, Error **errp); /* Parse QDict options as a replacement for a config file (allowing multiple 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; } -static int qemu_read_default_config_file(void) +static void qemu_read_default_config_file(Error **errp) { int ret; + Error *local_err = NULL; g_autofree char *file = get_relocated_path(CONFIG_QEMU_CONFDIR "/qemu.conf"); - ret = qemu_read_config_file(file); + ret = qemu_read_config_file(file, &local_err); if (ret < 0 && ret != -ENOENT) { - return ret; + error_propagate(errp, local_err); } - - return 0; } static void user_register_global_props(void) @@ -2598,9 +2597,7 @@ void qemu_init(int argc, char **argv, char **envp) } if (userconfig) { - if (qemu_read_default_config_file() < 0) { - exit(1); - } + qemu_read_default_config_file(&error_fatal); } /* 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 = 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 = 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) } /* 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, Error **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, const char *fname) /* group with id */ list = find_list(lists, group, &local_err); if (local_err) { - error_report_err(local_err); + error_propagate(errp, local_err); goto out; } opts = qemu_opts_create(list, id, 1, NULL); @@ -392,7 +392,7 @@ int qemu_config_parse(FILE *fp, QemuOptsList **lists, const char *fname) /* group without id */ list = find_list(lists, group, &local_err); if (local_err) { - error_report_err(local_err); + error_propagate(errp, local_err); goto out; } opts = 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 = \"\"", arg) == 1) { /* arg = value */ if (opts == 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 = count; @@ -426,16 +425,17 @@ out: return res; } -int qemu_read_config_file(const char *filename) +int qemu_read_config_file(const char *filename, Error **errp) { FILE *f = fopen(filename, "r"); int ret; if (f == NULL) { + error_setg_errno(errp, errno, "Cannot read config file %s", filename); return -errno; } - ret = qemu_config_parse(f, vm_config_groups, filename); + ret = qemu_config_parse(f, vm_config_groups, filename, errp); fclose(f); return ret; } From patchwork Wed Nov 11 14:25:35 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paolo Bonzini X-Patchwork-Id: 11897941 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 6FDAE139F for ; Wed, 11 Nov 2020 14:35:30 +0000 (UTC) Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id E65762067D for ; Wed, 11 Nov 2020 14:35:29 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b="U8zmzBGH" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org E65762067D Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=redhat.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Received: from localhost ([::1]:44018 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1kcrDc-000442-OS for patchwork-qemu-devel@patchwork.kernel.org; Wed, 11 Nov 2020 09:35:28 -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 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= 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 X-MC-Unique: 5QX32h0VO52VD2lSEcUpPw-1 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) 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 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+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Sender: "Qemu-devel" 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 *qdict, Error **errp) while (entry != NULL) { next = qdict_next(qdict, entry); - 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; } From patchwork Wed Nov 11 14:25:36 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paolo Bonzini X-Patchwork-Id: 11897931 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 6CF881391 for ; Wed, 11 Nov 2020 14:32:08 +0000 (UTC) Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 05ECF2067D for ; Wed, 11 Nov 2020 14:32:07 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b="YFkqG7+G" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 05ECF2067D Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=redhat.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Received: from localhost ([::1]:34006 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1kcrAM-0008Bt-Dl for patchwork-qemu-devel@patchwork.kernel.org; Wed, 11 Nov 2020 09:32:06 -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 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= 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 X-MC-Unique: _9jxOxyyO4Keryy7x2EMAA-1 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) 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 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+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Sender: "Qemu-devel" 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 +typedef void QEMUConfigCB(const char *group, QDict *qdict, void *opaque, Error **errp); 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, Error **errp); -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, Error **errp); + +int qemu_read_config_file(const char *filename, QEMUConfigCB *f, Error **errp); /* Parse QDict options as a replacement for a config file (allowing multiple 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 **errp) Error *local_err = NULL; g_autofree char *file = get_relocated_path(CONFIG_QEMU_CONFDIR "/qemu.conf"); - ret = qemu_read_config_file(file, &local_err); + ret = qemu_read_config_file(file, qemu_config_do_parse, &local_err); if (ret < 0 && ret != -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 = 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) } /* Returns number of config groups on success, -errno on error */ -int qemu_config_parse(FILE *fp, QemuOptsList **lists, const char *fname, Error **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 = NULL; Error *local_err = NULL; - QemuOpts *opts = NULL; + QDict *qdict = NULL; int res = -EINVAL, lno = 0; int count = 0; loc_push_none(&loc); while (fgets(line, sizeof(line), fp) != NULL) { - loc_set_file(fname, ++lno); + ++lno; if (line[0] == '\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) == 2) { - /* group with id */ - list = find_list(lists, group, &local_err); - if (local_err) { - error_propagate(errp, local_err); - goto out; + if (line[0] == '[') { + QDict *prev = qdict; + if (sscanf(line, "[%63s \"%63[^\"]\"]", group, value) == 2) { + qdict = qdict_new(); + qdict_put_str(qdict, "id", value); + count++; + } else if (sscanf(line, "[%63[^]]]", group) == 1) { + qdict = qdict_new(); + count++; } - opts = qemu_opts_create(list, id, 1, NULL); - count++; - continue; - } - if (sscanf(line, "[%63[^]]]", group) == 1) { - /* group without id */ - list = find_list(lists, group, &local_err); - if (local_err) { - error_propagate(errp, local_err); - goto out; + if (qdict != 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 = qemu_opts_create(list, NULL, 0, &error_abort); - count++; - continue; } + loc_set_file(fname, lno); value[0] = '\0'; if (sscanf(line, " %63s = \"%1023[^\"]\"", arg, value) == 2 || sscanf(line, " %63s = \"\"", arg) == 1) { /* arg = value */ - if (opts == NULL) { + if (qdict == 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 = count; out: loc_pop(&loc); + if (qdict) { + cb(group, qdict, opaque, errp); + qobject_unref(qdict); + } return res; } -int qemu_read_config_file(const char *filename, Error **errp) +void qemu_config_do_parse(const char *group, QDict *qdict, void *opaque, Error **errp) +{ + QemuOptsList **lists = opaque; + const char *id = qdict_get_try_str(qdict, "id"); + QemuOptsList *list; + QemuOpts *opts; + + list = find_list(lists, group, errp); + if (!list) { + return; + } + + opts = 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, Error **errp) +{ + return qemu_config_foreach(fp, qemu_config_do_parse, lists, fname, errp); +} + +int qemu_read_config_file(const char *filename, QEMUConfigCB *cb, Error **errp) { FILE *f = fopen(filename, "r"); int ret; @@ -435,7 +466,7 @@ int qemu_read_config_file(const char *filename, Error **errp) return -errno; } - ret = qemu_config_parse(f, vm_config_groups, filename, errp); + ret = qemu_config_foreach(f, cb, vm_config_groups, filename, errp); fclose(f); return ret; } From patchwork Wed Nov 11 14:25:37 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paolo Bonzini X-Patchwork-Id: 11897933 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 3ADE7139F for ; Wed, 11 Nov 2020 14:32:31 +0000 (UTC) Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id BF557207BB for ; Wed, 11 Nov 2020 14:32:29 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b="I4+Ejw34" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org BF557207BB Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=redhat.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Received: from localhost ([::1]:35090 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1kcrAi-0000C1-Fk for patchwork-qemu-devel@patchwork.kernel.org; Wed, 11 Nov 2020 09:32:28 -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 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= 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 X-MC-Unique: Xps8wpKFOqaqXIloXoOKVg-1 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) 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 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+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Sender: "Qemu-devel" 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_interfaces.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); - -/** - * 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); -/** - * 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 neither - * "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; } - -int user_creatable_add_opts_foreach(void *opaque, QemuOpts *opts, Error **errp) -{ - bool (*type_opt_predicate)(const char *, QemuOpts *) = opaque; - Object *obj = NULL; - const char *type; - - type = qemu_opt_get(opts, "qom-type"); - if (type && type_opt_predicate && - !type_opt_predicate(type, opts)) { - return 0; - } - - obj = 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; } -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 = qdict_get_try_str(args, "qom-type"); @@ -306,13 +271,6 @@ bool user_creatable_del(const char *id, Error **errp) return false; } - /* - * 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 = 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 = { }, }; -static QemuOptsList qemu_object_opts = { - .name = "object", - .implied_opt_name = "qom-type", - .head = QTAILQ_HEAD_INITIALIZER(qemu_object_opts.head), - .desc = { - { } - }, -}; - static QemuOptsList qemu_tpmdev_opts = { .name = "tpmdev", .implied_opt_name = "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 = boot_order; } +static void user_creatable_add_dict_foreach(void *data, void *opaque) +{ + bool (*type_opt_predicate)(const char *) = opaque; + QDict *dict = data; + const char *type = 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 = MACHINE_GET_CLASS(current_machine); @@ -1795,9 +1800,9 @@ static void qemu_create_early_backends(void) exit(1); } - 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); /* spice needs the timers to be initialized by this point */ /* spice must initialize before audio as it changes the default auiodev */ @@ -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); } static void qemu_create_late_backends(void) @@ -1839,9 +1844,9 @@ static void qemu_create_late_backends(void) net_init_clients(&error_fatal); - 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); if (tpm_init() < 0) { exit(1); @@ -2041,13 +2046,32 @@ static int global_init_func(void *opaque, QemuOpts *opts, Error **errp) return 0; } +/* + * 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 = qdict_crumple(qdict, errp); + if (!crumpled) { + return; + } + object_opts_list = 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 = NULL; g_autofree char *file = get_relocated_path(CONFIG_QEMU_CONFDIR "/qemu.conf"); - ret = qemu_read_config_file(file, qemu_config_do_parse, &local_err); + ret = qemu_read_config_file(file, qemu_parse_config_group, &local_err); if (ret < 0 && ret != -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, &error_fatal); break; case QEMU_OPTION_spice: olist = 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 = qemu_opts_parse_noisily(qemu_find_opts("object"), - optarg, true); - if (!opts) { - exit(1); + { + QDict *args; + bool help; + + args = keyval_parse(optarg, "qom-type", &help, &error_fatal); + if (help) { + user_creatable_print_help_from_qdict(args); + exit(EXIT_SUCCESS); + } + object_opts_list = g_slist_prepend(object_opts_list, args); + break; } - break; case QEMU_OPTION_realtime: warn_report("'-realtime mlock=...' is deprecated, please use " "'-overcommit mem-lock=...' instead"); @@ -3424,6 +3453,10 @@ void qemu_init(int argc, char **argv, char **envp) } } } + + /* Cleanup after option parsing loop. */ + object_opts_list = 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!