From nobody Fri Apr 19 11:08:17 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of redhat.com designates 170.10.133.124 as permitted sender) client-ip=170.10.133.124; envelope-from=libvir-list-bounces@redhat.com; helo=us-smtp-delivery-124.mimecast.com; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 170.10.133.124 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1678293618; cv=none; d=zohomail.com; s=zohoarc; b=gMFMvGXoSMfXTDwcdfJHlQJq86m+xY0uaALOzzA0iNsBLe8yJnrs1rCRO06JHvb7QXI90dTexjxdeCW4Aj9dVa0Ntik8QEjsCNYqKCK7TmUro+unacI/n2lTWdFUzI8kMiup9RBRCQEKGfvJl9UjueK4YYpEpJQqSJ3ALIQbpI4= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1678293618; h=Content-Type:Content-Transfer-Encoding:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=XhENEKNrnAnjuUTSubBYUUKGceBSdvQB/5mWvV9Q+pQ=; b=Lxk2iFY7ZP8uJ+Hz5olXO+/eg/RM07vw3ZHlGqmaLcAi6YKl1FuFvaDU3MG4rzJZUN9I0RBlxsrC2EW5hXqr4zJDR4R0QggjNw3beGM6D53dQ6hCY5NBTRAYZ2b1V6pbBTl+LeVbiokwM3n80NLp90XXfBjg9655OqtZEffC5OE= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 170.10.133.124 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by mx.zohomail.com with SMTPS id 1678293618093783.3241163522908; Wed, 8 Mar 2023 08:40:18 -0800 (PST) Received: from mimecast-mx02.redhat.com (mimecast-mx02.redhat.com [66.187.233.88]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-637-GOmykwK3P-2NWdfn-E_1XQ-1; Wed, 08 Mar 2023 11:39:41 -0500 Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.rdu2.redhat.com [10.11.54.4]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 95B0B100DEA5; Wed, 8 Mar 2023 16:39:24 +0000 (UTC) Received: from mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com (unknown [10.30.29.100]) by smtp.corp.redhat.com (Postfix) with ESMTP id 7F7D52026D68; Wed, 8 Mar 2023 16:39:24 +0000 (UTC) Received: from mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com (localhost [IPv6:::1]) by mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com (Postfix) with ESMTP id B41BA19451FB; Wed, 8 Mar 2023 16:39:21 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.rdu2.redhat.com [10.11.54.3]) by mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com (Postfix) with ESMTP id E023C19465B5 for ; Wed, 8 Mar 2023 16:39:17 +0000 (UTC) Received: by smtp.corp.redhat.com (Postfix) id D50B8112132D; Wed, 8 Mar 2023 16:39:17 +0000 (UTC) Received: from virtlab420.virt.lab.eng.bos.redhat.com (virtlab420.virt.lab.eng.bos.redhat.com [10.19.152.148]) by smtp.corp.redhat.com (Postfix) with ESMTP id BB51A1121314; Wed, 8 Mar 2023 16:39:17 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1678293617; h=from:from:sender:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:list-id:list-help: list-unsubscribe:list-subscribe:list-post; bh=XhENEKNrnAnjuUTSubBYUUKGceBSdvQB/5mWvV9Q+pQ=; b=BDNKvHkluqyI7hCp2XuPVCoVcRHOkriUALTRaFFeuwgdN4Jvm3sT+NzZ1GGOknTGT3tQqD YJAD9DWi8IQVNg9q7HUH6on8orVLyX//XgHUZib0euRAyKb44XDUpqS4V6zSABehqMAsKS bw8/qSd0QejU+qehClgtQQ5r2rlEuvE= X-MC-Unique: GOmykwK3P-2NWdfn-E_1XQ-1 X-Original-To: libvir-list@listman.corp.redhat.com From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= To: libvir-list@redhat.com Subject: [PATCH 01/16] rpcgen: drop type-puning workarounds Date: Wed, 8 Mar 2023 11:38:58 -0500 Message-Id: <20230308163913.338952-2-berrange@redhat.com> In-Reply-To: <20230308163913.338952-1-berrange@redhat.com> References: <20230308163913.338952-1-berrange@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.1 on 10.11.54.3 X-BeenThere: libvir-list@redhat.com X-Mailman-Version: 2.1.29 Precedence: list List-Id: Development discussions about the libvirt library & tools List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: libvir-list-bounces@redhat.com Sender: "libvir-list" X-Scanned-By: MIMEDefang 3.1 on 10.11.54.4 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1678293618905100002 The current RPC code is post-processed to introduce an intermediate variable, rather than casting directly to char ** at time of use. This is said to be a workaround for type-puning warnings that the compiler emitted. Neither GCC or CLang emit any warnings for the code in question today, across any of the architectures we test in CI. Thus it is presumed that somewhere in the 15 years since the workaround was done, the compilers have got smarter and do the right thing. Signed-off-by: Daniel P. Berrang=C3=A9 Reviewed-by: Michal Privoznik --- src/rpc/genprotocol.pl | 23 ----------------------- 1 file changed, 23 deletions(-) diff --git a/src/rpc/genprotocol.pl b/src/rpc/genprotocol.pl index f567260588..079627964f 100755 --- a/src/rpc/genprotocol.pl +++ b/src/rpc/genprotocol.pl @@ -92,29 +92,6 @@ while () { @uses =3D grep /[^.>]\bi\b/, @function; @function =3D grep !/[^.>]\bi\b/, @function if @uses =3D=3D 1; =20 - # (char **)&objp->... gives: - # warning: dereferencing type-punned pointer will break - # strict-aliasing rules - # so rewrite it. - my %uses =3D (); - my $i =3D 0; - foreach (@function) { - $uses{$1} =3D $i++ if m/\(char \*\*\)\&(objp->[a-z_.]+_val)/i; - } - if (keys %uses >=3D 1) { - my $i =3D 1; - - foreach (sort(keys %uses)) { - $i =3D $uses{$_}; - unshift @function, - (" char **objp_cpp$i =3D (char **) (void *) &$_;\n"= ); - $i++; - } - @function =3D - map { s{\(char \*\*\)\&(objp->[a-z_.]+_val)} - {objp_cpp$uses{$1}}gi; $_ } @function; - } - # The code uses 'IXDR_PUT_{U_,}LONG' but it's wrong in two # ways: Firstly these functions are deprecated and don't # work on 64 bit platforms. Secondly the return value should --=20 2.39.1 From nobody Fri Apr 19 11:08:17 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of redhat.com designates 170.10.133.124 as permitted sender) client-ip=170.10.133.124; envelope-from=libvir-list-bounces@redhat.com; helo=us-smtp-delivery-124.mimecast.com; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 170.10.133.124 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1678293617; cv=none; d=zohomail.com; s=zohoarc; b=aXSAbGOcrSuAqOSfwJZ09y52VA92U06Q6fcib62zTEYjUjxJkGkGI2730a22uUMFjOg87LgdlL/ACMs22SA9EDuBEw60M2EKhMlc5FXpwOO6jgkpBuA/gg4L8f/w5UO32nfCTjXarUCivfQiBv2DjTQYxpuBv1YW5iTtYjOdyYQ= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1678293617; h=Content-Type:Content-Transfer-Encoding:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=tGpoACLxGZGv+eNZYtCW8JIWdFJUflmoVDQsXVB1bns=; b=Czfa06ZV4IKJxznFKLefXZq0BYOFnAz35zBEBg/9X2BkerRR24mR53eCRJWUAjKONxH1aKADKj3pG6s79E6erzDyJ6HKQX5vnPUK0TLGkiscJzpGL5N2OIzfZFQq4Tn/dwqA4uwdPMq5gwC7r83bqdSy0HzmbnDFGWKa0dde4Qg= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 170.10.133.124 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by mx.zohomail.com with SMTPS id 1678293617252702.308123278062; Wed, 8 Mar 2023 08:40:17 -0800 (PST) Received: from mimecast-mx02.redhat.com (mimecast-mx02.redhat.com [66.187.233.88]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-625-qCFfGIkBNCy3QdN25yoxCQ-1; Wed, 08 Mar 2023 11:39:46 -0500 Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.rdu2.redhat.com [10.11.54.4]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id AB16E804BAA; Wed, 8 Mar 2023 16:39:25 +0000 (UTC) Received: from mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com (unknown [10.30.29.100]) by smtp.corp.redhat.com (Postfix) with ESMTP id 8BBE52026D2B; Wed, 8 Mar 2023 16:39:25 +0000 (UTC) Received: from mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com (localhost [IPv6:::1]) by mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com (Postfix) with ESMTP id 55DCD194865C; Wed, 8 Mar 2023 16:39:22 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.rdu2.redhat.com [10.11.54.3]) by mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com (Postfix) with ESMTP id 21BAD19465B5 for ; Wed, 8 Mar 2023 16:39:18 +0000 (UTC) Received: by smtp.corp.redhat.com (Postfix) id 060D51121314; Wed, 8 Mar 2023 16:39:18 +0000 (UTC) Received: from virtlab420.virt.lab.eng.bos.redhat.com (virtlab420.virt.lab.eng.bos.redhat.com [10.19.152.148]) by smtp.corp.redhat.com (Postfix) with ESMTP id DF7FB1121330; Wed, 8 Mar 2023 16:39:17 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1678293616; h=from:from:sender:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:list-id:list-help: list-unsubscribe:list-subscribe:list-post; bh=tGpoACLxGZGv+eNZYtCW8JIWdFJUflmoVDQsXVB1bns=; b=aPaAo0Il3ey2Qvi7Gzt12Ys2Jz0Yiz07fw8dN3V6/RNx7Xow8zOHWpHTFM6YmCWQsVWBcY hAFkTVwAOizTwfp75+tU7VHMNZF6S91cHrUdC8aiL3sngbClQAojPuRUhd2CbCIkHl3ZUT vVm2jXj/EaarkP3EI/zpDKy9TtHN72Y= X-MC-Unique: qCFfGIkBNCy3QdN25yoxCQ-1 X-Original-To: libvir-list@listman.corp.redhat.com From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= To: libvir-list@redhat.com Subject: [PATCH 02/16] build-aux: skip E203 and W503 flake8 checks Date: Wed, 8 Mar 2023 11:38:59 -0500 Message-Id: <20230308163913.338952-3-berrange@redhat.com> In-Reply-To: <20230308163913.338952-1-berrange@redhat.com> References: <20230308163913.338952-1-berrange@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.1 on 10.11.54.3 X-BeenThere: libvir-list@redhat.com X-Mailman-Version: 2.1.29 Precedence: list List-Id: Development discussions about the libvirt library & tools List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: libvir-list-bounces@redhat.com Sender: "libvir-list" X-Scanned-By: MIMEDefang 3.1 on 10.11.54.4 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1678293618887100001 The flake8 check W503 does not want a line break before binary operator. This is contrary to the style that the 'black' formatting tool wants to use. Defer to 'black' as it is intended to be an opinionated formatting tool standardizing python code style, and thus not to be customized per project. The flake8 check E203 does not want whitespace before a ':'. This is, however, desirable when indexing array slices eg self.lookahead[skip : skip + 1] which is a format that 'black' produces. Signed-off-by: Daniel P. Berrang=C3=A9 Reviewed-by: Michal Privoznik --- build-aux/syntax-check.mk | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/build-aux/syntax-check.mk b/build-aux/syntax-check.mk index 21f6b311ce..158f14e77e 100644 --- a/build-aux/syntax-check.mk +++ b/build-aux/syntax-check.mk @@ -568,15 +568,22 @@ sc_prohibit_python_without_env: =20 # We're intentionally ignoring a few warnings # +# E302: whitespace before ':'. This is something that is +# desirable when indexing array slices and is used by the +# 'black' formatting tool +# # E501: Force breaking lines at < 80 characters results in # some really unnatural code formatting which harms # readability. # +# W503: line break before binary operator, because this +# is contrary to what 'black' formatting tool wants +# # W504: Knuth code style requires the operators "or" and "and" etc # to be at the start of line in a multi-line conditional. # This the opposite to what is normal libvirt practice. # -FLAKE8_IGNORE =3D E501,W504 +FLAKE8_IGNORE =3D E203,E501,W503,W504 =20 sc_flake8: @if [ -n "$(FLAKE8)" ]; then \ --=20 2.39.1 From nobody Fri Apr 19 11:08:17 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of redhat.com designates 170.10.133.124 as permitted sender) client-ip=170.10.133.124; envelope-from=libvir-list-bounces@redhat.com; helo=us-smtp-delivery-124.mimecast.com; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 170.10.133.124 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1678293605; cv=none; d=zohomail.com; s=zohoarc; b=mlFnf/LdbdhcwrvOZxmgebrIl9By5dWBKmgNhrkrEYTmLzNop8bW71TJxouWfQ+cPOqaNrJykvmqQmuOv6Eyn8IEg6sLyKXKtthPozOkpjyGkARe17CKDk1nLCFv8W/nHGFxD1Vk5PJwOT21jXgVTyBFrvMZRWxXcDodnZlNnDs= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1678293605; h=Content-Type:Content-Transfer-Encoding:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=xMM8Mtp1xaAzbqhW+dSzV8SkmByemWecEZPRgCy64ag=; b=XKFr4GggCHRnvDT6JNpLh5sO8MEyvfVByZyZh1K/hlT06/5G3GmmFD5/M9gBsIa9mUpCn7lgXkSbQPkrpa/DMVPvVA1vPgzl/2lnXeDZybFAFmp1AZR4ImNSsQ52scB+EXhag0zayAFzzGFWrgwc480vMlb0hkMV4m32lj0rqh4= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 170.10.133.124 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by mx.zohomail.com with SMTPS id 1678293605204550.6871017826637; Wed, 8 Mar 2023 08:40:05 -0800 (PST) Received: from mimecast-mx02.redhat.com (mimecast-mx02.redhat.com [66.187.233.88]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-650-E8NqA5N4PaOvYUznDpeU6A-1; Wed, 08 Mar 2023 11:39:33 -0500 Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.rdu2.redhat.com [10.11.54.3]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 6C974100F909; Wed, 8 Mar 2023 16:39:22 +0000 (UTC) Received: from mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com (unknown [10.30.29.100]) by smtp.corp.redhat.com (Postfix) with ESMTP id 5CAEE1121314; Wed, 8 Mar 2023 16:39:20 +0000 (UTC) Received: from mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com (localhost [IPv6:::1]) by mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com (Postfix) with ESMTP id 251181946A63; Wed, 8 Mar 2023 16:39:19 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.rdu2.redhat.com [10.11.54.3]) by mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com (Postfix) with ESMTP id 382DB19465B5 for ; Wed, 8 Mar 2023 16:39:18 +0000 (UTC) Received: by smtp.corp.redhat.com (Postfix) id 2A3801121330; Wed, 8 Mar 2023 16:39:18 +0000 (UTC) Received: from virtlab420.virt.lab.eng.bos.redhat.com (virtlab420.virt.lab.eng.bos.redhat.com [10.19.152.148]) by smtp.corp.redhat.com (Postfix) with ESMTP id 10366112132D; Wed, 8 Mar 2023 16:39:18 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1678293604; h=from:from:sender:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:list-id:list-help: list-unsubscribe:list-subscribe:list-post; bh=xMM8Mtp1xaAzbqhW+dSzV8SkmByemWecEZPRgCy64ag=; b=btVrLAE6qrhaP2tPadMWHg2mtuR5+RLaOe6xVlCOPRxLzCzFwsO0tTl9NkxebZibBXPyni jQyiwV3GLlP5dWVjSH5GAwy9tSEeSSOlBCIPRhBSNJhwlcWo/vE2tnG5MarnwLJh3lQdgr ChICLm1rQqJv9+clOkxvI7BjmCdzJYc= X-MC-Unique: E8NqA5N4PaOvYUznDpeU6A-1 X-Original-To: libvir-list@listman.corp.redhat.com From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= To: libvir-list@redhat.com Subject: [PATCH 03/16] build-aux: introduce 'black' tool for python formatting Date: Wed, 8 Mar 2023 11:39:00 -0500 Message-Id: <20230308163913.338952-4-berrange@redhat.com> In-Reply-To: <20230308163913.338952-1-berrange@redhat.com> References: <20230308163913.338952-1-berrange@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.1 on 10.11.54.3 X-BeenThere: libvir-list@redhat.com X-Mailman-Version: 2.1.29 Precedence: list List-Id: Development discussions about the libvirt library & tools List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: libvir-list-bounces@redhat.com Sender: "libvir-list" X-Scanned-By: MIMEDefang 3.1 on 10.11.54.3 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1678293606842100003 The 'black' tool is intended to be an opinionated formatting tool for python code. It is complementary to flake8 which validates coding bad practices, but (mostly) ignores code layout issues. Signed-off-by: Daniel P. Berrang=C3=A9 Reviewed-by: Michal Privoznik --- build-aux/Makefile.in | 1 + build-aux/meson.build | 5 +++++ build-aux/syntax-check.mk | 18 ++++++++++++++++++ meson.build | 1 + 4 files changed, 25 insertions(+) diff --git a/build-aux/Makefile.in b/build-aux/Makefile.in index 7ee4680847..db44ee36a4 100644 --- a/build-aux/Makefile.in +++ b/build-aux/Makefile.in @@ -3,6 +3,7 @@ top_srcdir =3D @top_srcdir@ top_builddir =3D @top_builddir@ FLAKE8 =3D @flake8_path@ +BLACK =3D @black_path@ RUNUTF8 =3D @runutf8@ PYTHON =3D @PYTHON3@ GREP =3D @GREP@ diff --git a/build-aux/meson.build b/build-aux/meson.build index 16d085505d..0330f2940c 100644 --- a/build-aux/meson.build +++ b/build-aux/meson.build @@ -2,6 +2,10 @@ flake8_path =3D '' if flake8_prog.found() flake8_path =3D flake8_prog.full_path() endif +black_path =3D '' +if black_prog.found() + black_path =3D black_prog.full_path() +endif =20 if host_machine.system() =3D=3D 'freebsd' or host_machine.system() =3D=3D = 'darwin' make_prog =3D find_program('gmake') @@ -32,6 +36,7 @@ syntax_check_conf =3D configuration_data({ 'top_srcdir': meson.project_source_root(), 'top_builddir': meson.project_build_root(), 'flake8_path': flake8_path, + 'black_path': black_path, 'runutf8': ' '.join(runutf8), 'PYTHON3': python3_prog.full_path(), 'GREP': grep_prog.full_path(), diff --git a/build-aux/syntax-check.mk b/build-aux/syntax-check.mk index 158f14e77e..6d82a4301a 100644 --- a/build-aux/syntax-check.mk +++ b/build-aux/syntax-check.mk @@ -595,6 +595,16 @@ sc_flake8: echo 'skipping test $@: flake8 not installed' 1>&2; \ fi =20 +sc_black: + if [ -n "$(BLACK)" ]; then \ + DOT_PY=3D$$($(VC_LIST_EXCEPT) | $(GREP) '\.py$$'); \ + BANG_PY=3D$$($(VC_LIST_EXCEPT) | xargs grep -l '^#!/usr/bin/env python3$= $'); \ + ALL_PY=3D$$(printf "%s\n%s" "$$DOT_PY" "$$BANG_PY" | sort -u); \ + echo "$$ALL_PY" | xargs $(BLACK) --check; \ + else \ + echo 'skipping test $@: black not installed' 1>&2; \ + fi + # mymain() in test files should use return, not exit, for nicer output sc_prohibit_exit_in_tests: @prohibit=3D'\&2; \ echo "*****************************************************" >&2; \ fi + if [ -z "$(BLACK)" ]; then \ + echo "*****************************************************" >&2; \ + echo "* black not installed, sc_black has been skipped *" >&2; \ + echo "*****************************************************" >&2; \ + fi endif =20 # Don't include duplicate header in the source (either *.c or *.h) @@ -1479,6 +1494,9 @@ exclude_file_name_regexp--sc_prohibit_select =3D \ ^build-aux/syntax-check\.mk|src/util/vireventglibwatch\.c|tests/meson\.b= uild$$ =20 =20 +exclude_file_name_regexp--sc_black =3D \ + ^tools/|src/|tests/|ci/|run\.in|scripts/[^/]*\.py + ## -------------- ## ## Implementation ## ## -------------- ## diff --git a/meson.build b/meson.build index 319ed790f9..f63fed8cb5 100644 --- a/meson.build +++ b/meson.build @@ -769,6 +769,7 @@ endforeach =20 optional_programs =3D [ 'augparse', + 'black', 'dmidecode', 'ebtables', 'flake8', --=20 2.39.1 From nobody Fri Apr 19 11:08:17 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of redhat.com designates 170.10.133.124 as permitted sender) client-ip=170.10.133.124; envelope-from=libvir-list-bounces@redhat.com; helo=us-smtp-delivery-124.mimecast.com; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 170.10.133.124 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1678293605; cv=none; d=zohomail.com; s=zohoarc; b=Zd+ApRlhL5/jPmSSyhDPo1gXhFykXNv4ix+jCTjUPlnxOKZwFFUG/wCry2iklT5XJ3ULJFKk2GRiDgIWniQ7tDx4SEComgCXwpYg2To5SEPFzO16mUZNKBOEKhatp0MfDz+LOuX9gSlCZDqtnWwspy8ZZGWl23WShNqaTeozlPk= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1678293605; h=Content-Type:Content-Transfer-Encoding:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=6eOsyin+g/NmNK2bzy5sZ1jTtnHaeObu2l6QJwkYS+w=; b=b0l3T3lhSXphJapVCQwhcBep8FgQfin1C7gRNym2MmlXxWV8K9l2YknSB5smnjAr8QLXQFsx5I7XeCkxfqW01uoyG2QSV/VYq1D9h+z5K0UDWtrSa3NHiudMKxd6kHqiLcSQsCAVhP80IVJ2kLYgVApKZSGsrDuINdzjHpS1AVM= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 170.10.133.124 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by mx.zohomail.com with SMTPS id 1678293605712108.90918267142399; Wed, 8 Mar 2023 08:40:05 -0800 (PST) Received: from mimecast-mx02.redhat.com (mx3-rdu2.redhat.com [66.187.233.73]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-509-1FhrJYuJPzu7OKHqQG33gw-1; Wed, 08 Mar 2023 11:39:37 -0500 Received: from smtp.corp.redhat.com (int-mx07.intmail.prod.int.rdu2.redhat.com [10.11.54.7]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 6F81F2932495; Wed, 8 Mar 2023 16:39:22 +0000 (UTC) Received: from mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com (unknown [10.30.29.100]) by smtp.corp.redhat.com (Postfix) with ESMTP id 774931400AFC; Wed, 8 Mar 2023 16:39:21 +0000 (UTC) Received: from mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com (localhost [IPv6:::1]) by mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com (Postfix) with ESMTP id 5CF5F1946A4C; Wed, 8 Mar 2023 16:39:20 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.rdu2.redhat.com [10.11.54.3]) by mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com (Postfix) with ESMTP id 789DA19465B5 for ; Wed, 8 Mar 2023 16:39:18 +0000 (UTC) Received: by smtp.corp.redhat.com (Postfix) id 4F6201121330; Wed, 8 Mar 2023 16:39:18 +0000 (UTC) Received: from virtlab420.virt.lab.eng.bos.redhat.com (virtlab420.virt.lab.eng.bos.redhat.com [10.19.152.148]) by smtp.corp.redhat.com (Postfix) with ESMTP id 350641121314; Wed, 8 Mar 2023 16:39:18 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1678293604; h=from:from:sender:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:list-id:list-help: list-unsubscribe:list-subscribe:list-post; bh=6eOsyin+g/NmNK2bzy5sZ1jTtnHaeObu2l6QJwkYS+w=; b=Scj9ABwXiuOZrh3N1l9DNtMuo8D+hYXo9wzluolo12hYsliJEOuxRYSZtDRN9JouIcI9Hx ezxWXkD7Kdq1ih61WcS+854GZj8AC8ncDiPk8+Y6DPFc9cCyShKU6jWrGmn26EpfYvcmiX wgHQnwjBoVFfYhB92PSRcqJgUkbxbbQ= X-MC-Unique: 1FhrJYuJPzu7OKHqQG33gw-1 X-Original-To: libvir-list@listman.corp.redhat.com From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= To: libvir-list@redhat.com Subject: [PATCH 04/16] rpcgen: add an XDR protocol lexer Date: Wed, 8 Mar 2023 11:39:01 -0500 Message-Id: <20230308163913.338952-5-berrange@redhat.com> In-Reply-To: <20230308163913.338952-1-berrange@redhat.com> References: <20230308163913.338952-1-berrange@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.1 on 10.11.54.3 X-BeenThere: libvir-list@redhat.com X-Mailman-Version: 2.1.29 Precedence: list List-Id: Development discussions about the libvirt library & tools List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: libvir-list-bounces@redhat.com Sender: "libvir-list" X-Scanned-By: MIMEDefang 3.1 on 10.11.54.7 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1678293606950100004 This adds a lexer capable of handling the XDR protocol files. The lexical rquirements are detailed in https://www.rfc-editor.org/rfc/rfc4506#section-6.2 pytest is introduced as a build dependancy for testing python code. Signed-off-by: Daniel P. Berrang=C3=A9 Reviewed-by: Michal Privoznik --- libvirt.spec.in | 1 + meson.build | 1 + scripts/meson.build | 2 + scripts/rpcgen/meson.build | 11 ++ scripts/rpcgen/rpcgen/lexer.py | 213 +++++++++++++++++++++++++++++ scripts/rpcgen/tests/meson.build | 3 + scripts/rpcgen/tests/simple.x | 35 +++++ scripts/rpcgen/tests/test_lexer.py | 116 ++++++++++++++++ 8 files changed, 382 insertions(+) create mode 100644 scripts/rpcgen/meson.build create mode 100644 scripts/rpcgen/rpcgen/lexer.py create mode 100644 scripts/rpcgen/tests/meson.build create mode 100644 scripts/rpcgen/tests/simple.x create mode 100644 scripts/rpcgen/tests/test_lexer.py diff --git a/libvirt.spec.in b/libvirt.spec.in index e62534c31d..84d2f1c65a 100644 --- a/libvirt.spec.in +++ b/libvirt.spec.in @@ -274,6 +274,7 @@ BuildRequires: ninja-build BuildRequires: git BuildRequires: perl-interpreter BuildRequires: python3 +BuildRequires: python3-pytest %if %{with_libxl} BuildRequires: xen-devel %endif diff --git a/meson.build b/meson.build index f63fed8cb5..9f660c7604 100644 --- a/meson.build +++ b/meson.build @@ -783,6 +783,7 @@ optional_programs =3D [ 'ovs-vsctl', 'passt', 'pdwtags', + 'pytest', 'rmmod', 'scrub', 'tc', diff --git a/scripts/meson.build b/scripts/meson.build index 05b71184f1..b91a482d09 100644 --- a/scripts/meson.build +++ b/scripts/meson.build @@ -36,3 +36,5 @@ foreach name : scripts sname =3D name.split('.')[0].underscorify() set_variable('@0@_prog'.format(sname), find_program(name)) endforeach + +subdir('rpcgen') diff --git a/scripts/rpcgen/meson.build b/scripts/rpcgen/meson.build new file mode 100644 index 0000000000..52526bf812 --- /dev/null +++ b/scripts/rpcgen/meson.build @@ -0,0 +1,11 @@ +if pytest_prog.found() + subdir('tests') + + test( + 'rpcgen-pytest', + python3_prog, + args: [ '-mpytest' ] + rpcgen_tests, + env: runutf8, + workdir: meson.current_source_dir(), + ) +endif diff --git a/scripts/rpcgen/rpcgen/lexer.py b/scripts/rpcgen/rpcgen/lexer.py new file mode 100644 index 0000000000..989c2ae216 --- /dev/null +++ b/scripts/rpcgen/rpcgen/lexer.py @@ -0,0 +1,213 @@ +# SPDX-License-Identifier: LGPL-2.1-or-later + +import abc + + +class XDRReader: + def __init__(self, fp): + self.fp =3D fp + self.lookahead =3D "" + self.lookbehind =3D "" + self.line =3D 1 + self.column =3D 0 + + def _read(self): + if len(self.lookahead) > 0: + c =3D self.lookahead[0:1] + self.lookahead =3D self.lookahead[1:] + return c + return self.fp.read(1) + + def peek(self, skip=3D0): + need =3D 1 + skip + if len(self.lookahead) < need: + self.lookahead =3D self.lookahead + self.fp.read(need - len(se= lf.lookahead)) + if len(self.lookahead) < need: + return None + + return self.lookahead[skip : skip + 1] + + def last(self, skip=3D0): + if (skip + 1) > len(self.lookbehind): + return None + return self.lookbehind[skip] + + def next(self): + c =3D self._read() + line =3D self.line + column =3D self.column + if c =3D=3D "\n": + self.line =3D self.line + 1 + self.column =3D 0 + else: + self.column =3D self.column + 1 + self.lookbehind =3D c + self.lookbehind + if len(self.lookbehind) > 2: + self.lookbehind =3D self.lookbehind[0:2] + return c, line, column + + +class XDRToken(abc.ABC): + def __init__(self, line, column, value): + self.line =3D line + self.column =3D column + self.value =3D value + + def __eq__(self, other): + return ( + type(self) =3D=3D type(other) + and self.line =3D=3D other.line + and self.column =3D=3D other.column + and self.value =3D=3D other.value + ) + + @classmethod + @abc.abstractmethod + def start(cls, reader): + pass + + @classmethod + @abc.abstractmethod + def end(cls, reader): + pass + + @classmethod + def consume(cls, reader): + c, line, col =3D reader.next() + buf =3D c + while True: + if cls.end(reader): + break + c, _, _ =3D reader.next() + buf =3D buf + c + return cls(line, col, buf) + + def __repr__(self): + return "%s{line=3D%d,col=3D%d,value=3D{{{%s}}}}" % ( + self.__class__.__name__, + self.line, + self.column, + self.value, + ) + + +class XDRTokenComment(XDRToken): + @classmethod + def start(cls, reader): + return reader.peek() =3D=3D "/" and reader.peek(skip=3D1) =3D=3D "= *" + + @classmethod + def end(cls, reader): + c1 =3D reader.last(skip=3D1) + c2 =3D reader.last() + if c1 =3D=3D "*" and c2 =3D=3D "/": + return True + + if reader.peek() is None: + raise Exception( + "EOF before closing comment starting at %d:%d" + % (reader.line, reader.column) + ) + + +class XDRTokenIdentifier(XDRToken): + @classmethod + def start(cls, reader): + c =3D reader.peek() + return c.isalpha() + + @classmethod + def end(cls, reader): + c =3D reader.peek() + if c is None: + return True + return not c.isalnum() and c !=3D "_" + + +class XDRTokenPunctuation(XDRToken): + @classmethod + def start(cls, reader): + c =3D reader.peek() + return c in [";", "=3D", "{", "}", ",", "[", "]", "<", ">", "*", "= (", ")", ":"] + + @classmethod + def end(cls, reader): + return True + + +class XDRTokenConstant(XDRToken): + @classmethod + def start(cls, reader): + c1 =3D reader.peek() + c2 =3D reader.peek(skip=3D1) + return c1.isdecimal() or (c1 =3D=3D "-" and c2 is not None and c2.= isdecimal()) + + @classmethod + def end(cls, reader): + c =3D reader.peek() + return ( + not c.isdecimal() + and not c =3D=3D "." + and not c.lower() in ["x", "a", "b", "c", "d", "e", "f"] + ) + + +class XDRTokenCEscape(XDRToken): + @classmethod + def start(cls, reader): + return reader.column =3D=3D 0 and reader.peek() =3D=3D "%" + + @classmethod + def end(cls, reader): + return reader.peek() =3D=3D "\n" + + +class XDRTokenSpace(XDRToken): + @classmethod + def start(cls, reader): + return reader.peek().isspace() + + @classmethod + def end(cls, reader): + c =3D reader.peek() + return c is None or not c.isspace() + + +class XDRLexer: + def __init__(self, fp): + self.reader =3D XDRReader(fp) + self.lookahead =3D [] + + def _token(self): + tokenTypes =3D [ + XDRTokenComment, + XDRTokenIdentifier, + XDRTokenCEscape, + XDRTokenPunctuation, + XDRTokenConstant, + XDRTokenSpace, + ] + while True: + if self.reader.peek() is None: + return None + + for tokenType in tokenTypes: + if tokenType.start(self.reader): + ret =3D tokenType.consume(self.reader) + if type(ret) not in [XDRTokenSpace, XDRTokenComment]: + return ret + + def next(self): + if len(self.lookahead) > 0: + token =3D self.lookahead[0] + self.lookahead =3D self.lookahead[1:] + return token + return self._token() + + def peek(self): + if len(self.lookahead) =3D=3D 0: + token =3D self._token() + if token is None: + return None + self.lookahead.append(token) + return self.lookahead[0] diff --git a/scripts/rpcgen/tests/meson.build b/scripts/rpcgen/tests/meson.= build new file mode 100644 index 0000000000..9162412d31 --- /dev/null +++ b/scripts/rpcgen/tests/meson.build @@ -0,0 +1,3 @@ +rpcgen_tests =3D files([ + 'test_lexer.py', +]) diff --git a/scripts/rpcgen/tests/simple.x b/scripts/rpcgen/tests/simple.x new file mode 100644 index 0000000000..91a1f2d234 --- /dev/null +++ b/scripts/rpcgen/tests/simple.x @@ -0,0 +1,35 @@ +/* Example from https://www.rfc-editor.org/rfc/rfc4506#section-7 */ + +const MAXUSERNAME =3D 32; /* max length of a user name */ +const MAXFILELEN =3D 65535; /* max length of a file */ +const MAXNAMELEN =3D 255; /* max length of a file name */ + +/* + * Types of files: + */ +enum filekind { + TEXT =3D 0, /* ascii data */ + DATA =3D 1, /* raw data */ + EXEC =3D 2 /* executable */ +}; + +/* + * File information, per kind of file: + */ +union filetype switch (filekind kind) { +case TEXT: + void; /* no extra information */ +case DATA: + string creator; /* data creator */ +case EXEC: + string interpretor; /* program interpretor */ +}; +/* + * A complete file: + */ +struct file { + string filename; /* name of file */ + filetype type; /* info about file */ + string owner; /* owner of file */ + opaque data; /* file data */ +}; diff --git a/scripts/rpcgen/tests/test_lexer.py b/scripts/rpcgen/tests/test= _lexer.py new file mode 100644 index 0000000000..7cba98057f --- /dev/null +++ b/scripts/rpcgen/tests/test_lexer.py @@ -0,0 +1,116 @@ +# SPDX-License-Identifier: LGPL-2.1-or-later + +from pathlib import Path + +from rpcgen.lexer import ( + XDRLexer, + XDRTokenIdentifier, + XDRTokenPunctuation, + XDRTokenConstant, +) + + +def test_lexer(): + p =3D Path(Path(__file__).parent, "simple.x") + with p.open("r") as fp: + lexer =3D XDRLexer(fp) + + tokens =3D [] + while True: + tok =3D lexer.next() + if tok is None: + break + tokens.append(tok) + + assert tokens =3D=3D [ + XDRTokenIdentifier(line=3D3, column=3D0, value=3D"const"), + XDRTokenIdentifier(line=3D3, column=3D6, value=3D"MAXUSERNAME"), + XDRTokenPunctuation(line=3D3, column=3D18, value=3D"=3D"), + XDRTokenConstant(line=3D3, column=3D20, value=3D"32"), + XDRTokenPunctuation(line=3D3, column=3D22, value=3D";"), + XDRTokenIdentifier(line=3D4, column=3D0, value=3D"const"), + XDRTokenIdentifier(line=3D4, column=3D6, value=3D"MAXFILELEN"), + XDRTokenPunctuation(line=3D4, column=3D17, value=3D"=3D"), + XDRTokenConstant(line=3D4, column=3D19, value=3D"65535"), + XDRTokenPunctuation(line=3D4, column=3D24, value=3D";"), + XDRTokenIdentifier(line=3D5, column=3D0, value=3D"const"), + XDRTokenIdentifier(line=3D5, column=3D6, value=3D"MAXNAMELEN"), + XDRTokenPunctuation(line=3D5, column=3D17, value=3D"=3D"), + XDRTokenConstant(line=3D5, column=3D19, value=3D"255"), + XDRTokenPunctuation(line=3D5, column=3D22, value=3D";"), + XDRTokenIdentifier(line=3D10, column=3D0, value=3D"enum"), + XDRTokenIdentifier(line=3D10, column=3D5, value=3D"filekind"), + XDRTokenPunctuation(line=3D10, column=3D14, value=3D"{"), + XDRTokenIdentifier(line=3D11, column=3D3, value=3D"TEXT"), + XDRTokenPunctuation(line=3D11, column=3D8, value=3D"=3D"), + XDRTokenConstant(line=3D11, column=3D10, value=3D"0"), + XDRTokenPunctuation(line=3D11, column=3D11, value=3D","), + XDRTokenIdentifier(line=3D12, column=3D3, value=3D"DATA"), + XDRTokenPunctuation(line=3D12, column=3D8, value=3D"=3D"), + XDRTokenConstant(line=3D12, column=3D10, value=3D"1"), + XDRTokenPunctuation(line=3D12, column=3D11, value=3D","), + XDRTokenIdentifier(line=3D13, column=3D3, value=3D"EXEC"), + XDRTokenPunctuation(line=3D13, column=3D8, value=3D"=3D"), + XDRTokenConstant(line=3D13, column=3D10, value=3D"2"), + XDRTokenPunctuation(line=3D14, column=3D0, value=3D"}"), + XDRTokenPunctuation(line=3D14, column=3D1, value=3D";"), + XDRTokenIdentifier(line=3D19, column=3D0, value=3D"union"), + XDRTokenIdentifier(line=3D19, column=3D6, value=3D"filetype"), + XDRTokenIdentifier(line=3D19, column=3D15, value=3D"switch"), + XDRTokenPunctuation(line=3D19, column=3D22, value=3D"("), + XDRTokenIdentifier(line=3D19, column=3D23, value=3D"filekind"), + XDRTokenIdentifier(line=3D19, column=3D32, value=3D"kind"), + XDRTokenPunctuation(line=3D19, column=3D36, value=3D")"), + XDRTokenPunctuation(line=3D19, column=3D38, value=3D"{"), + XDRTokenIdentifier(line=3D20, column=3D0, value=3D"case"), + XDRTokenIdentifier(line=3D20, column=3D5, value=3D"TEXT"), + XDRTokenPunctuation(line=3D20, column=3D9, value=3D":"), + XDRTokenIdentifier(line=3D21, column=3D3, value=3D"void"), + XDRTokenPunctuation(line=3D21, column=3D7, value=3D";"), + XDRTokenIdentifier(line=3D22, column=3D0, value=3D"case"), + XDRTokenIdentifier(line=3D22, column=3D5, value=3D"DATA"), + XDRTokenPunctuation(line=3D22, column=3D9, value=3D":"), + XDRTokenIdentifier(line=3D23, column=3D3, value=3D"string"), + XDRTokenIdentifier(line=3D23, column=3D10, value=3D"creator"), + XDRTokenPunctuation(line=3D23, column=3D17, value=3D"<"), + XDRTokenIdentifier(line=3D23, column=3D18, value=3D"MAXNAMELEN"), + XDRTokenPunctuation(line=3D23, column=3D28, value=3D">"), + XDRTokenPunctuation(line=3D23, column=3D29, value=3D";"), + XDRTokenIdentifier(line=3D24, column=3D0, value=3D"case"), + XDRTokenIdentifier(line=3D24, column=3D5, value=3D"EXEC"), + XDRTokenPunctuation(line=3D24, column=3D9, value=3D":"), + XDRTokenIdentifier(line=3D25, column=3D3, value=3D"string"), + XDRTokenIdentifier(line=3D25, column=3D10, value=3D"interpretor"), + XDRTokenPunctuation(line=3D25, column=3D21, value=3D"<"), + XDRTokenIdentifier(line=3D25, column=3D22, value=3D"MAXNAMELEN"), + XDRTokenPunctuation(line=3D25, column=3D32, value=3D">"), + XDRTokenPunctuation(line=3D25, column=3D33, value=3D";"), + XDRTokenPunctuation(line=3D26, column=3D0, value=3D"}"), + XDRTokenPunctuation(line=3D26, column=3D1, value=3D";"), + XDRTokenIdentifier(line=3D30, column=3D0, value=3D"struct"), + XDRTokenIdentifier(line=3D30, column=3D7, value=3D"file"), + XDRTokenPunctuation(line=3D30, column=3D12, value=3D"{"), + XDRTokenIdentifier(line=3D31, column=3D3, value=3D"string"), + XDRTokenIdentifier(line=3D31, column=3D10, value=3D"filename"), + XDRTokenPunctuation(line=3D31, column=3D18, value=3D"<"), + XDRTokenIdentifier(line=3D31, column=3D19, value=3D"MAXNAMELEN"), + XDRTokenPunctuation(line=3D31, column=3D29, value=3D">"), + XDRTokenPunctuation(line=3D31, column=3D30, value=3D";"), + XDRTokenIdentifier(line=3D32, column=3D3, value=3D"filetype"), + XDRTokenIdentifier(line=3D32, column=3D12, value=3D"type"), + XDRTokenPunctuation(line=3D32, column=3D16, value=3D";"), + XDRTokenIdentifier(line=3D33, column=3D3, value=3D"string"), + XDRTokenIdentifier(line=3D33, column=3D10, value=3D"owner"), + XDRTokenPunctuation(line=3D33, column=3D15, value=3D"<"), + XDRTokenIdentifier(line=3D33, column=3D16, value=3D"MAXUSERNAME"), + XDRTokenPunctuation(line=3D33, column=3D27, value=3D">"), + XDRTokenPunctuation(line=3D33, column=3D28, value=3D";"), + XDRTokenIdentifier(line=3D34, column=3D3, value=3D"opaque"), + XDRTokenIdentifier(line=3D34, column=3D10, value=3D"data"), + XDRTokenPunctuation(line=3D34, column=3D14, value=3D"<"), + XDRTokenIdentifier(line=3D34, column=3D15, value=3D"MAXFILELEN"), + XDRTokenPunctuation(line=3D34, column=3D25, value=3D">"), + XDRTokenPunctuation(line=3D34, column=3D26, value=3D";"), + XDRTokenPunctuation(line=3D35, column=3D0, value=3D"}"), + XDRTokenPunctuation(line=3D35, column=3D1, value=3D";"), + ] --=20 2.39.1 From nobody Fri Apr 19 11:08:17 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of redhat.com designates 170.10.133.124 as permitted sender) client-ip=170.10.133.124; envelope-from=libvir-list-bounces@redhat.com; helo=us-smtp-delivery-124.mimecast.com; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 170.10.133.124 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1678293578; cv=none; d=zohomail.com; s=zohoarc; b=N7hMPzZ6CKFp86EffQI56AoJKDCbI2KUoZelb5reBjVrLuLMzhZ0dL1v4JFK41sYRJNqiJ7xyiImElsNzFVI4k35Mji6iI1n4l+FaSMH5IRsxRx4TSKymysZomPHuCA8zg0wevgcBa13jXlrqzh1QvXjwBis76Y61kfydfjP6AU= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1678293578; h=Content-Type:Content-Transfer-Encoding:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=WcnugFfmnR9783NRJ/vMjVNckGl4PTKgcwBvh8nU8y0=; b=PkN8RqlCTr4wtXrRn0TB21Nv6RDYj1nk5WEzmO//A7KlcA8gydCSSt4UGKiGR5h4OGByDH+3P44sL73oICKTT1qgexDYJG0dyudLddwcncigE+oMiGvhoWTFvf7Qz1c8Cxt9b0LNoP7Iqf8Fu5Kom6I0eQMJC6bDROJOCVodvQw= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 170.10.133.124 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by mx.zohomail.com with SMTPS id 1678293578043797.379157107258; Wed, 8 Mar 2023 08:39:38 -0800 (PST) Received: from mimecast-mx02.redhat.com (mx3-rdu2.redhat.com [66.187.233.73]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-584-GiO47tpeOdS7GWDXZVtmZw-1; Wed, 08 Mar 2023 11:39:33 -0500 Received: from smtp.corp.redhat.com (int-mx10.intmail.prod.int.rdu2.redhat.com [10.11.54.10]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 6C7753855568; Wed, 8 Mar 2023 16:39:22 +0000 (UTC) Received: from mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com (unknown [10.30.29.100]) by smtp.corp.redhat.com (Postfix) with ESMTP id C091D492B00; Wed, 8 Mar 2023 16:39:20 +0000 (UTC) Received: from mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com (localhost [IPv6:::1]) by mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com (Postfix) with ESMTP id BA8841946A42; Wed, 8 Mar 2023 16:39:19 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.rdu2.redhat.com [10.11.54.3]) by mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com (Postfix) with ESMTP id 8F5F51946A49 for ; Wed, 8 Mar 2023 16:39:18 +0000 (UTC) Received: by smtp.corp.redhat.com (Postfix) id 739C5112132D; Wed, 8 Mar 2023 16:39:18 +0000 (UTC) Received: from virtlab420.virt.lab.eng.bos.redhat.com (virtlab420.virt.lab.eng.bos.redhat.com [10.19.152.148]) by smtp.corp.redhat.com (Postfix) with ESMTP id 599101121314; Wed, 8 Mar 2023 16:39:18 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1678293577; h=from:from:sender:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:list-id:list-help: list-unsubscribe:list-subscribe:list-post; bh=WcnugFfmnR9783NRJ/vMjVNckGl4PTKgcwBvh8nU8y0=; b=SGMUi81YfF6R0SkxHSxlWg8VPeGrPTdAxN8TPIeTvIH+17a4HBtQ1nWQs/tqXRYHFL51SV EVFZZ+vMMP+zWkKXoBEITwDMmRwB2WgRkcAiMZD+S7bC4Rs54MaQqLqhW1ytdomwv4rpmH v5qbLDxNDdXU97/1S2lsZHKxdEbYuLU= X-MC-Unique: GiO47tpeOdS7GWDXZVtmZw-1 X-Original-To: libvir-list@listman.corp.redhat.com From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= To: libvir-list@redhat.com Subject: [PATCH 05/16] rpcgen: add an XDR protocol abstract syntax tree Date: Wed, 8 Mar 2023 11:39:02 -0500 Message-Id: <20230308163913.338952-6-berrange@redhat.com> In-Reply-To: <20230308163913.338952-1-berrange@redhat.com> References: <20230308163913.338952-1-berrange@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.1 on 10.11.54.3 X-BeenThere: libvir-list@redhat.com X-Mailman-Version: 2.1.29 Precedence: list List-Id: Development discussions about the libvirt library & tools List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: libvir-list-bounces@redhat.com Sender: "libvir-list" X-Scanned-By: MIMEDefang 3.1 on 10.11.54.10 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1678293578714100001 This introduces classes needed to form an abstract syntax tree representing the XDR protocol language. The syntax requirements are detailed in https://www.rfc-editor.org/rfc/rfc4506#section-6.3 Signed-off-by: Daniel P. Berrang=C3=A9 Reviewed-by: Michal Privoznik --- scripts/rpcgen/rpcgen/ast.py | 270 +++++++++++++++++++++++++++++++++++ 1 file changed, 270 insertions(+) create mode 100644 scripts/rpcgen/rpcgen/ast.py diff --git a/scripts/rpcgen/rpcgen/ast.py b/scripts/rpcgen/rpcgen/ast.py new file mode 100644 index 0000000000..3e3e089713 --- /dev/null +++ b/scripts/rpcgen/rpcgen/ast.py @@ -0,0 +1,270 @@ +# SPDX-License-Identifier: LGPL-2.1-or-later + +import abc + + +class XDRSpecification: + def __init__(self): + self.definitions =3D [] + + def __repr__(self): + return "\n".join([repr(a) for a in self.definitions]) + + +class XDRDefinition(abc.ABC): + pass + + +class XDRDefinitionConstant(XDRDefinition): + def __init__(self, name, value): + self.name =3D name + self.value =3D value + + def __repr__(self): + return "const:{name=3D%s,value=3D%s}" % (self.name, self.value) + + +class XDRDefinitionTypedef(XDRDefinition): + def __init__(self, decl): + self.decl =3D decl + + def __repr__(self): + return "typedef:{decl=3D%s}" % (self.decl) + + +class XDRDefinitionEnum(XDRDefinition): + def __init__(self, name, body): + self.name =3D name + self.body =3D body + + def __repr__(self): + return "enum:{name=3D%s,body=3D%s}" % (self.name, self.body) + + +class XDRDefinitionStruct(XDRDefinition): + def __init__(self, name, body): + self.name =3D name + self.body =3D body + + def __repr__(self): + return "struct:{name=3D%s,body=3D%s}" % (self.name, self.body) + + +class XDRDefinitionUnion(XDRDefinition): + def __init__(self, name, body): + self.name =3D name + self.body =3D body + + def __repr__(self): + return "union:{name=3D%s,body=3D%s}" % (self.name, self.body) + + +class XDRDefinitionCEscape(XDRDefinition): + def __init__(self, code): + self.code =3D code + + def __repr__(self): + return "c-escape:{code=3D%s}" % (self.code) + + +class XDRDeclaration(abc.ABC): + def __init__(self, typ, identifier): + self.typ =3D typ + self.identifier =3D identifier + + +class XDRDeclarationScalar(XDRDeclaration): + def __repr__(self): + return "scalar:{type=3D%s,identifier=3D%s}" % (self.typ, self.iden= tifier) + + +class XDRDeclarationPointer(XDRDeclaration): + def __repr__(self): + return "pointer:{type=3D%s,identifier=3D%s}" % (self.typ, self.ide= ntifier) + + +class XDRDeclarationFixedArray(XDRDeclaration): + def __init__(self, typ, identifier, length): + super().__init__(typ, identifier) + self.length =3D length + + def __repr__(self): + return "fixed-array:{type=3D%s,identifier=3D%s,length=3D%s}" % ( + self.typ, + self.identifier, + self.length, + ) + + +class XDRDeclarationVariableArray(XDRDeclaration): + def __init__(self, typ, identifier, maxlength): + super().__init__(typ, identifier) + self.maxlength =3D maxlength + + def __repr__(self): + return "variable-array:{type=3D%s,identifier=3D%s,maxlength=3D%s}"= % ( + self.typ, + self.identifier, + self.maxlength, + ) + + +class XDRType(abc.ABC): + def __repr__(self): + name =3D self.__class__.__name__ + return name[7:].lower() + + def is_scalar(self): + return False + + +class XDRTypeScalar(XDRType): + def is_scalar(self): + return True + + +class XDRTypeVoid(XDRTypeScalar): + pass + + +class XDRTypeChar(XDRTypeScalar): + pass + + +class XDRTypeUnsignedChar(XDRTypeScalar): + pass + + +class XDRTypeShort(XDRTypeScalar): + pass + + +class XDRTypeUnsignedShort(XDRTypeScalar): + pass + + +class XDRTypeInt(XDRTypeScalar): + pass + + +class XDRTypeUnsignedInt(XDRTypeScalar): + pass + + +class XDRTypeHyper(XDRTypeScalar): + pass + + +class XDRTypeUnsignedHyper(XDRTypeScalar): + pass + + +class XDRTypeFloat(XDRTypeScalar): + pass + + +class XDRTypeDouble(XDRTypeScalar): + pass + + +class XDRTypeBool(XDRTypeScalar): + pass + + +class XDRTypeOpaque(XDRType): + pass + + +class XDRTypeString(XDRType): + pass + + +class XDRTypeCustom(XDRType): + def __init__(self, identifier, definition): + self.identifier =3D identifier + self.definition =3D definition + + def is_scalar(self): + if type(self.definition) =3D=3D XDRDefinitionEnum: + return True + if type(self.definition) =3D=3D XDRDefinitionTypedef: + return self.definition.decl.typ.is_scalar() + return False + + def __repr__(self): + return "custom{identifier=3D%s,definition=3D%s}" % ( + self.identifier, + self.definition, + ) + + +class XDREnumValue: + def __init__(self, name, value): + self.name =3D name + self.value =3D value + + def __repr__(self): + return "%s=3D%s" % (self.name, self.value) + + +class XDREnumBody: + def __init__(self, values): + self.values =3D values + + def __repr__(self): + return "enum-body{values=3D[" + ",".join([str(a) for a in self.val= ues]) + "]}" + + +class XDRTypeEnum(XDRTypeScalar): + def __init__(self, body): + self.body =3D body + + def __repr__(self): + return "enum{%s}" % self.body + + +class XDRStructBody: + def __init__(self, fields): + self.fields =3D fields + + def __repr__(self): + return "struct-body{fields=3D[" + ",".join([str(a) for a in self.f= ields]) + "]}" + + +class XDRTypeStruct(XDRType): + def __init__(self, body): + self.body =3D body + + def __repr__(self): + return "struct{%s}" % self.body + + +class XDRUnionCase: + def __init__(self, value, decl): + self.value =3D value + self.decl =3D decl + + def __repr__(self): + return "%s=3D%s" % (self.value, self.decl) + + +class XDRUnionBody: + def __init__(self, discriminator, cases, default): + self.discriminator =3D discriminator + self.cases =3D cases + self.default =3D default + + def __repr__(self): + return ( + "union-body{discriminator=3D%s,cases=3D[" + + ",".join([str(a) for a in self.cases]) + + "],default=3D%s}" + ) % (self.discriminator, self.default) + + +class XDRTypeUnion(XDRType): + def __init__(self, body): + self.body =3D body + + def __repr__(self): + return "union{%s}" % self.body --=20 2.39.1 From nobody Fri Apr 19 11:08:17 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of redhat.com designates 170.10.129.124 as permitted sender) client-ip=170.10.129.124; envelope-from=libvir-list-bounces@redhat.com; helo=us-smtp-delivery-124.mimecast.com; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 170.10.129.124 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1678293610; cv=none; d=zohomail.com; s=zohoarc; b=FjOZ+QSstI8rj/ZAIeRD6dGMb94lB8Hm+mwjl18hZoNexijFpPOyUnuENGdYxPuo6Vb7crM1xYHTCm9bhv4IX3ZMkx0MJzzHouMfEiQWUA0sO9tMODX68HR6673ZNpU0GJEocGVF0gAkSyG6lAvcLAwqcBguDTfDNh3rveg3XI0= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1678293610; h=Content-Type:Content-Transfer-Encoding:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=4Qc9cWHNrhx1RAeXJaeh3mYyyTua5IPWQo2/v6/4vB8=; b=Hr3kIq+fsbNdSd7Gqyl466NBv79D3kcj/ivNcC1k1wiAK68DpkUspL2J8hCLm3KaDNhcDomEi1ff3UeKkWb0Eka1T6Y9REMBI3atLcyXCkGYbXOeEYYUeUKikc16j0gapTV7k+IhxUWih5iFTPtqOJHdL2colkO7a8Wn7S4im8A= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 170.10.129.124 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) by mx.zohomail.com with SMTPS id 1678293610981798.9353704587098; Wed, 8 Mar 2023 08:40:10 -0800 (PST) Received: from mimecast-mx02.redhat.com (mimecast-mx02.redhat.com [66.187.233.88]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-208-A4x4wZ3lMambj4uS8dwC9Q-1; Wed, 08 Mar 2023 11:39:36 -0500 Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.rdu2.redhat.com [10.11.54.5]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 4A80A101A52E; Wed, 8 Mar 2023 16:39:26 +0000 (UTC) Received: from mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com (unknown [10.30.29.100]) by smtp.corp.redhat.com (Postfix) with ESMTP id 2E6F447CEF; Wed, 8 Mar 2023 16:39:26 +0000 (UTC) Received: from mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com (localhost [IPv6:::1]) by mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com (Postfix) with ESMTP id A42451948665; Wed, 8 Mar 2023 16:39:22 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.rdu2.redhat.com [10.11.54.3]) by mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com (Postfix) with ESMTP id BB3541946A5E for ; Wed, 8 Mar 2023 16:39:18 +0000 (UTC) Received: by smtp.corp.redhat.com (Postfix) id 9DBD51121330; Wed, 8 Mar 2023 16:39:18 +0000 (UTC) Received: from virtlab420.virt.lab.eng.bos.redhat.com (virtlab420.virt.lab.eng.bos.redhat.com [10.19.152.148]) by smtp.corp.redhat.com (Postfix) with ESMTP id 7E7691121314; Wed, 8 Mar 2023 16:39:18 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1678293609; h=from:from:sender:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:list-id:list-help: list-unsubscribe:list-subscribe:list-post; bh=4Qc9cWHNrhx1RAeXJaeh3mYyyTua5IPWQo2/v6/4vB8=; b=XnImi2ypmXJoEdgOzJXew85/BjLkIkf+Cn4jwn+WYLZ5HdYy9Dan4SuodRlbhiE/gr+D73 WfLmnOk+PEuErsaDx/KgKUKj4OzqiRYcsOf8z9b6KtGfsEwZsnTyC1BjXrgX1dRIo2vxwA DkHkZnjwiGdP3OHv/PH5lv9xtQdjh3k= X-MC-Unique: A4x4wZ3lMambj4uS8dwC9Q-1 X-Original-To: libvir-list@listman.corp.redhat.com From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= To: libvir-list@redhat.com Subject: [PATCH 06/16] rpcgen: add an XDR protocol parser Date: Wed, 8 Mar 2023 11:39:03 -0500 Message-Id: <20230308163913.338952-7-berrange@redhat.com> In-Reply-To: <20230308163913.338952-1-berrange@redhat.com> References: <20230308163913.338952-1-berrange@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.1 on 10.11.54.3 X-BeenThere: libvir-list@redhat.com X-Mailman-Version: 2.1.29 Precedence: list List-Id: Development discussions about the libvirt library & tools List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: libvir-list-bounces@redhat.com Sender: "libvir-list" X-Scanned-By: MIMEDefang 3.1 on 10.11.54.5 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1678293612832100001 This adds a parser capable of handling the XDR protocol files. The parsing grammar requirements are detailed in https://www.rfc-editor.org/rfc/rfc4506#section-6.3 Signed-off-by: Daniel P. Berrang=C3=A9 Reviewed-by: Michal Privoznik --- scripts/rpcgen/rpcgen/parser.py | 497 ++++++++++++++++++++++++++++ scripts/rpcgen/tests/meson.build | 1 + scripts/rpcgen/tests/test_parser.py | 91 +++++ 3 files changed, 589 insertions(+) create mode 100644 scripts/rpcgen/rpcgen/parser.py create mode 100644 scripts/rpcgen/tests/test_parser.py diff --git a/scripts/rpcgen/rpcgen/parser.py b/scripts/rpcgen/rpcgen/parser= .py new file mode 100644 index 0000000000..7efbe5468e --- /dev/null +++ b/scripts/rpcgen/rpcgen/parser.py @@ -0,0 +1,497 @@ +# SPDX-License-Identifier: LGPL-2.1-or-later + +from .lexer import ( + XDRLexer, + XDRTokenPunctuation, + XDRTokenIdentifier, + XDRTokenCEscape, + XDRTokenConstant, +) +from .ast import ( + XDRSpecification, + XDRDefinitionConstant, + XDRDefinitionTypedef, + XDRDefinitionEnum, + XDRDefinitionStruct, + XDRDefinitionUnion, + XDRDefinitionCEscape, + XDRDeclarationScalar, + XDRDeclarationPointer, + XDRDeclarationFixedArray, + XDRDeclarationVariableArray, + XDRTypeVoid, + XDRTypeChar, + XDRTypeUnsignedChar, + XDRTypeShort, + XDRTypeUnsignedShort, + XDRTypeInt, + XDRTypeUnsignedInt, + XDRTypeHyper, + XDRTypeUnsignedHyper, + XDRTypeFloat, + XDRTypeDouble, + XDRTypeBool, + XDRTypeOpaque, + XDRTypeString, + XDRTypeCustom, + XDREnumValue, + XDREnumBody, + XDRTypeEnum, + XDRStructBody, + XDRTypeStruct, + XDRUnionCase, + XDRUnionBody, + XDRTypeUnion, +) + + +# We are parsing (approximately the following grammar +# from RFC 4506 #6.3: +# +# declaration: +# type-specifier identifier +# | type-specifier identifier "[" value "]" +# | type-specifier identifier "<" [ value ] ">" +# | "opaque" identifier "[" value "]" +# | "opaque" identifier "<" [ value ] ">" +# | "string" identifier "<" [ value ] ">" +# | type-specifier "*" identifier +# | "void" +# +# value: +# constant +# | identifier +# +# constant: +# decimal-constant | hexadecimal-constant | octal-constant +# +# type-specifier: +# [ "unsigned" ] "int" +# | [ "unsigned" ] "hyper" +# | "float" +# | "double" +# | "quadruple" /* We're skipping this one */ +# | "bool" +# | enum-type-spec +# | struct-type-spec +# | union-type-spec +# | identifier +# +# enum-type-spec: +# "enum" enum-body +# +# enum-body: +# "{" +# ( identifier "=3D" value ) +# ( "," identifier "=3D" value )* +# "}" +# +# struct-type-spec: +# "struct" struct-body +# +# struct-body: +# "{" +# ( declaration ";" ) +# ( declaration ";" )* +# "}" +# +# union-type-spec: +# "union" union-body +# +# union-body: +# "switch" "(" declaration ")" "{" +# case-spec +# case-spec * +# [ "default" ":" declaration ";" ] +# "}" +# +# case-spec: +# ( "case" value ":") +# ( "case" value ":") * +# declaration ";" +# +# constant-def: +# "const" identifier "=3D" constant ";" +# +# type-def: +# "typedef" declaration ";" +# | "enum" identifier enum-body ";" +# | "struct" identifier struct-body ";" +# | "union" identifier union-body ";" +# +# definition: +# type-def +# | constant-def +# +# specification: +# definition * +# +# Notable divergance: +# +# - In 'type-decl' we allow 'char' and 'short' +# in signed and unsigned variants +# +# - In 'definition' we allow '%...' as escape C code +# to passthrough to the header output +# +# - In 'enum-type-spec' we allow a bare enum name +# instead of enum body +# +# - In 'struct-type-spec' we allow a bare struct name +# instead of struct body +# +# - In 'union-type-spec' we allow a bare union name +# instead of union body +# +class XDRParser: + def __init__(self, fp): + self.lexer =3D XDRLexer(fp) + self.typedefs =3D {} + + def parse(self): + spec =3D XDRSpecification() + while True: + definition =3D self.parse_definition() + if definition is None: + break + spec.definitions.append(definition) + return spec + + def parse_definition(self): + token =3D self.lexer.next() + if token is None: + return None + + if type(token) =3D=3D XDRTokenCEscape: + return XDRDefinitionCEscape(token.value[1:]) + + if type(token) !=3D XDRTokenIdentifier: + raise Exception("Expected identifier, but got %s" % token) + + defs =3D { + "const": XDRDefinitionConstant, + "typedef": XDRDefinitionTypedef, + "enum": XDRDefinitionEnum, + "struct": XDRDefinitionStruct, + "union": XDRDefinitionUnion, + } + + if token.value not in defs: + raise Exception("Unexpected identifier %s" % token) + + funcname =3D "parse_definition_" + token.value + func =3D getattr(self, funcname) + assert func is not None + + definition =3D func() + + semi =3D self.lexer.next() + if type(semi) !=3D XDRTokenPunctuation or semi.value !=3D ";": + raise Exception("Expected ';', but got %s" % semi) + + return definition + + def parse_definition_const(self): + ident =3D self.lexer.next() + if type(ident) !=3D XDRTokenIdentifier: + raise Exception("Expected identifier, but got %s" % ident) + + assign =3D self.lexer.next() + if type(assign) !=3D XDRTokenPunctuation or assign.value !=3D "=3D= ": + raise Exception("Expected '=3D', but got %s" % assign) + + const =3D self.lexer.next() + if type(const) not in [XDRTokenConstant, XDRTokenIdentifier]: + raise Exception("Expected constant, but got %s" % const) + + return XDRDefinitionConstant(ident.value, const.value) + + def parse_definition_typedef(self): + decl =3D self.parse_declaration() + if decl.identifier in self.typedefs: + raise Exception("Type '%s' already defined" % decl.identifier) + + definition =3D XDRDefinitionTypedef(decl) + self.typedefs[decl.identifier] =3D definition + return definition + + def parse_definition_enum(self): + name =3D self.lexer.next() + if type(name) !=3D XDRTokenIdentifier: + raise Exception("Expected identifier, but got %s" % name) + + body =3D self.parse_enum_body() + + if name.value in self.typedefs: + raise Exception("Type '%s' already defined" % name.value) + + definition =3D XDRDefinitionEnum(name.value, body) + self.typedefs[name.value] =3D definition + return definition + + def parse_definition_struct(self): + name =3D self.lexer.next() + if type(name) !=3D XDRTokenIdentifier: + raise Exception("Expected identifier, but got %s" % name) + + body =3D self.parse_struct_body() + + if name.value in self.typedefs: + raise Exception("Type '%s' already defined" % name.value) + + definition =3D XDRDefinitionStruct(name.value, body) + self.typedefs[name.value] =3D definition + return definition + + def parse_definition_union(self): + name =3D self.lexer.next() + if type(name) !=3D XDRTokenIdentifier: + raise Exception("Expected identifier, but got %s" % name) + + body =3D self.parse_union_body() + + if name.value in self.typedefs: + raise Exception("Type '%s' already defined" % name.value) + + definition =3D XDRDefinitionUnion(name.value, body) + self.typedefs[name.value] =3D definition + return definition + + def parse_declaration(self): + typ =3D self.parse_type() + + if type(typ) =3D=3D XDRTypeVoid: + return XDRDeclarationScalar(typ, None) + + ident =3D self.lexer.next() + + pointer =3D False + if type(ident) =3D=3D XDRTokenPunctuation: + if ident.value !=3D "*": + raise Exception("Expected '*' or identifer, but got %s" % = ident) + if type(typ) =3D=3D XDRTypeString or type(typ) =3D=3D XDRTypeO= paque: + raise Exception("Pointer invalid for 'string' and 'opaque'= types") + + pointer =3D True + ident =3D self.lexer.next() + + bracket =3D self.lexer.peek() + if type(bracket) =3D=3D XDRTokenPunctuation: + if bracket.value =3D=3D "[": + _ =3D self.lexer.next() + value =3D self.lexer.next() + if type(value) not in [XDRTokenConstant, XDRTokenIdentifie= r]: + raise Exception("Expected constant, but got %s" % valu= e) + + close =3D self.lexer.next() + if type(close) !=3D XDRTokenPunctuation or close.value != =3D "]": + raise Exception("Expected ']', but got %s" % value) + + if type(typ) =3D=3D XDRTypeString: + raise Exception("Fixed array invalid for 'string' type= ") + return XDRDeclarationFixedArray(typ, ident.value, value.va= lue) + elif bracket.value =3D=3D "<": + _ =3D self.lexer.next() + maybeValue =3D self.lexer.peek() + value =3D None + if type(maybeValue) in [XDRTokenConstant, XDRTokenIdentifi= er]: + value =3D self.lexer.next().value + + close =3D self.lexer.next() + if type(close) !=3D XDRTokenPunctuation or close.value != =3D ">": + raise Exception("Expected '>', but got %s" % close) + + return XDRDeclarationVariableArray(typ, ident.value, value) + + if pointer: + return XDRDeclarationPointer(typ, ident.value) + else: + return XDRDeclarationScalar(typ, ident.value) + + def parse_type(self): + typ =3D self.lexer.next() + if type(typ) !=3D XDRTokenIdentifier: + raise Exception("Expected identifier, but got %s" % typ) + + if typ.value =3D=3D "unsigned": + typ =3D self.lexer.peek() + if type(typ) !=3D XDRTokenIdentifier: + raise Exception("Expected identifier, but got %s" % typ) + + if typ.value =3D=3D "char": + _ =3D self.lexer.next() + return XDRTypeUnsignedChar() + elif typ.value =3D=3D "short": + _ =3D self.lexer.next() + return XDRTypeUnsignedShort() + elif typ.value =3D=3D "int": + _ =3D self.lexer.next() + return XDRTypeUnsignedInt() + elif typ.value =3D=3D "hyper": + _ =3D self.lexer.next() + return XDRTypeUnsignedHyper() + else: + # Bare 'unsigned' isn't allowed by 'type-specifier' + # grammer in RFC 1014, but rpcgen allows it + return XDRTypeUnsignedInt() + + if typ.value =3D=3D "void": + return XDRTypeVoid() + elif typ.value =3D=3D "char": + return XDRTypeChar() + elif typ.value =3D=3D "short": + return XDRTypeShort() + elif typ.value =3D=3D "int": + return XDRTypeInt() + elif typ.value =3D=3D "hyper": + return XDRTypeHyper() + elif typ.value =3D=3D "float": + return XDRTypeFloat() + elif typ.value =3D=3D "double": + return XDRTypeDouble() + elif typ.value =3D=3D "bool": + return XDRTypeBool() + elif typ.value =3D=3D "enum": + return self.parse_type_enum() + elif typ.value =3D=3D "struct": + return self.parse_type_struct() + elif typ.value =3D=3D "union": + return self.parse_type_union() + elif typ.value =3D=3D "opaque": + return XDRTypeOpaque() + elif typ.value =3D=3D "string": + return XDRTypeString() + else: + return XDRTypeCustom(typ.value, self.typedefs.get(typ.value, N= one)) + + def parse_enum_body(self): + body =3D self.lexer.next() + if type(body) !=3D XDRTokenPunctuation or body.value !=3D "{": + raise Exception("Expected '{', but got %s" % body) + + values =3D [] + while True: + ident =3D self.lexer.next() + if type(ident) !=3D XDRTokenIdentifier: + raise Exception("Expected identifier, but got %s" % ident) + + equal =3D self.lexer.next() + if type(equal) !=3D XDRTokenPunctuation or equal.value !=3D "= =3D": + raise Exception("Expected '=3D', but got %s" % ident) + + value =3D self.lexer.next() + if type(value) !=3D XDRTokenConstant: + raise Exception("Expected constant, but got %s" % ident) + + separator =3D self.lexer.next() + if type(separator) !=3D XDRTokenPunctuation and separator.valu= e not in [ + "}", + ",", + ]: + raise Exception("Expected '}' or ',', but got %s" % separa= tor) + + values.append(XDREnumValue(ident.value, value.value)) + + if separator.value =3D=3D "}": + break + + return XDREnumBody(values) + + def parse_type_enum(self): + body =3D self.parse_enum_body() + return XDRTypeEnum(body) + + def parse_struct_body(self): + body =3D self.lexer.next() + if type(body) !=3D XDRTokenPunctuation or body.value !=3D "{": + raise Exception("Expected '{', but got %s" % body) + + fields =3D [] + while True: + field =3D self.parse_declaration() + fields.append(field) + + separator =3D self.lexer.next() + if type(separator) !=3D XDRTokenPunctuation and separator.valu= e !=3D ";": + raise Exception("Expected ';', but got %s" % separator) + + end =3D self.lexer.peek() + if type(end) =3D=3D XDRTokenPunctuation and end.value =3D=3D "= }": + break + + # discard the '}' we peeked at to end the loop + _ =3D self.lexer.next() + return XDRStructBody(fields) + + def parse_type_struct(self): + body =3D self.parse_struct_body() + return XDRTypeStruct(body) + + def parse_union_body(self): + ident =3D self.lexer.next() + if type(ident) !=3D XDRTokenIdentifier or ident.value !=3D "switch= ": + raise Exception("Expected 'switch', but got %s" % ident) + + bracket =3D self.lexer.next() + if type(bracket) !=3D XDRTokenPunctuation or bracket.value !=3D "(= ": + raise Exception("Expected '(', but got %s" % bracket) + + discriminator =3D self.parse_declaration() + + bracket =3D self.lexer.next() + if type(bracket) !=3D XDRTokenPunctuation or bracket.value !=3D ")= ": + raise Exception("Expected ')', but got %s" % bracket) + + bracket =3D self.lexer.next() + if type(bracket) !=3D XDRTokenPunctuation or bracket.value !=3D "{= ": + raise Exception("Expected '{', but got %s" % bracket) + + default =3D None + cases =3D [] + while True: + ident =3D self.lexer.next() + if type(ident) !=3D XDRTokenIdentifier or ident.value not in [ + "default", + "case", + ]: + raise Exception("Expected 'default' or 'case', but got %s"= % ident) + + value =3D None + if ident.value =3D=3D "case": + value =3D self.lexer.next() + if type(value) not in [XDRTokenConstant, XDRTokenIdentifie= r]: + raise Exception("Expected constant, but got %s" % valu= e) + + sep =3D self.lexer.next() + if type(sep) !=3D XDRTokenPunctuation or sep.value !=3D ":= ": + raise Exception("Expected ':', but got %s" % value) + + decl =3D self.parse_declaration() + + case =3D XDRUnionCase(value.value, decl) + cases.append(case) + else: + if default is not None: + raise Exception("Duplicate 'default' clause") + + sep =3D self.lexer.next() + if type(sep) !=3D XDRTokenPunctuation or sep.value !=3D ":= ": + raise Exception("Expected ':', but got %s" % value) + + default =3D self.parse_declaration() + + separator =3D self.lexer.next() + if type(separator) !=3D XDRTokenPunctuation and separator.valu= e !=3D ";": + raise Exception("Expected ';', but got %s" % bracket) + + end =3D self.lexer.peek() + if type(end) =3D=3D XDRTokenPunctuation and end.value =3D=3D "= }": + break + + # discard the '}' we peeked at to end the loop + _ =3D self.lexer.next() + return XDRUnionBody(discriminator, cases, default) + + def parse_type_union(self): + body =3D self.parse_union_body() + return XDRTypeUnion(body) diff --git a/scripts/rpcgen/tests/meson.build b/scripts/rpcgen/tests/meson.= build index 9162412d31..4b1ea308ce 100644 --- a/scripts/rpcgen/tests/meson.build +++ b/scripts/rpcgen/tests/meson.build @@ -1,3 +1,4 @@ rpcgen_tests =3D files([ 'test_lexer.py', + 'test_parser.py', ]) diff --git a/scripts/rpcgen/tests/test_parser.py b/scripts/rpcgen/tests/tes= t_parser.py new file mode 100644 index 0000000000..8527b8d6e2 --- /dev/null +++ b/scripts/rpcgen/tests/test_parser.py @@ -0,0 +1,91 @@ +# SPDX-License-Identifier: LGPL-2.1-or-later + +from pathlib import Path + +from rpcgen.ast import ( + XDRSpecification, + XDRDefinitionConstant, + XDRDefinitionEnum, + XDRDefinitionUnion, + XDRDefinitionStruct, + XDRDeclarationScalar, + XDRDeclarationVariableArray, + XDREnumValue, + XDREnumBody, + XDRStructBody, + XDRUnionCase, + XDRUnionBody, + XDRTypeCustom, + XDRTypeVoid, + XDRTypeString, + XDRTypeOpaque, +) +from rpcgen.parser import XDRParser + + +def test_parser(): + p =3D Path(Path(__file__).parent, "simple.x") + with p.open("r") as fp: + parser =3D XDRParser(fp) + + got =3D parser.parse() + + enum =3D XDRDefinitionEnum( + "filekind", + XDREnumBody( + [ + XDREnumValue("TEXT", "0"), + XDREnumValue("DATA", "1"), + XDREnumValue("EXEC", "2"), + ], + ), + ) + + union =3D XDRDefinitionUnion( + "filetype", + XDRUnionBody( + XDRDeclarationScalar(XDRTypeCustom("filekind", enum), "kind"), + [ + XDRUnionCase("TEXT", XDRDeclarationScalar(XDRTypeVoid(), N= one)), + XDRUnionCase( + "DATA", + XDRDeclarationVariableArray( + XDRTypeString(), "creator", "MAXNAMELEN" + ), + ), + XDRUnionCase( + "EXEC", + XDRDeclarationVariableArray( + XDRTypeString(), "interpretor", "MAXNAMELEN" + ), + ), + ], + None, + ), + ) + + struct =3D XDRDefinitionStruct( + "file", + XDRStructBody( + [ + XDRDeclarationVariableArray(XDRTypeString(), "filename", "= MAXNAMELEN"), + XDRDeclarationScalar(XDRTypeCustom("filetype", union), "ty= pe"), + XDRDeclarationVariableArray(XDRTypeString(), "owner", "MAX= USERNAME"), + XDRDeclarationVariableArray(XDRTypeOpaque(), "data", "MAXF= ILELEN"), + ] + ), + ) + + want =3D XDRSpecification() + want.definitions.extend( + [ + XDRDefinitionConstant("MAXUSERNAME", "32"), + XDRDefinitionConstant("MAXFILELEN", "65535"), + XDRDefinitionConstant("MAXNAMELEN", "255"), + enum, + union, + struct, + ] + ) + + assert str(got) =3D=3D str(want) --=20 2.39.1 From nobody Fri Apr 19 11:08:17 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of redhat.com designates 170.10.129.124 as permitted sender) client-ip=170.10.129.124; envelope-from=libvir-list-bounces@redhat.com; helo=us-smtp-delivery-124.mimecast.com; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 170.10.129.124 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1678293584; cv=none; d=zohomail.com; s=zohoarc; b=A+uudAjZ84YqE9qpSL/BWMaf+OIxRDNM6YLhl/H7dz9u3sEX2t/krXJloZEogTQXX4qYzBQBK0TJhZQQZf0O+1KjmYUFtsgFRrp4DHs9BJUJJXFu/jGOcAHjdyYUbZQW+q8mJDf9sUEAPqOuQYr2C3EfMnB+M+UpkjOujO4Debw= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1678293584; h=Content-Type:Content-Transfer-Encoding:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=sc6P6GtwXp+dFpZqOGm8C5ffdQFsDwJ2RgyqHDJgWgQ=; b=jWbhsnNZpoYxv8TvZ02HszuH2wG9svc6RWz/PPgyAyC+Wotq+jvGEo9dn9eokozkcZECtZSECPwEci+rj7mok8M8kchwgcKdhjy1X0wSUX7oEzA/pUUbYX73nvy9Rr40NOBOg726DTni0PN+s9kk8frbHBMllkIfaBSJvYPzIRo= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 170.10.129.124 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) by mx.zohomail.com with SMTPS id 1678293584398990.6498105439778; Wed, 8 Mar 2023 08:39:44 -0800 (PST) Received: from mimecast-mx02.redhat.com (mx3-rdu2.redhat.com [66.187.233.73]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-417-vNT2S634NQyX0-2VDcQxGQ-1; Wed, 08 Mar 2023 11:39:40 -0500 Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.rdu2.redhat.com [10.11.54.3]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id D642F3806652; Wed, 8 Mar 2023 16:39:26 +0000 (UTC) Received: from mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com (unknown [10.30.29.100]) by smtp.corp.redhat.com (Postfix) with ESMTP id BF1BE1120AC4; Wed, 8 Mar 2023 16:39:26 +0000 (UTC) Received: from mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com (localhost [IPv6:::1]) by mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com (Postfix) with ESMTP id 62E8519472D0; Wed, 8 Mar 2023 16:39:23 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.rdu2.redhat.com [10.11.54.3]) by mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com (Postfix) with ESMTP id DD34B1946A5E for ; Wed, 8 Mar 2023 16:39:18 +0000 (UTC) Received: by smtp.corp.redhat.com (Postfix) id C199B112132D; Wed, 8 Mar 2023 16:39:18 +0000 (UTC) Received: from virtlab420.virt.lab.eng.bos.redhat.com (virtlab420.virt.lab.eng.bos.redhat.com [10.19.152.148]) by smtp.corp.redhat.com (Postfix) with ESMTP id A79001121314; Wed, 8 Mar 2023 16:39:18 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1678293583; h=from:from:sender:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:list-id:list-help: list-unsubscribe:list-subscribe:list-post; bh=sc6P6GtwXp+dFpZqOGm8C5ffdQFsDwJ2RgyqHDJgWgQ=; b=dGs4sv77BoLalrlsBjbiohvlQb0XR80MSmPebBAT7Dq7+EjkwuTs/T+pXb6Re4cUsw9Beo qdAJS92QqwjVZ3D/RAZe7EqWLDnH9Xu1ejbYKgg8MUk6H5mifN08v/U8lEs34q6tsFWMgA tMRPdjadSAQPlOliq+UPcInAPSHCttU= X-MC-Unique: vNT2S634NQyX0-2VDcQxGQ-1 X-Original-To: libvir-list@listman.corp.redhat.com From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= To: libvir-list@redhat.com Subject: [PATCH 07/16] rpcgen: define a visitor API for XDR protocol specs Date: Wed, 8 Mar 2023 11:39:04 -0500 Message-Id: <20230308163913.338952-8-berrange@redhat.com> In-Reply-To: <20230308163913.338952-1-berrange@redhat.com> References: <20230308163913.338952-1-berrange@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.1 on 10.11.54.3 X-BeenThere: libvir-list@redhat.com X-Mailman-Version: 2.1.29 Precedence: list List-Id: Development discussions about the libvirt library & tools List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: libvir-list-bounces@redhat.com Sender: "libvir-list" X-Scanned-By: MIMEDefang 3.1 on 10.11.54.3 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1678293584783100001 The visitor API defines an interface for visiting each element in the XDR protocol spec abstract syntax tree. Signed-off-by: Daniel P. Berrang=C3=A9 Reviewed-by: Michal Privoznik --- scripts/rpcgen/rpcgen/visitor.py | 156 +++++++++++++++++++++++++++++++ 1 file changed, 156 insertions(+) create mode 100644 scripts/rpcgen/rpcgen/visitor.py diff --git a/scripts/rpcgen/rpcgen/visitor.py b/scripts/rpcgen/rpcgen/visit= or.py new file mode 100644 index 0000000000..e1b2d907c1 --- /dev/null +++ b/scripts/rpcgen/rpcgen/visitor.py @@ -0,0 +1,156 @@ +# SPDX-License-Identifier: LGPL-2.1-or-later + +import abc + +from .ast import ( + XDRSpecification, + XDRDefinition, + XDRDeclaration, + XDRType, + XDREnumValue, + XDREnumBody, + XDRStructBody, + XDRUnionCase, + XDRUnionBody, +) + + +class XDRVisitor(abc.ABC): + def __init__(self, spec): + self.spec =3D spec + + def visit(self, indent=3D"", context=3D""): + return self.visit_object(self.spec, indent=3D"", context=3Dcontext) + + def visit_object(self, obj, indent=3D"", context=3D""): + if isinstance(obj, XDRSpecification): + funcname =3D "visit_specification" + elif isinstance(obj, XDRDefinition): + funcname =3D "visit_definition_" + type(obj).__name__[13:].low= er() + elif isinstance(obj, XDRDeclaration): + funcname =3D "visit_declaration_" + type(obj).__name__[14:].lo= wer() + elif isinstance(obj, XDRType): + funcname =3D "visit_type_" + type(obj).__name__[7:].lower() + elif isinstance(obj, XDREnumValue): + funcname =3D "visit_enum_value" + elif isinstance(obj, XDREnumBody): + funcname =3D "visit_enum_body" + elif isinstance(obj, XDRStructBody): + funcname =3D "visit_struct_body" + elif isinstance(obj, XDRUnionCase): + funcname =3D "visit_union_case" + elif isinstance(obj, XDRUnionBody): + funcname =3D "visit_union_body" + else: + raise Exception("Unhandled %s" % obj.__class__.__name__) + + func =3D getattr(self, funcname) + assert func is not None + return func(obj, indent, context) + + def visit_specification(self, obj, indent, context): + code =3D [] + for definition in self.spec.definitions: + defcode =3D self.visit_object(definition, indent, context) + if defcode is not None: + code.append(defcode) + return "\n".join(code) + + def visit_definition_cescape(self, obj, indent, context): + pass + + def visit_definition_constant(self, obj, indent, context): + pass + + def visit_definition_enum(self, obj, indent, context): + pass + + def visit_definition_struct(self, obj, indent, context): + pass + + def visit_definition_union(self, obj, indent, context): + pass + + def visit_definition_typedef(self, obj, indent, context): + pass + + def visit_declaration_scalar(self, obj, indent, context): + pass + + def visit_declaration_pointer(self, obj, indent, context): + pass + + def visit_declaration_fixedarray(self, obj, indent, context): + pass + + def visit_declaration_variablearray(self, obj, indent, context): + pass + + def visit_type_custom(self, obj, indent, context): + pass + + def visit_type_opaque(self, obj, indent, context): + pass + + def visit_type_string(self, obj, indent, context): + pass + + def visit_type_void(self, obj, indent, context): + pass + + def visit_type_char(self, obj, indent, context): + pass + + def visit_type_unsignedchar(self, obj, indent, context): + pass + + def visit_type_short(self, obj, indent, context): + pass + + def visit_type_unsignedshort(self, obj, indent, context): + pass + + def visit_type_int(self, obj, indent, context): + pass + + def visit_type_unsignedint(self, obj, indent, context): + pass + + def visit_type_hyper(self, obj, indent, context): + pass + + def visit_type_unsignedhyper(self, obj, indent, context): + pass + + def visit_type_bool(self, obj, indent, context): + pass + + def visit_type_float(self, obj, indent, context): + pass + + def visit_type_double(self, obj, indent, context): + pass + + def visit_type_enum(self, obj, indent, context): + pass + + def visit_type_struct(self, obj, indent, context): + pass + + def visit_type_union(self, obj, indent, context): + pass + + def visit_enum_value(self, obj, indent, context): + pass + + def visit_enum_body(self, obj, indent, context): + pass + + def visit_struct_body(self, obj, indent, context): + pass + + def visit_union_case(self, obj, indent, context): + pass + + def visit_union_body(self, obj, indent, context): + pass --=20 2.39.1 From nobody Fri Apr 19 11:08:17 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of redhat.com designates 170.10.133.124 as permitted sender) client-ip=170.10.133.124; envelope-from=libvir-list-bounces@redhat.com; helo=us-smtp-delivery-124.mimecast.com; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 170.10.133.124 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1678293577; cv=none; d=zohomail.com; s=zohoarc; b=dIcF26KDV6oErXVvHc8+FkPcyXCCRndtgd+85d+HGdnVNG7vZV8eXHSyrr6HTy9oBfp5gL75kle44Q+DjXlmTWv7HRkIwcmiHL/Dky7lJ3sihepblU8ZKGvXbOB03TaKXHkSfmtr5XqcLOaV+lXcj62cBXS/w0U/wv7094nNSNI= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1678293577; h=Content-Type:Content-Transfer-Encoding:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=XUnMtHZrBwbpTByV82xiuGIeg963sjQG3MWnFHFdtRg=; b=aCfWjKisf8WzSAIHi2NGQ4T5HWc8nlurYhqkVFE7RH16LAF2DPROoPyaane9FLZACN+bbL3nod3oAwvwhwMT4vgEJg0Zym/3sJEx6+BUTAZiquXqYamIzxuqErxqHlIA/EyZYnkEycPyP+bH6kNjDY6/sysdSBzlKTJ+yTZvcbE= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 170.10.133.124 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by mx.zohomail.com with SMTPS id 1678293577742923.5927262257832; Wed, 8 Mar 2023 08:39:37 -0800 (PST) Received: from mimecast-mx02.redhat.com (mx3-rdu2.redhat.com [66.187.233.73]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-620-4aMjoGCINIOITGcXUViHtA-1; Wed, 08 Mar 2023 11:39:32 -0500 Received: from smtp.corp.redhat.com (int-mx09.intmail.prod.int.rdu2.redhat.com [10.11.54.9]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 6EF021C0758F; Wed, 8 Mar 2023 16:39:22 +0000 (UTC) Received: from mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com (unknown [10.30.29.100]) by smtp.corp.redhat.com (Postfix) with ESMTP id 01FAC492B08; Wed, 8 Mar 2023 16:39:22 +0000 (UTC) Received: from mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com (localhost [IPv6:::1]) by mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com (Postfix) with ESMTP id 99E961946A51; Wed, 8 Mar 2023 16:39:20 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.rdu2.redhat.com [10.11.54.3]) by mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com (Postfix) with ESMTP id 1799F1946A5E for ; Wed, 8 Mar 2023 16:39:19 +0000 (UTC) Received: by smtp.corp.redhat.com (Postfix) id F1C881121330; Wed, 8 Mar 2023 16:39:18 +0000 (UTC) Received: from virtlab420.virt.lab.eng.bos.redhat.com (virtlab420.virt.lab.eng.bos.redhat.com [10.19.152.148]) by smtp.corp.redhat.com (Postfix) with ESMTP id CDC111121314; Wed, 8 Mar 2023 16:39:18 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1678293576; h=from:from:sender:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:list-id:list-help: list-unsubscribe:list-subscribe:list-post; bh=XUnMtHZrBwbpTByV82xiuGIeg963sjQG3MWnFHFdtRg=; b=Xv3i9Ca9upPD1LbWdT10OAgeCOUWKtDYvWncmrLjY5Zwd2mprA5eXsyN06t3sZvrwvePzq yTi8ca9VYvvklYeY32S6GQGRN91efxyshGFats53+kdYGXGTfAxtashSxmkeK8oODfaok4 XWEg4IO18vPl2Bo9M6EACMc4Gh3upJY= X-MC-Unique: 4aMjoGCINIOITGcXUViHtA-1 X-Original-To: libvir-list@listman.corp.redhat.com From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= To: libvir-list@redhat.com Subject: [PATCH 08/16] rpcgen: add a C code generator for XDR protocol specs Date: Wed, 8 Mar 2023 11:39:05 -0500 Message-Id: <20230308163913.338952-9-berrange@redhat.com> In-Reply-To: <20230308163913.338952-1-berrange@redhat.com> References: <20230308163913.338952-1-berrange@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.1 on 10.11.54.3 X-BeenThere: libvir-list@redhat.com X-Mailman-Version: 2.1.29 Precedence: list List-Id: Development discussions about the libvirt library & tools List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: libvir-list-bounces@redhat.com Sender: "libvir-list" X-Scanned-By: MIMEDefang 3.1 on 10.11.54.9 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1678293578752100003 This implements a C code generator that emits code that is (almost) identical to the classic 'rpcgen' program. The key differences are: - Skip inlining of calls for struct fields - Skip K&R style function prototypes in headers - Use int64_t instead of quad_t for OS portability - Saner whitespace / indentation The tests/demo.c and tests/demo.h files were created using the traditional 'rpcgen' program, and then editted to cut out the leading boilerplate, and the differences mentioned above. Signed-off-by: Daniel P. Berrang=C3=A9 Reviewed-by: Michal Privoznik --- build-aux/syntax-check.mk | 4 +- scripts/rpcgen/rpcgen/generator.py | 467 +++++++++++++++++++++++++ scripts/rpcgen/tests/demo.c | 351 +++++++++++++++++++ scripts/rpcgen/tests/demo.h | 216 ++++++++++++ scripts/rpcgen/tests/demo.x | 128 +++++++ scripts/rpcgen/tests/meson.build | 1 + scripts/rpcgen/tests/test_generator.py | 55 +++ 7 files changed, 1221 insertions(+), 1 deletion(-) create mode 100644 scripts/rpcgen/rpcgen/generator.py create mode 100644 scripts/rpcgen/tests/demo.c create mode 100644 scripts/rpcgen/tests/demo.h create mode 100644 scripts/rpcgen/tests/demo.x create mode 100644 scripts/rpcgen/tests/test_generator.py diff --git a/build-aux/syntax-check.mk b/build-aux/syntax-check.mk index 6d82a4301a..375fad188b 100644 --- a/build-aux/syntax-check.mk +++ b/build-aux/syntax-check.mk @@ -1429,7 +1429,7 @@ exclude_file_name_regexp--sc_prohibit_xmlURI =3D ^src= /util/viruri\.c$$ exclude_file_name_regexp--sc_prohibit_return_as_function =3D \.py$$ =20 exclude_file_name_regexp--sc_require_config_h =3D \ - ^(examples/|tools/virsh-edit\.c$$|tests/virmockstathelpers.c) + ^(examples/c/.*/.*\.c|tools/virsh-edit\.c|tests/virmockstathelpers\.c|scr= ipts/rpcgen/tests/demo\.c)$$ =20 exclude_file_name_regexp--sc_require_config_h_first =3D \ ^(examples/|tools/virsh-edit\.c$$|tests/virmockstathelpers.c) @@ -1493,6 +1493,8 @@ exclude_file_name_regexp--sc_prohibit_strcmp =3D \ exclude_file_name_regexp--sc_prohibit_select =3D \ ^build-aux/syntax-check\.mk|src/util/vireventglibwatch\.c|tests/meson\.b= uild$$ =20 +exclude_file_name_regexp--sc_header-ifdef =3D \ + ^scripts/rpcgen/tests/demo\.[ch]$$ =20 exclude_file_name_regexp--sc_black =3D \ ^tools/|src/|tests/|ci/|run\.in|scripts/[^/]*\.py diff --git a/scripts/rpcgen/rpcgen/generator.py b/scripts/rpcgen/rpcgen/gen= erator.py new file mode 100644 index 0000000000..110cd12c5e --- /dev/null +++ b/scripts/rpcgen/rpcgen/generator.py @@ -0,0 +1,467 @@ +# SPDX-License-Identifier: LGPL-2.1-or-later + +from .visitor import XDRVisitor +from .parser import ( + XDRTypeString, + XDRTypeVoid, + XDRTypeOpaque, + XDRTypeCustom, + XDRDefinitionTypedef, + XDRDeclarationFixedArray, + XDRDeclarationVariableArray, + XDRDeclarationPointer, +) + + +class XDRTypeDeclarationGenerator(XDRVisitor): + def visit_definition_cescape(self, obj, indent, context): + return obj.code + "\n" + + def visit_definition_constant(self, obj, indent, context): + return "#%sdefine %s %s\n" % (indent, obj.name, obj.value) + + def visit_definition_enum(self, obj, indent, context): + code =3D "%senum %s %s;\n" % ( + indent, + obj.name, + self.visit_object(obj.body, indent), + ) + "%stypedef enum %s %s;\n" % (indent, obj.name, obj.name) + return code + + def visit_definition_struct(self, obj, indent, context): + code =3D "%sstruct %s %s;\n" % ( + indent, + obj.name, + self.visit_object(obj.body, indent), + ) + "%stypedef struct %s %s;\n" % (indent, obj.name, obj.name) + return code + + def visit_definition_union(self, obj, indent, context): + code =3D "%sstruct %s %s;\n" % ( + indent, + obj.name, + self.visit_object(obj.body, indent, obj.name), + ) + "%stypedef struct %s %s;\n" % (indent, obj.name, obj.name) + return code + + def visit_definition_typedef(self, obj, indent, context): + return "%stypedef %s;\n" % (indent, self.visit_object(obj.decl, in= dent)) + + def visit_declaration_scalar(self, obj, indent, context): + return "%s %s" % (self.visit_object(obj.typ, indent), obj.identifi= er) + + def visit_declaration_pointer(self, obj, indent, context): + return "%s *%s" % (self.visit_object(obj.typ, indent), obj.identif= ier) + + def visit_declaration_fixedarray(self, obj, indent, context): + return "%s %s[%s]" % ( + self.visit_object(obj.typ, indent), + obj.identifier, + obj.length, + ) + + def visit_declaration_variablearray(self, obj, indent, context): + if type(obj.typ) =3D=3D XDRTypeString: + return "%schar *%s" % (indent, obj.identifier) + else: + code =3D ( + "%sstruct {\n" % indent + + "%s u_int %s_len;\n" % (indent, obj.identifier) + + "%s %s *%s_val;\n" + % (indent, self.visit_object(obj.typ, ""), obj.identifier) + + "%s} %s" % (indent, obj.identifier) + ) + return code + + def visit_type_custom(self, obj, indent, context): + return "%s%s" % (indent, obj.identifier) + + def visit_type_opaque(self, obj, indent, context): + return "%schar" % indent + + def visit_type_string(self, obj, indent, context): + return "%sstring" % indent + + def visit_type_void(self, obj, indent, context): + return "%svoid" % indent + + def visit_type_char(self, obj, indent, context): + return "%schar" % indent + + def visit_type_unsignedchar(self, obj, indent, context): + return "%su_char" % indent + + def visit_type_short(self, obj, indent, context): + return "%sshort" % indent + + def visit_type_unsignedshort(self, obj, indent, context): + return "%su_short" % indent + + def visit_type_int(self, obj, indent, context): + return "%sint" % indent + + def visit_type_unsignedint(self, obj, indent, context): + return "%su_int" % indent + + def visit_type_hyper(self, obj, indent, context): + return "%sint64_t" % indent + + def visit_type_unsignedhyper(self, obj, indent, context): + return "%suint64_t" % indent + + def visit_type_bool(self, obj, indent, context): + return "%sbool_t" % indent + + def visit_type_float(self, obj, indent, context): + return "%sfloat" % indent + + def visit_type_double(self, obj, indent, context): + return "%sdouble" % indent + + def visit_type_enum(self, obj, indent, context): + return "%senum %s" % (indent, self.visit_object(obj.body.body, ind= ent)) + + def visit_type_struct(self, obj, indent, context): + return "%sstruct %s" % (indent, self.visit_object(obj.body, indent= )) + + def visit_type_union(self, obj, indent, context): + return "%sstruct %s" % (indent, self.visit_object(obj.body, indent= )) + + def visit_enum_value(self, obj, indent, context): + return "%s%s =3D %s" % (indent, obj.name, obj.value) + + def visit_enum_body(self, obj, indent, context): + code =3D "{\n" + for value in obj.values: + code =3D code + self.visit_object(value, indent + " ") + ",= \n" + code =3D code + "%s}" % indent + return code + + def visit_struct_body(self, obj, indent, context): + code =3D "{\n" + for value in obj.fields: + code =3D code + self.visit_object(value, indent + " ") + ";= \n" + code =3D code + "%s}" % indent + return code + + def visit_union_case(self, obj, indent, context): + return self.visit_object(obj.decl, indent) + + def visit_union_body(self, obj, indent, context): + prefix =3D context + if prefix !=3D "": + prefix =3D prefix + "_" + + code =3D ( + "%s{\n" % indent + + "%s %s;\n" % (indent, self.visit_object(obj.discriminator= )) + + "%s union {\n" % indent + ) + for value in obj.cases: + if type(value.decl.typ) =3D=3D XDRTypeVoid: + continue + code =3D code + self.visit_object(value, indent + " ") = + ";\n" + if obj.default is not None and type(obj.default.typ) !=3D XDRTypeV= oid: + code =3D code + self.visit_object(obj.default, indent + " = ") + ";\n" + code =3D code + "%s } %su;\n" % (indent, prefix) + "%s}" % inde= nt + return code + + +class XDRMarshallDeclarationGenerator(XDRVisitor): + def visit_definition_enum(self, obj, indent, context): + return "%sextern bool_t xdr_%s(XDR *, %s*);\n" % (indent, obj.nam= e, obj.name) + + def visit_definition_union(self, obj, indent, context): + return "%sextern bool_t xdr_%s(XDR *, %s*);\n" % (indent, obj.nam= e, obj.name) + + def visit_definition_struct(self, obj, indent, context): + return "%sextern bool_t xdr_%s(XDR *, %s*);\n" % (indent, obj.nam= e, obj.name) + + def visit_definition_typedef(self, obj, indent, context): + if isinstance(obj.decl, XDRDeclarationFixedArray): + return "%sextern bool_t xdr_%s(XDR *, %s);\n" % ( + indent, + obj.decl.identifier, + obj.decl.identifier, + ) + else: + return "%sextern bool_t xdr_%s(XDR *, %s*);\n" % ( + indent, + obj.decl.identifier, + obj.decl.identifier, + ) + + +class XDRMarshallImplementationGenerator(XDRVisitor): + def visit_definition_enum(self, obj, indent, context): + code =3D ( + "%sbool_t\n" % indent + + "%sxdr_%s(XDR *xdrs, %s *objp)\n" % (indent, obj.name, obj.n= ame) + + "%s{\n" % indent + + "%s if (!xdr_enum(xdrs, (enum_t *)objp))\n" % indent + + "%s return FALSE;\n" % indent + + "%s return TRUE;\n" % indent + + "%s}\n" % indent + ) + return code + + def generate_type_call(self, decl, field, typename, embedded=3DFalse, = indent=3D""): + if type(decl.typ) =3D=3D XDRTypeVoid: + return "" + if type(decl) =3D=3D XDRDeclarationFixedArray: + if type(decl.typ) =3D=3D XDRTypeOpaque: + code =3D "%s if (!xdr_%s(xdrs, %s, %s))\n" % ( + indent, + self.visit_object(decl.typ, context=3D"func"), + field, + decl.length, + ) + else: + code =3D "%s if (!xdr_vector(xdrs, (char *)%s, %s,\n" %= ( + indent, + field, + decl.length, + ) + "%s sizeof(%s), (xdrproc_t)xdr_%s))\n" % ( + indent, + self.visit_object(decl.typ), + self.visit_object(decl.typ, context=3D"func"), + ) + elif type(decl) =3D=3D XDRDeclarationVariableArray: + fieldRef =3D "." + pointerStr =3D "" + if embedded: + pointerStr =3D "&" + else: + fieldRef =3D "->" + + if type(decl.typ) =3D=3D XDRTypeString: + code =3D "%s if (!xdr_%s(xdrs, %s%s, %s))\n" % ( + indent, + self.visit_object(decl.typ, context=3D"func"), + pointerStr, + field, + decl.maxlength, + ) + elif type(decl.typ) =3D=3D XDRTypeOpaque: + code =3D "%s if (!xdr_bytes(xdrs, (char **)&%s%s%s_val,= " % ( + indent, + field, + fieldRef, + typename, + ) + "(u_int *) &%s%s%s_len, %s))\n" % ( + field, + fieldRef, + typename, + decl.maxlength, + ) + else: + code =3D ( + "%s if (!xdr_array(xdrs, (char **)&%s%s%s_val, " + % (indent, field, fieldRef, typename) + + "(u_int *) &%s%s%s_len, %s,\n" + % (field, fieldRef, typename, decl.maxlength) + + "%s sizeof(%s), (xdrproc_t)xdr_%s))\n" + % ( + indent, + self.visit_object(decl.typ), + self.visit_object(decl.typ, context=3D"func"), + ) + ) + elif type(decl) =3D=3D XDRDeclarationPointer: + pointerStr =3D "" + if embedded: + pointerStr =3D "&" + + code =3D "%s if (!xdr_pointer(xdrs, (char **)%s%s, " % ( + indent, + pointerStr, + field, + ) + "sizeof(%s), (xdrproc_t)xdr_%s))\n" % ( + self.visit_object(decl.typ, context=3D"func"), + self.visit_object(decl.typ, context=3D"func"), + ) + else: + pointerStr =3D "" + isFixedArray =3D ( + type(decl.typ) =3D=3D XDRTypeCustom + and type(decl.typ.definition) =3D=3D XDRDefinitionTypedef + and type(decl.typ.definition.decl) =3D=3D XDRDeclarationFi= xedArray + ) + + if embedded and not isFixedArray: + pointerStr =3D "&" + + code =3D "%s if (!xdr_%s(xdrs, %s%s))\n" % ( + indent, + self.visit_object(decl.typ, context=3D"func"), + pointerStr, + field, + ) + + code =3D code + "%s return FALSE;\n" % indent + return code + + def visit_definition_union(self, obj, indent, context): + code =3D ( + "%sbool_t\n" % indent + + "%sxdr_%s(XDR *xdrs, %s *objp)\n" % (indent, obj.name, obj.n= ame) + + "%s{\n" % indent + + self.generate_type_call( + obj.body.discriminator, + "objp->%s" % obj.body.discriminator.identifier, + obj.body.discriminator.identifier, + embedded=3DTrue, + indent=3Dindent, + ) + + "%s switch (objp->%s) {\n" + % (indent, obj.body.discriminator.identifier) + ) + + for case in obj.body.cases: + code =3D ( + code + + "%s case %s:\n" % (indent, case.value) + + self.generate_type_call( + case.decl, + "objp->%s_u.%s" % (obj.name, case.decl.identifier), + obj.name, + embedded=3DTrue, + indent=3Dindent + " ", + ) + + "%s break;\n" % indent + ) + + code =3D code + "%s default:\n" % indent + + if obj.body.default is not None: + code =3D ( + code + + self.generate_type_call( + obj.body.default, + "objp->%s_u.%s" % (obj.name, obj.body.default.identifi= er), + obj.name, + embedded=3DTrue, + indent=3Dindent + " ", + ) + + "%s break;\n" % indent + ) + else: + code =3D code + "%s return FALSE;\n" % indent + + code =3D ( + code + + "%s }\n" % indent + + "%s return TRUE;\n" % indent + + "%s}\n" % indent + ) + return code + + def visit_definition_struct(self, obj, indent, context): + code =3D ( + "%sbool_t\n" % indent + + "%sxdr_%s(XDR *xdrs, %s *objp)\n" % (indent, obj.name, obj.n= ame) + + "%s{\n" % indent + ) + for field in obj.body.fields: + code =3D code + self.generate_type_call( + field, + "objp->%s" % field.identifier, + field.identifier, + embedded=3DTrue, + indent=3Dindent, + ) + code =3D code + "%s return TRUE;\n" % indent + "%s}\n" % indent + return code + + def visit_definition_typedef(self, obj, indent, context): + code =3D "%sbool_t\n" % indent + if isinstance(obj.decl, XDRDeclarationFixedArray): + code =3D code + "%sxdr_%s(XDR *xdrs, %s objp)\n" % ( + indent, + obj.decl.identifier, + obj.decl.identifier, + ) + else: + code =3D code + "%sxdr_%s(XDR *xdrs, %s *objp)\n" % ( + indent, + obj.decl.identifier, + obj.decl.identifier, + ) + code =3D ( + code + + "%s{\n" % indent + + self.generate_type_call( + obj.decl, "objp", obj.decl.identifier, embedded=3DFalse, i= ndent=3Dindent + ) + + "%s return TRUE;\n" % indent + + "%s}\n" % indent + ) + return code + + def visit_declaration_pointer(self, obj, indent, context): + return "%s%s *%s" % (indent, self.visit_object(obj.typ), obj.ident= ifier) + + def visit_declaration_fixedarray(self, obj, indent, context): + return "%s%s %s[%s]" % ( + indent, + self.visit_object(obj.typ), + obj.identifier, + obj.length, + ) + + def visit_declaration_variablearray(self, obj, indent, context): + return "%s%s *%s" % (indent, self.visit_object(obj.typ), obj.ident= ifier) + + def visit_type_custom(self, obj, indent, context): + return "%s%s" % (indent, obj.identifier) + + def visit_type_opaque(self, obj, indent, context): + return "%sopaque" % indent + + def visit_type_string(self, obj, indent, context): + return "%sstring" % indent + + def visit_type_char(self, obj, indent, context): + return "%schar" % indent + + def visit_type_unsignedchar(self, obj, indent, context): + return "%su_char" % indent + + def visit_type_short(self, obj, indent, context): + return "%sshort" % indent + + def visit_type_unsignedshort(self, obj, indent, context): + return "%su_short" % indent + + def visit_type_int(self, obj, indent, context): + return "%sint" % indent + + def visit_type_unsignedint(self, obj, indent, context): + return "%su_int" % indent + + def visit_type_hyper(self, obj, indent, context): + return "%sint64_t" % indent + + def visit_type_unsignedhyper(self, obj, indent, context): + if context =3D=3D "func": + return "%su_int64_t" % indent + else: + return "%suint64_t" % indent + + def visit_type_bool(self, obj, indent, context): + if context =3D=3D "func": + return "%sbool" % indent + else: + return "%sbool_t" % indent + + def visit_type_float(self, obj, indent, context): + return "%sfloat" % indent + + def visit_type_double(self, obj, indent, context): + return "%sdouble" % indent + + def visit_enum_value(self, obj, indent, context): + return "%s%s =3D %s" % (indent, obj.name, obj.value) + + def visit_union_case(self, obj, indent, context): + return self.visit_object(obj.value, indent) diff --git a/scripts/rpcgen/tests/demo.c b/scripts/rpcgen/tests/demo.c new file mode 100644 index 0000000000..a261b4fe22 --- /dev/null +++ b/scripts/rpcgen/tests/demo.c @@ -0,0 +1,351 @@ +bool_t +xdr_TestEnum(XDR *xdrs, TestEnum *objp) +{ + if (!xdr_enum(xdrs, (enum_t *)objp)) + return FALSE; + return TRUE; +} + +bool_t +xdr_TestStruct(XDR *xdrs, TestStruct *objp) +{ + if (!xdr_char(xdrs, &objp->c1)) + return FALSE; + if (!xdr_char(xdrs, &objp->c2)) + return FALSE; + return TRUE; +} + +bool_t +xdr_TestUnion(XDR *xdrs, TestUnion *objp) +{ + if (!xdr_int(xdrs, &objp->type)) + return FALSE; + switch (objp->type) { + case 20: + if (!xdr_int(xdrs, &objp->TestUnion_u.i1)) + return FALSE; + break; + case 30: + if (!xdr_int(xdrs, &objp->TestUnion_u.i2)) + return FALSE; + break; + default: + if (!xdr_int(xdrs, &objp->TestUnion_u.i3)) + return FALSE; + break; + } + return TRUE; +} + +bool_t +xdr_TestUnionVoidDefault(XDR *xdrs, TestUnionVoidDefault *objp) +{ + if (!xdr_int(xdrs, &objp->type)) + return FALSE; + switch (objp->type) { + case 21: + if (!xdr_int(xdrs, &objp->TestUnionVoidDefault_u.i1)) + return FALSE; + break; + case 31: + if (!xdr_int(xdrs, &objp->TestUnionVoidDefault_u.i2)) + return FALSE; + break; + default: + break; + } + return TRUE; +} + +bool_t +xdr_TestUnionNoDefault(XDR *xdrs, TestUnionNoDefault *objp) +{ + if (!xdr_int(xdrs, &objp->type)) + return FALSE; + switch (objp->type) { + case 22: + if (!xdr_int(xdrs, &objp->TestUnionNoDefault_u.i1)) + return FALSE; + break; + case 32: + if (!xdr_int(xdrs, &objp->TestUnionNoDefault_u.i2)) + return FALSE; + break; + default: + return FALSE; + } + return TRUE; +} + +bool_t +xdr_TestIntScalar(XDR *xdrs, TestIntScalar *objp) +{ + if (!xdr_int(xdrs, objp)) + return FALSE; + return TRUE; +} + +bool_t +xdr_TestIntPointer(XDR *xdrs, TestIntPointer *objp) +{ + if (!xdr_pointer(xdrs, (char **)objp, sizeof(int), (xdrproc_t)xdr_int)) + return FALSE; + return TRUE; +} + +bool_t +xdr_TestIntFixedArray(XDR *xdrs, TestIntFixedArray objp) +{ + if (!xdr_vector(xdrs, (char *)objp, 3, + sizeof(int), (xdrproc_t)xdr_int)) + return FALSE; + return TRUE; +} + +bool_t +xdr_TestIntVariableArray(XDR *xdrs, TestIntVariableArray *objp) +{ + if (!xdr_array(xdrs, (char **)&objp->TestIntVariableArray_val, (u_int = *) &objp->TestIntVariableArray_len, 5, + sizeof(int), (xdrproc_t)xdr_int)) + return FALSE; + return TRUE; +} + +bool_t +xdr_TestStringVariableArray(XDR *xdrs, TestStringVariableArray *objp) +{ + if (!xdr_string(xdrs, objp, 7)) + return FALSE; + return TRUE; +} + +bool_t +xdr_TestOpaqueFixedArray(XDR *xdrs, TestOpaqueFixedArray objp) +{ + if (!xdr_opaque(xdrs, objp, 9)) + return FALSE; + return TRUE; +} + +bool_t +xdr_TestOpaqueVariableArray(XDR *xdrs, TestOpaqueVariableArray *objp) +{ + if (!xdr_bytes(xdrs, (char **)&objp->TestOpaqueVariableArray_val, (u_i= nt *) &objp->TestOpaqueVariableArray_len, 11)) + return FALSE; + return TRUE; +} + +bool_t +xdr_TestEnumScalar(XDR *xdrs, TestEnumScalar *objp) +{ + if (!xdr_TestEnum(xdrs, objp)) + return FALSE; + return TRUE; +} + +bool_t +xdr_TestEnumPointer(XDR *xdrs, TestEnumPointer *objp) +{ + if (!xdr_pointer(xdrs, (char **)objp, sizeof(TestEnum), (xdrproc_t)xdr= _TestEnum)) + return FALSE; + return TRUE; +} + +bool_t +xdr_TestEnumFixedArray(XDR *xdrs, TestEnumFixedArray objp) +{ + if (!xdr_vector(xdrs, (char *)objp, 13, + sizeof(TestEnum), (xdrproc_t)xdr_TestEnum)) + return FALSE; + return TRUE; +} + +bool_t +xdr_TestEnumVariableArray(XDR *xdrs, TestEnumVariableArray *objp) +{ + if (!xdr_array(xdrs, (char **)&objp->TestEnumVariableArray_val, (u_int= *) &objp->TestEnumVariableArray_len, 15, + sizeof(TestEnum), (xdrproc_t)xdr_TestEnum)) + return FALSE; + return TRUE; +} + +bool_t +xdr_TestStructScalar(XDR *xdrs, TestStructScalar *objp) +{ + if (!xdr_TestStruct(xdrs, objp)) + return FALSE; + return TRUE; +} + +bool_t +xdr_TestStructPointer(XDR *xdrs, TestStructPointer *objp) +{ + if (!xdr_pointer(xdrs, (char **)objp, sizeof(TestStruct), (xdrproc_t)x= dr_TestStruct)) + return FALSE; + return TRUE; +} + +bool_t +xdr_TestStructFixedArray(XDR *xdrs, TestStructFixedArray objp) +{ + if (!xdr_vector(xdrs, (char *)objp, 17, + sizeof(TestStruct), (xdrproc_t)xdr_TestStruct)) + return FALSE; + return TRUE; +} + +bool_t +xdr_TestStructVariableArray(XDR *xdrs, TestStructVariableArray *objp) +{ + if (!xdr_array(xdrs, (char **)&objp->TestStructVariableArray_val, (u_i= nt *) &objp->TestStructVariableArray_len, 19, + sizeof(TestStruct), (xdrproc_t)xdr_TestStruct)) + return FALSE; + return TRUE; +} + +bool_t +xdr_TestUnionScalar(XDR *xdrs, TestUnionScalar *objp) +{ + if (!xdr_TestUnion(xdrs, objp)) + return FALSE; + return TRUE; +} + +bool_t +xdr_TestUnionPointer(XDR *xdrs, TestUnionPointer *objp) +{ + if (!xdr_pointer(xdrs, (char **)objp, sizeof(TestUnion), (xdrproc_t)xd= r_TestUnion)) + return FALSE; + return TRUE; +} + +bool_t +xdr_TestUnionFixedArray(XDR *xdrs, TestUnionFixedArray objp) +{ + if (!xdr_vector(xdrs, (char *)objp, 21, + sizeof(TestUnion), (xdrproc_t)xdr_TestUnion)) + return FALSE; + return TRUE; +} + +bool_t +xdr_TestUnionVariableArray(XDR *xdrs, TestUnionVariableArray *objp) +{ + if (!xdr_array(xdrs, (char **)&objp->TestUnionVariableArray_val, (u_in= t *) &objp->TestUnionVariableArray_len, 23, + sizeof(TestUnion), (xdrproc_t)xdr_TestUnion)) + return FALSE; + return TRUE; +} + +bool_t +xdr_TestStructAllTypes(XDR *xdrs, TestStructAllTypes *objp) +{ + if (!xdr_char(xdrs, &objp->sc)) + return FALSE; + if (!xdr_u_char(xdrs, &objp->suc)) + return FALSE; + if (!xdr_short(xdrs, &objp->ss)) + return FALSE; + if (!xdr_u_short(xdrs, &objp->sus)) + return FALSE; + if (!xdr_int(xdrs, &objp->si)) + return FALSE; + if (!xdr_u_int(xdrs, &objp->sui)) + return FALSE; + if (!xdr_int64_t(xdrs, &objp->sh)) + return FALSE; + if (!xdr_u_int64_t(xdrs, &objp->suh)) + return FALSE; + if (!xdr_bool(xdrs, &objp->sb)) + return FALSE; + if (!xdr_float(xdrs, &objp->sf)) + return FALSE; + if (!xdr_double(xdrs, &objp->sd)) + return FALSE; + if (!xdr_pointer(xdrs, (char **)&objp->ip, sizeof(int), (xdrproc_t)xdr= _int)) + return FALSE; + if (!xdr_vector(xdrs, (char *)objp->ifa, TestConstDec, + sizeof(int), (xdrproc_t)xdr_int)) + return FALSE; + if (!xdr_array(xdrs, (char **)&objp->iva.iva_val, (u_int *) &objp->iva= .iva_len, TestConstHex, + sizeof(int), (xdrproc_t)xdr_int)) + return FALSE; + if (!xdr_string(xdrs, &objp->stva, TestConstOct)) + return FALSE; + if (!xdr_opaque(xdrs, objp->ofa, 33)) + return FALSE; + if (!xdr_bytes(xdrs, (char **)&objp->ova.ova_val, (u_int *) &objp->ova= .ova_len, 35)) + return FALSE; + if (!xdr_TestEnum(xdrs, &objp->e1)) + return FALSE; + if (!xdr_TestEnum(xdrs, &objp->e2)) + return FALSE; + if (!xdr_pointer(xdrs, (char **)&objp->ep, sizeof(TestEnum), (xdrproc_= t)xdr_TestEnum)) + return FALSE; + if (!xdr_vector(xdrs, (char *)objp->efa, 37, + sizeof(TestEnum), (xdrproc_t)xdr_TestEnum)) + return FALSE; + if (!xdr_array(xdrs, (char **)&objp->eva.eva_val, (u_int *) &objp->eva= .eva_len, 39, + sizeof(TestEnum), (xdrproc_t)xdr_TestEnum)) + return FALSE; + if (!xdr_TestStruct(xdrs, &objp->s)) + return FALSE; + if (!xdr_pointer(xdrs, (char **)&objp->sp, sizeof(TestStruct), (xdrpro= c_t)xdr_TestStruct)) + return FALSE; + if (!xdr_vector(xdrs, (char *)objp->sfa, 41, + sizeof(TestStruct), (xdrproc_t)xdr_TestStruct)) + return FALSE; + if (!xdr_array(xdrs, (char **)&objp->sva.sva_val, (u_int *) &objp->sva= .sva_len, 43, + sizeof(TestStruct), (xdrproc_t)xdr_TestStruct)) + return FALSE; + if (!xdr_TestUnion(xdrs, &objp->u)) + return FALSE; + if (!xdr_pointer(xdrs, (char **)&objp->up, sizeof(TestUnion), (xdrproc= _t)xdr_TestUnion)) + return FALSE; + if (!xdr_vector(xdrs, (char *)objp->ufa, 45, + sizeof(TestUnion), (xdrproc_t)xdr_TestUnion)) + return FALSE; + if (!xdr_array(xdrs, (char **)&objp->uva.uva_val, (u_int *) &objp->uva= .uva_len, 47, + sizeof(TestUnion), (xdrproc_t)xdr_TestUnion)) + return FALSE; + if (!xdr_TestIntScalar(xdrs, &objp->tis)) + return FALSE; + if (!xdr_TestIntPointer(xdrs, &objp->tip)) + return FALSE; + if (!xdr_TestIntFixedArray(xdrs, objp->tifa)) + return FALSE; + if (!xdr_TestIntVariableArray(xdrs, &objp->tiva)) + return FALSE; + if (!xdr_TestStringVariableArray(xdrs, &objp->tstva)) + return FALSE; + if (!xdr_TestOpaqueFixedArray(xdrs, objp->tofa)) + return FALSE; + if (!xdr_TestOpaqueVariableArray(xdrs, &objp->tova)) + return FALSE; + if (!xdr_TestEnumScalar(xdrs, &objp->tes)) + return FALSE; + if (!xdr_TestEnumPointer(xdrs, &objp->tep)) + return FALSE; + if (!xdr_TestEnumFixedArray(xdrs, objp->tefa)) + return FALSE; + if (!xdr_TestEnumVariableArray(xdrs, &objp->teva)) + return FALSE; + if (!xdr_TestStructScalar(xdrs, &objp->tss)) + return FALSE; + if (!xdr_TestStructPointer(xdrs, &objp->tsp)) + return FALSE; + if (!xdr_TestStructFixedArray(xdrs, objp->tsfa)) + return FALSE; + if (!xdr_TestStructVariableArray(xdrs, &objp->tsva)) + return FALSE; + if (!xdr_TestUnionScalar(xdrs, &objp->tu)) + return FALSE; + if (!xdr_TestUnionPointer(xdrs, &objp->tup)) + return FALSE; + if (!xdr_TestUnionFixedArray(xdrs, objp->tufa)) + return FALSE; + if (!xdr_TestUnionVariableArray(xdrs, &objp->tuva)) + return FALSE; + return TRUE; +} diff --git a/scripts/rpcgen/tests/demo.h b/scripts/rpcgen/tests/demo.h new file mode 100644 index 0000000000..6fac61e7e9 --- /dev/null +++ b/scripts/rpcgen/tests/demo.h @@ -0,0 +1,216 @@ +enum TestEnum { + TEST_ENUM_ONE =3D 1, + TEST_ENUM_TWO =3D 2, +}; +typedef enum TestEnum TestEnum; + +struct TestStruct { + char c1; + char c2; +}; +typedef struct TestStruct TestStruct; + +struct TestUnion { + int type; + union { + int i1; + int i2; + int i3; + } TestUnion_u; +}; +typedef struct TestUnion TestUnion; + +struct TestUnionVoidDefault { + int type; + union { + int i1; + int i2; + } TestUnionVoidDefault_u; +}; +typedef struct TestUnionVoidDefault TestUnionVoidDefault; + +struct TestUnionNoDefault { + int type; + union { + int i1; + int i2; + } TestUnionNoDefault_u; +}; +typedef struct TestUnionNoDefault TestUnionNoDefault; + +typedef int TestIntScalar; + +typedef int *TestIntPointer; + +typedef int TestIntFixedArray[3]; + +typedef struct { + u_int TestIntVariableArray_len; + int *TestIntVariableArray_val; +} TestIntVariableArray; + +typedef char *TestStringVariableArray; + +typedef char TestOpaqueFixedArray[9]; + +typedef struct { + u_int TestOpaqueVariableArray_len; + char *TestOpaqueVariableArray_val; +} TestOpaqueVariableArray; + +typedef TestEnum TestEnumScalar; + +typedef TestEnum *TestEnumPointer; + +typedef TestEnum TestEnumFixedArray[13]; + +typedef struct { + u_int TestEnumVariableArray_len; + TestEnum *TestEnumVariableArray_val; +} TestEnumVariableArray; + +typedef TestStruct TestStructScalar; + +typedef TestStruct *TestStructPointer; + +typedef TestStruct TestStructFixedArray[17]; + +typedef struct { + u_int TestStructVariableArray_len; + TestStruct *TestStructVariableArray_val; +} TestStructVariableArray; + +typedef TestUnion TestUnionScalar; + +typedef TestUnion *TestUnionPointer; + +typedef TestUnion TestUnionFixedArray[21]; + +typedef struct { + u_int TestUnionVariableArray_len; + TestUnion *TestUnionVariableArray_val; +} TestUnionVariableArray; + +#define TestConstDec 25 + +#define TestConstHex 0x27 + +#define TestConstOct 031 + +struct TestStructAllTypes { + char sc; + u_char suc; + short ss; + u_short sus; + int si; + u_int sui; + int64_t sh; + uint64_t suh; + bool_t sb; + float sf; + double sd; + int *ip; + int ifa[TestConstDec]; + struct { + u_int iva_len; + int *iva_val; + } iva; + char *stva; + char ofa[33]; + struct { + u_int ova_len; + char *ova_val; + } ova; + TestEnum e1; + TestEnum e2; + TestEnum *ep; + TestEnum efa[37]; + struct { + u_int eva_len; + TestEnum *eva_val; + } eva; + TestStruct s; + TestStruct *sp; + TestStruct sfa[41]; + struct { + u_int sva_len; + TestStruct *sva_val; + } sva; + TestUnion u; + TestUnion *up; + TestUnion ufa[45]; + struct { + u_int uva_len; + TestUnion *uva_val; + } uva; + TestIntScalar tis; + TestIntPointer tip; + TestIntFixedArray tifa; + TestIntVariableArray tiva; + TestStringVariableArray tstva; + TestOpaqueFixedArray tofa; + TestOpaqueVariableArray tova; + TestEnumScalar tes; + TestEnumPointer tep; + TestEnumFixedArray tefa; + TestEnumVariableArray teva; + TestStructScalar tss; + TestStructPointer tsp; + TestStructFixedArray tsfa; + TestStructVariableArray tsva; + TestUnionScalar tu; + TestUnionPointer tup; + TestUnionFixedArray tufa; + TestUnionVariableArray tuva; +}; +typedef struct TestStructAllTypes TestStructAllTypes; + +extern bool_t xdr_TestEnum(XDR *, TestEnum*); + +extern bool_t xdr_TestStruct(XDR *, TestStruct*); + +extern bool_t xdr_TestUnion(XDR *, TestUnion*); + +extern bool_t xdr_TestUnionVoidDefault(XDR *, TestUnionVoidDefault*); + +extern bool_t xdr_TestUnionNoDefault(XDR *, TestUnionNoDefault*); + +extern bool_t xdr_TestIntScalar(XDR *, TestIntScalar*); + +extern bool_t xdr_TestIntPointer(XDR *, TestIntPointer*); + +extern bool_t xdr_TestIntFixedArray(XDR *, TestIntFixedArray); + +extern bool_t xdr_TestIntVariableArray(XDR *, TestIntVariableArray*); + +extern bool_t xdr_TestStringVariableArray(XDR *, TestStringVariableArray*= ); + +extern bool_t xdr_TestOpaqueFixedArray(XDR *, TestOpaqueFixedArray); + +extern bool_t xdr_TestOpaqueVariableArray(XDR *, TestOpaqueVariableArray*= ); + +extern bool_t xdr_TestEnumScalar(XDR *, TestEnumScalar*); + +extern bool_t xdr_TestEnumPointer(XDR *, TestEnumPointer*); + +extern bool_t xdr_TestEnumFixedArray(XDR *, TestEnumFixedArray); + +extern bool_t xdr_TestEnumVariableArray(XDR *, TestEnumVariableArray*); + +extern bool_t xdr_TestStructScalar(XDR *, TestStructScalar*); + +extern bool_t xdr_TestStructPointer(XDR *, TestStructPointer*); + +extern bool_t xdr_TestStructFixedArray(XDR *, TestStructFixedArray); + +extern bool_t xdr_TestStructVariableArray(XDR *, TestStructVariableArray*= ); + +extern bool_t xdr_TestUnionScalar(XDR *, TestUnionScalar*); + +extern bool_t xdr_TestUnionPointer(XDR *, TestUnionPointer*); + +extern bool_t xdr_TestUnionFixedArray(XDR *, TestUnionFixedArray); + +extern bool_t xdr_TestUnionVariableArray(XDR *, TestUnionVariableArray*); + +extern bool_t xdr_TestStructAllTypes(XDR *, TestStructAllTypes*); diff --git a/scripts/rpcgen/tests/demo.x b/scripts/rpcgen/tests/demo.x new file mode 100644 index 0000000000..ec69913f3d --- /dev/null +++ b/scripts/rpcgen/tests/demo.x @@ -0,0 +1,128 @@ +enum TestEnum { + TEST_ENUM_ONE =3D 1, + TEST_ENUM_TWO =3D 2 +}; + +struct TestStruct { + char c1; + char c2; +}; + +union TestUnion switch (int type) { + case 20: + int i1; + case 30: + int i2; + default: + int i3; +}; + +union TestUnionVoidDefault switch (int type) { + case 21: + int i1; + case 31: + int i2; + default: + void; +}; + +union TestUnionNoDefault switch (int type) { + case 22: + int i1; + case 32: + int i2; +}; + +typedef int TestIntScalar; +typedef int *TestIntPointer; +typedef int TestIntFixedArray[3]; +typedef int TestIntVariableArray<5>; + +typedef string TestStringVariableArray<7>; + +typedef opaque TestOpaqueFixedArray[9]; +typedef opaque TestOpaqueVariableArray<11>; + +typedef TestEnum TestEnumScalar; +typedef TestEnum *TestEnumPointer; +typedef TestEnum TestEnumFixedArray[13]; +typedef TestEnum TestEnumVariableArray<15>; + +typedef TestStruct TestStructScalar; +typedef TestStruct *TestStructPointer; +typedef TestStruct TestStructFixedArray[17]; +typedef TestStruct TestStructVariableArray<19>; + +typedef TestUnion TestUnionScalar; +typedef TestUnion *TestUnionPointer; +typedef TestUnion TestUnionFixedArray[21]; +typedef TestUnion TestUnionVariableArray<23>; + +const TestConstDec =3D 25; +const TestConstHex =3D 0x27; +const TestConstOct =3D 031; + +struct TestStructAllTypes { + char sc; + unsigned char suc; + short ss; + unsigned short sus; + int si; + unsigned int sui; + hyper sh; + unsigned hyper suh; + bool sb; + float sf; + double sd; +/* quadruple sq; */ + + int *ip; + int ifa[TestConstDec]; + int iva; + + string stva; + + opaque ofa[33]; + opaque ova<35>; + + TestEnum e1; + TestEnum e2; + TestEnum *ep; + TestEnum efa[37]; + TestEnum eva<39>; + + TestStruct s; + TestStruct *sp; + TestStruct sfa[41]; + TestStruct sva<43>; + + TestUnion u; + TestUnion *up; + TestUnion ufa[45]; + TestUnion uva<47>; + + TestIntScalar tis; + TestIntPointer tip; + TestIntFixedArray tifa; + TestIntVariableArray tiva; + + TestStringVariableArray tstva; + + TestOpaqueFixedArray tofa; + TestOpaqueVariableArray tova; + + TestEnumScalar tes; + TestEnumPointer tep; + TestEnumFixedArray tefa; + TestEnumVariableArray teva; + + TestStructScalar tss; + TestStructPointer tsp; + TestStructFixedArray tsfa; + TestStructVariableArray tsva; + + TestUnionScalar tu; + TestUnionPointer tup; + TestUnionFixedArray tufa; + TestUnionVariableArray tuva; +}; diff --git a/scripts/rpcgen/tests/meson.build b/scripts/rpcgen/tests/meson.= build index 4b1ea308ce..953a3dbede 100644 --- a/scripts/rpcgen/tests/meson.build +++ b/scripts/rpcgen/tests/meson.build @@ -1,4 +1,5 @@ rpcgen_tests =3D files([ + 'test_generator.py', 'test_lexer.py', 'test_parser.py', ]) diff --git a/scripts/rpcgen/tests/test_generator.py b/scripts/rpcgen/tests/= test_generator.py new file mode 100644 index 0000000000..bc7660a6fc --- /dev/null +++ b/scripts/rpcgen/tests/test_generator.py @@ -0,0 +1,55 @@ +# SPDX-License-Identifier: LGPL-2.1-or-later + +import os +from pathlib import Path + +from rpcgen.parser import XDRParser +from rpcgen.generator import ( + XDRTypeDeclarationGenerator, + XDRMarshallDeclarationGenerator, + XDRMarshallImplementationGenerator, +) + + +def test_generate_header(): + x =3D Path(Path(__file__).parent, "demo.x") + h =3D Path(Path(__file__).parent, "demo.h") + with x.open("r") as fp: + parser =3D XDRParser(fp) + spec =3D parser.parse() + + got =3D ( + XDRTypeDeclarationGenerator(spec).visit() + + "\n" + + XDRMarshallDeclarationGenerator(spec).visit() + ) + + with h.open("r") as fp: + want =3D fp.read() + + if "VIR_TEST_REGENERATE_OUTPUT" in os.environ: + want =3D got + with h.open("w") as fp: + fp.write(want) + + assert got =3D=3D want + + +def test_generate_source(): + x =3D Path(Path(__file__).parent, "demo.x") + h =3D Path(Path(__file__).parent, "demo.c") + with x.open("r") as fp: + parser =3D XDRParser(fp) + spec =3D parser.parse() + + got =3D XDRMarshallImplementationGenerator(spec).visit() + + with h.open("r") as fp: + want =3D fp.read() + + if "VIR_TEST_REGENERATE_OUTPUT" in os.environ: + want =3D got + with h.open("w") as fp: + fp.write(want) + + assert got =3D=3D want --=20 2.39.1 From nobody Fri Apr 19 11:08:17 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of redhat.com designates 170.10.133.124 as permitted sender) client-ip=170.10.133.124; envelope-from=libvir-list-bounces@redhat.com; helo=us-smtp-delivery-124.mimecast.com; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 170.10.133.124 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1678293590; cv=none; d=zohomail.com; s=zohoarc; b=H1zgUYamIi/786dMaRbonS6WYRyqbJ5o46cbGmudsSokfNISS0g+AQ5dQ3HrUvIz30/e0Wqy6oafBekvZquIXKQluwoVCzlSBx1B1LZ4uDDokwnkplY1/OTg/aj51X148RYyG4PxL8jC5Up/m4D3myVEtY4mlQaWBbxdBEpZw6c= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1678293590; h=Content-Type:Content-Transfer-Encoding:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=6Z3ZcKEsGYRAW6ZxzUgfBnL4XxMuvtFrZO2SjmjM6N4=; b=dtwNqQ3XxfEzGj94hMRnOt6XI3FcWnnuQqNB2NnKuPV2GugvVsfQgCPlQfUmaMXaNumLl6p9DoJudDB2bybi8MutB1ixZkloc6+/cqb5oB2S9zi85GsMYdReWR244DtMTFFtQftB+9sAaBA0kgd53PNhErc+CG+OR1/N5jLOQQM= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 170.10.133.124 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by mx.zohomail.com with SMTPS id 1678293590373445.21447283291866; Wed, 8 Mar 2023 08:39:50 -0800 (PST) Received: from mimecast-mx02.redhat.com (mx3-rdu2.redhat.com [66.187.233.73]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-504-PyCEWoHEOgSq0GOaQSnvKg-1; Wed, 08 Mar 2023 11:39:42 -0500 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.rdu2.redhat.com [10.11.54.6]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 356103C10249; Wed, 8 Mar 2023 16:39:25 +0000 (UTC) Received: from mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com (unknown [10.30.29.100]) by smtp.corp.redhat.com (Postfix) with ESMTP id 220322166B26; Wed, 8 Mar 2023 16:39:25 +0000 (UTC) Received: from mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com (localhost [IPv6:::1]) by mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com (Postfix) with ESMTP id 1D365194864E; Wed, 8 Mar 2023 16:39:22 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.rdu2.redhat.com [10.11.54.3]) by mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com (Postfix) with ESMTP id 48AAC1946A6E for ; Wed, 8 Mar 2023 16:39:19 +0000 (UTC) Received: by smtp.corp.redhat.com (Postfix) id 2E0921121330; Wed, 8 Mar 2023 16:39:19 +0000 (UTC) Received: from virtlab420.virt.lab.eng.bos.redhat.com (virtlab420.virt.lab.eng.bos.redhat.com [10.19.152.148]) by smtp.corp.redhat.com (Postfix) with ESMTP id 0A89C1121314; Wed, 8 Mar 2023 16:39:19 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1678293589; h=from:from:sender:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:list-id:list-help: list-unsubscribe:list-subscribe:list-post; bh=6Z3ZcKEsGYRAW6ZxzUgfBnL4XxMuvtFrZO2SjmjM6N4=; b=I0DeZDN661uTI5O1hLBqCCT4Lj5Vq9NxvvvdRVQ3Q8AsXD6aXw71nJWKENVKF0l7ak+zj4 uY5Lw1nNOC9PKzp+biXf89pwFVWPjthrlnw7/9DlBq8byAEjWWzL/SVvhnI1D9mzsL7noR XR0ybYr7xoDfhewZMq7j7V21dn1ZI9c= X-MC-Unique: PyCEWoHEOgSq0GOaQSnvKg-1 X-Original-To: libvir-list@listman.corp.redhat.com From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= To: libvir-list@redhat.com Subject: [PATCH 09/16] rpcgen: add test case for XDR serialization Date: Wed, 8 Mar 2023 11:39:06 -0500 Message-Id: <20230308163913.338952-10-berrange@redhat.com> In-Reply-To: <20230308163913.338952-1-berrange@redhat.com> References: <20230308163913.338952-1-berrange@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.1 on 10.11.54.3 X-BeenThere: libvir-list@redhat.com X-Mailman-Version: 2.1.29 Precedence: list List-Id: Development discussions about the libvirt library & tools List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: libvir-list-bounces@redhat.com Sender: "libvir-list" X-Scanned-By: MIMEDefang 3.1 on 10.11.54.6 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1678293591134100002 Test the serialization done by libtirpc, so that when we later switch to our own code, we can prove wire compatibility. Signed-off-by: Daniel P. Berrang=C3=A9 Reviewed-by: Michal Privoznik --- build-aux/syntax-check.mk | 11 +- scripts/rpcgen/tests/demo.x | 1 - scripts/rpcgen/tests/meson.build | 15 + scripts/rpcgen/tests/test_demo.c | 789 ++++++++++++++++++ scripts/rpcgen/tests/test_demo_enum.bin | Bin 0 -> 4 bytes .../tests/test_demo_enum_fixed_array.bin | Bin 0 -> 52 bytes .../tests/test_demo_enum_pointer_null.bin | Bin 0 -> 4 bytes .../tests/test_demo_enum_pointer_set.bin | Bin 0 -> 8 bytes .../rpcgen/tests/test_demo_enum_scalar.bin | Bin 0 -> 4 bytes .../test_demo_enum_variable_array_empty.bin | Bin 0 -> 4 bytes .../test_demo_enum_variable_array_set.bin | Bin 0 -> 16 bytes .../tests/test_demo_int_fixed_array.bin | Bin 0 -> 12 bytes .../tests/test_demo_int_pointer_null.bin | Bin 0 -> 4 bytes .../tests/test_demo_int_pointer_set.bin | Bin 0 -> 8 bytes scripts/rpcgen/tests/test_demo_int_scalar.bin | Bin 0 -> 4 bytes .../test_demo_int_variable_array_empty.bin | Bin 0 -> 4 bytes .../test_demo_int_variable_array_set.bin | Bin 0 -> 16 bytes .../tests/test_demo_opaque_fixed_array.bin | Bin 0 -> 12 bytes .../test_demo_opaque_variable_array_empty.bin | Bin 0 -> 4 bytes .../test_demo_opaque_variable_array_set.bin | Bin 0 -> 8 bytes .../test_demo_string_variable_array_empty.bin | Bin 0 -> 4 bytes .../test_demo_string_variable_array_set.bin | Bin 0 -> 12 bytes scripts/rpcgen/tests/test_demo_struct.bin | Bin 0 -> 8 bytes .../tests/test_demo_struct_fixed_array.bin | Bin 0 -> 136 bytes .../tests/test_demo_struct_pointer_null.bin | Bin 0 -> 4 bytes .../tests/test_demo_struct_pointer_set.bin | Bin 0 -> 12 bytes .../rpcgen/tests/test_demo_struct_scalar.bin | 1 + .../test_demo_struct_variable_array_empty.bin | Bin 0 -> 4 bytes .../test_demo_struct_variable_array_set.bin | Bin 0 -> 28 bytes .../tests/test_demo_test_struct_all_types.bin | Bin 0 -> 1752 bytes scripts/rpcgen/tests/test_demo_union_case.bin | Bin 0 -> 8 bytes .../rpcgen/tests/test_demo_union_default.bin | Bin 0 -> 8 bytes .../tests/test_demo_union_fixed_array.bin | Bin 0 -> 168 bytes .../tests/test_demo_union_no_default_case.bin | Bin 0 -> 8 bytes .../tests/test_demo_union_pointer_null.bin | Bin 0 -> 4 bytes .../tests/test_demo_union_pointer_set.bin | Bin 0 -> 12 bytes .../rpcgen/tests/test_demo_union_scalar.bin | Bin 0 -> 8 bytes .../test_demo_union_variable_array_empty.bin | Bin 0 -> 4 bytes .../test_demo_union_variable_array_set.bin | Bin 0 -> 28 bytes .../test_demo_union_void_default_case.bin | Bin 0 -> 8 bytes .../test_demo_union_void_default_default.bin | 1 + 41 files changed, 813 insertions(+), 5 deletions(-) create mode 100644 scripts/rpcgen/tests/test_demo.c create mode 100644 scripts/rpcgen/tests/test_demo_enum.bin create mode 100644 scripts/rpcgen/tests/test_demo_enum_fixed_array.bin create mode 100644 scripts/rpcgen/tests/test_demo_enum_pointer_null.bin create mode 100644 scripts/rpcgen/tests/test_demo_enum_pointer_set.bin create mode 100644 scripts/rpcgen/tests/test_demo_enum_scalar.bin create mode 100644 scripts/rpcgen/tests/test_demo_enum_variable_array_empt= y.bin create mode 100644 scripts/rpcgen/tests/test_demo_enum_variable_array_set.= bin create mode 100644 scripts/rpcgen/tests/test_demo_int_fixed_array.bin create mode 100644 scripts/rpcgen/tests/test_demo_int_pointer_null.bin create mode 100644 scripts/rpcgen/tests/test_demo_int_pointer_set.bin create mode 100644 scripts/rpcgen/tests/test_demo_int_scalar.bin create mode 100644 scripts/rpcgen/tests/test_demo_int_variable_array_empty= .bin create mode 100644 scripts/rpcgen/tests/test_demo_int_variable_array_set.b= in create mode 100644 scripts/rpcgen/tests/test_demo_opaque_fixed_array.bin create mode 100644 scripts/rpcgen/tests/test_demo_opaque_variable_array_em= pty.bin create mode 100644 scripts/rpcgen/tests/test_demo_opaque_variable_array_se= t.bin create mode 100644 scripts/rpcgen/tests/test_demo_string_variable_array_em= pty.bin create mode 100644 scripts/rpcgen/tests/test_demo_string_variable_array_se= t.bin create mode 100644 scripts/rpcgen/tests/test_demo_struct.bin create mode 100644 scripts/rpcgen/tests/test_demo_struct_fixed_array.bin create mode 100644 scripts/rpcgen/tests/test_demo_struct_pointer_null.bin create mode 100644 scripts/rpcgen/tests/test_demo_struct_pointer_set.bin create mode 100644 scripts/rpcgen/tests/test_demo_struct_scalar.bin create mode 100644 scripts/rpcgen/tests/test_demo_struct_variable_array_em= pty.bin create mode 100644 scripts/rpcgen/tests/test_demo_struct_variable_array_se= t.bin create mode 100644 scripts/rpcgen/tests/test_demo_test_struct_all_types.bin create mode 100644 scripts/rpcgen/tests/test_demo_union_case.bin create mode 100644 scripts/rpcgen/tests/test_demo_union_default.bin create mode 100644 scripts/rpcgen/tests/test_demo_union_fixed_array.bin create mode 100644 scripts/rpcgen/tests/test_demo_union_no_default_case.bin create mode 100644 scripts/rpcgen/tests/test_demo_union_pointer_null.bin create mode 100644 scripts/rpcgen/tests/test_demo_union_pointer_set.bin create mode 100644 scripts/rpcgen/tests/test_demo_union_scalar.bin create mode 100644 scripts/rpcgen/tests/test_demo_union_variable_array_emp= ty.bin create mode 100644 scripts/rpcgen/tests/test_demo_union_variable_array_set= .bin create mode 100644 scripts/rpcgen/tests/test_demo_union_void_default_case.= bin create mode 100644 scripts/rpcgen/tests/test_demo_union_void_default_defau= lt.bin diff --git a/build-aux/syntax-check.mk b/build-aux/syntax-check.mk index 375fad188b..2599ba688f 100644 --- a/build-aux/syntax-check.mk +++ b/build-aux/syntax-check.mk @@ -1358,7 +1358,7 @@ exclude_file_name_regexp--sc_avoid_strcase =3D ^tools= /(vsh\.h|nss/libvirt_nss_(lea exclude_file_name_regexp--sc_avoid_write =3D ^src/libvirt-stream\.c$$ =20 exclude_file_name_regexp--sc_gettext_init =3D \ - ^((tests|examples)/|tools/virt-login-shell.c) + ^((tests|examples)/|tools/virt-login-shell\.c$$|scripts/rpcgen/tests/test= _demo\.c$$) =20 exclude_file_name_regexp--sc_copyright_usage =3D \ ^COPYING(|\.LESSER)$$ @@ -1387,7 +1387,7 @@ exclude_file_name_regexp--sc_prohibit_close =3D \ (\.p[yl]$$|\.spec\.in$$|^docs/|^(src/util/vir(file|event)\.c|src/libvirt= -stream\.c|tests/(vir.+mock\.c|commandhelper\.c|qemusecuritymock\.c)|tools/= nss/libvirt_nss_(leases|macs)\.c)|tools/virt-qemu-qmp-proxy$$) =20 exclude_file_name_regexp--sc_prohibit_empty_lines_at_EOF =3D \ - (^tests/(nodedevmdevctl|virhostcpu|virpcitest|virstoragetest)data/|docs/= js/.*\.js|docs/fonts/.*\.woff|\.diff|tests/virconfdata/no-newline\.conf$$) + (^tests/(nodedevmdevctl|virhostcpu|virpcitest|virstoragetest)data/|docs/= js/.*\.js|docs/fonts/.*\.woff|\.diff|tests/virconfdata/no-newline\.conf$$|\= .bin) =20 exclude_file_name_regexp--sc_prohibit_fork_wrappers =3D \ (^(src/(util/(vircommand|virdaemon)|lxc/lxc_controller)|tests/testutils)= \.c$$) @@ -1429,10 +1429,10 @@ exclude_file_name_regexp--sc_prohibit_xmlURI =3D ^s= rc/util/viruri\.c$$ exclude_file_name_regexp--sc_prohibit_return_as_function =3D \.py$$ =20 exclude_file_name_regexp--sc_require_config_h =3D \ - ^(examples/c/.*/.*\.c|tools/virsh-edit\.c|tests/virmockstathelpers\.c|scr= ipts/rpcgen/tests/demo\.c)$$ + ^(examples/c/.*/.*\.c|tools/virsh-edit\.c|tests/virmockstathelpers\.c|scr= ipts/rpcgen/tests/(test_)?demo\.c)$$ =20 exclude_file_name_regexp--sc_require_config_h_first =3D \ - ^(examples/|tools/virsh-edit\.c$$|tests/virmockstathelpers.c) + ^(examples/|tools/virsh-edit\.c$$|tests/virmockstathelpers\.c$$|scripts/r= pcgen/tests/test_demo\.c$$) =20 exclude_file_name_regexp--sc_trailing_blank =3D \ /sysinfodata/.*\.data|/virhostcpudata/.*\.cpuinfo$$ @@ -1499,6 +1499,9 @@ exclude_file_name_regexp--sc_header-ifdef =3D \ exclude_file_name_regexp--sc_black =3D \ ^tools/|src/|tests/|ci/|run\.in|scripts/[^/]*\.py =20 +exclude_file_name_regexp--sc_spacing-check =3D \ + ^scripts/rpcgen/tests/test_demo\.[ch]$$ + ## -------------- ## ## Implementation ## ## -------------- ## diff --git a/scripts/rpcgen/tests/demo.x b/scripts/rpcgen/tests/demo.x index ec69913f3d..7260ad08df 100644 --- a/scripts/rpcgen/tests/demo.x +++ b/scripts/rpcgen/tests/demo.x @@ -74,7 +74,6 @@ struct TestStructAllTypes { bool sb; float sf; double sd; -/* quadruple sq; */ =20 int *ip; int ifa[TestConstDec]; diff --git a/scripts/rpcgen/tests/meson.build b/scripts/rpcgen/tests/meson.= build index 953a3dbede..b504684394 100644 --- a/scripts/rpcgen/tests/meson.build +++ b/scripts/rpcgen/tests/meson.build @@ -3,3 +3,18 @@ rpcgen_tests =3D files([ 'test_lexer.py', 'test_parser.py', ]) + + +test_demo =3D executable( + 'test_demo', + [ 'test_demo.c' ], + dependencies: [ + xdr_dep, glib_dep + ], +) + +test( + 'test_demo', + test_demo, + workdir: meson.current_source_dir(), +) diff --git a/scripts/rpcgen/tests/test_demo.c b/scripts/rpcgen/tests/test_d= emo.c new file mode 100644 index 0000000000..54f48e5637 --- /dev/null +++ b/scripts/rpcgen/tests/test_demo.c @@ -0,0 +1,789 @@ +#include +#include +#include + +#include "demo.h" +#include "demo.c" + +static void test_xdr(xdrproc_t proc, void *vorig, void *vnew, const char *= testname, bool fail) +{ + XDR xdr; + /* 128kb is big enough for any of our test data */ + size_t buflen =3D 128 * 1000; + g_autofree char *buf =3D g_new0(char, buflen); + g_autofree char *expfile =3D g_strdup_printf("test_demo_%s.bin", testn= ame); + g_autofree char *expected =3D NULL; + size_t explen; + size_t actlen; + g_autoptr(GError) err =3D NULL; + bool_t ret; + + /* Step 1: serialize the vorig and compare to the data in test .bin f= iles */ + xdrmem_create(&xdr, buf, buflen, XDR_ENCODE); + + ret =3D !!proc(&xdr, vorig); + g_assert_cmpint(ret, =3D=3D, !fail); + + if (fail) + goto cleanup; + + actlen =3D xdr_getpos(&xdr); + + if (getenv("VIR_TEST_REGENERATE_OUTPUT")) { + g_file_set_contents(expfile, buf, actlen, NULL); + } + + g_file_get_contents(expfile, &expected, &explen, &err); + if (err !=3D NULL) { + g_printerr("%s\n", err->message); + abort(); + } + + g_assert_cmpint(explen, =3D=3D, actlen); + + g_assert_cmpint(memcmp(buf, expected, actlen), =3D=3D, 0); + + xdr_destroy(&xdr); + + /* Step 2: de-serialize the state to create a new object */ + xdrmem_create(&xdr, buf, buflen, XDR_DECODE); + + ret =3D !!proc(&xdr, vnew); + g_assert_cmpint(ret, =3D=3D, true); + + actlen =3D xdr_getpos(&xdr); + g_assert_cmpint(explen, =3D=3D, actlen); + + xdr_destroy(&xdr); + + /* Step 3: serialize the new object again to prove we + * round-tripped the original object */ + memset(buf, 0, buflen); + + xdrmem_create(&xdr, buf, buflen, XDR_ENCODE); + + ret =3D !!proc(&xdr, vnew); + g_assert_cmpint(ret, =3D=3D, true); + + actlen =3D xdr_getpos(&xdr); + + g_assert_cmpint(explen, =3D=3D, actlen); + + g_assert_cmpint(memcmp(buf, expected, actlen), =3D=3D, 0); + xdr_destroy(&xdr); + + /* Step 4: free mem from the new object only; the orig + * was on the stack so leave untouched */ + xdrmem_create(&xdr, buf, buflen, XDR_FREE); + + ret =3D !!proc(&xdr, vnew); + g_assert_cmpint(ret, =3D=3D, true); + + cleanup: + xdr_destroy(&xdr); +} + +static void test_enum(void) +{ + TestEnum vorig =3D TEST_ENUM_TWO; + TestEnum vnew =3D 0; + + test_xdr((xdrproc_t)xdr_TestEnum, &vorig, &vnew, "enum", false); +} + +static void test_struct(void) +{ + TestStruct vorig =3D { + .c1 =3D 'a', .c2 =3D 'b', + }; + TestStruct vnew =3D {0}; + + test_xdr((xdrproc_t)xdr_TestStruct, &vorig, &vnew, "struct", false); +} + +static void test_union_case(void) +{ + TestUnion vorig =3D { + .type =3D 20, .TestUnion_u =3D { .i1 =3D 1729 }, + }; + TestUnion vnew =3D {0}; + + test_xdr((xdrproc_t)xdr_TestUnion, &vorig, &vnew, "union_case", false); +} + +static void test_union_default(void) +{ + TestUnion vorig =3D { + .type =3D 87539319, .TestUnion_u =3D { .i3 =3D 1729 }, + }; + TestUnion vnew =3D {0}; + + test_xdr((xdrproc_t)xdr_TestUnion, &vorig, &vnew, "union_default", fal= se); +} + +static void test_union_void_default_case(void) +{ + TestUnionVoidDefault vorig =3D { + .type =3D 21, .TestUnionVoidDefault_u =3D { .i1 =3D 1729 }, + }; + TestUnionVoidDefault vnew =3D {0}; + + test_xdr((xdrproc_t)xdr_TestUnionVoidDefault, &vorig, &vnew, "union_vo= id_default_case", false); +} + +static void test_union_void_default_default(void) +{ + TestUnionVoidDefault vorig =3D { + .type =3D 87539319 + }; + TestUnionVoidDefault vnew =3D {0}; + + test_xdr((xdrproc_t)xdr_TestUnionVoidDefault, &vorig, &vnew, "union_vo= id_default_default", false); +} + +static void test_union_no_default_case(void) +{ + TestUnionNoDefault vorig =3D { + .type =3D 22, .TestUnionNoDefault_u =3D { .i1 =3D 1729 }, + }; + TestUnionNoDefault vnew =3D {0}; + + test_xdr((xdrproc_t)xdr_TestUnionNoDefault, &vorig, &vnew, "union_no_d= efault_case", false); +} + +static void test_union_no_default_default(void) +{ + TestUnionNoDefault vorig =3D { + .type =3D 87539319, + }; + TestUnionNoDefault vnew =3D {0}; + + test_xdr((xdrproc_t)xdr_TestUnionNoDefault, &vorig, &vnew, "union_no_d= efault_default", true); +} + +static void test_int_scalar(void) +{ + TestIntScalar vorig =3D 1729; + TestIntScalar vnew =3D 0; + + test_xdr((xdrproc_t)xdr_TestIntScalar, &vorig, &vnew, "int_scalar", fa= lse); +} + +static void test_int_pointer_set(void) +{ + int vorigp =3D 1729; + TestIntPointer vorig =3D &vorigp; + TestIntPointer vnew =3D NULL; + + test_xdr((xdrproc_t)xdr_TestIntPointer, &vorig, &vnew, "int_pointer_se= t", false); +} + +static void test_int_pointer_null(void) +{ + TestIntPointer vorig =3D NULL; + TestIntPointer vnew =3D NULL; + + test_xdr((xdrproc_t)xdr_TestIntPointer, &vorig, &vnew, "int_pointer_nu= ll", false); +} + +static void test_int_fixed_array(void) +{ + TestIntFixedArray vorig =3D { 1729, 0, 87539319 }; + TestIntFixedArray vnew =3D {0}; + + test_xdr((xdrproc_t)xdr_TestIntFixedArray, + vorig, vnew, "int_fixed_array", false); +} + +static void test_int_variable_array_set(void) +{ + TestIntVariableArray vorig =3D { + .TestIntVariableArray_len =3D 3, + .TestIntVariableArray_val =3D (int[]) { 1729, 0, 87539319 } + }; + TestIntVariableArray vnew =3D {0}; + + test_xdr((xdrproc_t)xdr_TestIntVariableArray, + &vorig, &vnew, "int_variable_array_set", false); +} + +static void test_int_variable_array_overflow(void) +{ + TestIntVariableArray vorig =3D { + .TestIntVariableArray_len =3D 6, + .TestIntVariableArray_val =3D (int[]) { 1729, 0, 87539319, 0, 1729= } + }; + TestIntVariableArray vnew =3D {0}; + + test_xdr((xdrproc_t)xdr_TestIntVariableArray, + &vorig, &vnew, "int_variable_array_overflow", true); +} + +static void test_int_variable_array_empty(void) +{ + TestIntVariableArray vorig =3D { + .TestIntVariableArray_len =3D 0, + .TestIntVariableArray_val =3D (int[]) {0}, + }; + TestIntVariableArray vnew =3D {0}; + + test_xdr((xdrproc_t)xdr_TestIntVariableArray, + &vorig, &vnew, "int_variable_array_empty", false); +} + +static void test_string_variable_array_set(void) +{ + TestStringVariableArray vorig =3D (TestStringVariableArray) "taxis"; + TestStringVariableArray vnew =3D NULL; + + test_xdr((xdrproc_t)xdr_TestStringVariableArray, + &vorig, &vnew, "string_variable_array_set", false); +} + +static void test_string_variable_array_empty(void) +{ + TestStringVariableArray vorig =3D (TestStringVariableArray)""; + TestStringVariableArray vnew =3D NULL; + + test_xdr((xdrproc_t)xdr_TestStringVariableArray, + &vorig, &vnew, "string_variable_array_empty", false); +} + +static void test_opaque_fixed_array(void) +{ + TestOpaqueFixedArray vorig =3D { 0xca, 0xfe, 0x12, 0x23, 0x34, 0x45, 0= x56, 0x67, 0x78 }; + TestOpaqueFixedArray vnew =3D {0}; + + test_xdr((xdrproc_t)xdr_TestOpaqueFixedArray, vorig, vnew, "opaque_fix= ed_array", false); +} + +static void test_opaque_variable_array_set(void) +{ + TestOpaqueVariableArray vorig =3D { + .TestOpaqueVariableArray_len =3D 3, + .TestOpaqueVariableArray_val =3D (char[]) { 0xca, 0xfe, 0x12 }, + }; + TestOpaqueVariableArray vnew =3D {0}; + + test_xdr((xdrproc_t)xdr_TestOpaqueVariableArray, + &vorig, &vnew, "opaque_variable_array_set", false); +} + +static void test_opaque_variable_array_overflow(void) +{ + TestOpaqueVariableArray vorig =3D { + .TestOpaqueVariableArray_len =3D 12, + .TestOpaqueVariableArray_val =3D (char[]) { + 0xca, 0xfe, 0x12, 0xca, 0xfe, 0x12, + 0xca, 0xfe, 0x12, 0xca, 0xfe, 0x12, + }, + }; + TestOpaqueVariableArray vnew =3D {0}; + + test_xdr((xdrproc_t)xdr_TestOpaqueVariableArray, + &vorig, &vnew, "opaque_variable_array_overflow", true); +} + +static void test_opaque_variable_array_empty(void) +{ + TestOpaqueVariableArray vorig =3D { + .TestOpaqueVariableArray_len =3D 0, + .TestOpaqueVariableArray_val =3D (char[]) {0}, + }; + TestOpaqueVariableArray vnew =3D {0}; + + test_xdr((xdrproc_t)xdr_TestOpaqueVariableArray, + &vorig, &vnew, "opaque_variable_array_empty", false); +} + +static void test_enum_scalar(void) +{ + TestEnumScalar vorig =3D TEST_ENUM_TWO; + TestEnumScalar vnew =3D 0; + + test_xdr((xdrproc_t)xdr_TestEnumScalar, + &vorig, &vnew, "enum_scalar", false); +} + +static void test_enum_pointer_set(void) +{ + TestEnum vorigp =3D TEST_ENUM_TWO; + TestEnumPointer vorig =3D &vorigp; + TestEnumPointer vnew =3D NULL; + + test_xdr((xdrproc_t)xdr_TestEnumPointer, + &vorig, &vnew, "enum_pointer_set", false); +} + +static void test_enum_pointer_null(void) +{ + TestEnumPointer vorig =3D NULL; + TestEnumPointer vnew =3D NULL; + + test_xdr((xdrproc_t)xdr_TestEnumPointer, + &vorig, &vnew, "enum_pointer_null", false); +} + +static void test_enum_fixed_array(void) +{ + TestEnumFixedArray vorig =3D { + TEST_ENUM_ONE, TEST_ENUM_TWO, TEST_ENUM_ONE, TEST_ENUM_TWO, + TEST_ENUM_ONE, TEST_ENUM_TWO, TEST_ENUM_ONE, TEST_ENUM_TWO, + TEST_ENUM_ONE, TEST_ENUM_TWO, TEST_ENUM_ONE + }; + TestEnumFixedArray vnew =3D {0}; + + test_xdr((xdrproc_t)xdr_TestEnumFixedArray, vorig, vnew, "enum_fixed_a= rray", false); +} + +static void test_enum_variable_array_set(void) +{ + TestEnumVariableArray vorig =3D { + .TestEnumVariableArray_len =3D 3, + .TestEnumVariableArray_val =3D (TestEnum[]) { + TEST_ENUM_ONE, TEST_ENUM_TWO, TEST_ENUM_ONE, + }, + }; + TestEnumVariableArray vnew =3D {0}; + + test_xdr((xdrproc_t)xdr_TestEnumVariableArray, + &vorig, &vnew, "enum_variable_array_set", false); +} + +static void test_enum_variable_array_overflow(void) +{ + TestEnumVariableArray vorig =3D { + .TestEnumVariableArray_len =3D 16, + .TestEnumVariableArray_val =3D (TestEnum[]) { + TEST_ENUM_ONE, TEST_ENUM_TWO, TEST_ENUM_ONE, TEST_ENUM_TWO, + TEST_ENUM_ONE, TEST_ENUM_TWO, TEST_ENUM_ONE, TEST_ENUM_TWO, + TEST_ENUM_ONE, TEST_ENUM_TWO, TEST_ENUM_ONE, TEST_ENUM_TWO, + TEST_ENUM_ONE, TEST_ENUM_TWO, TEST_ENUM_ONE, TEST_ENUM_TWO, + } + }; + TestEnumVariableArray vnew =3D {0}; + + test_xdr((xdrproc_t)xdr_TestEnumVariableArray, + &vorig, &vnew, "enum_variable_array_overflow", true); +} + +static void test_enum_variable_array_empty(void) +{ + TestEnumVariableArray vorig =3D { + .TestEnumVariableArray_len =3D 0, + .TestEnumVariableArray_val =3D (TestEnum[]) {0}, + }; + TestEnumVariableArray vnew =3D {0}; + + test_xdr((xdrproc_t)xdr_TestEnumVariableArray, + &vorig, &vnew, "enum_variable_array_empty", false); +} + +#define TEST_STRUCT_INIT (TestStruct) { .c1 =3D 0xca, .c2 =3D 0xfe } +#define TEST_STRUCT_INIT_ALT (TestStruct) { .c1 =3D 0x09, .c2 =3D 0x07 } + +static void test_struct_scalar(void) +{ + TestStructScalar vorig =3D TEST_STRUCT_INIT; + TestStructScalar vnew =3D {0}; + + test_xdr((xdrproc_t)xdr_TestStructScalar, + &vorig, &vnew, "struct_scalar", false); +} + +static void test_struct_pointer_set(void) +{ + TestStruct vorigp =3D TEST_STRUCT_INIT; + TestStructPointer vorig =3D &vorigp; + TestStructPointer vnew =3D NULL; + + test_xdr((xdrproc_t)xdr_TestStructPointer, + &vorig, &vnew, "struct_pointer_set", false); +} + +static void test_struct_pointer_null(void) +{ + TestStructPointer vorig =3D NULL; + TestStructPointer vnew =3D NULL; + + test_xdr((xdrproc_t)xdr_TestStructPointer, + &vorig, &vnew, "struct_pointer_null", false); +} + +static void test_struct_fixed_array(void) +{ + TestStructFixedArray vorig =3D { + TEST_STRUCT_INIT, TEST_STRUCT_INIT_ALT, TEST_STRUCT_INIT, TEST_STR= UCT_INIT_ALT, + TEST_STRUCT_INIT_ALT, TEST_STRUCT_INIT, TEST_STRUCT_INIT_ALT, TEST= _STRUCT_INIT, + TEST_STRUCT_INIT, TEST_STRUCT_INIT, TEST_STRUCT_INIT, TEST_STRUCT_= INIT, + TEST_STRUCT_INIT_ALT, TEST_STRUCT_INIT_ALT, TEST_STRUCT_INIT, TEST= _STRUCT_INIT, + TEST_STRUCT_INIT_ALT + }; + TestStructFixedArray vnew =3D {0}; + + test_xdr((xdrproc_t)xdr_TestStructFixedArray, vorig, vnew, "struct_fix= ed_array", false); +} + +static void test_struct_variable_array_set(void) +{ + TestStructVariableArray vorig =3D { + .TestStructVariableArray_len =3D 3, + .TestStructVariableArray_val =3D (TestStruct[]) { + TEST_STRUCT_INIT, TEST_STRUCT_INIT_ALT, TEST_STRUCT_INIT_ALT, + }, + }; + TestStructVariableArray vnew =3D {0}; + + test_xdr((xdrproc_t)xdr_TestStructVariableArray, + &vorig, &vnew, "struct_variable_array_set", false); +} + +static void test_struct_variable_array_overflow(void) +{ + TestStructVariableArray vorig =3D { + .TestStructVariableArray_len =3D 20, + .TestStructVariableArray_val =3D (TestStruct[]) { + TEST_STRUCT_INIT, TEST_STRUCT_INIT, TEST_STRUCT_INIT, TEST_STR= UCT_INIT, + TEST_STRUCT_INIT, TEST_STRUCT_INIT, TEST_STRUCT_INIT, TEST_STR= UCT_INIT, + TEST_STRUCT_INIT, TEST_STRUCT_INIT, TEST_STRUCT_INIT, TEST_STR= UCT_INIT, + TEST_STRUCT_INIT, TEST_STRUCT_INIT, TEST_STRUCT_INIT, TEST_STR= UCT_INIT, + TEST_STRUCT_INIT, TEST_STRUCT_INIT, TEST_STRUCT_INIT, TEST_STR= UCT_INIT, + } + }; + TestStructVariableArray vnew =3D {0}; + + test_xdr((xdrproc_t)xdr_TestStructVariableArray, + &vorig, &vnew, "struct_variable_array_overflow", true); +} + +static void test_struct_variable_array_empty(void) +{ + TestStructVariableArray vorig =3D { + .TestStructVariableArray_len =3D 0, + .TestStructVariableArray_val =3D (TestStruct[]) {}, + }; + TestStructVariableArray vnew =3D {0}; + + test_xdr((xdrproc_t)xdr_TestStructVariableArray, + &vorig, &vnew, "struct_variable_array_empty", false); +} + +#define TEST_UNION_INIT (TestUnion) { .type =3D 20, .TestUnion_u =3D { .i1= =3D 1729 } } +#define TEST_UNION_INIT_ALT (TestUnion) { .type =3D 1729, .TestUnion_u =3D= { .i3 =3D 87539319 } } + +static void test_union_scalar(void) +{ + TestUnionScalar vorig =3D TEST_UNION_INIT; + TestUnionScalar vnew =3D {0}; + + test_xdr((xdrproc_t)xdr_TestUnionScalar, + &vorig, &vnew, "union_scalar", false); +} + +static void test_union_pointer_set(void) +{ + TestUnion vorigp =3D TEST_UNION_INIT; + TestUnionPointer vorig =3D &vorigp; + TestUnionPointer vnew =3D NULL; + + test_xdr((xdrproc_t)xdr_TestUnionPointer, + &vorig, &vnew, "union_pointer_set", false); +} + +static void test_union_pointer_null(void) +{ + TestUnionPointer vorig =3D NULL; + TestUnionPointer vnew =3D NULL; + + test_xdr((xdrproc_t)xdr_TestUnionPointer, + &vorig, &vnew, "union_pointer_null", false); +} + +static void test_union_fixed_array(void) +{ + TestUnionFixedArray vorig =3D { + TEST_UNION_INIT, TEST_UNION_INIT_ALT, TEST_UNION_INIT, TEST_UNION_= INIT_ALT, + TEST_UNION_INIT_ALT, TEST_UNION_INIT, TEST_UNION_INIT_ALT, TEST_UN= ION_INIT, + TEST_UNION_INIT, TEST_UNION_INIT, TEST_UNION_INIT, TEST_UNION_INIT, + TEST_UNION_INIT_ALT, TEST_UNION_INIT_ALT, TEST_UNION_INIT, TEST_UN= ION_INIT, + TEST_UNION_INIT_ALT + }; + TestUnionFixedArray vnew =3D {0}; + + test_xdr((xdrproc_t)xdr_TestUnionFixedArray, vorig, vnew, "union_fixed= _array", false); +} + +static void test_union_variable_array_set(void) +{ + TestUnionVariableArray vorig =3D { + .TestUnionVariableArray_len =3D 3, + .TestUnionVariableArray_val =3D (TestUnion[]) { + TEST_UNION_INIT, TEST_UNION_INIT_ALT, TEST_UNION_INIT_ALT, + }, + }; + TestUnionVariableArray vnew =3D {0}; + + test_xdr((xdrproc_t)xdr_TestUnionVariableArray, + &vorig, &vnew, "union_variable_array_set", false); +} + +static void test_union_variable_array_overflow(void) +{ + TestUnionVariableArray vorig =3D { + .TestUnionVariableArray_len =3D 24, + .TestUnionVariableArray_val =3D (TestUnion[]) { + TEST_UNION_INIT, TEST_UNION_INIT, TEST_UNION_INIT, TEST_UNION_= INIT, + TEST_UNION_INIT, TEST_UNION_INIT, TEST_UNION_INIT, TEST_UNION_= INIT, + TEST_UNION_INIT, TEST_UNION_INIT, TEST_UNION_INIT, TEST_UNION_= INIT, + TEST_UNION_INIT, TEST_UNION_INIT, TEST_UNION_INIT, TEST_UNION_= INIT, + TEST_UNION_INIT, TEST_UNION_INIT, TEST_UNION_INIT, TEST_UNION_= INIT, + TEST_UNION_INIT, TEST_UNION_INIT, TEST_UNION_INIT, TEST_UNION_= INIT, + } + }; + TestUnionVariableArray vnew =3D {0}; + + test_xdr((xdrproc_t)xdr_TestUnionVariableArray, + &vorig, &vnew, "union_variable_array_overflow", true); +} + +static void test_union_variable_array_empty(void) +{ + TestUnionVariableArray vorig =3D { + .TestUnionVariableArray_len =3D 0, + .TestUnionVariableArray_val =3D (TestUnion[]) {}, + }; + TestUnionVariableArray vnew =3D {0}; + + test_xdr((xdrproc_t)xdr_TestUnionVariableArray, + &vorig, &vnew, "union_variable_array_empty", false); +} + +static void test_struct_all_types(void) +{ + int ip =3D 1729; + TestEnum ep =3D TEST_ENUM_TWO; + TestStruct sp =3D TEST_STRUCT_INIT; + TestUnion up =3D TEST_UNION_INIT; + TestStructAllTypes vorig =3D { + .sc =3D 'x', + .suc =3D 'y', + .ss =3D -7, + .sus =3D 14, + .si =3D -1729, + .sui =3D 1729, + .sh =3D -87539319, + .suh =3D -87539319, + .sb =3D true, + .sf =3D 0.1729, + .sd =3D 8753.9319, + .ip =3D &ip, + .ifa =3D { 1, 2, 3 }, + .iva =3D { + .iva_len =3D 3, + .iva_val =3D (int[]) { 7, 8, 9 }, + }, + .stva =3D (char *)"hello", + .ofa =3D { + 0x1, 0x2, 0x3, 0xff, 0xff, 0xff, 0xff, 0x1, + 0x1, 0x2, 0x3, 0xff, 0xff, 0xff, 0xff, 0x1, + 0x1, 0x2, 0x3, 0xff, 0xff, 0xff, 0xff, 0x1, + 0x1, 0x2, 0x3, 0xff, 0xff, 0xff, 0xff, 0x1, + 0xff, + }, + .ova =3D { + .ova_len =3D 3, + .ova_val =3D (char[]) { 0x1, 0xca, 0xfe }, + }, + .e1 =3D TEST_ENUM_ONE, + .e2 =3D TEST_ENUM_TWO, + .ep =3D &ep, + .efa =3D { + TEST_ENUM_ONE, TEST_ENUM_TWO, TEST_ENUM_ONE, TEST_ENUM_TWO, + TEST_ENUM_ONE, TEST_ENUM_TWO, TEST_ENUM_ONE, TEST_ENUM_TWO, + TEST_ENUM_ONE, TEST_ENUM_TWO, TEST_ENUM_ONE, TEST_ENUM_TWO, + TEST_ENUM_ONE, TEST_ENUM_TWO, TEST_ENUM_ONE, TEST_ENUM_TWO, + TEST_ENUM_ONE, TEST_ENUM_TWO, TEST_ENUM_ONE, TEST_ENUM_TWO, + TEST_ENUM_ONE, TEST_ENUM_TWO, TEST_ENUM_ONE, TEST_ENUM_TWO, + TEST_ENUM_ONE, TEST_ENUM_TWO, TEST_ENUM_ONE, TEST_ENUM_TWO, + TEST_ENUM_ONE, TEST_ENUM_TWO, TEST_ENUM_ONE, TEST_ENUM_TWO, + TEST_ENUM_ONE, TEST_ENUM_TWO, TEST_ENUM_ONE, TEST_ENUM_TWO, + TEST_ENUM_ONE, + }, + .eva =3D { + .eva_len =3D 3, + .eva_val =3D (TestEnum[]) { + TEST_ENUM_TWO, TEST_ENUM_ONE, TEST_ENUM_TWO, + }, + }, + .s =3D TEST_STRUCT_INIT, + .sp =3D &sp, + .sfa =3D { + TEST_STRUCT_INIT, TEST_STRUCT_INIT_ALT, TEST_STRUCT_INIT, TEST= _STRUCT_INIT_ALT, + TEST_STRUCT_INIT_ALT, TEST_STRUCT_INIT, TEST_STRUCT_INIT_ALT, = TEST_STRUCT_INIT, + TEST_STRUCT_INIT, TEST_STRUCT_INIT, TEST_STRUCT_INIT, TEST_STR= UCT_INIT, + TEST_STRUCT_INIT_ALT, TEST_STRUCT_INIT_ALT, TEST_STRUCT_INIT, = TEST_STRUCT_INIT, + TEST_STRUCT_INIT, TEST_STRUCT_INIT_ALT, TEST_STRUCT_INIT, TEST= _STRUCT_INIT_ALT, + TEST_STRUCT_INIT_ALT, TEST_STRUCT_INIT, TEST_STRUCT_INIT_ALT, = TEST_STRUCT_INIT, + TEST_STRUCT_INIT, TEST_STRUCT_INIT, TEST_STRUCT_INIT, TEST_STR= UCT_INIT, + TEST_STRUCT_INIT_ALT, TEST_STRUCT_INIT_ALT, TEST_STRUCT_INIT, = TEST_STRUCT_INIT, + TEST_STRUCT_INIT, TEST_STRUCT_INIT_ALT, TEST_STRUCT_INIT, TEST= _STRUCT_INIT_ALT, + TEST_STRUCT_INIT_ALT, TEST_STRUCT_INIT, TEST_STRUCT_INIT_ALT, = TEST_STRUCT_INIT, + TEST_STRUCT_INIT, + }, + .sva =3D { + .sva_len =3D 3, + .sva_val =3D (TestStruct[]) { + TEST_STRUCT_INIT, TEST_STRUCT_INIT_ALT, TEST_STRUCT_INIT, + }, + }, + .u =3D TEST_UNION_INIT, + .up =3D &up, + .ufa =3D { + TEST_UNION_INIT, TEST_UNION_INIT_ALT, TEST_UNION_INIT, TEST_UN= ION_INIT_ALT, + TEST_UNION_INIT_ALT, TEST_UNION_INIT, TEST_UNION_INIT_ALT, TES= T_UNION_INIT, + TEST_UNION_INIT, TEST_UNION_INIT, TEST_UNION_INIT, TEST_UNION_= INIT, + TEST_UNION_INIT_ALT, TEST_UNION_INIT_ALT, TEST_UNION_INIT, TES= T_UNION_INIT, + TEST_UNION_INIT, TEST_UNION_INIT_ALT, TEST_UNION_INIT, TEST_UN= ION_INIT_ALT, + TEST_UNION_INIT_ALT, TEST_UNION_INIT, TEST_UNION_INIT_ALT, TES= T_UNION_INIT, + TEST_UNION_INIT, TEST_UNION_INIT, TEST_UNION_INIT, TEST_UNION_= INIT, + TEST_UNION_INIT_ALT, TEST_UNION_INIT_ALT, TEST_UNION_INIT, TES= T_UNION_INIT, + TEST_UNION_INIT, TEST_UNION_INIT_ALT, TEST_UNION_INIT, TEST_UN= ION_INIT_ALT, + TEST_UNION_INIT_ALT, TEST_UNION_INIT, TEST_UNION_INIT_ALT, TES= T_UNION_INIT, + TEST_UNION_INIT, TEST_UNION_INIT, TEST_UNION_INIT, TEST_UNION_= INIT, + TEST_UNION_INIT_ALT, + }, + .uva =3D { + .uva_len =3D 3, + .uva_val =3D (TestUnion[]) { + TEST_UNION_INIT, TEST_UNION_INIT_ALT, TEST_UNION_INIT_ALT, + }, + }, + .tis =3D 1729, + .tip =3D &ip, + .tifa =3D { 1, 2, 3 }, + .tiva =3D { + .TestIntVariableArray_len =3D 3, + .TestIntVariableArray_val =3D (int[]) { 7, 8, 9 }, + }, + .tstva =3D (char *)"hello", + .tofa =3D { + 0x1, 0x2, 0x3, 0xff, 0xff, 0xff, 0xff, 0x1, + 0xff, + }, + .tova =3D { + .TestOpaqueVariableArray_len =3D 3, + .TestOpaqueVariableArray_val =3D (char[]) { 0x1, 0xca, 0xfe }, + }, + .tes =3D TEST_ENUM_ONE, + .tep =3D &ep, + .tefa =3D { + TEST_ENUM_ONE, TEST_ENUM_TWO, TEST_ENUM_ONE, TEST_ENUM_TWO, + TEST_ENUM_ONE, TEST_ENUM_TWO, TEST_ENUM_ONE, TEST_ENUM_TWO, + TEST_ENUM_ONE, TEST_ENUM_TWO, TEST_ENUM_ONE, TEST_ENUM_TWO, + TEST_ENUM_ONE, + }, + .teva =3D { + .TestEnumVariableArray_len =3D 3, + .TestEnumVariableArray_val =3D (TestEnum[]) { + TEST_ENUM_TWO, TEST_ENUM_ONE, TEST_ENUM_TWO, + }, + }, + .tss =3D TEST_STRUCT_INIT, + .tsp =3D &sp, + .tsfa =3D { + TEST_STRUCT_INIT, TEST_STRUCT_INIT_ALT, TEST_STRUCT_INIT, TEST= _STRUCT_INIT_ALT, + TEST_STRUCT_INIT_ALT, TEST_STRUCT_INIT, TEST_STRUCT_INIT_ALT, = TEST_STRUCT_INIT, + TEST_STRUCT_INIT, TEST_STRUCT_INIT, TEST_STRUCT_INIT, TEST_STR= UCT_INIT, + TEST_STRUCT_INIT_ALT, TEST_STRUCT_INIT_ALT, TEST_STRUCT_INIT, = TEST_STRUCT_INIT, + TEST_STRUCT_INIT, + }, + .tsva =3D { + .TestStructVariableArray_len =3D 3, + .TestStructVariableArray_val =3D (TestStruct[]) { + TEST_STRUCT_INIT, TEST_STRUCT_INIT_ALT, TEST_STRUCT_INIT, + }, + }, + .tu =3D TEST_UNION_INIT, + .tup =3D &up, + .tufa =3D { + TEST_UNION_INIT, TEST_UNION_INIT_ALT, TEST_UNION_INIT, TEST_UN= ION_INIT_ALT, + TEST_UNION_INIT_ALT, TEST_UNION_INIT, TEST_UNION_INIT_ALT, TES= T_UNION_INIT, + TEST_UNION_INIT, TEST_UNION_INIT, TEST_UNION_INIT, TEST_UNION_= INIT, + TEST_UNION_INIT_ALT, TEST_UNION_INIT_ALT, TEST_UNION_INIT, TES= T_UNION_INIT, + TEST_UNION_INIT, TEST_UNION_INIT_ALT, TEST_UNION_INIT, TEST_UN= ION_INIT_ALT, + TEST_UNION_INIT_ALT, + }, + .tuva =3D { + .TestUnionVariableArray_len =3D 3, + .TestUnionVariableArray_val =3D (TestUnion[]) { + TEST_UNION_INIT, TEST_UNION_INIT_ALT, TEST_UNION_INIT_ALT, + }, + }, + }; + TestStructAllTypes vnew =3D {0}; + + test_xdr((xdrproc_t)xdr_TestStructAllTypes, + &vorig, &vnew, "test_struct_all_types", false); +} + +int main(int argc, char **argv) +{ + g_test_init(&argc, &argv, NULL); + + g_test_set_nonfatal_assertions(); + + g_test_add_func("/xdr/enum", test_enum); + + g_test_add_func("/xdr/struct", test_struct); + + g_test_add_func("/xdr/union/case", test_union_case); + g_test_add_func("/xdr/union/default", test_union_default); + g_test_add_func("/xdr/union-void-default/case", test_union_void_defaul= t_case); + g_test_add_func("/xdr/union-void-default/default", test_union_void_def= ault_default); + g_test_add_func("/xdr/union-no-default/case", test_union_no_default_ca= se); + g_test_add_func("/xdr/union-no-default/default", test_union_no_default= _default); + + g_test_add_func("/xdr/int-scalar", test_int_scalar); + g_test_add_func("/xdr/int-pointer/set", test_int_pointer_set); + g_test_add_func("/xdr/int-pointer/null", test_int_pointer_null); + g_test_add_func("/xdr/int-fixed-array", test_int_fixed_array); + g_test_add_func("/xdr/int-variable-array/set", test_int_variable_array= _set); + g_test_add_func("/xdr/int-variable-array/overflow", test_int_variable_= array_overflow); + g_test_add_func("/xdr/int-variable-array/empty", test_int_variable_arr= ay_empty); + + g_test_add_func("/xdr/string-variable-array/set", test_string_variable= _array_set); + g_test_add_func("/xdr/string-variable-array/empty", test_string_variab= le_array_empty); + + g_test_add_func("/xdr/opaque-fixed-array", test_opaque_fixed_array); + g_test_add_func("/xdr/opaque-variable-array/set", test_opaque_variable= _array_set); + g_test_add_func("/xdr/opaque-variable-array/overflow", test_opaque_var= iable_array_overflow); + g_test_add_func("/xdr/opaque-variable-array/empty", test_opaque_variab= le_array_empty); + + g_test_add_func("/xdr/enum-scalar", test_enum_scalar); + g_test_add_func("/xdr/enum-pointer/set", test_enum_pointer_set); + g_test_add_func("/xdr/enum-pointer/null", test_enum_pointer_null); + g_test_add_func("/xdr/enum-fixed-array", test_enum_fixed_array); + g_test_add_func("/xdr/enum-variable-array/set", test_enum_variable_arr= ay_set); + g_test_add_func("/xdr/enum-variable-array/overflow", test_enum_variabl= e_array_overflow); + g_test_add_func("/xdr/enum-variable-array/empty", test_enum_variable_a= rray_empty); + + g_test_add_func("/xdr/struct-scalar", test_struct_scalar); + g_test_add_func("/xdr/struct-pointer/set", test_struct_pointer_set); + g_test_add_func("/xdr/struct-pointer/null", test_struct_pointer_null); + g_test_add_func("/xdr/struct-fixed-array", test_struct_fixed_array); + g_test_add_func("/xdr/struct-variable-array/set", test_struct_variable= _array_set); + g_test_add_func("/xdr/struct-variable-array/overflow", test_struct_var= iable_array_overflow); + g_test_add_func("/xdr/struct-variable-array/empty", test_struct_variab= le_array_empty); + + g_test_add_func("/xdr/union-scalar", test_union_scalar); + g_test_add_func("/xdr/union-pointer/set", test_union_pointer_set); + g_test_add_func("/xdr/union-pointer/null", test_union_pointer_null); + g_test_add_func("/xdr/union-fixed-array", test_union_fixed_array); + g_test_add_func("/xdr/union-variable-array/set", test_union_variable_a= rray_set); + g_test_add_func("/xdr/union-variable-array/overflow", test_union_varia= ble_array_overflow); + g_test_add_func("/xdr/union-variable-array/empty", test_union_variable= _array_empty); + + g_test_add_func("/xdr/struct-all-types", test_struct_all_types); + + return g_test_run(); +} diff --git a/scripts/rpcgen/tests/test_demo_enum.bin b/scripts/rpcgen/tests= /test_demo_enum.bin new file mode 100644 index 0000000000000000000000000000000000000000..b6a8ef3e7ca7c398cd8f65bb1e2= 1a23c0d251536 GIT binary patch literal 4 LcmZQzU|<3O00sa9 literal 0 HcmV?d00001 diff --git a/scripts/rpcgen/tests/test_demo_enum_fixed_array.bin b/scripts/= rpcgen/tests/test_demo_enum_fixed_array.bin new file mode 100644 index 0000000000000000000000000000000000000000..869e8134ac62626562dda76a4ee= a95f9779ab266 GIT binary patch literal 52 WcmZQzU|?imU|<4bVrZZ;1_l5E1OO2L literal 0 HcmV?d00001 diff --git a/scripts/rpcgen/tests/test_demo_enum_pointer_null.bin b/scripts= /rpcgen/tests/test_demo_enum_pointer_null.bin new file mode 100644 index 0000000000000000000000000000000000000000..593f4708db84ac8fd0f5cc47c63= 4f38c013fe9e4 GIT binary patch literal 4 LcmZQzU|;|M00aO5 literal 0 HcmV?d00001 diff --git a/scripts/rpcgen/tests/test_demo_enum_pointer_set.bin b/scripts/= rpcgen/tests/test_demo_enum_pointer_set.bin new file mode 100644 index 0000000000000000000000000000000000000000..dc4fb37fcdbedaa327cd251b1a0= 666fe66a51917 GIT binary patch literal 8 PcmZQzU|?imU|<3O01p5J literal 0 HcmV?d00001 diff --git a/scripts/rpcgen/tests/test_demo_enum_scalar.bin b/scripts/rpcge= n/tests/test_demo_enum_scalar.bin new file mode 100644 index 0000000000000000000000000000000000000000..b6a8ef3e7ca7c398cd8f65bb1e2= 1a23c0d251536 GIT binary patch literal 4 LcmZQzU|<3O00sa9 literal 0 HcmV?d00001 diff --git a/scripts/rpcgen/tests/test_demo_enum_variable_array_empty.bin b= /scripts/rpcgen/tests/test_demo_enum_variable_array_empty.bin new file mode 100644 index 0000000000000000000000000000000000000000..593f4708db84ac8fd0f5cc47c63= 4f38c013fe9e4 GIT binary patch literal 4 LcmZQzU|;|M00aO5 literal 0 HcmV?d00001 diff --git a/scripts/rpcgen/tests/test_demo_enum_variable_array_set.bin b/s= cripts/rpcgen/tests/test_demo_enum_variable_array_set.bin new file mode 100644 index 0000000000000000000000000000000000000000..63c142946282ff9fc3d398e1a7f= f0d354572875a GIT binary patch literal 16 TcmZQzU|?ooU|G=3DPly2k23-N( literal 0 HcmV?d00001 diff --git a/scripts/rpcgen/tests/test_demo_string_variable_array_empty.bin= b/scripts/rpcgen/tests/test_demo_string_variable_array_empty.bin new file mode 100644 index 0000000000000000000000000000000000000000..593f4708db84ac8fd0f5cc47c63= 4f38c013fe9e4 GIT binary patch literal 4 LcmZQzU|;|M00aO5 literal 0 HcmV?d00001 diff --git a/scripts/rpcgen/tests/test_demo_string_variable_array_set.bin b= /scripts/rpcgen/tests/test_demo_string_variable_array_set.bin new file mode 100644 index 0000000000000000000000000000000000000000..78e29054977ae0cf3a9a29e568c= 586407891c363 GIT binary patch literal 12 TcmZQzU|=3DmttjH{8U|;|M4JiUI literal 0 HcmV?d00001 diff --git a/scripts/rpcgen/tests/test_demo_struct.bin b/scripts/rpcgen/tes= ts/test_demo_struct.bin new file mode 100644 index 0000000000000000000000000000000000000000..17d90c3c949f7e06f21a758ec28= 1b8739386ae32 GIT binary patch literal 8 PcmZQzU`S+OU`PT00#5+M literal 0 HcmV?d00001 diff --git a/scripts/rpcgen/tests/test_demo_struct_fixed_array.bin b/script= s/rpcgen/tests/test_demo_struct_fixed_array.bin new file mode 100644 index 0000000000000000000000000000000000000000..f0e786ddea02cbd342ec9f6d3c6= ee2b090b38792 GIT binary patch literal 136 ncmezW|Np7~|NsAEU|`?`Vs;=3DKg^x=3Ddrj8H|(+{K3)x*RAqQp)G literal 0 HcmV?d00001 diff --git a/scripts/rpcgen/tests/test_demo_struct_pointer_null.bin b/scrip= ts/rpcgen/tests/test_demo_struct_pointer_null.bin new file mode 100644 index 0000000000000000000000000000000000000000..593f4708db84ac8fd0f5cc47c63= 4f38c013fe9e4 GIT binary patch literal 4 LcmZQzU|;|M00aO5 literal 0 HcmV?d00001 diff --git a/scripts/rpcgen/tests/test_demo_struct_pointer_set.bin b/script= s/rpcgen/tests/test_demo_struct_pointer_set.bin new file mode 100644 index 0000000000000000000000000000000000000000..572814793222ad03346747bb304= 1bb7eafc5205e GIT binary patch literal 12 ScmZQzU|{_J|Nki<{s#ae=3DLf_9 literal 0 HcmV?d00001 diff --git a/scripts/rpcgen/tests/test_demo_struct_scalar.bin b/scripts/rpc= gen/tests/test_demo_struct_scalar.bin new file mode 100644 index 0000000000..0e6959d56a --- /dev/null +++ b/scripts/rpcgen/tests/test_demo_struct_scalar.bin @@ -0,0 +1 @@ + From nobody Fri Apr 19 11:08:17 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of redhat.com designates 170.10.133.124 as permitted sender) client-ip=170.10.133.124; envelope-from=libvir-list-bounces@redhat.com; helo=us-smtp-delivery-124.mimecast.com; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 170.10.133.124 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1678293614; cv=none; d=zohomail.com; s=zohoarc; b=CV4+0jwswQN9pwNs8Ype07pNq2i6o/0cCMSgEZHHwxxJTxlF9QCVL6gCE/fC9TOUQ+tGO3XPaGDDWLzhEFah6It6KqxE6y7wD2xlo3ZIK6ITCBB2dhAVu5MV1g4eP4iR4B9sfxBPgDxpWLd7e+J33iB9vjWei2+2il0s2mwWmAg= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1678293614; h=Content-Type:Content-Transfer-Encoding:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=ciSkwoB9WTILwwahc92uBsp70SgjyjoVkuYmzW0KeJQ=; b=CHWB/D9AUDNbmv31SLeJqcyRGxFLVNVxmz/awK0hdQZapxVJR1xj4kZPq9G6oVxYW+vroJSBHWY5FzVdK3ajftnteq+aqWdqJHnH23yIXlO6FLzoJABDbqyoO6oGa8si/hE/4nvEhBIEGg5k7BLo0OXe4dcHfJpTfXX8+gs2aUo= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 170.10.133.124 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by mx.zohomail.com with SMTPS id 1678293614548437.86331665745035; Wed, 8 Mar 2023 08:40:14 -0800 (PST) Received: from mimecast-mx02.redhat.com (mimecast-mx02.redhat.com [66.187.233.88]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-299-dKo5CYHGNZGbeMv1zT9PZg-1; Wed, 08 Mar 2023 11:39:38 -0500 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.rdu2.redhat.com [10.11.54.6]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id E04B687A9E7; Wed, 8 Mar 2023 16:39:22 +0000 (UTC) Received: from mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com (unknown [10.30.29.100]) by smtp.corp.redhat.com (Postfix) with ESMTP id CB94E2166B2B; Wed, 8 Mar 2023 16:39:22 +0000 (UTC) Received: from mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com (localhost [IPv6:::1]) by mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com (Postfix) with ESMTP id EAA1119472D5; Wed, 8 Mar 2023 16:39:20 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.rdu2.redhat.com [10.11.54.3]) by mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com (Postfix) with ESMTP id 6E52619465B9 for ; Wed, 8 Mar 2023 16:39:19 +0000 (UTC) Received: by smtp.corp.redhat.com (Postfix) id 52F3A1121331; Wed, 8 Mar 2023 16:39:19 +0000 (UTC) Received: from virtlab420.virt.lab.eng.bos.redhat.com (virtlab420.virt.lab.eng.bos.redhat.com [10.19.152.148]) by smtp.corp.redhat.com (Postfix) with ESMTP id 389DF112132D; Wed, 8 Mar 2023 16:39:19 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1678293613; h=from:from:sender:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:list-id:list-help: list-unsubscribe:list-subscribe:list-post; bh=ciSkwoB9WTILwwahc92uBsp70SgjyjoVkuYmzW0KeJQ=; b=G6tc+eAavWD/shN1f/YCDpJk4bfi8oSowKZxYVuSWAgT5LTHxpaS5HMow3+fC85GKd6ke/ s5UGFJn0jdqVEfOzt2hHnQJV5gfj6X8SUV/StpXK7wTgECtyiWu8HVNjPfa4J+iOTMn0nx E+rZoby8psFP0gz13r4AopTmTvqDY4s= X-MC-Unique: dKo5CYHGNZGbeMv1zT9PZg-1 X-Original-To: libvir-list@listman.corp.redhat.com From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= To: libvir-list@redhat.com Subject: [PATCH 10/16] rpcgen: define entrypoint for running new rpcgen impl Date: Wed, 8 Mar 2023 11:39:07 -0500 Message-Id: <20230308163913.338952-11-berrange@redhat.com> In-Reply-To: <20230308163913.338952-1-berrange@redhat.com> References: <20230308163913.338952-1-berrange@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.1 on 10.11.54.3 X-BeenThere: libvir-list@redhat.com X-Mailman-Version: 2.1.29 Precedence: list List-Id: Development discussions about the libvirt library & tools List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: libvir-list-bounces@redhat.com Sender: "libvir-list" X-Scanned-By: MIMEDefang 3.1 on 10.11.54.6 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1678293614862100003 The new program takes the form rpcgen [--mode source|header|repr] \ [--header include] \ xdr-file output-file If '--mode' is not given it parses the XDR file but does not generate anything, which is useful as a syntax check. The 'source' mode gives the '.c' file content, while 'header' gives the '.h' file content. 'repr' gives a representation of the abstract syntax tree, mostly useful for debugging the parser. If '--header' is given, it is added as a local #include ".." statement in the output and is valid for either 'header' or 'source' modes. Either 'xdr-file' or 'output-file' can be omitted in which case they default to stdin/stdout respectively. This rpcgen program will directly include the 'config.h' header in its output. Signed-off-by: Daniel P. Berrang=C3=A9 Reviewed-by: Michal Privoznik --- scripts/rpcgen/main.py | 86 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 86 insertions(+) create mode 100755 scripts/rpcgen/main.py diff --git a/scripts/rpcgen/main.py b/scripts/rpcgen/main.py new file mode 100755 index 0000000000..bf4ef38ede --- /dev/null +++ b/scripts/rpcgen/main.py @@ -0,0 +1,86 @@ +#!/usr/bin/python +# SPDX-License-Identifier: LGPL-2.1-or-later + +import argparse +import os +import sys + +from rpcgen.parser import XDRParser +from rpcgen.generator import ( + XDRTypeDeclarationGenerator, + XDRMarshallDeclarationGenerator, + XDRMarshallImplementationGenerator, +) + + +def parse_cli(): + parser =3D argparse.ArgumentParser("RPC code generator") + parser.add_argument( + "-m", + "--mode", + choices=3D["header", "source", "repr"], + help=3D"Output generation mode", + ) + parser.add_argument( + "-r", "--header", default=3D[], action=3D"append", help=3D"Extra h= eaders to include" + ) + parser.add_argument("input", default=3D"-", nargs=3D"?", help=3D"XDR i= nput protocol file") + parser.add_argument("output", default=3D"-", nargs=3D"?", help=3D"Gene= rated output file") + + return parser.parse_args() + + +def main(): + args =3D parse_cli() + + infp =3D sys.stdin + outfp =3D sys.stdout + if args.input !=3D "-": + infp =3D open(args.input, "r") + if args.output !=3D "-": + # the old genprotocol.pl wrapper would make the + # output files mode 0444, which will prevent us + # from writing directly do them. Explicitly + # unlinking first gets rid of any old possibly + # read-only copy + # + # We can delete this in a few years, once we + # know users won't have a previously generated + # readonly copy lieing around. + try: + os.unlink(args.output) + except Exception: + pass + outfp =3D open(args.output, "w") + + parser =3D XDRParser(infp) + spec =3D parser.parse() + + if args.mode =3D=3D "header": + print("/* This file is auto-generated from %s */\n" % args.input, = file=3Doutfp) + print("#include ", file=3Doutfp) + for h in args.header: + print('#include "%s"' % h, file=3Doutfp) + print("", file=3Doutfp) + print("#pragma once\n", file=3Doutfp) + generator =3D XDRTypeDeclarationGenerator(spec) + print(generator.visit(), file=3Doutfp) + generator =3D XDRMarshallDeclarationGenerator(spec) + print(generator.visit(), file=3Doutfp) + elif args.mode =3D=3D "source": + print("/* This file is auto-generated from %s */\n" % args.input, = file=3Doutfp) + print("#include ", file=3Doutfp) + if args.input.endswith(".x"): + print('#include "%s.h"' % args.input[:-2], file=3Doutfp) + for h in args.header: + print('#include "%s"' % h, file=3Doutfp) + print("", file=3Doutfp) + generator =3D XDRMarshallImplementationGenerator(spec) + print(generator.visit(), file=3Doutfp) + elif args.mode =3D=3D "repr": + print(spec, file=3Doutfp) + else: + pass # Just validates XDR input syntax + + +main() --=20 2.39.1 From nobody Fri Apr 19 11:08:17 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of redhat.com designates 170.10.133.124 as permitted sender) client-ip=170.10.133.124; envelope-from=libvir-list-bounces@redhat.com; helo=us-smtp-delivery-124.mimecast.com; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 170.10.133.124 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1678293603; cv=none; d=zohomail.com; s=zohoarc; b=HbpZxOG5GPB4vtneSA3HbmxujYrKz+nSA6ojb20D8t8Lr+ZxPyW5ILSCFxhi7bnk9RUkBcDOi+UuvhYTTmU+gotPdGNKX3ke+xADoigIuojUUnz+zGw28w7G9oJgpWH6jdt1+hs3lyEH8lSLO3EaOWMj/fNNIhuQGRoH6wcds1M= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1678293603; h=Content-Type:Content-Transfer-Encoding:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=oMYPiCSybvUZqaAmgNw+xjARNjEatA51yOqZwpHDbLc=; b=jmeZVNJDF5NC3MkcXSliNODvPZ8cjyxk+Ajbk8bFO2rJInBZKCV0Rk6KlAJHEwH1KcwekRXxnDToiAR/69CMWOJxMqWhubTXdAvd0Pk8ER66SfXJVgqe31+CJ455lT9F3IH92kH/JLjXnc38mevBbVj3TRJTswqQ00EoejVhHFI= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 170.10.133.124 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by mx.zohomail.com with SMTPS id 1678293603648494.73559736744755; Wed, 8 Mar 2023 08:40:03 -0800 (PST) Received: from mimecast-mx02.redhat.com (mx3-rdu2.redhat.com [66.187.233.73]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-468-BRJ4n1_EMhCCMDxdzte9oA-1; Wed, 08 Mar 2023 11:39:40 -0500 Received: from smtp.corp.redhat.com (int-mx09.intmail.prod.int.rdu2.redhat.com [10.11.54.9]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 732E228237DB; Wed, 8 Mar 2023 16:39:28 +0000 (UTC) Received: from mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com (unknown [10.30.29.100]) by smtp.corp.redhat.com (Postfix) with ESMTP id 5FFF3492B04; Wed, 8 Mar 2023 16:39:28 +0000 (UTC) Received: from mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com (localhost [IPv6:::1]) by mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com (Postfix) with ESMTP id 03F6519465B9; Wed, 8 Mar 2023 16:39:28 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.rdu2.redhat.com [10.11.54.3]) by mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com (Postfix) with ESMTP id 9FF7A19465B9 for ; Wed, 8 Mar 2023 16:39:19 +0000 (UTC) Received: by smtp.corp.redhat.com (Postfix) id 785EC1121330; Wed, 8 Mar 2023 16:39:19 +0000 (UTC) Received: from virtlab420.virt.lab.eng.bos.redhat.com (virtlab420.virt.lab.eng.bos.redhat.com [10.19.152.148]) by smtp.corp.redhat.com (Postfix) with ESMTP id 5DA0F112132D; Wed, 8 Mar 2023 16:39:19 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1678293602; h=from:from:sender:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:list-id:list-help: list-unsubscribe:list-subscribe:list-post; bh=oMYPiCSybvUZqaAmgNw+xjARNjEatA51yOqZwpHDbLc=; b=VLPx9lG5Kzy2b7hN94lV6BeDINRvpOz5Sn2Pj8OQSL++7/cEBC2zwAtsCWzTS4D+UvjWZV kDNC2a5JWK7eL3xKPEz0H19GwlUHDxjgOL0DpfbrJ8CgUiTKFkO1RZQb1tytT/BtFkftcx alRjz2mArupxjncXI5B3B0xj6BNVA0Q= X-MC-Unique: BRJ4n1_EMhCCMDxdzte9oA-1 X-Original-To: libvir-list@listman.corp.redhat.com From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= To: libvir-list@redhat.com Subject: [PATCH 11/16] build: switch over to new rpc generator code Date: Wed, 8 Mar 2023 11:39:08 -0500 Message-Id: <20230308163913.338952-12-berrange@redhat.com> In-Reply-To: <20230308163913.338952-1-berrange@redhat.com> References: <20230308163913.338952-1-berrange@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.1 on 10.11.54.3 X-BeenThere: libvir-list@redhat.com X-Mailman-Version: 2.1.29 Precedence: list List-Id: Development discussions about the libvirt library & tools List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: libvir-list-bounces@redhat.com Sender: "libvir-list" X-Scanned-By: MIMEDefang 3.1 on 10.11.54.9 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1678293604823100001 This replaces use of 'rpcgen' with our new python impl of the RPC code generator. Since the new impl generates code that matches our style/coding rules, and does not contain long standing bugs, we no longer need to post-process the output. Signed-off-by: Daniel P. Berrang=C3=A9 Reviewed-by: Michal Privoznik --- libvirt.spec.in | 1 - meson.build | 11 --- scripts/rpcgen/meson.build | 5 ++ scripts/rpcgen/rpcgen/meson.build | 7 ++ src/admin/meson.build | 8 +- src/locking/meson.build | 8 +- src/logging/meson.build | 8 +- src/lxc/meson.build | 12 ++- src/remote/meson.build | 8 +- src/rpc/genprotocol.pl | 121 ------------------------------ src/rpc/meson.build | 9 ++- 11 files changed, 52 insertions(+), 146 deletions(-) create mode 100644 scripts/rpcgen/rpcgen/meson.build delete mode 100755 src/rpc/genprotocol.pl diff --git a/libvirt.spec.in b/libvirt.spec.in index 84d2f1c65a..aca7e23512 100644 --- a/libvirt.spec.in +++ b/libvirt.spec.in @@ -377,7 +377,6 @@ BuildRequires: wireshark-devel %if %{with_libssh} BuildRequires: libssh-devel >=3D 0.8.1 %endif -BuildRequires: rpcgen BuildRequires: libtirpc-devel # Needed for the firewalld_reload macro %if %{with_firewalld_zone} diff --git a/meson.build b/meson.build index 9f660c7604..ef1f697e0b 100644 --- a/meson.build +++ b/meson.build @@ -743,10 +743,6 @@ required_programs =3D [ 'xsltproc', ] =20 -required_programs_groups =3D [ - { 'name': 'rpcgen', 'prog': [ 'rpcgen', 'portable-rpcgen' ] }, -] - if host_machine.system() =3D=3D 'freebsd' required_programs +=3D 'ifconfig' endif @@ -758,13 +754,6 @@ foreach name : required_programs set_variable('@0@_prog'.format(varname), prog) endforeach =20 -foreach item : required_programs_groups - prog =3D find_program(item.get('prog'), dirs: libvirt_sbin_path) - varname =3D item.get('name').underscorify() - conf.set_quoted(varname.to_upper(), prog.full_path()) - set_variable('@0@_prog'.format(varname), prog) -endforeach - # optional programs =20 optional_programs =3D [ diff --git a/scripts/rpcgen/meson.build b/scripts/rpcgen/meson.build index 52526bf812..65236457be 100644 --- a/scripts/rpcgen/meson.build +++ b/scripts/rpcgen/meson.build @@ -1,3 +1,5 @@ +subdir('rpcgen') + if pytest_prog.found() subdir('tests') =20 @@ -9,3 +11,6 @@ if pytest_prog.found() workdir: meson.current_source_dir(), ) endif + +rpcgen_prog =3D find_program('main.py') +rpcgen_src +=3D files(['main.py']) diff --git a/scripts/rpcgen/rpcgen/meson.build b/scripts/rpcgen/rpcgen/meso= n.build new file mode 100644 index 0000000000..5a0f59eecf --- /dev/null +++ b/scripts/rpcgen/rpcgen/meson.build @@ -0,0 +1,7 @@ +rpcgen_src =3D files([ + 'ast.py', + 'lexer.py', + 'generator.py', + 'parser.py', + 'visitor.py', +]) diff --git a/src/admin/meson.build b/src/admin/meson.build index 692cc128a3..e5e6a87706 100644 --- a/src/admin/meson.build +++ b/src/admin/meson.build @@ -13,8 +13,10 @@ admin_protocol_h =3D custom_target( 'admin_protocol.h', input: admin_driver_protocol, output: 'admin_protocol.h', + depend_files: rpcgen_src, command: [ - genprotocol_prog, rpcgen_prog, '-h', '@INPUT@', '@OUTPUT@', + meson_python_prog, python3_prog, rpcgen_prog, + '--mode=3Dheader', '@INPUT@', '@OUTPUT@', ], ) admin_driver_generated +=3D admin_protocol_h @@ -23,8 +25,10 @@ admin_driver_generated +=3D custom_target( 'admin_protocol.c', input: admin_driver_protocol, output: 'admin_protocol.c', + depend_files: rpcgen_src, command: [ - genprotocol_prog, rpcgen_prog, '-c', '@INPUT@', '@OUTPUT@', + meson_python_prog, python3_prog, rpcgen_prog, + '--mode=3Dsource', '--header=3Dadmin_protocol.h', '@INPUT@', '@OUTPUT@= ', ], ) =20 diff --git a/src/locking/meson.build b/src/locking/meson.build index 72f7780438..529caa1b9e 100644 --- a/src/locking/meson.build +++ b/src/locking/meson.build @@ -18,8 +18,10 @@ lock_protocol_generated +=3D custom_target( 'lock_protocol.h', input: lock_protocol, output: 'lock_protocol.h', + depend_files: rpcgen_src, command: [ - genprotocol_prog, rpcgen_prog, '-h', '@INPUT@', '@OUTPUT@', + meson_python_prog, python3_prog, rpcgen_prog, + '--mode=3Dheader', '@INPUT@', '@OUTPUT@', ], ) =20 @@ -27,8 +29,10 @@ lock_protocol_generated +=3D custom_target( 'lock_protocol.c', input: lock_protocol, output: 'lock_protocol.c', + depend_files: rpcgen_src, command: [ - genprotocol_prog, rpcgen_prog, '-c', '@INPUT@', '@OUTPUT@', + meson_python_prog, python3_prog, rpcgen_prog, + '--mode=3Dsource', '--header=3Dlock_protocol.h', '@INPUT@', '@OUTPUT@', ], ) =20 diff --git a/src/logging/meson.build b/src/logging/meson.build index fa6af50fa6..4f5ca92052 100644 --- a/src/logging/meson.build +++ b/src/logging/meson.build @@ -10,8 +10,10 @@ log_protocol_header_generated =3D custom_target( 'log_protocol.h', input: log_protocol, output: 'log_protocol.h', + depend_files: rpcgen_src, command: [ - genprotocol_prog, rpcgen_prog, '-h', '@INPUT@', '@OUTPUT@' + meson_python_prog, python3_prog, rpcgen_prog, + '--mode=3Dheader', '@INPUT@', '@OUTPUT@', ], ) log_protocol_generated +=3D log_protocol_header_generated @@ -20,8 +22,10 @@ log_protocol_generated +=3D custom_target( 'log_protocol.c', input: log_protocol, output: 'log_protocol.c', + depend_files: rpcgen_src, command: [ - genprotocol_prog, rpcgen_prog, '-c', '@INPUT@', '@OUTPUT@' + meson_python_prog, python3_prog, rpcgen_prog, + '--mode=3Dsource', '--header=3Dlog_protocol.h', '@INPUT@', '@OUTPUT@', ], ) =20 diff --git a/src/lxc/meson.build b/src/lxc/meson.build index 99d4a34213..3a21f1f006 100644 --- a/src/lxc/meson.build +++ b/src/lxc/meson.build @@ -21,14 +21,22 @@ lxc_monitor_protocol_generated +=3D custom_target( 'lxc_monitor_protocol_h', input: lxc_monitor_protocol, output: 'lxc_monitor_protocol.h', - command: [ genprotocol_prog, rpcgen_prog, '-h', '@INPUT@', '@OUTPUT@' ] + depend_files: rpcgen_src, + command: [ + meson_python_prog, python3_prog, rpcgen_prog, + '--mode=3Dheader', '@INPUT@', '@OUTPUT@', + ] ) =20 lxc_monitor_protocol_generated +=3D custom_target( 'lxc_monitor_protocol_c', input: lxc_monitor_protocol, output: 'lxc_monitor_protocol.c', - command: [ genprotocol_prog, rpcgen_prog, '-c', '@INPUT@', '@OUTPUT@' ] + depend_files: rpcgen_src, + command: [ + meson_python_prog, python3_prog, rpcgen_prog, + '--mode=3Dsource', '--header=3Dlxc_monitor_protocol.h', '@INPUT@', '@O= UTPUT@', + ], ) =20 lxc_monitor_generated =3D custom_target( diff --git a/src/remote/meson.build b/src/remote/meson.build index eb4f7a0068..ce41591f5b 100644 --- a/src/remote/meson.build +++ b/src/remote/meson.build @@ -25,8 +25,10 @@ foreach name : [ 'remote', 'qemu', 'lxc' ] protocol_h, input: protocol_x, output: protocol_h, + depend_files: rpcgen_src, command: [ - genprotocol_prog, rpcgen_prog, '-h', '@INPUT@', '@OUTPUT@', + meson_python_prog, python3_prog, rpcgen_prog, + '--mode=3Dheader', '@INPUT@', '@OUTPUT@', ], ) =20 @@ -34,8 +36,10 @@ foreach name : [ 'remote', 'qemu', 'lxc' ] protocol_c, input: protocol_x, output: protocol_c, + depend_files: rpcgen_src, command: [ - genprotocol_prog, rpcgen_prog, '-c', '@INPUT@', '@OUTPUT@', + meson_python_prog, python3_prog, rpcgen_prog, + '--mode=3Dsource', '--header=3D' + protocol_h, '@INPUT@', '@OUTPUT@', ], ) =20 diff --git a/src/rpc/genprotocol.pl b/src/rpc/genprotocol.pl deleted file mode 100755 index 079627964f..0000000000 --- a/src/rpc/genprotocol.pl +++ /dev/null @@ -1,121 +0,0 @@ -#!/usr/bin/env perl -# -# Generate code for an XDR protocol, optionally applying -# fixups to the glibc rpcgen code so that it compiles -# with warnings turned on. -# -# This code is evil. Arguably better would be just to compile -# without -Werror. Update: The IXDR_PUT_LONG replacements are -# actually fixes for 64 bit, so this file is necessary. Arguably -# so is the type-punning fix. -# -# Copyright (C) 2007, 2011-2013 Red Hat, Inc. -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library. If not, see -# . -# -# Richard Jones - -use strict; - -my $in_function =3D 0; -my @function =3D (); - -my $rpcgen =3D shift; -my $mode =3D shift; -my $xdrdef =3D shift; -my $target =3D shift; - -unlink $target; - -if ($rpcgen =3D~ /portable-rpcgen/) { - $rpcgen =3D "$rpcgen -o -"; -} -open RPCGEN, "-|", "$rpcgen $mode $xdrdef" - or die "cannot run $rpcgen $mode $xdrdef: $!"; -open TARGET, ">$target" - or die "cannot create $target: $!"; - -my $fixup =3D $^O eq "linux" || $^O eq "gnukfreebsd" || $^O eq "freebsd" |= | $^O eq "darwin"; - -if ($mode eq "-c") { - print TARGET "#include \n"; -} - -while () { - # We only want to fixup the GLibc rpcgen output - # So just print data unchanged, if non-Linux - unless ($fixup) { - print TARGET; - next; - } - - if (m/^{/) { - $in_function =3D 1; - print TARGET; - next; - } - - s/\t/ /g; - - # Fix VPATH builds - s,#include ".*/([^/]+)protocol\.h",#include "${1}protocol.h",; - - # Portability for Solaris RPC - s/u_quad_t/uint64_t/g; - s/quad_t/int64_t/g; - s/xdr_u_quad_t/xdr_uint64_t/g; - s/xdr_quad_t/xdr_int64_t/g; - s/(?]\bbuf\b/, @function; - @function =3D grep !/[^.>]\bbuf\b/, @function if @uses =3D=3D 1; - - # Remove decl of i, if i isn't used in the function. - @uses =3D grep /[^.>]\bi\b/, @function; - @function =3D grep !/[^.>]\bi\b/, @function if @uses =3D=3D 1; - - # The code uses 'IXDR_PUT_{U_,}LONG' but it's wrong in two - # ways: Firstly these functions are deprecated and don't - # work on 64 bit platforms. Secondly the return value should - # be ignored. Correct both these mistakes. - @function =3D - map { s/\bIXDR_PUT_((U_)?)LONG\b/(void)IXDR_PUT_$1INT32/; $_ } - map { s/\bXDR_INLINE\b/(int32_t*)XDR_INLINE/; $_ } - @function; - - print TARGET (join ("", @function)); - @function =3D (); - } - - unless ($in_function) { - print TARGET; - } else { - push @function, $_; - } -} - -close TARGET - or die "cannot save $target: $!"; -close RPCGEN - or die "cannot shutdown $rpcgen: $!"; - -chmod 0444, $target - or die "cannot set $target readonly: $!"; diff --git a/src/rpc/meson.build b/src/rpc/meson.build index 36a2809adf..d58f3caaf5 100644 --- a/src/rpc/meson.build +++ b/src/rpc/meson.build @@ -1,4 +1,3 @@ -genprotocol_prog =3D find_program('genprotocol.pl') gendispatch_prog =3D find_program('gendispatch.pl') =20 socket_sources =3D [ @@ -53,8 +52,10 @@ foreach name : [ 'virnet', 'virkeepalive' ] header_file, input: protocol_file, output: header_file, + depend_files: rpcgen_src, command: [ - genprotocol_prog, rpcgen_prog, '-h', '@INPUT@', '@OUTPUT@', + meson_python_prog, python3_prog, rpcgen_prog, + '--mode=3Dheader', '@INPUT@', '@OUTPUT@', ], ) =20 @@ -62,8 +63,10 @@ foreach name : [ 'virnet', 'virkeepalive' ] source_file, input: protocol_file, output: source_file, + depend_files: rpcgen_src, command: [ - genprotocol_prog, rpcgen_prog, '-c', '@INPUT@', '@OUTPUT@', + meson_python_prog, python3_prog, rpcgen_prog, + '--mode=3Dsource', '--header=3D' + header_file, '@INPUT@', '@OUTPUT@= ', ], ) =20 --=20 2.39.1 From nobody Fri Apr 19 11:08:17 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of redhat.com designates 170.10.133.124 as permitted sender) client-ip=170.10.133.124; envelope-from=libvir-list-bounces@redhat.com; helo=us-smtp-delivery-124.mimecast.com; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 170.10.133.124 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1678293614; cv=none; d=zohomail.com; s=zohoarc; b=jVuyh65fEtbEMTHjMr2gCf2jFZQqybz1HUiJL7CFDPzZE0nIqArywaMuwCIFlpFWgvDnUoObk7rk+24i66DHIrKPi/Tb+1XeIXC0NmtiOmQhZT7NdW9Jlb8Y/ZKzlo6nG5baVaFUM9PpXoJECiLyt6O2z8zVErcNbmRlbC3q94k= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1678293614; h=Content-Type:Content-Transfer-Encoding:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=eiKZo++NdPDhiiHGyPgYZvR8g8tzeI6JHVHhg1m9T+4=; b=I4D5AYufyq1Y1Iw5wj/BlsjeNZK4L+nSjLaEXf/fD5uNA0xMzwVeB6Rukbu9cGuV9Qc0yCcaRVrFaoeEWsMdKGkt4lBmWRlKOeEw27fbP5P2YzXqZS8X325cXHPHR3TAdRkNVh9eyf9SMWjwbOBHcT9pLu23Rbl6JL4esOvf/vc= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 170.10.133.124 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by mx.zohomail.com with SMTPS id 1678293614357690.8949985266769; Wed, 8 Mar 2023 08:40:14 -0800 (PST) Received: from mimecast-mx02.redhat.com (mimecast-mx02.redhat.com [66.187.233.88]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-199-IjYUzNyONByotOo9m_Jd9Q-1; Wed, 08 Mar 2023 11:39:39 -0500 Received: from smtp.corp.redhat.com (int-mx09.intmail.prod.int.rdu2.redhat.com [10.11.54.9]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 02A5B87AA11; Wed, 8 Mar 2023 16:39:23 +0000 (UTC) Received: from mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com (unknown [10.30.29.100]) by smtp.corp.redhat.com (Postfix) with ESMTP id E2337492B04; Wed, 8 Mar 2023 16:39:22 +0000 (UTC) Received: from mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com (localhost [IPv6:::1]) by mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com (Postfix) with ESMTP id 04AB619472DC; Wed, 8 Mar 2023 16:39:21 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.rdu2.redhat.com [10.11.54.3]) by mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com (Postfix) with ESMTP id ACA401946A41 for ; Wed, 8 Mar 2023 16:39:19 +0000 (UTC) Received: by smtp.corp.redhat.com (Postfix) id A2E1A112132D; Wed, 8 Mar 2023 16:39:19 +0000 (UTC) Received: from virtlab420.virt.lab.eng.bos.redhat.com (virtlab420.virt.lab.eng.bos.redhat.com [10.19.152.148]) by smtp.corp.redhat.com (Postfix) with ESMTP id 845521121314; Wed, 8 Mar 2023 16:39:19 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1678293613; h=from:from:sender:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:list-id:list-help: list-unsubscribe:list-subscribe:list-post; bh=eiKZo++NdPDhiiHGyPgYZvR8g8tzeI6JHVHhg1m9T+4=; b=DNbdLNLFITyyWgTuMW3uDEfmft/22LHH9iWkHcVcvDRSa4GxYIECeQfFbJXAi3BuHaqgJg 8hiCU+rCwjZeAM1MZOnO/uD9Tiq64aOAtqDP6jiWwCbzwuQIFHd1aU5pog50ZWgbWIaTnQ ZCZfha0iTnE/6orypq12tOcMN4pfxZs= X-MC-Unique: IjYUzNyONByotOo9m_Jd9Q-1 X-Original-To: libvir-list@listman.corp.redhat.com From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= To: libvir-list@redhat.com Subject: [PATCH 12/16] rpcgen: add g_auto function support Date: Wed, 8 Mar 2023 11:39:09 -0500 Message-Id: <20230308163913.338952-13-berrange@redhat.com> In-Reply-To: <20230308163913.338952-1-berrange@redhat.com> References: <20230308163913.338952-1-berrange@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.1 on 10.11.54.3 X-BeenThere: libvir-list@redhat.com X-Mailman-Version: 2.1.29 Precedence: list List-Id: Development discussions about the libvirt library & tools List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: libvir-list-bounces@redhat.com Sender: "libvir-list" X-Scanned-By: MIMEDefang 3.1 on 10.11.54.9 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1678293614882100004 This will eliminate the need to call xdr_free to clear pointers from data structures. Signed-off-by: Daniel P. Berrang=C3=A9 Reviewed-by: Michal Privoznik --- build-aux/syntax-check.mk | 2 +- scripts/rpcgen/main.py | 4 + scripts/rpcgen/rpcgen/generator.py | 64 +++++++++-- scripts/rpcgen/tests/demo.c | 144 +++++++++++++++++++++++++ scripts/rpcgen/tests/demo.h | 48 +++++++++ scripts/rpcgen/tests/test_demo.c | 91 ++++++++-------- scripts/rpcgen/tests/test_generator.py | 7 +- 7 files changed, 298 insertions(+), 62 deletions(-) diff --git a/build-aux/syntax-check.mk b/build-aux/syntax-check.mk index 2599ba688f..317cf223e7 100644 --- a/build-aux/syntax-check.mk +++ b/build-aux/syntax-check.mk @@ -1464,7 +1464,7 @@ exclude_file_name_regexp--sc_prohibit_mixed_case_abbr= eviations =3D \ ^src/(vbox/vbox_CAPI.*.h|esx/esx_vi.(c|h)|esx/esx_storage_backend_iscsi.= c)$$ =20 exclude_file_name_regexp--sc_prohibit_empty_first_line =3D \ - ^tests/vmwareverdata/fusion-5.0.3.txt$$ + ^tests/vmwareverdata/fusion-5.0.3.txt|scripts/rpcgen/tests/demo\.c$$ =20 exclude_file_name_regexp--sc_prohibit_useless_translation =3D \ ^tests/virpolkittest.c diff --git a/scripts/rpcgen/main.py b/scripts/rpcgen/main.py index bf4ef38ede..d50f08c180 100755 --- a/scripts/rpcgen/main.py +++ b/scripts/rpcgen/main.py @@ -8,6 +8,7 @@ import sys from rpcgen.parser import XDRParser from rpcgen.generator import ( XDRTypeDeclarationGenerator, + XDRTypeImplementationGenerator, XDRMarshallDeclarationGenerator, XDRMarshallImplementationGenerator, ) @@ -59,6 +60,7 @@ def main(): if args.mode =3D=3D "header": print("/* This file is auto-generated from %s */\n" % args.input, = file=3Doutfp) print("#include ", file=3Doutfp) + print('#include "internal.h"', file=3Doutfp) for h in args.header: print('#include "%s"' % h, file=3Doutfp) print("", file=3Doutfp) @@ -75,6 +77,8 @@ def main(): for h in args.header: print('#include "%s"' % h, file=3Doutfp) print("", file=3Doutfp) + generator =3D XDRTypeImplementationGenerator(spec) + print(generator.visit(), file=3Doutfp) generator =3D XDRMarshallImplementationGenerator(spec) print(generator.visit(), file=3Doutfp) elif args.mode =3D=3D "repr": diff --git a/scripts/rpcgen/rpcgen/generator.py b/scripts/rpcgen/rpcgen/gen= erator.py index 110cd12c5e..c0f1e03ec4 100644 --- a/scripts/rpcgen/rpcgen/generator.py +++ b/scripts/rpcgen/rpcgen/generator.py @@ -28,24 +28,42 @@ class XDRTypeDeclarationGenerator(XDRVisitor): ) + "%stypedef enum %s %s;\n" % (indent, obj.name, obj.name) return code =20 - def visit_definition_struct(self, obj, indent, context): - code =3D "%sstruct %s %s;\n" % ( + def generate_cleanup(self, name, indent): + code =3D "%svoid xdr_%s_clear(%s *objp);\n" % ( indent, - obj.name, - self.visit_object(obj.body, indent), - ) + "%stypedef struct %s %s;\n" % (indent, obj.name, obj.name) + name, + name, + ) + "%sG_DEFINE_AUTO_CLEANUP_CLEAR_FUNC(%s, xdr_%s_clear);\n" % ( + indent, + name, + name, + ) + return code + + def visit_definition_struct(self, obj, indent, context): + code =3D ( + "%sstruct %s %s;\n" + % (indent, obj.name, self.visit_object(obj.body, indent)) + + "%stypedef struct %s %s;\n" % (indent, obj.name, obj.name) + + self.generate_cleanup(obj.name, indent) + ) return code =20 def visit_definition_union(self, obj, indent, context): - code =3D "%sstruct %s %s;\n" % ( - indent, - obj.name, - self.visit_object(obj.body, indent, obj.name), - ) + "%stypedef struct %s %s;\n" % (indent, obj.name, obj.name) + code =3D ( + "%sstruct %s %s;\n" + % (indent, obj.name, self.visit_object(obj.body, indent, obj.n= ame)) + + "%stypedef struct %s %s;\n" % (indent, obj.name, obj.name) + + self.generate_cleanup(obj.name, indent) + ) return code =20 def visit_definition_typedef(self, obj, indent, context): - return "%stypedef %s;\n" % (indent, self.visit_object(obj.decl, in= dent)) + code =3D "%stypedef %s;\n" % ( + indent, + self.visit_object(obj.decl, indent), + ) + self.generate_cleanup(obj.decl.identifier, indent) + return code =20 def visit_declaration_scalar(self, obj, indent, context): return "%s %s" % (self.visit_object(obj.typ, indent), obj.identifi= er) @@ -167,6 +185,30 @@ class XDRTypeDeclarationGenerator(XDRVisitor): return code =20 =20 +class XDRTypeImplementationGenerator(XDRVisitor): + def visit_definition_enum(self, obj, indent, context): + pass + + def generate_cleanup(self, name, indent): + code =3D ( + "\n" + + "%svoid xdr_%s_clear(%s *objp)\n" % (indent, name, name) + + "%s{\n" % indent + + "%s xdr_free((xdrproc_t)xdr_%s, (char *)objp);\n" % (inde= nt, name) + + "%s}\n" % indent + ) + return code + + def visit_definition_union(self, obj, indent, context): + return self.generate_cleanup(obj.name, indent) + + def visit_definition_struct(self, obj, indent, context): + return self.generate_cleanup(obj.name, indent) + + def visit_definition_typedef(self, obj, indent, context): + return self.generate_cleanup(obj.decl.identifier, indent) + + class XDRMarshallDeclarationGenerator(XDRVisitor): def visit_definition_enum(self, obj, indent, context): return "%sextern bool_t xdr_%s(XDR *, %s*);\n" % (indent, obj.nam= e, obj.name) diff --git a/scripts/rpcgen/tests/demo.c b/scripts/rpcgen/tests/demo.c index a261b4fe22..d57547d5eb 100644 --- a/scripts/rpcgen/tests/demo.c +++ b/scripts/rpcgen/tests/demo.c @@ -1,3 +1,147 @@ + +void xdr_TestStruct_clear(TestStruct *objp) +{ + xdr_free((xdrproc_t)xdr_TestStruct, (char *)objp); +} + + +void xdr_TestUnion_clear(TestUnion *objp) +{ + xdr_free((xdrproc_t)xdr_TestUnion, (char *)objp); +} + + +void xdr_TestUnionVoidDefault_clear(TestUnionVoidDefault *objp) +{ + xdr_free((xdrproc_t)xdr_TestUnionVoidDefault, (char *)objp); +} + + +void xdr_TestUnionNoDefault_clear(TestUnionNoDefault *objp) +{ + xdr_free((xdrproc_t)xdr_TestUnionNoDefault, (char *)objp); +} + + +void xdr_TestIntScalar_clear(TestIntScalar *objp) +{ + xdr_free((xdrproc_t)xdr_TestIntScalar, (char *)objp); +} + + +void xdr_TestIntPointer_clear(TestIntPointer *objp) +{ + xdr_free((xdrproc_t)xdr_TestIntPointer, (char *)objp); +} + + +void xdr_TestIntFixedArray_clear(TestIntFixedArray *objp) +{ + xdr_free((xdrproc_t)xdr_TestIntFixedArray, (char *)objp); +} + + +void xdr_TestIntVariableArray_clear(TestIntVariableArray *objp) +{ + xdr_free((xdrproc_t)xdr_TestIntVariableArray, (char *)objp); +} + + +void xdr_TestStringVariableArray_clear(TestStringVariableArray *objp) +{ + xdr_free((xdrproc_t)xdr_TestStringVariableArray, (char *)objp); +} + + +void xdr_TestOpaqueFixedArray_clear(TestOpaqueFixedArray *objp) +{ + xdr_free((xdrproc_t)xdr_TestOpaqueFixedArray, (char *)objp); +} + + +void xdr_TestOpaqueVariableArray_clear(TestOpaqueVariableArray *objp) +{ + xdr_free((xdrproc_t)xdr_TestOpaqueVariableArray, (char *)objp); +} + + +void xdr_TestEnumScalar_clear(TestEnumScalar *objp) +{ + xdr_free((xdrproc_t)xdr_TestEnumScalar, (char *)objp); +} + + +void xdr_TestEnumPointer_clear(TestEnumPointer *objp) +{ + xdr_free((xdrproc_t)xdr_TestEnumPointer, (char *)objp); +} + + +void xdr_TestEnumFixedArray_clear(TestEnumFixedArray *objp) +{ + xdr_free((xdrproc_t)xdr_TestEnumFixedArray, (char *)objp); +} + + +void xdr_TestEnumVariableArray_clear(TestEnumVariableArray *objp) +{ + xdr_free((xdrproc_t)xdr_TestEnumVariableArray, (char *)objp); +} + + +void xdr_TestStructScalar_clear(TestStructScalar *objp) +{ + xdr_free((xdrproc_t)xdr_TestStructScalar, (char *)objp); +} + + +void xdr_TestStructPointer_clear(TestStructPointer *objp) +{ + xdr_free((xdrproc_t)xdr_TestStructPointer, (char *)objp); +} + + +void xdr_TestStructFixedArray_clear(TestStructFixedArray *objp) +{ + xdr_free((xdrproc_t)xdr_TestStructFixedArray, (char *)objp); +} + + +void xdr_TestStructVariableArray_clear(TestStructVariableArray *objp) +{ + xdr_free((xdrproc_t)xdr_TestStructVariableArray, (char *)objp); +} + + +void xdr_TestUnionScalar_clear(TestUnionScalar *objp) +{ + xdr_free((xdrproc_t)xdr_TestUnionScalar, (char *)objp); +} + + +void xdr_TestUnionPointer_clear(TestUnionPointer *objp) +{ + xdr_free((xdrproc_t)xdr_TestUnionPointer, (char *)objp); +} + + +void xdr_TestUnionFixedArray_clear(TestUnionFixedArray *objp) +{ + xdr_free((xdrproc_t)xdr_TestUnionFixedArray, (char *)objp); +} + + +void xdr_TestUnionVariableArray_clear(TestUnionVariableArray *objp) +{ + xdr_free((xdrproc_t)xdr_TestUnionVariableArray, (char *)objp); +} + + +void xdr_TestStructAllTypes_clear(TestStructAllTypes *objp) +{ + xdr_free((xdrproc_t)xdr_TestStructAllTypes, (char *)objp); +} + bool_t xdr_TestEnum(XDR *xdrs, TestEnum *objp) { diff --git a/scripts/rpcgen/tests/demo.h b/scripts/rpcgen/tests/demo.h index 6fac61e7e9..36bcb40916 100644 --- a/scripts/rpcgen/tests/demo.h +++ b/scripts/rpcgen/tests/demo.h @@ -9,6 +9,8 @@ struct TestStruct { char c2; }; typedef struct TestStruct TestStruct; +void xdr_TestStruct_clear(TestStruct *objp); +G_DEFINE_AUTO_CLEANUP_CLEAR_FUNC(TestStruct, xdr_TestStruct_clear); =20 struct TestUnion { int type; @@ -19,6 +21,8 @@ struct TestUnion { } TestUnion_u; }; typedef struct TestUnion TestUnion; +void xdr_TestUnion_clear(TestUnion *objp); +G_DEFINE_AUTO_CLEANUP_CLEAR_FUNC(TestUnion, xdr_TestUnion_clear); =20 struct TestUnionVoidDefault { int type; @@ -28,6 +32,8 @@ struct TestUnionVoidDefault { } TestUnionVoidDefault_u; }; typedef struct TestUnionVoidDefault TestUnionVoidDefault; +void xdr_TestUnionVoidDefault_clear(TestUnionVoidDefault *objp); +G_DEFINE_AUTO_CLEANUP_CLEAR_FUNC(TestUnionVoidDefault, xdr_TestUnionVoidDe= fault_clear); =20 struct TestUnionNoDefault { int type; @@ -37,59 +43,99 @@ struct TestUnionNoDefault { } TestUnionNoDefault_u; }; typedef struct TestUnionNoDefault TestUnionNoDefault; +void xdr_TestUnionNoDefault_clear(TestUnionNoDefault *objp); +G_DEFINE_AUTO_CLEANUP_CLEAR_FUNC(TestUnionNoDefault, xdr_TestUnionNoDefaul= t_clear); =20 typedef int TestIntScalar; +void xdr_TestIntScalar_clear(TestIntScalar *objp); +G_DEFINE_AUTO_CLEANUP_CLEAR_FUNC(TestIntScalar, xdr_TestIntScalar_clear); =20 typedef int *TestIntPointer; +void xdr_TestIntPointer_clear(TestIntPointer *objp); +G_DEFINE_AUTO_CLEANUP_CLEAR_FUNC(TestIntPointer, xdr_TestIntPointer_clear); =20 typedef int TestIntFixedArray[3]; +void xdr_TestIntFixedArray_clear(TestIntFixedArray *objp); +G_DEFINE_AUTO_CLEANUP_CLEAR_FUNC(TestIntFixedArray, xdr_TestIntFixedArray_= clear); =20 typedef struct { u_int TestIntVariableArray_len; int *TestIntVariableArray_val; } TestIntVariableArray; +void xdr_TestIntVariableArray_clear(TestIntVariableArray *objp); +G_DEFINE_AUTO_CLEANUP_CLEAR_FUNC(TestIntVariableArray, xdr_TestIntVariable= Array_clear); =20 typedef char *TestStringVariableArray; +void xdr_TestStringVariableArray_clear(TestStringVariableArray *objp); +G_DEFINE_AUTO_CLEANUP_CLEAR_FUNC(TestStringVariableArray, xdr_TestStringVa= riableArray_clear); =20 typedef char TestOpaqueFixedArray[9]; +void xdr_TestOpaqueFixedArray_clear(TestOpaqueFixedArray *objp); +G_DEFINE_AUTO_CLEANUP_CLEAR_FUNC(TestOpaqueFixedArray, xdr_TestOpaqueFixed= Array_clear); =20 typedef struct { u_int TestOpaqueVariableArray_len; char *TestOpaqueVariableArray_val; } TestOpaqueVariableArray; +void xdr_TestOpaqueVariableArray_clear(TestOpaqueVariableArray *objp); +G_DEFINE_AUTO_CLEANUP_CLEAR_FUNC(TestOpaqueVariableArray, xdr_TestOpaqueVa= riableArray_clear); =20 typedef TestEnum TestEnumScalar; +void xdr_TestEnumScalar_clear(TestEnumScalar *objp); +G_DEFINE_AUTO_CLEANUP_CLEAR_FUNC(TestEnumScalar, xdr_TestEnumScalar_clear); =20 typedef TestEnum *TestEnumPointer; +void xdr_TestEnumPointer_clear(TestEnumPointer *objp); +G_DEFINE_AUTO_CLEANUP_CLEAR_FUNC(TestEnumPointer, xdr_TestEnumPointer_clea= r); =20 typedef TestEnum TestEnumFixedArray[13]; +void xdr_TestEnumFixedArray_clear(TestEnumFixedArray *objp); +G_DEFINE_AUTO_CLEANUP_CLEAR_FUNC(TestEnumFixedArray, xdr_TestEnumFixedArra= y_clear); =20 typedef struct { u_int TestEnumVariableArray_len; TestEnum *TestEnumVariableArray_val; } TestEnumVariableArray; +void xdr_TestEnumVariableArray_clear(TestEnumVariableArray *objp); +G_DEFINE_AUTO_CLEANUP_CLEAR_FUNC(TestEnumVariableArray, xdr_TestEnumVariab= leArray_clear); =20 typedef TestStruct TestStructScalar; +void xdr_TestStructScalar_clear(TestStructScalar *objp); +G_DEFINE_AUTO_CLEANUP_CLEAR_FUNC(TestStructScalar, xdr_TestStructScalar_cl= ear); =20 typedef TestStruct *TestStructPointer; +void xdr_TestStructPointer_clear(TestStructPointer *objp); +G_DEFINE_AUTO_CLEANUP_CLEAR_FUNC(TestStructPointer, xdr_TestStructPointer_= clear); =20 typedef TestStruct TestStructFixedArray[17]; +void xdr_TestStructFixedArray_clear(TestStructFixedArray *objp); +G_DEFINE_AUTO_CLEANUP_CLEAR_FUNC(TestStructFixedArray, xdr_TestStructFixed= Array_clear); =20 typedef struct { u_int TestStructVariableArray_len; TestStruct *TestStructVariableArray_val; } TestStructVariableArray; +void xdr_TestStructVariableArray_clear(TestStructVariableArray *objp); +G_DEFINE_AUTO_CLEANUP_CLEAR_FUNC(TestStructVariableArray, xdr_TestStructVa= riableArray_clear); =20 typedef TestUnion TestUnionScalar; +void xdr_TestUnionScalar_clear(TestUnionScalar *objp); +G_DEFINE_AUTO_CLEANUP_CLEAR_FUNC(TestUnionScalar, xdr_TestUnionScalar_clea= r); =20 typedef TestUnion *TestUnionPointer; +void xdr_TestUnionPointer_clear(TestUnionPointer *objp); +G_DEFINE_AUTO_CLEANUP_CLEAR_FUNC(TestUnionPointer, xdr_TestUnionPointer_cl= ear); =20 typedef TestUnion TestUnionFixedArray[21]; +void xdr_TestUnionFixedArray_clear(TestUnionFixedArray *objp); +G_DEFINE_AUTO_CLEANUP_CLEAR_FUNC(TestUnionFixedArray, xdr_TestUnionFixedAr= ray_clear); =20 typedef struct { u_int TestUnionVariableArray_len; TestUnion *TestUnionVariableArray_val; } TestUnionVariableArray; +void xdr_TestUnionVariableArray_clear(TestUnionVariableArray *objp); +G_DEFINE_AUTO_CLEANUP_CLEAR_FUNC(TestUnionVariableArray, xdr_TestUnionVari= ableArray_clear); =20 #define TestConstDec 25 =20 @@ -164,6 +210,8 @@ struct TestStructAllTypes { TestUnionVariableArray tuva; }; typedef struct TestStructAllTypes TestStructAllTypes; +void xdr_TestStructAllTypes_clear(TestStructAllTypes *objp); +G_DEFINE_AUTO_CLEANUP_CLEAR_FUNC(TestStructAllTypes, xdr_TestStructAllType= s_clear); =20 extern bool_t xdr_TestEnum(XDR *, TestEnum*); =20 diff --git a/scripts/rpcgen/tests/test_demo.c b/scripts/rpcgen/tests/test_d= emo.c index 54f48e5637..cfb4cbe146 100644 --- a/scripts/rpcgen/tests/test_demo.c +++ b/scripts/rpcgen/tests/test_demo.c @@ -72,13 +72,6 @@ static void test_xdr(xdrproc_t proc, void *vorig, void *= vnew, const char *testna g_assert_cmpint(memcmp(buf, expected, actlen), =3D=3D, 0); xdr_destroy(&xdr); =20 - /* Step 4: free mem from the new object only; the orig - * was on the stack so leave untouched */ - xdrmem_create(&xdr, buf, buflen, XDR_FREE); - - ret =3D !!proc(&xdr, vnew); - g_assert_cmpint(ret, =3D=3D, true); - cleanup: xdr_destroy(&xdr); } @@ -96,7 +89,7 @@ static void test_struct(void) TestStruct vorig =3D { .c1 =3D 'a', .c2 =3D 'b', }; - TestStruct vnew =3D {0}; + g_auto(TestStruct) vnew =3D {0}; =20 test_xdr((xdrproc_t)xdr_TestStruct, &vorig, &vnew, "struct", false); } @@ -106,7 +99,7 @@ static void test_union_case(void) TestUnion vorig =3D { .type =3D 20, .TestUnion_u =3D { .i1 =3D 1729 }, }; - TestUnion vnew =3D {0}; + g_auto(TestUnion) vnew =3D {0}; =20 test_xdr((xdrproc_t)xdr_TestUnion, &vorig, &vnew, "union_case", false); } @@ -116,7 +109,7 @@ static void test_union_default(void) TestUnion vorig =3D { .type =3D 87539319, .TestUnion_u =3D { .i3 =3D 1729 }, }; - TestUnion vnew =3D {0}; + g_auto(TestUnion) vnew =3D {0}; =20 test_xdr((xdrproc_t)xdr_TestUnion, &vorig, &vnew, "union_default", fal= se); } @@ -126,7 +119,7 @@ static void test_union_void_default_case(void) TestUnionVoidDefault vorig =3D { .type =3D 21, .TestUnionVoidDefault_u =3D { .i1 =3D 1729 }, }; - TestUnionVoidDefault vnew =3D {0}; + g_auto(TestUnionVoidDefault) vnew =3D {0}; =20 test_xdr((xdrproc_t)xdr_TestUnionVoidDefault, &vorig, &vnew, "union_vo= id_default_case", false); } @@ -136,7 +129,7 @@ static void test_union_void_default_default(void) TestUnionVoidDefault vorig =3D { .type =3D 87539319 }; - TestUnionVoidDefault vnew =3D {0}; + g_auto(TestUnionVoidDefault) vnew =3D {0}; =20 test_xdr((xdrproc_t)xdr_TestUnionVoidDefault, &vorig, &vnew, "union_vo= id_default_default", false); } @@ -146,7 +139,7 @@ static void test_union_no_default_case(void) TestUnionNoDefault vorig =3D { .type =3D 22, .TestUnionNoDefault_u =3D { .i1 =3D 1729 }, }; - TestUnionNoDefault vnew =3D {0}; + g_auto(TestUnionNoDefault) vnew =3D {0}; =20 test_xdr((xdrproc_t)xdr_TestUnionNoDefault, &vorig, &vnew, "union_no_d= efault_case", false); } @@ -156,7 +149,7 @@ static void test_union_no_default_default(void) TestUnionNoDefault vorig =3D { .type =3D 87539319, }; - TestUnionNoDefault vnew =3D {0}; + g_auto(TestUnionNoDefault) vnew =3D {0}; =20 test_xdr((xdrproc_t)xdr_TestUnionNoDefault, &vorig, &vnew, "union_no_d= efault_default", true); } @@ -164,7 +157,7 @@ static void test_union_no_default_default(void) static void test_int_scalar(void) { TestIntScalar vorig =3D 1729; - TestIntScalar vnew =3D 0; + g_auto(TestIntScalar) vnew =3D 0; =20 test_xdr((xdrproc_t)xdr_TestIntScalar, &vorig, &vnew, "int_scalar", fa= lse); } @@ -173,7 +166,7 @@ static void test_int_pointer_set(void) { int vorigp =3D 1729; TestIntPointer vorig =3D &vorigp; - TestIntPointer vnew =3D NULL; + g_auto(TestIntPointer) vnew =3D NULL; =20 test_xdr((xdrproc_t)xdr_TestIntPointer, &vorig, &vnew, "int_pointer_se= t", false); } @@ -181,7 +174,7 @@ static void test_int_pointer_set(void) static void test_int_pointer_null(void) { TestIntPointer vorig =3D NULL; - TestIntPointer vnew =3D NULL; + g_auto(TestIntPointer) vnew =3D NULL; =20 test_xdr((xdrproc_t)xdr_TestIntPointer, &vorig, &vnew, "int_pointer_nu= ll", false); } @@ -189,7 +182,7 @@ static void test_int_pointer_null(void) static void test_int_fixed_array(void) { TestIntFixedArray vorig =3D { 1729, 0, 87539319 }; - TestIntFixedArray vnew =3D {0}; + g_auto(TestIntFixedArray) vnew =3D {0}; =20 test_xdr((xdrproc_t)xdr_TestIntFixedArray, vorig, vnew, "int_fixed_array", false); @@ -201,7 +194,7 @@ static void test_int_variable_array_set(void) .TestIntVariableArray_len =3D 3, .TestIntVariableArray_val =3D (int[]) { 1729, 0, 87539319 } }; - TestIntVariableArray vnew =3D {0}; + g_auto(TestIntVariableArray) vnew =3D {0}; =20 test_xdr((xdrproc_t)xdr_TestIntVariableArray, &vorig, &vnew, "int_variable_array_set", false); @@ -213,7 +206,7 @@ static void test_int_variable_array_overflow(void) .TestIntVariableArray_len =3D 6, .TestIntVariableArray_val =3D (int[]) { 1729, 0, 87539319, 0, 1729= } }; - TestIntVariableArray vnew =3D {0}; + g_auto(TestIntVariableArray) vnew =3D {0}; =20 test_xdr((xdrproc_t)xdr_TestIntVariableArray, &vorig, &vnew, "int_variable_array_overflow", true); @@ -225,7 +218,7 @@ static void test_int_variable_array_empty(void) .TestIntVariableArray_len =3D 0, .TestIntVariableArray_val =3D (int[]) {0}, }; - TestIntVariableArray vnew =3D {0}; + g_auto(TestIntVariableArray) vnew =3D {0}; =20 test_xdr((xdrproc_t)xdr_TestIntVariableArray, &vorig, &vnew, "int_variable_array_empty", false); @@ -234,7 +227,7 @@ static void test_int_variable_array_empty(void) static void test_string_variable_array_set(void) { TestStringVariableArray vorig =3D (TestStringVariableArray) "taxis"; - TestStringVariableArray vnew =3D NULL; + g_auto(TestStringVariableArray) vnew =3D NULL; =20 test_xdr((xdrproc_t)xdr_TestStringVariableArray, &vorig, &vnew, "string_variable_array_set", false); @@ -243,7 +236,7 @@ static void test_string_variable_array_set(void) static void test_string_variable_array_empty(void) { TestStringVariableArray vorig =3D (TestStringVariableArray)""; - TestStringVariableArray vnew =3D NULL; + g_auto(TestStringVariableArray) vnew =3D NULL; =20 test_xdr((xdrproc_t)xdr_TestStringVariableArray, &vorig, &vnew, "string_variable_array_empty", false); @@ -252,7 +245,7 @@ static void test_string_variable_array_empty(void) static void test_opaque_fixed_array(void) { TestOpaqueFixedArray vorig =3D { 0xca, 0xfe, 0x12, 0x23, 0x34, 0x45, 0= x56, 0x67, 0x78 }; - TestOpaqueFixedArray vnew =3D {0}; + g_auto(TestOpaqueFixedArray) vnew =3D {0}; =20 test_xdr((xdrproc_t)xdr_TestOpaqueFixedArray, vorig, vnew, "opaque_fix= ed_array", false); } @@ -263,7 +256,7 @@ static void test_opaque_variable_array_set(void) .TestOpaqueVariableArray_len =3D 3, .TestOpaqueVariableArray_val =3D (char[]) { 0xca, 0xfe, 0x12 }, }; - TestOpaqueVariableArray vnew =3D {0}; + g_auto(TestOpaqueVariableArray) vnew =3D {0}; =20 test_xdr((xdrproc_t)xdr_TestOpaqueVariableArray, &vorig, &vnew, "opaque_variable_array_set", false); @@ -278,7 +271,7 @@ static void test_opaque_variable_array_overflow(void) 0xca, 0xfe, 0x12, 0xca, 0xfe, 0x12, }, }; - TestOpaqueVariableArray vnew =3D {0}; + g_auto(TestOpaqueVariableArray) vnew =3D {0}; =20 test_xdr((xdrproc_t)xdr_TestOpaqueVariableArray, &vorig, &vnew, "opaque_variable_array_overflow", true); @@ -290,7 +283,7 @@ static void test_opaque_variable_array_empty(void) .TestOpaqueVariableArray_len =3D 0, .TestOpaqueVariableArray_val =3D (char[]) {0}, }; - TestOpaqueVariableArray vnew =3D {0}; + g_auto(TestOpaqueVariableArray) vnew =3D {0}; =20 test_xdr((xdrproc_t)xdr_TestOpaqueVariableArray, &vorig, &vnew, "opaque_variable_array_empty", false); @@ -299,7 +292,7 @@ static void test_opaque_variable_array_empty(void) static void test_enum_scalar(void) { TestEnumScalar vorig =3D TEST_ENUM_TWO; - TestEnumScalar vnew =3D 0; + g_auto(TestEnumScalar) vnew =3D 0; =20 test_xdr((xdrproc_t)xdr_TestEnumScalar, &vorig, &vnew, "enum_scalar", false); @@ -309,7 +302,7 @@ static void test_enum_pointer_set(void) { TestEnum vorigp =3D TEST_ENUM_TWO; TestEnumPointer vorig =3D &vorigp; - TestEnumPointer vnew =3D NULL; + g_auto(TestEnumPointer) vnew =3D NULL; =20 test_xdr((xdrproc_t)xdr_TestEnumPointer, &vorig, &vnew, "enum_pointer_set", false); @@ -318,7 +311,7 @@ static void test_enum_pointer_set(void) static void test_enum_pointer_null(void) { TestEnumPointer vorig =3D NULL; - TestEnumPointer vnew =3D NULL; + g_auto(TestEnumPointer) vnew =3D NULL; =20 test_xdr((xdrproc_t)xdr_TestEnumPointer, &vorig, &vnew, "enum_pointer_null", false); @@ -331,7 +324,7 @@ static void test_enum_fixed_array(void) TEST_ENUM_ONE, TEST_ENUM_TWO, TEST_ENUM_ONE, TEST_ENUM_TWO, TEST_ENUM_ONE, TEST_ENUM_TWO, TEST_ENUM_ONE }; - TestEnumFixedArray vnew =3D {0}; + g_auto(TestEnumFixedArray) vnew =3D {0}; =20 test_xdr((xdrproc_t)xdr_TestEnumFixedArray, vorig, vnew, "enum_fixed_a= rray", false); } @@ -344,7 +337,7 @@ static void test_enum_variable_array_set(void) TEST_ENUM_ONE, TEST_ENUM_TWO, TEST_ENUM_ONE, }, }; - TestEnumVariableArray vnew =3D {0}; + g_auto(TestEnumVariableArray) vnew =3D {0}; =20 test_xdr((xdrproc_t)xdr_TestEnumVariableArray, &vorig, &vnew, "enum_variable_array_set", false); @@ -361,7 +354,7 @@ static void test_enum_variable_array_overflow(void) TEST_ENUM_ONE, TEST_ENUM_TWO, TEST_ENUM_ONE, TEST_ENUM_TWO, } }; - TestEnumVariableArray vnew =3D {0}; + g_auto(TestEnumVariableArray) vnew =3D {0}; =20 test_xdr((xdrproc_t)xdr_TestEnumVariableArray, &vorig, &vnew, "enum_variable_array_overflow", true); @@ -373,7 +366,7 @@ static void test_enum_variable_array_empty(void) .TestEnumVariableArray_len =3D 0, .TestEnumVariableArray_val =3D (TestEnum[]) {0}, }; - TestEnumVariableArray vnew =3D {0}; + g_auto(TestEnumVariableArray) vnew =3D {0}; =20 test_xdr((xdrproc_t)xdr_TestEnumVariableArray, &vorig, &vnew, "enum_variable_array_empty", false); @@ -385,7 +378,7 @@ static void test_enum_variable_array_empty(void) static void test_struct_scalar(void) { TestStructScalar vorig =3D TEST_STRUCT_INIT; - TestStructScalar vnew =3D {0}; + g_auto(TestStructScalar) vnew =3D {0}; =20 test_xdr((xdrproc_t)xdr_TestStructScalar, &vorig, &vnew, "struct_scalar", false); @@ -395,7 +388,7 @@ static void test_struct_pointer_set(void) { TestStruct vorigp =3D TEST_STRUCT_INIT; TestStructPointer vorig =3D &vorigp; - TestStructPointer vnew =3D NULL; + g_auto(TestStructPointer) vnew =3D NULL; =20 test_xdr((xdrproc_t)xdr_TestStructPointer, &vorig, &vnew, "struct_pointer_set", false); @@ -404,7 +397,7 @@ static void test_struct_pointer_set(void) static void test_struct_pointer_null(void) { TestStructPointer vorig =3D NULL; - TestStructPointer vnew =3D NULL; + g_auto(TestStructPointer) vnew =3D NULL; =20 test_xdr((xdrproc_t)xdr_TestStructPointer, &vorig, &vnew, "struct_pointer_null", false); @@ -419,7 +412,7 @@ static void test_struct_fixed_array(void) TEST_STRUCT_INIT_ALT, TEST_STRUCT_INIT_ALT, TEST_STRUCT_INIT, TEST= _STRUCT_INIT, TEST_STRUCT_INIT_ALT }; - TestStructFixedArray vnew =3D {0}; + g_auto(TestStructFixedArray) vnew =3D {0}; =20 test_xdr((xdrproc_t)xdr_TestStructFixedArray, vorig, vnew, "struct_fix= ed_array", false); } @@ -432,7 +425,7 @@ static void test_struct_variable_array_set(void) TEST_STRUCT_INIT, TEST_STRUCT_INIT_ALT, TEST_STRUCT_INIT_ALT, }, }; - TestStructVariableArray vnew =3D {0}; + g_auto(TestStructVariableArray) vnew =3D {0}; =20 test_xdr((xdrproc_t)xdr_TestStructVariableArray, &vorig, &vnew, "struct_variable_array_set", false); @@ -450,7 +443,7 @@ static void test_struct_variable_array_overflow(void) TEST_STRUCT_INIT, TEST_STRUCT_INIT, TEST_STRUCT_INIT, TEST_STR= UCT_INIT, } }; - TestStructVariableArray vnew =3D {0}; + g_auto(TestStructVariableArray) vnew =3D {0}; =20 test_xdr((xdrproc_t)xdr_TestStructVariableArray, &vorig, &vnew, "struct_variable_array_overflow", true); @@ -462,7 +455,7 @@ static void test_struct_variable_array_empty(void) .TestStructVariableArray_len =3D 0, .TestStructVariableArray_val =3D (TestStruct[]) {}, }; - TestStructVariableArray vnew =3D {0}; + g_auto(TestStructVariableArray) vnew =3D {0}; =20 test_xdr((xdrproc_t)xdr_TestStructVariableArray, &vorig, &vnew, "struct_variable_array_empty", false); @@ -474,7 +467,7 @@ static void test_struct_variable_array_empty(void) static void test_union_scalar(void) { TestUnionScalar vorig =3D TEST_UNION_INIT; - TestUnionScalar vnew =3D {0}; + g_auto(TestUnionScalar) vnew =3D {0}; =20 test_xdr((xdrproc_t)xdr_TestUnionScalar, &vorig, &vnew, "union_scalar", false); @@ -484,7 +477,7 @@ static void test_union_pointer_set(void) { TestUnion vorigp =3D TEST_UNION_INIT; TestUnionPointer vorig =3D &vorigp; - TestUnionPointer vnew =3D NULL; + g_auto(TestUnionPointer) vnew =3D NULL; =20 test_xdr((xdrproc_t)xdr_TestUnionPointer, &vorig, &vnew, "union_pointer_set", false); @@ -493,7 +486,7 @@ static void test_union_pointer_set(void) static void test_union_pointer_null(void) { TestUnionPointer vorig =3D NULL; - TestUnionPointer vnew =3D NULL; + g_auto(TestUnionPointer) vnew =3D NULL; =20 test_xdr((xdrproc_t)xdr_TestUnionPointer, &vorig, &vnew, "union_pointer_null", false); @@ -508,7 +501,7 @@ static void test_union_fixed_array(void) TEST_UNION_INIT_ALT, TEST_UNION_INIT_ALT, TEST_UNION_INIT, TEST_UN= ION_INIT, TEST_UNION_INIT_ALT }; - TestUnionFixedArray vnew =3D {0}; + g_auto(TestUnionFixedArray) vnew =3D {0}; =20 test_xdr((xdrproc_t)xdr_TestUnionFixedArray, vorig, vnew, "union_fixed= _array", false); } @@ -521,7 +514,7 @@ static void test_union_variable_array_set(void) TEST_UNION_INIT, TEST_UNION_INIT_ALT, TEST_UNION_INIT_ALT, }, }; - TestUnionVariableArray vnew =3D {0}; + g_auto(TestUnionVariableArray) vnew =3D {0}; =20 test_xdr((xdrproc_t)xdr_TestUnionVariableArray, &vorig, &vnew, "union_variable_array_set", false); @@ -540,7 +533,7 @@ static void test_union_variable_array_overflow(void) TEST_UNION_INIT, TEST_UNION_INIT, TEST_UNION_INIT, TEST_UNION_= INIT, } }; - TestUnionVariableArray vnew =3D {0}; + g_auto(TestUnionVariableArray) vnew =3D {0}; =20 test_xdr((xdrproc_t)xdr_TestUnionVariableArray, &vorig, &vnew, "union_variable_array_overflow", true); @@ -552,7 +545,7 @@ static void test_union_variable_array_empty(void) .TestUnionVariableArray_len =3D 0, .TestUnionVariableArray_val =3D (TestUnion[]) {}, }; - TestUnionVariableArray vnew =3D {0}; + g_auto(TestUnionVariableArray) vnew =3D {0}; =20 test_xdr((xdrproc_t)xdr_TestUnionVariableArray, &vorig, &vnew, "union_variable_array_empty", false); @@ -720,7 +713,7 @@ static void test_struct_all_types(void) }, }, }; - TestStructAllTypes vnew =3D {0}; + g_auto(TestStructAllTypes) vnew =3D {0}; =20 test_xdr((xdrproc_t)xdr_TestStructAllTypes, &vorig, &vnew, "test_struct_all_types", false); diff --git a/scripts/rpcgen/tests/test_generator.py b/scripts/rpcgen/tests/= test_generator.py index bc7660a6fc..6660810f41 100644 --- a/scripts/rpcgen/tests/test_generator.py +++ b/scripts/rpcgen/tests/test_generator.py @@ -6,6 +6,7 @@ from pathlib import Path from rpcgen.parser import XDRParser from rpcgen.generator import ( XDRTypeDeclarationGenerator, + XDRTypeImplementationGenerator, XDRMarshallDeclarationGenerator, XDRMarshallImplementationGenerator, ) @@ -42,7 +43,11 @@ def test_generate_source(): parser =3D XDRParser(fp) spec =3D parser.parse() =20 - got =3D XDRMarshallImplementationGenerator(spec).visit() + got =3D ( + XDRTypeImplementationGenerator(spec).visit() + + "\n" + + XDRMarshallImplementationGenerator(spec).visit() + ) =20 with h.open("r") as fp: want =3D fp.read() --=20 2.39.1 From nobody Fri Apr 19 11:08:17 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of redhat.com designates 170.10.129.124 as permitted sender) client-ip=170.10.129.124; envelope-from=libvir-list-bounces@redhat.com; helo=us-smtp-delivery-124.mimecast.com; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 170.10.129.124 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1678293594; cv=none; d=zohomail.com; s=zohoarc; b=G9zPJG+/3ucp08NfgbLzJreYft+ioOKHUclAFXSpKdsbW0/ckV/cEAWRbhEXZFnGi/34mX0w/nChtjv9qIWDNIsgfnT1ivnuuY5jUrsEd6MipklN2JM2a6DsuVLSwqwdo9KP5iaq8mQYW8WnaX23WnzFq8RqfBHT6Ng9GB4RcDA= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1678293594; h=Content-Type:Content-Transfer-Encoding:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=crIEVgPkiMpmAFHEz5xiSbf2QIOYwP5tiojQ/SXCThw=; b=KnhNlCnV5Zcx0/Akdlpp/XcSSJGMNyzBSmSXrAcVJP38N0hdtPrS4s45Lcr7jFsolUL1zF5JVeSfoMnGUB6pv2K1y9Hhngoll4/4QwxNw/aMlDHig1OHjEz6xwJHdDVhYYxsm4a9L+XlUlDqoCZ6QjCIAfLndgmQDZgtx1H7wsU= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 170.10.129.124 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) by mx.zohomail.com with SMTPS id 1678293594542623.0244197929059; Wed, 8 Mar 2023 08:39:54 -0800 (PST) Received: from mimecast-mx02.redhat.com (mimecast-mx02.redhat.com [66.187.233.88]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-625-RZ4JGsXIMoyAbtnbcrb5eQ-1; Wed, 08 Mar 2023 11:39:44 -0500 Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.rdu2.redhat.com [10.11.54.3]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 40F69886463; Wed, 8 Mar 2023 16:39:29 +0000 (UTC) Received: from mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com (unknown [10.30.29.100]) by smtp.corp.redhat.com (Postfix) with ESMTP id 26DC81121330; Wed, 8 Mar 2023 16:39:29 +0000 (UTC) Received: from mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com (localhost [IPv6:::1]) by mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com (Postfix) with ESMTP id 41FB01946A6A; Wed, 8 Mar 2023 16:39:28 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.rdu2.redhat.com [10.11.54.3]) by mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com (Postfix) with ESMTP id D51EF1946A7B for ; Wed, 8 Mar 2023 16:39:19 +0000 (UTC) Received: by smtp.corp.redhat.com (Postfix) id C7F80112132D; Wed, 8 Mar 2023 16:39:19 +0000 (UTC) Received: from virtlab420.virt.lab.eng.bos.redhat.com (virtlab420.virt.lab.eng.bos.redhat.com [10.19.152.148]) by smtp.corp.redhat.com (Postfix) with ESMTP id ADAB21121314; Wed, 8 Mar 2023 16:39:19 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1678293593; h=from:from:sender:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:list-id:list-help: list-unsubscribe:list-subscribe:list-post; bh=crIEVgPkiMpmAFHEz5xiSbf2QIOYwP5tiojQ/SXCThw=; b=ViF71OjtAc7WrzKXiToC9Z1G9thiP4OI/KAYWLlXlob3RDpVeMGEsf8DLTS0HlJ1qUz+f+ vpaxcTuTEpeqpv9Q5UyP9l8364ch+o3sgjRu5aKTIrvHydKi6MhNejkZ0oBZUQJ3NAAXDA jU5PHfyMKgXkE+4fb0uMSarDrynGW5A= X-MC-Unique: RZ4JGsXIMoyAbtnbcrb5eQ-1 X-Original-To: libvir-list@listman.corp.redhat.com From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= To: libvir-list@redhat.com Subject: [PATCH 13/16] rpc: use g_auto for client RPC return parameters Date: Wed, 8 Mar 2023 11:39:10 -0500 Message-Id: <20230308163913.338952-14-berrange@redhat.com> In-Reply-To: <20230308163913.338952-1-berrange@redhat.com> References: <20230308163913.338952-1-berrange@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.1 on 10.11.54.3 X-BeenThere: libvir-list@redhat.com X-Mailman-Version: 2.1.29 Precedence: list List-Id: Development discussions about the libvirt library & tools List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: libvir-list-bounces@redhat.com Sender: "libvir-list" X-Scanned-By: MIMEDefang 3.1 on 10.11.54.3 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1678293594771100001 Currently some, but not all, methods have a call to the xdr_free function, for the 'ret' variable. This is done on methods where there are complex structs containing allocated memory. In other cases the structs contain allocated memory, but the pointer is stolen, so xdr_free is not called. In other cases no allocated memory is present, so xdr_free. This is hard to reason about, because the definition of the struct is not visible in the client stubs. Switch to use g_auto() for the 'ret' variable, which means 'xdr_free' is always going to be called. Some places now need to use g_steal_pointer as a result. Signed-off-by: Daniel P. Berrang=C3=A9 Reviewed-by: Michal Privoznik --- src/rpc/gendispatch.pl | 60 +++++++++++++++++------------------------- 1 file changed, 24 insertions(+), 36 deletions(-) diff --git a/src/rpc/gendispatch.pl b/src/rpc/gendispatch.pl index b186849606..e151d33aaa 100755 --- a/src/rpc/gendispatch.pl +++ b/src/rpc/gendispatch.pl @@ -1440,7 +1440,7 @@ elsif ($mode eq "client") { " = &args.$1.$1_len,\n" . " = VIR_TYPED_PARAM_STRING_OKAY) < 0) {\n" . " xdr_free((xdrproc_t)xdr_= $call->{args}, (char *)&args);\n" . - " goto done;\n" . + " goto cleanup;\n" . " }"); push(@free_list, " virTypedParamsRemoteFree((struct= _virTypedParameterRemote *) args.params.params_val,\n" . " args.pa= rams.params_len);\n"); @@ -1527,7 +1527,7 @@ elsif ($mode eq "client") { if ($rettype eq "void") { $call_ret =3D "NULL"; } else { - push(@vars_list, "$rettype ret =3D {0}"); + push(@vars_list, "g_auto($rettype) ret =3D {0}"); =20 foreach my $ret_member (@{$call->{ret_members}}) { if ($multi_ret) { @@ -1582,12 +1582,11 @@ elsif ($mode eq "client") { # error out on unannotated arrays die "$1_nonnull_string array without insert@ a= nnotation: $ret_member"; } elsif ($ret_member =3D~ m/^(?:admin|remote)_nonnull_stri= ng (\S+);/) { - push(@ret_list, "rv =3D ret.$1;"); + push(@ret_list, "rv =3D g_steal_pointer(&ret.$1);"); $single_ret_var =3D "char *rv =3D NULL"; $single_ret_type =3D "char *"; } elsif ($ret_member =3D~ m/^(?:admin|remote)_string (\S+)= ;/) { - push(@ret_list, "rv =3D ret.$1 ? *ret.$1 : NULL;"); - push(@ret_list, "VIR_FREE(ret.$1);"); + push(@ret_list, "rv =3D ret.$1 ? g_steal_pointer(ret.$= 1) : NULL;"); $single_ret_var =3D "char *rv =3D NULL"; $single_ret_type =3D "char *"; } elsif ($ret_member =3D~ m/^remote_nonnull_(domain|networ= k|network_port|storage_pool|storage_vol|node_device|interface|secret|nwfilt= er|nwfilter_binding|domain_checkpoint|domain_snapshot) (\S+);/) { @@ -1599,7 +1598,6 @@ elsif ($mode eq "client") { # SPECIAL: virDomainCreateWithFlags updates the gi= ven # domain object instead of returning a ne= w one push(@ret_list, "dom->id =3D ret.dom.id;"); - push(@ret_list, "xdr_free((xdrproc_t)xdr_$call->{r= et}, (char *)&ret);"); push(@ret_list, "rv =3D 0;"); $single_ret_var =3D "int rv =3D -1"; $single_ret_type =3D "int"; @@ -1612,7 +1610,6 @@ elsif ($mode eq "client") { push(@ret_list, "rv =3D get_nonnull_$name($pri= v_src, ret.$arg_name);"); } =20 - push(@ret_list, "xdr_free((xdrproc_t)xdr_$rettype,= (char *)&ret);"); $single_ret_var =3D "vir${type_name}Ptr rv =3D NUL= L"; $single_ret_type =3D "vir${type_name}Ptr"; } @@ -1712,8 +1709,6 @@ elsif ($mode eq "client") { push(@ret_list, "rv =3D get_nonnull_$name($priv_sr= c, ret.$arg_name);"); } =20 - push(@ret_list, "xdr_free((xdrproc_t)xdr_$rettype, (ch= ar *)&ret);"); - $single_ret_var =3D "virAdm${type_name}Ptr rv =3D NULL= "; $single_ret_type =3D "virAdm${type_name}Ptr"; } elsif ($ret_member =3D~ m/^(\/)?\*/) { @@ -1820,11 +1815,11 @@ elsif ($mode eq "client") { if ($call->{streamflag} ne "none") { print "\n"; print " if (!(netst =3D virNetClientStreamNew(priv->remoteP= rogram, $call->{constname}, priv->counter, sparse)))\n"; - print " goto done;\n"; + print " goto cleanup;\n"; print "\n"; print " if (virNetClientAddStream(priv->client, netst) < 0)= {\n"; print " virObjectUnref(netst);\n"; - print " goto done;\n"; + print " goto cleanup;\n"; print " }"; print "\n"; print " st->driver =3D &remoteStreamDrv;\n"; @@ -1837,7 +1832,7 @@ elsif ($mode eq "client") { print "\n"; print " if (feature =3D=3D VIR_DRV_FEATURE_REMOTE) {\n"; print " rv =3D 1;\n"; - print " goto done;\n"; + print " goto cleanup;\n"; print " }\n"; } =20 @@ -1847,7 +1842,7 @@ elsif ($mode eq "client") { print " virReportError(VIR_ERR_RPC,\n"; print " _(\"%s length greater than maxim= um: %d > %d\"),\n"; print " $args_check->{name}, (int)$args_= check->{arg}, $args_check->{limit});\n"; - print " goto done;\n"; + print " goto cleanup;\n"; print " }\n"; } =20 @@ -1858,7 +1853,7 @@ elsif ($mode eq "client") { print " _(\"too many remote ${single_ret= _list_error_msg_type}s: %d > %d,\"\n"; print " \"in parameter '$single_ret_li= st_name' for 'vir$call->{ProcName}'\"),\n"; print " $single_ret_list_max_var, $singl= e_ret_list_max_define);\n"; - print " goto done;\n"; + print " goto cleanup;\n"; print " }\n"; } =20 @@ -1909,7 +1904,7 @@ elsif ($mode eq "client") { print " st->privateData =3D NULL;\n"; } =20 - print " goto done;\n"; + print " goto cleanup;\n"; print " }\n"; print "\n"; =20 @@ -1982,29 +1977,22 @@ elsif ($mode eq "client") { } } =20 - if ($single_ret_as_list or $single_ret_cleanup or $modern_ret_as_l= ist) { + print "\n"; + print "cleanup:\n"; + if (@custom_error_cleanup) { + print " if (rv !=3D 0) {\n"; + print " "; + print join("\n ", @custom_error_cleanup); + print " }\n"; + } + if ($modern_ret_as_list) { + print " if (tmp_results) {\n"; + print " for (i =3D 0; i < ret.$single_ret_list_name.${s= ingle_ret_list_name}_len; i++)\n"; + print " virObjectUnref(tmp_results[i]);\n"; + print " VIR_FREE(tmp_results);\n"; + print " }\n"; print "\n"; - print "cleanup:\n"; - if (@custom_error_cleanup) { - print " if (rv !=3D 0) {\n"; - print " "; - print join("\n ", @custom_error_cleanup); - print " }\n"; - } - if ($modern_ret_as_list) { - print " if (tmp_results) {\n"; - print " for (i =3D 0; i < ret.$single_ret_list_name= .${single_ret_list_name}_len; i++)\n"; - print " virObjectUnref(tmp_results[i]);\n"; - print " VIR_FREE(tmp_results);\n"; - print " }\n"; - print "\n"; - } - print " xdr_free((xdrproc_t)xdr_$call->{ret}, (char *)&ret)= ;\n"; } - - print "\n"; - print "done:\n"; - print join("\n", @free_list); =20 print " return rv;\n"; --=20 2.39.1 From nobody Fri Apr 19 11:08:17 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of redhat.com designates 170.10.129.124 as permitted sender) client-ip=170.10.129.124; envelope-from=libvir-list-bounces@redhat.com; helo=us-smtp-delivery-124.mimecast.com; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 170.10.129.124 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1678293607; cv=none; d=zohomail.com; s=zohoarc; b=RXk3idLJT/veSYKv5ARuo91En0sK2hz1Q11lnm5ZS294/untLZ6u0alcLKN9tmHq2BdwC+zrL/mHjA5f8zZjsu0XhrgKuobfMN/bY1BkgthGVomLp29TpTlTOCWKibie5TAYhyJ7C2JxV8GzDt9I9HgUk3o2joihNBc45LE4Z9w= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1678293607; h=Content-Type:Content-Transfer-Encoding:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=MK4mXtFF6jL6Dv3btg6Hgl85v+Zpouz/LKQFKK6b4ws=; b=eTXVur0YROnvPuYSec4uPupJqxJpWAIUIVMjftN/z9EF8/DnvMUmatOsdXJwDpDeIaKHhpElHcNMvUJEcnNNCKRKSgEX3Y+k50iVVbCglaDLhOMXigmzzwuD+Ycz7K8v36/Sybl8VlaRs/HXYk44uA+msNuSca2YLurikkhVCEE= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 170.10.129.124 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) by mx.zohomail.com with SMTPS id 1678293607113911.9678205441638; Wed, 8 Mar 2023 08:40:07 -0800 (PST) Received: from mimecast-mx02.redhat.com (mx3-rdu2.redhat.com [66.187.233.73]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-484-ab1MqJQjNw6srUX15aMLew-1; Wed, 08 Mar 2023 11:39:35 -0500 Received: from smtp.corp.redhat.com (int-mx09.intmail.prod.int.rdu2.redhat.com [10.11.54.9]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 8BD9C1C02CAC; Wed, 8 Mar 2023 16:39:23 +0000 (UTC) Received: from mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com (unknown [10.30.29.100]) by smtp.corp.redhat.com (Postfix) with ESMTP id 726DF492B08; Wed, 8 Mar 2023 16:39:23 +0000 (UTC) Received: from mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com (localhost [IPv6:::1]) by mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com (Postfix) with ESMTP id 3697619472F2; Wed, 8 Mar 2023 16:39:21 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.rdu2.redhat.com [10.11.54.3]) by mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com (Postfix) with ESMTP id 0452719472C2 for ; Wed, 8 Mar 2023 16:39:20 +0000 (UTC) Received: by smtp.corp.redhat.com (Postfix) id EC6D3112132D; Wed, 8 Mar 2023 16:39:19 +0000 (UTC) Received: from virtlab420.virt.lab.eng.bos.redhat.com (virtlab420.virt.lab.eng.bos.redhat.com [10.19.152.148]) by smtp.corp.redhat.com (Postfix) with ESMTP id D256F1121330; Wed, 8 Mar 2023 16:39:19 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1678293606; h=from:from:sender:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:list-id:list-help: list-unsubscribe:list-subscribe:list-post; bh=MK4mXtFF6jL6Dv3btg6Hgl85v+Zpouz/LKQFKK6b4ws=; b=DTKoDzks3DvEytwkAdmEUwc+7owPk5eP5wuBfxG6Iod8q/vGZ/8Pap8qt6h5v+bd5madt/ i/326/YetAMSuWQ4mN2WUnF6pdpoEEUVjMq2+0oD3riVaFJC+MohwRFK+LTG/pY28Zoa4u tivO4UY2cfuSds55GKs4JYa6863DlsY= X-MC-Unique: ab1MqJQjNw6srUX15aMLew-1 X-Original-To: libvir-list@listman.corp.redhat.com From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= To: libvir-list@redhat.com Subject: [PATCH 14/16] admin: use g_auto for client RPC return parameters Date: Wed, 8 Mar 2023 11:39:11 -0500 Message-Id: <20230308163913.338952-15-berrange@redhat.com> In-Reply-To: <20230308163913.338952-1-berrange@redhat.com> References: <20230308163913.338952-1-berrange@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.1 on 10.11.54.3 X-BeenThere: libvir-list@redhat.com X-Mailman-Version: 2.1.29 Precedence: list List-Id: Development discussions about the libvirt library & tools List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: libvir-list-bounces@redhat.com Sender: "libvir-list" X-Scanned-By: MIMEDefang 3.1 on 10.11.54.9 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1678293608809100007 Currently some, but not all, methods have a call to the xdr_free function, for the 'ret' variable. This is done on methods where there are complex structs containing allocated memory. In other cases the structs contain allocated memory, but the pointer is stolen, so xdr_free is not called. In other cases no allocated memory is present, so xdr_free. This is hard to reason about, because the definition of the struct is not visible in the client stubs. Switch to use g_auto() for the 'ret' variable, which means 'xdr_free' is always going to be called. Some places now need to use g_steal_pointer as a result. Signed-off-by: Daniel P. Berrang=C3=A9 Reviewed-by: Michal Privoznik --- src/admin/admin_remote.c | 50 +++++++++++----------------------------- 1 file changed, 14 insertions(+), 36 deletions(-) diff --git a/src/admin/admin_remote.c b/src/admin/admin_remote.c index 3ae20ff373..3291a1e965 100644 --- a/src/admin/admin_remote.c +++ b/src/admin/admin_remote.c @@ -229,10 +229,9 @@ remoteAdminServerGetThreadPoolParameters(virAdmServerP= tr srv, int *nparams, unsigned int flags) { - int rv =3D -1; remoteAdminPriv *priv =3D srv->conn->privateData; admin_server_get_threadpool_parameters_args args; - admin_server_get_threadpool_parameters_ret ret =3D {0}; + g_auto(admin_server_get_threadpool_parameters_ret) ret =3D {0}; VIR_LOCK_GUARD lock =3D virObjectLockGuard(priv); =20 args.flags =3D flags; @@ -248,13 +247,9 @@ remoteAdminServerGetThreadPoolParameters(virAdmServerP= tr srv, ADMIN_SERVER_THREADPOOL_PARAMETERS_MAX, params, nparams) < 0) - goto cleanup; - - rv =3D 0; + return -1; =20 - cleanup: - xdr_free((xdrproc_t)xdr_admin_server_get_threadpool_parameters_ret, (c= har *) &ret); - return rv; + return 0; } =20 static int @@ -297,10 +292,9 @@ remoteAdminClientGetInfo(virAdmClientPtr client, int *nparams, unsigned int flags) { - int rv =3D -1; remoteAdminPriv *priv =3D client->srv->conn->privateData; admin_client_get_info_args args; - admin_client_get_info_ret ret =3D {0}; + g_auto(admin_client_get_info_ret) ret =3D {0}; VIR_LOCK_GUARD lock =3D virObjectLockGuard(priv); =20 args.flags =3D flags; @@ -316,13 +310,9 @@ remoteAdminClientGetInfo(virAdmClientPtr client, ADMIN_CLIENT_INFO_PARAMETERS_MAX, params, nparams) < 0) - goto cleanup; - - rv =3D 0; + return -1; =20 - cleanup: - xdr_free((xdrproc_t)xdr_admin_client_get_info_ret, (char *) &ret); - return rv; + return 0; } =20 static int @@ -331,9 +321,8 @@ remoteAdminServerGetClientLimits(virAdmServerPtr srv, int *nparams, unsigned int flags) { - int rv =3D -1; admin_server_get_client_limits_args args; - admin_server_get_client_limits_ret ret =3D {0}; + g_auto(admin_server_get_client_limits_ret) ret =3D {0}; remoteAdminPriv *priv =3D srv->conn->privateData; VIR_LOCK_GUARD lock =3D virObjectLockGuard(priv); =20 @@ -352,14 +341,9 @@ remoteAdminServerGetClientLimits(virAdmServerPtr srv, ADMIN_SERVER_CLIENT_LIMITS_MAX, params, nparams) < 0) - goto cleanup; - - rv =3D 0; + return -1; =20 - cleanup: - xdr_free((xdrproc_t) xdr_admin_server_get_client_limits_ret, - (char *) &ret); - return rv; + return 0; } =20 static int @@ -401,10 +385,9 @@ remoteAdminConnectGetLoggingOutputs(virAdmConnectPtr c= onn, char **outputs, unsigned int flags) { - int rv =3D -1; remoteAdminPriv *priv =3D conn->privateData; admin_connect_get_logging_outputs_args args; - admin_connect_get_logging_outputs_ret ret =3D {0}; + g_auto(admin_connect_get_logging_outputs_ret) ret =3D {0}; VIR_LOCK_GUARD lock =3D virObjectLockGuard(priv); =20 args.flags =3D flags; @@ -421,9 +404,7 @@ remoteAdminConnectGetLoggingOutputs(virAdmConnectPtr co= nn, if (outputs) *outputs =3D g_steal_pointer(&ret.outputs); =20 - rv =3D ret.noutputs; - xdr_free((xdrproc_t) xdr_admin_connect_get_logging_outputs_ret, (char = *) &ret); - return rv; + return ret.noutputs; } =20 static int @@ -431,10 +412,9 @@ remoteAdminConnectGetLoggingFilters(virAdmConnectPtr c= onn, char **filters, unsigned int flags) { - int rv =3D -1; remoteAdminPriv *priv =3D conn->privateData; admin_connect_get_logging_filters_args args; - admin_connect_get_logging_filters_ret ret =3D {0}; + g_auto(admin_connect_get_logging_filters_ret) ret =3D {0}; VIR_LOCK_GUARD lock =3D virObjectLockGuard(priv); =20 args.flags =3D flags; @@ -449,9 +429,7 @@ remoteAdminConnectGetLoggingFilters(virAdmConnectPtr co= nn, return -1; =20 if (filters) - *filters =3D ret.filters ? *ret.filters : NULL; + *filters =3D ret.filters ? g_steal_pointer(ret.filters) : NULL; =20 - rv =3D ret.nfilters; - VIR_FREE(ret.filters); - return rv; + return ret.nfilters; } --=20 2.39.1 From nobody Fri Apr 19 11:08:17 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of redhat.com designates 170.10.133.124 as permitted sender) client-ip=170.10.133.124; envelope-from=libvir-list-bounces@redhat.com; helo=us-smtp-delivery-124.mimecast.com; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 170.10.133.124 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1678293590; cv=none; d=zohomail.com; s=zohoarc; b=WYJ8j38PsRZcB/+mBLQxFoYcgvdEszrjfKzzYoZVYjIyc3KIcDSe6nabMw+zJKTU9xauDnVaxVjOwNfCAqY8tj43HifLcdN0wxwlhFeGo/pdfC2YMLlZiZT1sOZAWwfUb0/r8wjD/CVXQxVPMlzAH4FD5lLUbXtSZlH/QffDTrk= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1678293590; h=Content-Type:Content-Transfer-Encoding:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=YaPjHWxCs4YmWEYl4NvMiHTTbUUbGbhmf3358JenOYg=; b=fdxJOaSbR5J4Q5z70uiR5zkZsnuvsImxadM6y8f2m1N33Wmypph4R3IssFugzm+IigVUR/wE9OnNcUfIJQeOZQbFeXBiEvLuCs8i7yCEbKzkFblFUwMraqYMDsCK3p+kNVKJRzUV5uiS6VQBn0v3qvlu1EizpCj1Ga1C4vllF74= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 170.10.133.124 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by mx.zohomail.com with SMTPS id 1678293590373980.2935670474373; Wed, 8 Mar 2023 08:39:50 -0800 (PST) Received: from mimecast-mx02.redhat.com (mimecast-mx02.redhat.com [66.187.233.88]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-282-qznKLcCVMYa0d5-zRWPyZQ-1; Wed, 08 Mar 2023 11:39:44 -0500 Received: from smtp.corp.redhat.com (int-mx10.intmail.prod.int.rdu2.redhat.com [10.11.54.10]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 31C2D889063; Wed, 8 Mar 2023 16:39:24 +0000 (UTC) Received: from mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com (unknown [10.30.29.100]) by smtp.corp.redhat.com (Postfix) with ESMTP id 0EC53492C3E; Wed, 8 Mar 2023 16:39:24 +0000 (UTC) Received: from mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com (localhost [IPv6:::1]) by mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com (Postfix) with ESMTP id 757D419452CE; Wed, 8 Mar 2023 16:39:21 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.rdu2.redhat.com [10.11.54.3]) by mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com (Postfix) with ESMTP id 485E51946A44 for ; Wed, 8 Mar 2023 16:39:20 +0000 (UTC) Received: by smtp.corp.redhat.com (Postfix) id 2E73F1121330; Wed, 8 Mar 2023 16:39:20 +0000 (UTC) Received: from virtlab420.virt.lab.eng.bos.redhat.com (virtlab420.virt.lab.eng.bos.redhat.com [10.19.152.148]) by smtp.corp.redhat.com (Postfix) with ESMTP id 060501121314; Wed, 8 Mar 2023 16:39:19 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1678293589; h=from:from:sender:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:list-id:list-help: list-unsubscribe:list-subscribe:list-post; bh=YaPjHWxCs4YmWEYl4NvMiHTTbUUbGbhmf3358JenOYg=; b=jJxyAmwwqj4WmRwZBS/kkuvbOii9+FGSOClFwff/rUTBD+ke5N55ohYU7UKBf8hvwYHTMX 7e39zc88YeHa35455kusGjBfRB4ANDaY4bWZL4QLIgfz8V4utgFWoGbLQce3K0pgG9njbC 3Do3jkdrtAavB+qJlSmL9hKSl+abL/s= X-MC-Unique: qznKLcCVMYa0d5-zRWPyZQ-1 X-Original-To: libvir-list@listman.corp.redhat.com From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= To: libvir-list@redhat.com Subject: [PATCH 15/16] remote: use g_auto for client RPC return parameters Date: Wed, 8 Mar 2023 11:39:12 -0500 Message-Id: <20230308163913.338952-16-berrange@redhat.com> In-Reply-To: <20230308163913.338952-1-berrange@redhat.com> References: <20230308163913.338952-1-berrange@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.1 on 10.11.54.3 X-BeenThere: libvir-list@redhat.com X-Mailman-Version: 2.1.29 Precedence: list List-Id: Development discussions about the libvirt library & tools List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: libvir-list-bounces@redhat.com Sender: "libvir-list" X-Scanned-By: MIMEDefang 3.1 on 10.11.54.10 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1678293591131100001 Currently some, but not all, methods have a call to the xdr_free function, for the 'ret' variable. This is done on methods where there are complex structs containing allocated memory. In other cases the structs contain allocated memory, but the pointer is stolen, so xdr_free is not called. In other cases no allocated memory is present, so xdr_free. This is hard to reason about, because the definition of the struct is not visible in the client stubs. Switch to use g_auto() for the 'ret' variable, which means 'xdr_free' is always going to be called. Some places now need to use g_steal_pointer as a result. Signed-off-by: Daniel P. Berrang=C3=A9 Reviewed-by: Michal Privoznik --- src/remote/remote_driver.c | 754 +++++++++++-------------------------- 1 file changed, 230 insertions(+), 524 deletions(-) diff --git a/src/remote/remote_driver.c b/src/remote/remote_driver.c index a4c60be3d7..02a687a700 100644 --- a/src/remote/remote_driver.c +++ b/src/remote/remote_driver.c @@ -683,7 +683,7 @@ remoteConnectSupportsFeatureUnlocked(virConnectPtr conn, int feature) { remote_connect_supports_feature_args args =3D { feature }; - remote_connect_supports_feature_ret ret =3D { 0 }; + g_auto(remote_connect_supports_feature_ret) ret =3D { 0 }; int rc; =20 rc =3D call(conn, priv, 0, REMOTE_PROC_CONNECT_SUPPORTS_FEATURE, @@ -1386,7 +1386,7 @@ remoteConnectClose(virConnectPtr conn) static const char * remoteConnectGetType(virConnectPtr conn) { - remote_connect_get_type_ret ret =3D {0}; + g_auto(remote_connect_get_type_ret) ret =3D {0}; struct private_data *priv =3D conn->privateData; VIR_LOCK_GUARD lock =3D remoteDriverLock(priv); =20 @@ -1407,7 +1407,7 @@ remoteConnectGetType(virConnectPtr conn) static int remoteConnectIsSecure(virConnectPtr conn) { struct private_data *priv =3D conn->privateData; - remote_connect_is_secure_ret ret =3D {0}; + g_auto(remote_connect_is_secure_ret) ret =3D {0}; VIR_LOCK_GUARD lock =3D remoteDriverLock(priv); =20 if (call(conn, priv, 0, REMOTE_PROC_CONNECT_IS_SECURE, @@ -1430,7 +1430,7 @@ static int remoteConnectIsEncrypted(virConnectPtr con= n) { bool encrypted; struct private_data *priv =3D conn->privateData; - remote_connect_is_secure_ret ret =3D {0}; + g_auto(remote_connect_is_secure_ret) ret =3D {0}; VIR_LOCK_GUARD lock =3D remoteDriverLock(priv); =20 if (call(conn, priv, 0, REMOTE_PROC_CONNECT_IS_SECURE, @@ -1457,9 +1457,8 @@ remoteNodeGetCPUStats(virConnectPtr conn, virNodeCPUStatsPtr params, int *nparams, unsigned int flags) { - int rv =3D -1; remote_node_get_cpu_stats_args args =3D {0}; - remote_node_get_cpu_stats_ret ret =3D {0}; + g_auto(remote_node_get_cpu_stats_ret) ret =3D {0}; size_t i; struct private_data *priv =3D conn->privateData; VIR_LOCK_GUARD lock =3D remoteDriverLock(priv); @@ -1481,15 +1480,14 @@ remoteNodeGetCPUStats(virConnectPtr conn, virReportError(VIR_ERR_RPC, "%s", _("remoteNodeGetCPUStats: " "returned number of stats exceeds limit")); - goto cleanup; + return -1; } /* Handle the case when the caller does not know the number of stats * and is asking for the number of stats supported */ if (*nparams =3D=3D 0) { *nparams =3D ret.nparams; - rv =3D 0; - goto cleanup; + return 0; } =20 *nparams =3D ret.params.params_len; @@ -1500,16 +1498,12 @@ remoteNodeGetCPUStats(virConnectPtr conn, virReportError(VIR_ERR_INTERNAL_ERROR, _("Stats %s too big for destination"), ret.params.params_val[i].field); - goto cleanup; + return -1; } params[i].value =3D ret.params.params_val[i].value; } =20 - rv =3D 0; - - cleanup: - xdr_free((xdrproc_t) xdr_remote_node_get_cpu_stats_ret, (char *) &ret); - return rv; + return 0; } =20 static int @@ -1519,9 +1513,8 @@ remoteNodeGetMemoryStats(virConnectPtr conn, int *nparams, unsigned int flags) { - int rv =3D -1; remote_node_get_memory_stats_args args =3D {0}; - remote_node_get_memory_stats_ret ret =3D {0}; + g_auto(remote_node_get_memory_stats_ret) ret =3D {0}; size_t i; struct private_data *priv =3D conn->privateData; VIR_LOCK_GUARD lock =3D remoteDriverLock(priv); @@ -1541,15 +1534,14 @@ remoteNodeGetMemoryStats(virConnectPtr conn, virReportError(VIR_ERR_RPC, "%s", _("remoteNodeGetMemoryStats: " "returned number of stats exceeds limit")); - goto cleanup; + return -1; } /* Handle the case when the caller does not know the number of stats * and is asking for the number of stats supported */ if (*nparams =3D=3D 0) { *nparams =3D ret.nparams; - rv =3D 0; - goto cleanup; + return 0; } =20 *nparams =3D ret.params.params_len; @@ -1560,16 +1552,12 @@ remoteNodeGetMemoryStats(virConnectPtr conn, virReportError(VIR_ERR_INTERNAL_ERROR, _("Stats %s too big for destination"), ret.params.params_val[i].field); - goto cleanup; + return -1; } params[i].value =3D ret.params.params_val[i].value; } =20 - rv =3D 0; - - cleanup: - xdr_free((xdrproc_t) xdr_remote_node_get_memory_stats_ret, (char *) &r= et); - return rv; + return 0; } =20 static int @@ -1579,7 +1567,7 @@ remoteNodeGetCellsFreeMemory(virConnectPtr conn, int maxCells) { remote_node_get_cells_free_memory_args args =3D {0}; - remote_node_get_cells_free_memory_ret ret =3D {0}; + g_auto(remote_node_get_cells_free_memory_ret) ret =3D {0}; size_t i; struct private_data *priv =3D conn->privateData; VIR_LOCK_GUARD lock =3D remoteDriverLock(priv); @@ -1602,18 +1590,15 @@ remoteNodeGetCellsFreeMemory(virConnectPtr conn, for (i =3D 0; i < ret.cells.cells_len; i++) freeMems[i] =3D ret.cells.cells_val[i]; =20 - xdr_free((xdrproc_t) xdr_remote_node_get_cells_free_memory_ret, (char = *) &ret); - return ret.cells.cells_len; } =20 static int remoteConnectListDomains(virConnectPtr conn, int *ids, int maxids) { - int rv =3D -1; size_t i; remote_connect_list_domains_args args =3D {0}; - remote_connect_list_domains_ret ret =3D {0}; + g_auto(remote_connect_list_domains_ret) ret =3D {0}; struct private_data *priv =3D conn->privateData; VIR_LOCK_GUARD lock =3D remoteDriverLock(priv); =20 @@ -1634,17 +1619,13 @@ remoteConnectListDomains(virConnectPtr conn, int *i= ds, int maxids) virReportError(VIR_ERR_RPC, _("Too many domains '%d' for limit '%d'"), ret.ids.ids_len, maxids); - goto cleanup; + return -1; } =20 for (i =3D 0; i < ret.ids.ids_len; ++i) ids[i] =3D ret.ids.ids_val[i]; =20 - rv =3D ret.ids.ids_len; - - cleanup: - xdr_free((xdrproc_t) xdr_remote_connect_list_domains_ret, (char *) &re= t); - return rv; + return ret.ids.ids_len; } =20 static int @@ -1684,9 +1665,8 @@ remoteDomainBlockStatsFlags(virDomainPtr domain, int *nparams, unsigned int flags) { - int rv =3D -1; remote_domain_block_stats_flags_args args =3D {0}; - remote_domain_block_stats_flags_ret ret =3D {0}; + g_auto(remote_domain_block_stats_flags_ret) ret =3D {0}; struct private_data *priv =3D domain->conn->privateData; VIR_LOCK_GUARD lock =3D remoteDriverLock(priv); =20 @@ -1706,7 +1686,7 @@ remoteDomainBlockStatsFlags(virDomainPtr domain, virReportError(VIR_ERR_RPC, "%s", _("remoteDomainBlockStatsFlags: " "returned number of stats exceeds limit")); - goto cleanup; + return -1; } =20 /* Handle the case when the caller does not know the number of stats @@ -1714,8 +1694,7 @@ remoteDomainBlockStatsFlags(virDomainPtr domain, */ if (*nparams =3D=3D 0) { *nparams =3D ret.nparams; - rv =3D 0; - goto cleanup; + return 0; } =20 *nparams =3D ret.params.params_len; @@ -1726,14 +1705,9 @@ remoteDomainBlockStatsFlags(virDomainPtr domain, REMOTE_DOMAIN_BLOCK_STATS_PARAMETERS_MAX, ¶ms, nparams) < 0) - goto cleanup; - - rv =3D 0; + return -1; =20 - cleanup: - xdr_free((xdrproc_t) xdr_remote_domain_block_stats_flags_ret, - (char *) &ret); - return rv; + return 0; } =20 static int @@ -1741,9 +1715,8 @@ remoteDomainGetMemoryParameters(virDomainPtr domain, virTypedParameterPtr params, int *nparams, unsigned int flags) { - int rv =3D -1; remote_domain_get_memory_parameters_args args =3D {0}; - remote_domain_get_memory_parameters_ret ret =3D {0}; + g_auto(remote_domain_get_memory_parameters_ret) ret =3D {0}; struct private_data *priv =3D domain->conn->privateData; VIR_LOCK_GUARD lock =3D remoteDriverLock(priv); =20 @@ -1761,8 +1734,7 @@ remoteDomainGetMemoryParameters(virDomainPtr domain, */ if (*nparams =3D=3D 0) { *nparams =3D ret.nparams; - rv =3D 0; - goto cleanup; + return 0; } =20 if (virTypedParamsDeserialize((struct _virTypedParameterRemote *) ret.= params.params_val, @@ -1770,14 +1742,9 @@ remoteDomainGetMemoryParameters(virDomainPtr domain, REMOTE_DOMAIN_MEMORY_PARAMETERS_MAX, ¶ms, nparams) < 0) - goto cleanup; - - rv =3D 0; + return -1; =20 - cleanup: - xdr_free((xdrproc_t) xdr_remote_domain_get_memory_parameters_ret, - (char *) &ret); - return rv; + return 0; } =20 static int @@ -1785,9 +1752,8 @@ remoteDomainGetNumaParameters(virDomainPtr domain, virTypedParameterPtr params, int *nparams, unsigned int flags) { - int rv =3D -1; remote_domain_get_numa_parameters_args args =3D {0}; - remote_domain_get_numa_parameters_ret ret =3D {0}; + g_auto(remote_domain_get_numa_parameters_ret) ret =3D {0}; struct private_data *priv =3D domain->conn->privateData; VIR_LOCK_GUARD lock =3D remoteDriverLock(priv); =20 @@ -1805,8 +1771,7 @@ remoteDomainGetNumaParameters(virDomainPtr domain, */ if (*nparams =3D=3D 0) { *nparams =3D ret.nparams; - rv =3D 0; - goto cleanup; + return 0; } =20 if (virTypedParamsDeserialize((struct _virTypedParameterRemote *) ret.= params.params_val, @@ -1814,14 +1779,9 @@ remoteDomainGetNumaParameters(virDomainPtr domain, REMOTE_DOMAIN_NUMA_PARAMETERS_MAX, ¶ms, nparams) < 0) - goto cleanup; - - rv =3D 0; + return -1; =20 - cleanup: - xdr_free((xdrproc_t) xdr_remote_domain_get_numa_parameters_ret, - (char *) &ret); - return rv; + return 0; } =20 static int @@ -1830,9 +1790,8 @@ remoteDomainGetLaunchSecurityInfo(virDomainPtr domain, int *nparams, unsigned int flags) { - int rv =3D -1; remote_domain_get_launch_security_info_args args =3D {0}; - remote_domain_get_launch_security_info_ret ret =3D {0}; + g_auto(remote_domain_get_launch_security_info_ret) ret =3D {0}; struct private_data *priv =3D domain->conn->privateData; VIR_LOCK_GUARD lock =3D remoteDriverLock(priv); =20 @@ -1849,14 +1808,9 @@ remoteDomainGetLaunchSecurityInfo(virDomainPtr domai= n, REMOTE_DOMAIN_LAUNCH_SECURITY_INFO_PARAM= S_MAX, params, nparams) < 0) - goto cleanup; - - rv =3D 0; + return -1; =20 - cleanup: - xdr_free((xdrproc_t) xdr_remote_domain_get_launch_security_info_ret, - (char *) &ret); - return rv; + return 0; } =20 static int @@ -1865,9 +1819,8 @@ remoteDomainGetPerfEvents(virDomainPtr domain, int *nparams, unsigned int flags) { - int rv =3D -1; remote_domain_get_perf_events_args args =3D {0}; - remote_domain_get_perf_events_ret ret =3D {0}; + g_auto(remote_domain_get_perf_events_ret) ret =3D {0}; struct private_data *priv =3D domain->conn->privateData; VIR_LOCK_GUARD lock =3D remoteDriverLock(priv); =20 @@ -1884,14 +1837,9 @@ remoteDomainGetPerfEvents(virDomainPtr domain, REMOTE_DOMAIN_PERF_EVENTS_MAX, params, nparams) < 0) - goto cleanup; - - rv =3D 0; + return -1; =20 - cleanup: - xdr_free((xdrproc_t) xdr_remote_domain_get_perf_events_ret, - (char *) &ret); - return rv; + return 0; } =20 static int @@ -1899,9 +1847,8 @@ remoteDomainGetBlkioParameters(virDomainPtr domain, virTypedParameterPtr params, int *nparams, unsigned int flags) { - int rv =3D -1; remote_domain_get_blkio_parameters_args args =3D {0}; - remote_domain_get_blkio_parameters_ret ret =3D {0}; + g_auto(remote_domain_get_blkio_parameters_ret) ret =3D {0}; struct private_data *priv =3D domain->conn->privateData; VIR_LOCK_GUARD lock =3D remoteDriverLock(priv); =20 @@ -1919,8 +1866,7 @@ remoteDomainGetBlkioParameters(virDomainPtr domain, */ if (*nparams =3D=3D 0) { *nparams =3D ret.nparams; - rv =3D 0; - goto cleanup; + return 0; } =20 if (virTypedParamsDeserialize((struct _virTypedParameterRemote *) ret.= params.params_val, @@ -1928,14 +1874,9 @@ remoteDomainGetBlkioParameters(virDomainPtr domain, REMOTE_DOMAIN_BLKIO_PARAMETERS_MAX, ¶ms, nparams) < 0) - goto cleanup; - - rv =3D 0; + return -1; =20 - cleanup: - xdr_free((xdrproc_t) xdr_remote_domain_get_blkio_parameters_ret, - (char *) &ret); - return rv; + return 0; } =20 static int @@ -1945,10 +1886,9 @@ remoteDomainGetVcpuPinInfo(virDomainPtr domain, int maplen, unsigned int flags) { - int rv =3D -1; size_t i; remote_domain_get_vcpu_pin_info_args args =3D {0}; - remote_domain_get_vcpu_pin_info_ret ret =3D {0}; + g_auto(remote_domain_get_vcpu_pin_info_ret) ret =3D {0}; struct private_data *priv =3D domain->conn->privateData; VIR_LOCK_GUARD lock =3D remoteDriverLock(priv); =20 @@ -1983,14 +1923,14 @@ remoteDomainGetVcpuPinInfo(virDomainPtr domain, virReportError(VIR_ERR_RPC, _("host reports too many vCPUs: %d > %d"), ret.num, ncpumaps); - goto cleanup; + return -1; } =20 if (ret.cpumaps.cpumaps_len > ncpumaps * maplen) { virReportError(VIR_ERR_RPC, _("host reports map buffer length exceeds maximum: = %d > %d"), ret.cpumaps.cpumaps_len, ncpumaps * maplen); - goto cleanup; + return -1; } =20 memset(cpumaps, 0, ncpumaps * maplen); @@ -1998,11 +1938,7 @@ remoteDomainGetVcpuPinInfo(virDomainPtr domain, for (i =3D 0; i < ret.cpumaps.cpumaps_len; ++i) cpumaps[i] =3D ret.cpumaps.cpumaps_val[i]; =20 - rv =3D ret.num; - - cleanup: - xdr_free((xdrproc_t) xdr_remote_domain_get_vcpu_pin_info_ret, (char *)= &ret); - return rv; + return ret.num; } =20 static int @@ -2043,10 +1979,9 @@ remoteDomainGetEmulatorPinInfo(virDomainPtr domain, int maplen, unsigned int flags) { - int rv =3D -1; size_t i; remote_domain_get_emulator_pin_info_args args =3D {0}; - remote_domain_get_emulator_pin_info_ret ret =3D {0}; + g_auto(remote_domain_get_emulator_pin_info_ret) ret =3D {0}; struct private_data *priv =3D domain->conn->privateData; VIR_LOCK_GUARD lock =3D remoteDriverLock(priv); =20 @@ -2073,7 +2008,7 @@ remoteDomainGetEmulatorPinInfo(virDomainPtr domain, virReportError(VIR_ERR_RPC, _("host reports map buffer length exceeds maximum: = %d > %d"), ret.cpumaps.cpumaps_len, maplen); - goto cleanup; + return -1; } =20 memset(cpumaps, 0, maplen); @@ -2081,12 +2016,7 @@ remoteDomainGetEmulatorPinInfo(virDomainPtr domain, for (i =3D 0; i < ret.cpumaps.cpumaps_len; ++i) cpumaps[i] =3D ret.cpumaps.cpumaps_val[i]; =20 - rv =3D ret.ret; - - cleanup: - xdr_free((xdrproc_t) xdr_remote_domain_get_emulator_pin_info_ret, - (char *) &ret); - return rv; + return ret.ret; } =20 static int @@ -2096,10 +2026,9 @@ remoteDomainGetVcpus(virDomainPtr domain, unsigned char *cpumaps, int maplen) { - int rv =3D -1; size_t i; remote_domain_get_vcpus_args args =3D {0}; - remote_domain_get_vcpus_ret ret =3D {0}; + g_auto(remote_domain_get_vcpus_ret) ret =3D {0}; struct private_data *priv =3D domain->conn->privateData; VIR_LOCK_GUARD lock =3D remoteDriverLock(priv); =20 @@ -2130,13 +2059,13 @@ remoteDomainGetVcpus(virDomainPtr domain, virReportError(VIR_ERR_RPC, _("host reports too many vCPUs: %d > %d"), ret.info.info_len, maxinfo); - goto cleanup; + return -1; } if (ret.cpumaps.cpumaps_len > maxinfo * maplen) { virReportError(VIR_ERR_RPC, _("host reports map buffer length exceeds maximum: = %d > %d"), ret.cpumaps.cpumaps_len, maxinfo * maplen); - goto cleanup; + return -1; } =20 memset(info, 0, sizeof(virVcpuInfo) * maxinfo); @@ -2152,11 +2081,7 @@ remoteDomainGetVcpus(virDomainPtr domain, for (i =3D 0; i < ret.cpumaps.cpumaps_len; ++i) cpumaps[i] =3D ret.cpumaps.cpumaps_val[i]; =20 - rv =3D ret.info.info_len; - - cleanup: - xdr_free((xdrproc_t) xdr_remote_domain_get_vcpus_ret, (char *) &ret); - return rv; + return ret.info.info_len; } =20 static int @@ -2164,11 +2089,10 @@ remoteDomainGetIOThreadInfo(virDomainPtr dom, virDomainIOThreadInfoPtr **info, unsigned int flags) { - int rv =3D -1; size_t i; struct private_data *priv =3D dom->conn->privateData; remote_domain_get_iothread_info_args args =3D {0}; - remote_domain_get_iothread_info_ret ret =3D {0}; + g_auto(remote_domain_get_iothread_info_ret) ret =3D {0}; remote_domain_iothread_info *src; VIR_LOCK_GUARD lock =3D remoteDriverLock(priv); =20 @@ -2187,7 +2111,7 @@ remoteDomainGetIOThreadInfo(virDomainPtr dom, virReportError(VIR_ERR_INTERNAL_ERROR, _("Too many IOThreads in info: %d for limit %d"), ret.info.info_len, REMOTE_IOTHREAD_INFO_MAX); - goto cleanup; + return -1; } =20 if (info) { @@ -2195,8 +2119,7 @@ remoteDomainGetIOThreadInfo(virDomainPtr dom, =20 if (!ret.info.info_len) { *info =3D NULL; - rv =3D ret.ret; - goto cleanup; + return ret.ret; } =20 info_ret =3D g_new0(virDomainIOThreadInfoPtr, ret.info.info_len); @@ -2215,21 +2138,15 @@ remoteDomainGetIOThreadInfo(virDomainPtr dom, *info =3D info_ret; } =20 - rv =3D ret.ret; - - cleanup: - xdr_free((xdrproc_t)xdr_remote_domain_get_iothread_info_ret, - (char *) &ret); - return rv; + return ret.ret; } =20 static int remoteDomainGetSecurityLabel(virDomainPtr domain, virSecurityLabelPtr secl= abel) { remote_domain_get_security_label_args args =3D {0}; - remote_domain_get_security_label_ret ret =3D {0}; + g_auto(remote_domain_get_security_label_ret) ret =3D {0}; struct private_data *priv =3D domain->conn->privateData; - int rv =3D -1; VIR_LOCK_GUARD lock =3D remoteDriverLock(priv); =20 make_nonnull_domain(&args.dom, domain); @@ -2244,26 +2161,21 @@ remoteDomainGetSecurityLabel(virDomainPtr domain, v= irSecurityLabelPtr seclabel) if (virStrcpyStatic(seclabel->label, ret.label.label_val) < 0) { virReportError(VIR_ERR_RPC, _("security label exceeds maximum:= %zu"), sizeof(seclabel->label) - 1); - goto cleanup; + return -1; } seclabel->enforcing =3D ret.enforcing; } =20 - rv =3D 0; - - cleanup: - xdr_free((xdrproc_t) xdr_remote_domain_get_security_label_ret, (char *= )&ret); - return rv; + return 0; } =20 static int remoteDomainGetSecurityLabelList(virDomainPtr domain, virSecurityLabelPtr*= seclabels) { remote_domain_get_security_label_list_args args =3D {0}; - remote_domain_get_security_label_list_ret ret =3D {0}; + g_auto(remote_domain_get_security_label_list_ret) ret =3D {0}; struct private_data *priv =3D domain->conn->privateData; size_t i; - int rv =3D -1; VIR_LOCK_GUARD lock =3D remoteDriverLock(priv); =20 make_nonnull_domain(&args.dom, domain); @@ -2282,16 +2194,12 @@ remoteDomainGetSecurityLabelList(virDomainPtr domai= n, virSecurityLabelPtr* secla virReportError(VIR_ERR_RPC, _("security label exceeds maxi= mum: %zd"), sizeof((*seclabels)->label) - 1); VIR_FREE(*seclabels); - goto cleanup; + return -1; } (*seclabels)[i].enforcing =3D cur->enforcing; } } - rv =3D ret.ret; - - cleanup: - xdr_free((xdrproc_t) xdr_remote_domain_get_security_label_list_ret, (c= har *)&ret); - return rv; + return ret.ret; } =20 static int @@ -2301,7 +2209,7 @@ remoteDomainGetState(virDomainPtr domain, unsigned int flags) { remote_domain_get_state_args args =3D {0}; - remote_domain_get_state_ret ret =3D {0}; + g_auto(remote_domain_get_state_ret) ret =3D {0}; struct private_data *priv =3D domain->conn->privateData; VIR_LOCK_GUARD lock =3D remoteDriverLock(priv); =20 @@ -2323,9 +2231,8 @@ remoteDomainGetState(virDomainPtr domain, static int remoteNodeGetSecurityModel(virConnectPtr conn, virSecurityModelPtr secmode= l) { - remote_node_get_security_model_ret ret =3D {0}; + g_auto(remote_node_get_security_model_ret) ret =3D {0}; struct private_data *priv =3D conn->privateData; - int rv =3D -1; VIR_LOCK_GUARD lock =3D remoteDriverLock(priv); =20 memset(secmodel, 0, sizeof(*secmodel)); @@ -2339,7 +2246,7 @@ remoteNodeGetSecurityModel(virConnectPtr conn, virSec= urityModelPtr secmodel) if (virStrcpyStatic(secmodel->model, ret.model.model_val) < 0) { virReportError(VIR_ERR_RPC, _("security model exceeds maximum:= %zu"), sizeof(secmodel->model) - 1); - goto cleanup; + return -1; } } =20 @@ -2347,15 +2254,11 @@ remoteNodeGetSecurityModel(virConnectPtr conn, virS= ecurityModelPtr secmodel) if (virStrcpyStatic(secmodel->doi, ret.doi.doi_val) < 0) { virReportError(VIR_ERR_RPC, _("security doi exceeds maximum: %= zu"), sizeof(secmodel->doi) - 1); - goto cleanup; + return -1; } } =20 - rv =3D 0; - - cleanup: - xdr_free((xdrproc_t) xdr_remote_node_get_security_model_ret, (char *)&= ret); - return rv; + return 0; } =20 static int @@ -2366,7 +2269,7 @@ remoteDomainMigratePrepare(virConnectPtr dconn, unsigned long resource) { remote_domain_migrate_prepare_args args =3D {0}; - remote_domain_migrate_prepare_ret ret =3D {0}; + g_auto(remote_domain_migrate_prepare_ret) ret =3D {0}; struct private_data *priv =3D dconn->privateData; VIR_LOCK_GUARD lock =3D remoteDriverLock(priv); =20 @@ -2381,11 +2284,12 @@ remoteDomainMigratePrepare(virConnectPtr dconn, return -1; =20 if (ret.cookie.cookie_len > 0) { - *cookie =3D ret.cookie.cookie_val; /* Caller frees. */ + *cookie =3D g_steal_pointer(&ret.cookie.cookie_val); /* Caller fre= es. */ *cookielen =3D ret.cookie.cookie_len; + ret.cookie.cookie_len =3D 0; } if (ret.uri_out) - *uri_out =3D *ret.uri_out; /* Caller frees. */ + *uri_out =3D g_steal_pointer(ret.uri_out); /* Caller frees. */ =20 VIR_FREE(ret.uri_out); return 0; @@ -2399,9 +2303,8 @@ remoteDomainMigratePrepare2(virConnectPtr dconn, unsigned long resource, const char *dom_xml) { - int rv =3D -1; remote_domain_migrate_prepare2_args args =3D {0}; - remote_domain_migrate_prepare2_ret ret =3D {0}; + g_auto(remote_domain_migrate_prepare2_ret) ret =3D {0}; struct private_data *priv =3D dconn->privateData; VIR_LOCK_GUARD lock =3D remoteDriverLock(priv); =20 @@ -2420,31 +2323,21 @@ remoteDomainMigratePrepare2(virConnectPtr dconn, if (!cookie || !cookielen) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("caller ignores cookie or cookielen")); - goto error; + return -1; } - *cookie =3D ret.cookie.cookie_val; /* Caller frees. */ + *cookie =3D g_steal_pointer(&ret.cookie.cookie_val); /* Caller fre= es. */ *cookielen =3D ret.cookie.cookie_len; } if (ret.uri_out) { if (!uri_out) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("caller ignores uri_out")); - goto error; + return -1; } - *uri_out =3D *ret.uri_out; /* Caller frees. */ + *uri_out =3D g_steal_pointer(ret.uri_out); /* Caller frees. */ } =20 - rv =3D 0; - - done: - VIR_FREE(ret.uri_out); - return rv; - error: - if (ret.cookie.cookie_len) - VIR_FREE(ret.cookie.cookie_val); - if (ret.uri_out) - VIR_FREE(*ret.uri_out); - goto done; + return 0; } =20 static int @@ -2452,7 +2345,7 @@ remoteDomainCreate(virDomainPtr domain) { remote_domain_create_args args =3D {0}; remote_domain_lookup_by_uuid_args args2 =3D {0}; - remote_domain_lookup_by_uuid_ret ret2 =3D {0}; + g_auto(remote_domain_lookup_by_uuid_ret) ret2 =3D {0}; struct private_data *priv =3D domain->conn->privateData; VIR_LOCK_GUARD lock =3D remoteDriverLock(priv); =20 @@ -2474,7 +2367,6 @@ remoteDomainCreate(virDomainPtr domain) return -1; =20 domain->id =3D ret2.dom.id; - xdr_free((xdrproc_t) &xdr_remote_domain_lookup_by_uuid_ret, (char *) &= ret2); =20 return 0; } @@ -2483,7 +2375,7 @@ static char * remoteDomainGetSchedulerType(virDomainPtr domain, int *nparams) { remote_domain_get_scheduler_type_args args =3D {0}; - remote_domain_get_scheduler_type_ret ret =3D {0}; + g_auto(remote_domain_get_scheduler_type_ret) ret =3D {0}; struct private_data *priv =3D domain->conn->privateData; VIR_LOCK_GUARD lock =3D remoteDriverLock(priv); =20 @@ -2497,7 +2389,7 @@ remoteDomainGetSchedulerType(virDomainPtr domain, int= *nparams) if (nparams) *nparams =3D ret.nparams; =20 /* Caller frees this. */ - return ret.type; + return g_steal_pointer(&ret.type); } =20 static int @@ -2506,9 +2398,8 @@ remoteDomainMemoryStats(virDomainPtr domain, unsigned int nr_stats, unsigned int flags) { - int rv =3D -1; remote_domain_memory_stats_args args =3D {0}; - remote_domain_memory_stats_ret ret =3D {0}; + g_auto(remote_domain_memory_stats_ret) ret =3D {0}; struct private_data *priv =3D domain->conn->privateData; size_t i; VIR_LOCK_GUARD lock =3D remoteDriverLock(priv); @@ -2534,10 +2425,7 @@ remoteDomainMemoryStats(virDomainPtr domain, stats[i].tag =3D ret.stats.stats_val[i].tag; stats[i].val =3D ret.stats.stats_val[i].val; } - rv =3D ret.stats.stats_len; - xdr_free((xdrproc_t) xdr_remote_domain_memory_stats_ret, (char *) &ret= ); - - return rv; + return ret.stats.stats_len; } =20 static int @@ -2548,9 +2436,8 @@ remoteDomainBlockPeek(virDomainPtr domain, void *buffer, unsigned int flags) { - int rv =3D -1; remote_domain_block_peek_args args =3D {0}; - remote_domain_block_peek_ret ret =3D {0}; + g_auto(remote_domain_block_peek_ret) ret =3D {0}; struct private_data *priv =3D domain->conn->privateData; VIR_LOCK_GUARD lock =3D remoteDriverLock(priv); =20 @@ -2577,15 +2464,11 @@ remoteDomainBlockPeek(virDomainPtr domain, if (ret.buffer.buffer_len !=3D size) { virReportError(VIR_ERR_RPC, "%s", _("returned buffer is not same size as requested")); - goto cleanup; + return -1; } =20 memcpy(buffer, ret.buffer.buffer_val, size); - rv =3D 0; - - cleanup: - VIR_FREE(ret.buffer.buffer_val); - return rv; + return 0; } =20 static int @@ -2595,9 +2478,8 @@ remoteDomainMemoryPeek(virDomainPtr domain, void *buffer, unsigned int flags) { - int rv =3D -1; remote_domain_memory_peek_args args =3D {0}; - remote_domain_memory_peek_ret ret =3D {0}; + g_auto(remote_domain_memory_peek_ret) ret =3D {0}; struct private_data *priv =3D domain->conn->privateData; VIR_LOCK_GUARD lock =3D remoteDriverLock(priv); =20 @@ -2623,16 +2505,11 @@ remoteDomainMemoryPeek(virDomainPtr domain, if (ret.buffer.buffer_len !=3D size) { virReportError(VIR_ERR_RPC, "%s", _("returned buffer is not same size as requested")); - goto cleanup; + return -1; } =20 memcpy(buffer, ret.buffer.buffer_val, size); - rv =3D 0; - - cleanup: - VIR_FREE(ret.buffer.buffer_val); - - return rv; + return 0; } =20 static int remoteDomainGetBlockJobInfo(virDomainPtr domain, @@ -2641,7 +2518,7 @@ static int remoteDomainGetBlockJobInfo(virDomainPtr d= omain, unsigned int flags) { remote_domain_get_block_job_info_args args =3D {0}; - remote_domain_get_block_job_info_ret ret =3D {0}; + g_auto(remote_domain_get_block_job_info_ret) ret =3D {0}; struct private_data *priv =3D domain->conn->privateData; VIR_LOCK_GUARD lock =3D remoteDriverLock(priv); =20 @@ -2673,9 +2550,8 @@ static int remoteDomainGetBlockIoTune(virDomainPtr do= main, int *nparams, unsigned int flags) { - int rv =3D -1; remote_domain_get_block_io_tune_args args =3D {0}; - remote_domain_get_block_io_tune_ret ret =3D {0}; + g_auto(remote_domain_get_block_io_tune_ret) ret =3D {0}; struct private_data *priv =3D domain->conn->privateData; VIR_LOCK_GUARD lock =3D remoteDriverLock(priv); =20 @@ -2697,8 +2573,7 @@ static int remoteDomainGetBlockIoTune(virDomainPtr do= main, */ if (*nparams =3D=3D 0) { *nparams =3D ret.nparams; - rv =3D 0; - goto cleanup; + return -1; } =20 if (virTypedParamsDeserialize((struct _virTypedParameterRemote *) ret.= params.params_val, @@ -2706,14 +2581,9 @@ static int remoteDomainGetBlockIoTune(virDomainPtr d= omain, REMOTE_DOMAIN_BLOCK_IO_TUNE_PARAMETERS_M= AX, ¶ms, nparams) < 0) - goto cleanup; - - rv =3D 0; + return -1; =20 - cleanup: - xdr_free((xdrproc_t) xdr_remote_domain_get_block_io_tune_ret, - (char *) &ret); - return rv; + return 0; } =20 static int remoteDomainGetCPUStats(virDomainPtr domain, @@ -2725,8 +2595,7 @@ static int remoteDomainGetCPUStats(virDomainPtr domai= n, { struct private_data *priv =3D domain->conn->privateData; remote_domain_get_cpu_stats_args args =3D {0}; - remote_domain_get_cpu_stats_ret ret =3D {0}; - int rv =3D -1; + g_auto(remote_domain_get_cpu_stats_ret) ret =3D {0}; int cpu; VIR_LOCK_GUARD lock =3D remoteDriverLock(priv); =20 @@ -2763,16 +2632,14 @@ static int remoteDomainGetCPUStats(virDomainPtr dom= ain, virReportError(VIR_ERR_RPC, "%s", _("remoteDomainGetCPUStats: " "returned number of stats exceeds limit")); - memset(params, 0, sizeof(*params) * nparams * ncpus); - goto cleanup; + return -1; } =20 /* Handle the case when the caller does not know the number of stats * and is asking for the number of stats supported */ if (nparams =3D=3D 0) { - rv =3D ret.nparams; - goto cleanup; + return ret.nparams; } =20 /* The remote side did not send back any zero entries, so we have @@ -2789,18 +2656,13 @@ static int remoteDomainGetCPUStats(virDomainPtr dom= ain, if (virTypedParamsDeserialize((struct _virTypedParameterRemote *) = stride, ret.nparams, REMOTE_NODE_CPU_STATS_MAX, - &cpu_params, &tmp) < 0) - goto cleanup; + &cpu_params, &tmp) < 0) { + virTypedParamsClear(params, nparams * ncpus); + return -1; + } } =20 - rv =3D ret.nparams; - cleanup: - if (rv < 0) - virTypedParamsClear(params, nparams * ncpus); - - xdr_free((xdrproc_t) xdr_remote_domain_get_cpu_stats_ret, - (char *) &ret); - return rv; + return ret.nparams; } =20 =20 @@ -2814,7 +2676,7 @@ remoteConnectNetworkEventRegisterAny(virConnectPtr co= nn, { struct private_data *priv =3D conn->privateData; remote_connect_network_event_register_any_args args =3D {0}; - remote_connect_network_event_register_any_ret ret =3D {0}; + g_auto(remote_connect_network_event_register_any_ret) ret =3D {0}; int callbackID; int count; remote_nonnull_network network; @@ -2895,7 +2757,7 @@ remoteConnectStoragePoolEventRegisterAny(virConnectPt= r conn, { struct private_data *priv =3D conn->privateData; remote_connect_storage_pool_event_register_any_args args =3D {0}; - remote_connect_storage_pool_event_register_any_ret ret =3D {0}; + g_auto(remote_connect_storage_pool_event_register_any_ret) ret =3D {0}; int callbackID; int count; remote_nonnull_storage_pool storage_pool; @@ -2978,7 +2840,7 @@ remoteConnectNodeDeviceEventRegisterAny(virConnectPtr= conn, { struct private_data *priv =3D conn->privateData; remote_connect_node_device_event_register_any_args args =3D {0}; - remote_connect_node_device_event_register_any_ret ret =3D {0}; + g_auto(remote_connect_node_device_event_register_any_ret) ret =3D {0}; int callbackID; int count; remote_nonnull_node_device node_device; @@ -3062,7 +2924,7 @@ remoteConnectSecretEventRegisterAny(virConnectPtr con= n, { struct private_data *priv =3D conn->privateData; remote_connect_secret_event_register_any_args args =3D {0}; - remote_connect_secret_event_register_any_ret ret =3D {0}; + g_auto(remote_connect_secret_event_register_any_ret) ret =3D {0}; int callbackID; int count; remote_nonnull_secret sec; @@ -3147,7 +3009,7 @@ remoteConnectDomainQemuMonitorEventRegister(virConnec= tPtr conn, { struct private_data *priv =3D conn->privateData; qemu_connect_domain_monitor_event_register_args args; - qemu_connect_domain_monitor_event_register_ret ret =3D {0}; + g_auto(qemu_connect_domain_monitor_event_register_ret) ret =3D {0}; int callbackID; int count; remote_nonnull_domain domain; @@ -3227,9 +3089,8 @@ remoteConnectFindStoragePoolSources(virConnectPtr con= n, const char *srcSpec, unsigned int flags) { - char *rv =3D NULL; remote_connect_find_storage_pool_sources_args args =3D {0}; - remote_connect_find_storage_pool_sources_ret ret =3D {0}; + g_auto(remote_connect_find_storage_pool_sources_ret) ret =3D {0}; struct private_data *priv =3D conn->privateData; VIR_LOCK_GUARD lock =3D remoteDriverLock(priv); =20 @@ -3242,10 +3103,7 @@ remoteConnectFindStoragePoolSources(virConnectPtr co= nn, (xdrproc_t) xdr_remote_connect_find_storage_pool_sources_ret,= (char *) &ret) =3D=3D -1) return NULL; =20 - rv =3D g_steal_pointer(&ret.xml); /* To stop xdr_free free'ing it */ - - xdr_free((xdrproc_t) xdr_remote_connect_find_storage_pool_sources_ret,= (char *) &ret); - return rv; + return g_steal_pointer(&ret.xml); } =20 /*----------------------------------------------------------------------*/ @@ -3332,7 +3190,7 @@ remoteAuthenticate(virConnectPtr conn, struct private= _data *priv, virConnectAuthPtr auth G_GNUC_UNUSED, const char *authtype) { - struct remote_auth_list_ret ret =3D {0}; + g_auto(remote_auth_list_ret) ret =3D {0}; int err, type =3D REMOTE_AUTH_NONE; =20 err =3D call(conn, priv, 0, @@ -3962,7 +3820,7 @@ static int remoteAuthPolkit(virConnectPtr conn, struct private_data *priv, virConnectAuthPtr auth G_GNUC_UNUSED) { - remote_auth_polkit_ret ret =3D {0}; + g_auto(remote_auth_polkit_ret) ret =3D {0}; VIR_DEBUG("Client initialize PolicyKit authentication"); =20 if (call(conn, priv, 0, REMOTE_PROC_AUTH_POLKIT, @@ -4001,7 +3859,7 @@ remoteConnectDomainEventRegister(virConnectPtr conn, /* Tell the server when we are the first callback registering */ if (priv->serverEventFilter) { remote_connect_domain_event_callback_register_any_args args = =3D {0}; - remote_connect_domain_event_callback_register_any_ret ret =3D = {0}; + g_auto(remote_connect_domain_event_callback_register_any_ret) = ret =3D {0}; =20 args.eventID =3D VIR_DOMAIN_EVENT_ID_LIFECYCLE; args.dom =3D NULL; @@ -5110,7 +4968,7 @@ remoteSecretGetValue(virSecretPtr secret, size_t *val= ue_size, unsigned int flags) { remote_secret_get_value_args args =3D {0}; - remote_secret_get_value_ret ret =3D {0}; + g_auto(remote_secret_get_value_ret) ret =3D {0}; struct private_data *priv =3D secret->conn->privateData; VIR_LOCK_GUARD lock =3D remoteDriverLock(priv); =20 @@ -5123,7 +4981,7 @@ remoteSecretGetValue(virSecretPtr secret, size_t *val= ue_size, return NULL; =20 *value_size =3D ret.value.value_len; - return (unsigned char *) ret.value.value_val; /* Caller frees. */ + return (unsigned char *) g_steal_pointer(&ret.value.value_val); /* Cal= ler frees. */ } =20 =20 @@ -5517,7 +5375,7 @@ remoteConnectDomainEventRegisterAny(virConnectPtr con= n, if (count =3D=3D 1) { if (priv->serverEventFilter) { remote_connect_domain_event_callback_register_any_args args = =3D {0}; - remote_connect_domain_event_callback_register_any_ret ret =3D = {0}; + g_auto(remote_connect_domain_event_callback_register_any_ret) = ret =3D {0}; =20 args.eventID =3D eventID; if (dom) { @@ -5608,9 +5466,8 @@ static int remoteDomainQemuMonitorCommand(virDomainPtr domain, const char *cmd, char **result, unsigned int flags) { - int rv =3D -1; qemu_domain_monitor_command_args args; - qemu_domain_monitor_command_ret ret =3D {0}; + g_auto(qemu_domain_monitor_command_ret) ret =3D {0}; struct private_data *priv =3D domain->conn->privateData; VIR_LOCK_GUARD lock =3D remoteDriverLock(priv); =20 @@ -5623,13 +5480,9 @@ remoteDomainQemuMonitorCommand(virDomainPtr domain, = const char *cmd, (xdrproc_t) xdr_qemu_domain_monitor_command_ret, (char *) &re= t) =3D=3D -1) return -1; =20 - *result =3D g_strdup(ret.result); - - rv =3D 0; - - xdr_free((xdrproc_t) xdr_qemu_domain_monitor_command_ret, (char *) &re= t); + *result =3D g_steal_pointer(&ret.result); =20 - return rv; + return 0; } =20 =20 @@ -5644,7 +5497,7 @@ remoteDomainQemuMonitorCommandWithFiles(virDomainPtr = domain, unsigned int flags) { qemu_domain_monitor_command_with_files_args args; - qemu_domain_monitor_command_with_files_ret ret =3D {0}; + g_auto(qemu_domain_monitor_command_with_files_ret) ret =3D {0}; struct private_data *priv =3D domain->conn->privateData; size_t rpc_noutfiles =3D 0; g_autofree int *rpc_outfiles =3D NULL; @@ -5668,9 +5521,7 @@ remoteDomainQemuMonitorCommandWithFiles(virDomainPtr = domain, if (noutfiles) *noutfiles =3D rpc_noutfiles; =20 - *result =3D g_strdup(ret.result); - - xdr_free((xdrproc_t) xdr_qemu_domain_monitor_command_with_files_ret, (= char *) &ret); + *result =3D g_steal_pointer(&ret.result); =20 if (rpc_outfiles) { for (i =3D 0; i < rpc_noutfiles; i++) { @@ -5691,9 +5542,8 @@ remoteDomainMigrateBegin3(virDomainPtr domain, const char *dname, unsigned long resource) { - char *rv =3D NULL; remote_domain_migrate_begin3_args args =3D {0}; - remote_domain_migrate_begin3_ret ret =3D {0}; + g_auto(remote_domain_migrate_begin3_ret) ret =3D {0}; struct private_data *priv =3D domain->conn->privateData; VIR_LOCK_GUARD lock =3D remoteDriverLock(priv); =20 @@ -5712,20 +5562,14 @@ remoteDomainMigrateBegin3(virDomainPtr domain, if (!cookieout || !cookieoutlen) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("caller ignores cookieout or cookieoutlen")); - goto error; + return NULL; } - *cookieout =3D ret.cookie_out.cookie_out_val; /* Caller frees. */ + *cookieout =3D g_steal_pointer(&ret.cookie_out.cookie_out_val); /*= Caller frees. */ *cookieoutlen =3D ret.cookie_out.cookie_out_len; + ret.cookie_out.cookie_out_len =3D 0; } =20 - rv =3D ret.xml; /* caller frees */ - - done: - return rv; - - error: - VIR_FREE(ret.cookie_out.cookie_out_val); - goto done; + return g_steal_pointer(&ret.xml); /* caller frees */ } =20 =20 @@ -5742,9 +5586,8 @@ remoteDomainMigratePrepare3(virConnectPtr dconn, unsigned long resource, const char *dom_xml) { - int rv =3D -1; remote_domain_migrate_prepare3_args args =3D {0}; - remote_domain_migrate_prepare3_ret ret =3D {0}; + g_auto(remote_domain_migrate_prepare3_ret) ret =3D {0}; struct private_data *priv =3D dconn->privateData; VIR_LOCK_GUARD lock =3D remoteDriverLock(priv); =20 @@ -5765,30 +5608,22 @@ remoteDomainMigratePrepare3(virConnectPtr dconn, if (!cookieout || !cookieoutlen) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("caller ignores cookieout or cookieoutlen")); - goto error; + return -1; } - *cookieout =3D ret.cookie_out.cookie_out_val; /* Caller frees. */ + *cookieout =3D g_steal_pointer(&ret.cookie_out.cookie_out_val); /*= Caller frees. */ *cookieoutlen =3D ret.cookie_out.cookie_out_len; + ret.cookie_out.cookie_out_len =3D 0; } if (ret.uri_out) { if (!uri_out) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("caller ignores uri_out")); - goto error; + return -1; } - *uri_out =3D *ret.uri_out; /* Caller frees. */ + *uri_out =3D g_steal_pointer(ret.uri_out); /* Caller frees. */ } =20 - rv =3D 0; - - done: - VIR_FREE(ret.uri_out); - return rv; - error: - VIR_FREE(ret.cookie_out.cookie_out_val); - if (ret.uri_out) - VIR_FREE(*ret.uri_out); - goto done; + return 0; } =20 =20 @@ -5806,7 +5641,7 @@ remoteDomainMigratePrepareTunnel3(virConnectPtr dconn, { struct private_data *priv =3D dconn->privateData; remote_domain_migrate_prepare_tunnel3_args args =3D {0}; - remote_domain_migrate_prepare_tunnel3_ret ret =3D {0}; + g_auto(remote_domain_migrate_prepare_tunnel3_ret) ret =3D {0}; virNetClientStream *netst; VIR_LOCK_GUARD lock =3D remoteDriverLock(priv); =20 @@ -5844,17 +5679,14 @@ remoteDomainMigratePrepareTunnel3(virConnectPtr dco= nn, if (!cookieout || !cookieoutlen) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("caller ignores cookieout or cookieoutlen")); - goto error; + return -1; } - *cookieout =3D ret.cookie_out.cookie_out_val; /* Caller frees. */ + *cookieout =3D g_steal_pointer(&ret.cookie_out.cookie_out_val); /*= Caller frees. */ *cookieoutlen =3D ret.cookie_out.cookie_out_len; + ret.cookie_out.cookie_out_len =3D 0; } =20 return 0; - - error: - VIR_FREE(ret.cookie_out.cookie_out_val); - return -1; } =20 =20 @@ -5872,7 +5704,7 @@ remoteDomainMigratePerform3(virDomainPtr dom, unsigned long resource) { remote_domain_migrate_perform3_args args =3D {0}; - remote_domain_migrate_perform3_ret ret =3D {0}; + g_auto(remote_domain_migrate_perform3_ret) ret =3D {0}; struct private_data *priv =3D dom->conn->privateData; VIR_LOCK_GUARD lock =3D remoteDriverLock(priv); =20 @@ -5896,17 +5728,14 @@ remoteDomainMigratePerform3(virDomainPtr dom, if (!cookieout || !cookieoutlen) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("caller ignores cookieout or cookieoutlen")); - goto error; + return -1; } - *cookieout =3D ret.cookie_out.cookie_out_val; /* Caller frees. */ + *cookieout =3D g_steal_pointer(&ret.cookie_out.cookie_out_val); /*= Caller frees. */ *cookieoutlen =3D ret.cookie_out.cookie_out_len; + ret.cookie_out.cookie_out_len =3D 0; } =20 return 0; - - error: - VIR_FREE(ret.cookie_out.cookie_out_val); - return -1; } =20 =20 @@ -5923,9 +5752,8 @@ remoteDomainMigrateFinish3(virConnectPtr dconn, int cancelled) { remote_domain_migrate_finish3_args args =3D {0}; - remote_domain_migrate_finish3_ret ret =3D {0}; + g_auto(remote_domain_migrate_finish3_ret) ret =3D {0}; struct private_data *priv =3D dconn->privateData; - virDomainPtr rv =3D NULL; VIR_LOCK_GUARD lock =3D remoteDriverLock(priv); =20 args.cookie_in.cookie_in_val =3D (char *)cookiein; @@ -5945,22 +5773,14 @@ remoteDomainMigrateFinish3(virConnectPtr dconn, if (!cookieout || !cookieoutlen) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("caller ignores cookieout or cookieoutlen")); - goto error; + return NULL; } *cookieout =3D g_steal_pointer(&ret.cookie_out.cookie_out_val); /*= Caller frees. */ *cookieoutlen =3D ret.cookie_out.cookie_out_len; ret.cookie_out.cookie_out_len =3D 0; } =20 - rv =3D get_nonnull_domain(dconn, ret.dom); - - xdr_free((xdrproc_t) &xdr_remote_domain_migrate_finish3_ret, (char *) = &ret); - - return rv; - - error: - VIR_FREE(ret.cookie_out.cookie_out_val); - return NULL; + return get_nonnull_domain(dconn, ret.dom); } =20 =20 @@ -5996,11 +5816,10 @@ remoteConnectGetCPUModelNames(virConnectPtr conn, char ***models, unsigned int flags) { - int rv =3D -1; size_t i; g_auto(GStrv) retmodels =3D NULL; remote_connect_get_cpu_model_names_args args =3D {0}; - remote_connect_get_cpu_model_names_ret ret =3D {0}; + g_auto(remote_connect_get_cpu_model_names_ret) ret =3D {0}; struct private_data *priv =3D conn->privateData; VIR_LOCK_GUARD lock =3D remoteDriverLock(priv); =20 @@ -6021,7 +5840,7 @@ remoteConnectGetCPUModelNames(virConnectPtr conn, _("Too many model names '%d' for limit '%d'"), ret.models.models_len, REMOTE_CONNECT_CPU_MODELS_MAX); - goto cleanup; + return -1; } =20 if (models) { @@ -6033,12 +5852,7 @@ remoteConnectGetCPUModelNames(virConnectPtr conn, *models =3D g_steal_pointer(&retmodels); } =20 - rv =3D ret.ret; - - cleanup: - xdr_free((xdrproc_t) xdr_remote_connect_get_cpu_model_names_ret, (char= *) &ret); - - return rv; + return ret.ret; } =20 =20 @@ -6161,10 +5975,9 @@ remoteDomainGetDiskErrors(virDomainPtr dom, unsigned int maxerrors, unsigned int flags) { - int rv =3D -1; struct private_data *priv =3D dom->conn->privateData; remote_domain_get_disk_errors_args args =3D {0}; - remote_domain_get_disk_errors_ret ret =3D {0}; + g_auto(remote_domain_get_disk_errors_ret) ret =3D {0}; VIR_LOCK_GUARD lock =3D remoteDriverLock(priv); =20 make_nonnull_domain(&args.dom, dom); @@ -6183,13 +5996,9 @@ remoteDomainGetDiskErrors(virDomainPtr dom, REMOTE_DOMAIN_DISK_ERRORS_MAX, errors, maxerrors) < 0) - goto cleanup; - - rv =3D ret.nerrors; + return -1; =20 - cleanup: - xdr_free((xdrproc_t) xdr_remote_domain_get_disk_errors_ret, (char *) &= ret); - return rv; + return ret.nerrors; } =20 #include "remote_client_bodies.h" @@ -6267,9 +6076,8 @@ remoteDomainGetInterfaceParameters(virDomainPtr domai= n, virTypedParameterPtr params, int *npara= ms, unsigned int flags) { - int rv =3D -1; remote_domain_get_interface_parameters_args args =3D {0}; - remote_domain_get_interface_parameters_ret ret =3D {0}; + g_auto(remote_domain_get_interface_parameters_ret) ret =3D {0}; struct private_data *priv =3D domain->conn->privateData; VIR_LOCK_GUARD lock =3D remoteDriverLock(priv); =20 @@ -6288,8 +6096,7 @@ remoteDomainGetInterfaceParameters(virDomainPtr domai= n, */ if (*nparams =3D=3D 0) { *nparams =3D ret.nparams; - rv =3D 0; - goto cleanup; + return 0; } =20 if (virTypedParamsDeserialize((struct _virTypedParameterRemote *) ret.= params.params_val, @@ -6297,14 +6104,9 @@ remoteDomainGetInterfaceParameters(virDomainPtr doma= in, REMOTE_DOMAIN_INTERFACE_PARAMETERS_MAX, ¶ms, nparams) < 0) - goto cleanup; - - rv =3D 0; + return -1; =20 - cleanup: - xdr_free((xdrproc_t) xdr_remote_domain_get_interface_parameters_ret, - (char *) &ret); - return rv; + return 0; } =20 =20 @@ -6314,9 +6116,8 @@ remoteNodeGetMemoryParameters(virConnectPtr conn, int *nparams, unsigned int flags) { - int rv =3D -1; remote_node_get_memory_parameters_args args =3D {0}; - remote_node_get_memory_parameters_ret ret =3D {0}; + g_auto(remote_node_get_memory_parameters_ret) ret =3D {0}; struct private_data *priv =3D conn->privateData; VIR_LOCK_GUARD lock =3D remoteDriverLock(priv); =20 @@ -6333,8 +6134,7 @@ remoteNodeGetMemoryParameters(virConnectPtr conn, */ if (*nparams =3D=3D 0) { *nparams =3D ret.nparams; - rv =3D 0; - goto cleanup; + return 0; } =20 if (virTypedParamsDeserialize((struct _virTypedParameterRemote *) ret.= params.params_val, @@ -6342,14 +6142,9 @@ remoteNodeGetMemoryParameters(virConnectPtr conn, REMOTE_NODE_MEMORY_PARAMETERS_MAX, ¶ms, nparams) < 0) - goto cleanup; - - rv =3D 0; + return -1; =20 - cleanup: - xdr_free((xdrproc_t) xdr_remote_node_get_memory_parameters_ret, - (char *) &ret); - return rv; + return 0; } =20 =20 @@ -6359,9 +6154,8 @@ remoteNodeGetSEVInfo(virConnectPtr conn, int *nparams, unsigned int flags) { - int rv =3D -1; remote_node_get_sev_info_args args =3D {0}; - remote_node_get_sev_info_ret ret =3D {0}; + g_auto(remote_node_get_sev_info_ret) ret =3D {0}; struct private_data *priv =3D conn->privateData; VIR_LOCK_GUARD lock =3D remoteDriverLock(priv); =20 @@ -6377,13 +6171,9 @@ remoteNodeGetSEVInfo(virConnectPtr conn, REMOTE_NODE_SEV_INFO_MAX, params, nparams) < 0) - goto cleanup; - - rv =3D 0; + return -1; =20 - cleanup: - xdr_free((xdrproc_t) xdr_remote_node_get_sev_info_ret, (char *) &ret); - return rv; + return 0; } =20 =20 @@ -6393,9 +6183,8 @@ remoteNodeGetCPUMap(virConnectPtr conn, unsigned int *online, unsigned int flags) { - int rv =3D -1; remote_node_get_cpu_map_args args =3D {0}; - remote_node_get_cpu_map_ret ret =3D {0}; + g_auto(remote_node_get_cpu_map_ret) ret =3D {0}; struct private_data *priv =3D conn->privateData; VIR_LOCK_GUARD lock =3D remoteDriverLock(priv); =20 @@ -6411,7 +6200,7 @@ remoteNodeGetCPUMap(virConnectPtr conn, return -1; =20 if (ret.ret < 0) - goto cleanup; + return -1; =20 if (cpumap) { *cpumap =3D g_new0(unsigned char, ret.cpumap.cpumap_len); @@ -6421,11 +6210,7 @@ remoteNodeGetCPUMap(virConnectPtr conn, if (online) *online =3D ret.online; =20 - rv =3D ret.ret; - - cleanup: - xdr_free((xdrproc_t) xdr_remote_node_get_cpu_map_ret, (char *) &ret); - return rv; + return ret.ret; } =20 =20 @@ -6462,9 +6247,8 @@ remoteDomainGetJobStats(virDomainPtr domain, int *nparams, unsigned int flags) { - int rv =3D -1; remote_domain_get_job_stats_args args =3D {0}; - remote_domain_get_job_stats_ret ret =3D {0}; + g_auto(remote_domain_get_job_stats_ret) ret =3D {0}; struct private_data *priv =3D domain->conn->privateData; VIR_LOCK_GUARD lock =3D remoteDriverLock(priv); =20 @@ -6482,14 +6266,9 @@ remoteDomainGetJobStats(virDomainPtr domain, ret.params.params_len, REMOTE_DOMAIN_JOB_STATS_MAX, params, nparams) < 0) - goto cleanup; - - rv =3D 0; + return -1; =20 - cleanup: - xdr_free((xdrproc_t) xdr_remote_domain_get_job_stats_ret, - (char *) &ret); - return rv; + return 0; } =20 =20 @@ -6503,7 +6282,7 @@ remoteDomainMigrateBegin3Params(virDomainPtr domain, { char *rv =3D NULL; remote_domain_migrate_begin3_params_args args =3D {0}; - remote_domain_migrate_begin3_params_ret ret =3D {0}; + g_auto(remote_domain_migrate_begin3_params_ret) ret =3D {0}; struct private_data *priv =3D domain->conn->privateData; VIR_LOCK_GUARD lock =3D remoteDriverLock(priv); =20 @@ -6514,9 +6293,8 @@ remoteDomainMigrateBegin3Params(virDomainPtr domain, REMOTE_DOMAIN_MIGRATE_PARAM_LIST_MAX, (struct _virTypedParameterRemote **) &args= .params.params_val, &args.params.params_len, - VIR_TYPED_PARAM_STRING_OKAY) < 0) { - goto cleanup; - } + VIR_TYPED_PARAM_STRING_OKAY) < 0) + return NULL; =20 if (call(domain->conn, priv, 0, REMOTE_PROC_DOMAIN_MIGRATE_BEGIN3_PARA= MS, (xdrproc_t) xdr_remote_domain_migrate_begin3_params_args, @@ -6529,22 +6307,19 @@ remoteDomainMigrateBegin3Params(virDomainPtr domain, if (!cookieout || !cookieoutlen) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("caller ignores cookieout or cookieoutlen")); - goto error; + goto cleanup; } - *cookieout =3D ret.cookie_out.cookie_out_val; /* Caller frees. */ + *cookieout =3D g_steal_pointer(&ret.cookie_out.cookie_out_val); /*= Caller frees. */ *cookieoutlen =3D ret.cookie_out.cookie_out_len; + ret.cookie_out.cookie_out_len =3D 0; } =20 - rv =3D ret.xml; /* caller frees */ + rv =3D g_steal_pointer(&ret.xml); /* caller frees */ =20 cleanup: virTypedParamsRemoteFree((struct _virTypedParameterRemote *) args.para= ms.params_val, args.params.params_len); return rv; - - error: - VIR_FREE(ret.cookie_out.cookie_out_val); - goto cleanup; } =20 =20 @@ -6561,7 +6336,7 @@ remoteDomainMigratePrepare3Params(virConnectPtr dconn, { int rv =3D -1; remote_domain_migrate_prepare3_params_args args =3D {0}; - remote_domain_migrate_prepare3_params_ret ret =3D {0}; + g_auto(remote_domain_migrate_prepare3_params_ret) ret =3D {0}; struct private_data *priv =3D dconn->privateData; VIR_LOCK_GUARD lock =3D remoteDriverLock(priv); =20 @@ -6569,9 +6344,8 @@ remoteDomainMigratePrepare3Params(virConnectPtr dconn, REMOTE_DOMAIN_MIGRATE_PARAM_LIST_MAX, (struct _virTypedParameterRemote **) &args= .params.params_val, &args.params.params_len, - VIR_TYPED_PARAM_STRING_OKAY) < 0) { - goto cleanup; - } + VIR_TYPED_PARAM_STRING_OKAY) < 0) + return -1; =20 args.cookie_in.cookie_in_val =3D (char *)cookiein; args.cookie_in.cookie_in_len =3D cookieinlen; @@ -6588,18 +6362,19 @@ remoteDomainMigratePrepare3Params(virConnectPtr dco= nn, if (!cookieout || !cookieoutlen) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("caller ignores cookieout or cookieoutlen")); - goto error; + goto cleanup; } - *cookieout =3D ret.cookie_out.cookie_out_val; /* Caller frees. */ + *cookieout =3D g_steal_pointer(&ret.cookie_out.cookie_out_val); /*= Caller frees. */ *cookieoutlen =3D ret.cookie_out.cookie_out_len; + ret.cookie_out.cookie_out_len =3D 0; } if (ret.uri_out) { if (!uri_out) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("caller ignores uri_out")); - goto error; + goto cleanup; } - *uri_out =3D *ret.uri_out; /* Caller frees. */ + *uri_out =3D g_steal_pointer(ret.uri_out); /* Caller frees. */ } =20 rv =3D 0; @@ -6607,14 +6382,7 @@ remoteDomainMigratePrepare3Params(virConnectPtr dcon= n, cleanup: virTypedParamsRemoteFree((struct _virTypedParameterRemote *) args.para= ms.params_val, args.params.params_len); - VIR_FREE(ret.uri_out); return rv; - - error: - VIR_FREE(ret.cookie_out.cookie_out_val); - if (ret.uri_out) - VIR_FREE(*ret.uri_out); - goto cleanup; } =20 =20 @@ -6632,7 +6400,7 @@ remoteDomainMigratePrepareTunnel3Params(virConnectPtr= dconn, struct private_data *priv =3D dconn->privateData; int rv =3D -1; remote_domain_migrate_prepare_tunnel3_params_args args =3D {0}; - remote_domain_migrate_prepare_tunnel3_params_ret ret =3D {0}; + g_auto(remote_domain_migrate_prepare_tunnel3_params_ret) ret =3D {0}; virNetClientStream *netst; VIR_LOCK_GUARD lock =3D remoteDriverLock(priv); =20 @@ -6644,9 +6412,8 @@ remoteDomainMigratePrepareTunnel3Params(virConnectPtr= dconn, REMOTE_DOMAIN_MIGRATE_PARAM_LIST_MAX, (struct _virTypedParameterRemote **) &args= .params.params_val, &args.params.params_len, - VIR_TYPED_PARAM_STRING_OKAY) < 0) { - goto cleanup; - } + VIR_TYPED_PARAM_STRING_OKAY) < 0) + return -1; =20 if (!(netst =3D virNetClientStreamNew(priv->remoteProgram, REMOTE_PROC_DOMAIN_MIGRATE_PREPARE= _TUNNEL3_PARAMS, @@ -6677,10 +6444,11 @@ remoteDomainMigratePrepareTunnel3Params(virConnectP= tr dconn, if (!cookieout || !cookieoutlen) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("caller ignores cookieout or cookieoutlen")); - goto error; + goto cleanup; } - *cookieout =3D ret.cookie_out.cookie_out_val; /* Caller frees. */ + *cookieout =3D g_steal_pointer(&ret.cookie_out.cookie_out_val); /*= Caller frees. */ *cookieoutlen =3D ret.cookie_out.cookie_out_len; + ret.cookie_out.cookie_out_len =3D 0; } =20 rv =3D 0; @@ -6689,10 +6457,6 @@ remoteDomainMigratePrepareTunnel3Params(virConnectPt= r dconn, virTypedParamsRemoteFree((struct _virTypedParameterRemote *) args.para= ms.params_val, args.params.params_len); return rv; - - error: - VIR_FREE(ret.cookie_out.cookie_out_val); - goto cleanup; } =20 =20 @@ -6709,7 +6473,7 @@ remoteDomainMigratePerform3Params(virDomainPtr dom, { int rv =3D -1; remote_domain_migrate_perform3_params_args args =3D {0}; - remote_domain_migrate_perform3_params_ret ret =3D {0}; + g_auto(remote_domain_migrate_perform3_params_ret) ret =3D {0}; struct private_data *priv =3D dom->conn->privateData; VIR_LOCK_GUARD lock =3D remoteDriverLock(priv); =20 @@ -6723,9 +6487,8 @@ remoteDomainMigratePerform3Params(virDomainPtr dom, REMOTE_DOMAIN_MIGRATE_PARAM_LIST_MAX, (struct _virTypedParameterRemote **) &args= .params.params_val, &args.params.params_len, - VIR_TYPED_PARAM_STRING_OKAY) < 0) { - goto cleanup; - } + VIR_TYPED_PARAM_STRING_OKAY) < 0) + return -1; =20 if (call(dom->conn, priv, 0, REMOTE_PROC_DOMAIN_MIGRATE_PERFORM3_PARAM= S, (xdrproc_t) xdr_remote_domain_migrate_perform3_params_args, @@ -6738,10 +6501,11 @@ remoteDomainMigratePerform3Params(virDomainPtr dom, if (!cookieout || !cookieoutlen) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("caller ignores cookieout or cookieoutlen")); - goto error; + goto cleanup; } - *cookieout =3D ret.cookie_out.cookie_out_val; /* Caller frees. */ + *cookieout =3D g_steal_pointer(&ret.cookie_out.cookie_out_val); /*= Caller frees. */ *cookieoutlen =3D ret.cookie_out.cookie_out_len; + ret.cookie_out.cookie_out_len =3D 0; } =20 rv =3D 0; @@ -6750,10 +6514,6 @@ remoteDomainMigratePerform3Params(virDomainPtr dom, virTypedParamsRemoteFree((struct _virTypedParameterRemote *) args.para= ms.params_val, args.params.params_len); return rv; - - error: - VIR_FREE(ret.cookie_out.cookie_out_val); - goto cleanup; } =20 =20 @@ -6769,7 +6529,7 @@ remoteDomainMigrateFinish3Params(virConnectPtr dconn, int cancelled) { remote_domain_migrate_finish3_params_args args =3D {0}; - remote_domain_migrate_finish3_params_ret ret =3D {0}; + g_auto(remote_domain_migrate_finish3_params_ret) ret =3D {0}; struct private_data *priv =3D dconn->privateData; virDomainPtr rv =3D NULL; VIR_LOCK_GUARD lock =3D remoteDriverLock(priv); @@ -6783,9 +6543,8 @@ remoteDomainMigrateFinish3Params(virConnectPtr dconn, REMOTE_DOMAIN_MIGRATE_PARAM_LIST_MAX, (struct _virTypedParameterRemote **) &args= .params.params_val, &args.params.params_len, - VIR_TYPED_PARAM_STRING_OKAY) < 0) { - goto cleanup; - } + VIR_TYPED_PARAM_STRING_OKAY) < 0) + return NULL; =20 if (call(dconn, priv, 0, REMOTE_PROC_DOMAIN_MIGRATE_FINISH3_PARAMS, (xdrproc_t) xdr_remote_domain_migrate_finish3_params_args, @@ -6798,7 +6557,7 @@ remoteDomainMigrateFinish3Params(virConnectPtr dconn, if (!cookieout || !cookieoutlen) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("caller ignores cookieout or cookieoutlen")); - goto error; + goto cleanup; } *cookieout =3D g_steal_pointer(&ret.cookie_out.cookie_out_val); /*= Caller frees. */ *cookieoutlen =3D ret.cookie_out.cookie_out_len; @@ -6806,18 +6565,10 @@ remoteDomainMigrateFinish3Params(virConnectPtr dcon= n, } =20 rv =3D get_nonnull_domain(dconn, ret.dom); - - xdr_free((xdrproc_t) &xdr_remote_domain_migrate_finish3_params_ret, - (char *) &ret); - cleanup: virTypedParamsRemoteFree((struct _virTypedParameterRemote *) args.para= ms.params_val, args.params.params_len); return rv; - - error: - VIR_FREE(ret.cookie_out.cookie_out_val); - goto cleanup; } =20 =20 @@ -6845,9 +6596,8 @@ remoteDomainMigrateConfirm3Params(virDomainPtr domain, REMOTE_DOMAIN_MIGRATE_PARAM_LIST_MAX, (struct _virTypedParameterRemote **) &args= .params.params_val, &args.params.params_len, - VIR_TYPED_PARAM_STRING_OKAY) < 0) { - goto cleanup; - } + VIR_TYPED_PARAM_STRING_OKAY) < 0) + return -1; =20 if (call(domain->conn, priv, 0, REMOTE_PROC_DOMAIN_MIGRATE_CONFIRM3_PA= RAMS, (xdrproc_t) xdr_remote_domain_migrate_confirm3_params_args, @@ -6867,10 +6617,9 @@ static virDomainPtr remoteDomainCreateXMLWithFiles(virConnectPtr conn, const char *xml_desc, unsigned int nfiles, int *files, unsigned i= nt flags) { - virDomainPtr rv =3D NULL; struct private_data *priv =3D conn->privateData; remote_domain_create_xml_with_files_args args =3D {0}; - remote_domain_create_xml_with_files_ret ret =3D {0}; + g_auto(remote_domain_create_xml_with_files_ret) ret =3D {0}; VIR_LOCK_GUARD lock =3D remoteDriverLock(priv); =20 args.xml_desc =3D (char *)xml_desc; @@ -6884,10 +6633,7 @@ remoteDomainCreateXMLWithFiles(virConnectPtr conn, c= onst char *xml_desc, (xdrproc_t)xdr_remote_domain_create_xml_with_files_ret, (= char *)&ret) =3D=3D -1) return NULL; =20 - rv =3D get_nonnull_domain(conn, ret.dom); - xdr_free((xdrproc_t)xdr_remote_domain_create_xml_with_files_ret, (char= *)&ret); - - return rv; + return get_nonnull_domain(conn, ret.dom); } =20 =20 @@ -6898,7 +6644,7 @@ remoteDomainCreateWithFiles(virDomainPtr dom, { struct private_data *priv =3D dom->conn->privateData; remote_domain_create_with_files_args args =3D {0}; - remote_domain_create_with_files_ret ret =3D {0}; + g_auto(remote_domain_create_with_files_ret) ret =3D {0}; VIR_LOCK_GUARD lock =3D remoteDriverLock(priv); =20 make_nonnull_domain(&args.dom, dom); @@ -6913,7 +6659,6 @@ remoteDomainCreateWithFiles(virDomainPtr dom, return -1; =20 dom->id =3D ret.dom.id; - xdr_free((xdrproc_t) &xdr_remote_domain_create_with_files_ret, (char *= ) &ret); return 0; } =20 @@ -6925,7 +6670,7 @@ remoteDomainGetTime(virDomainPtr dom, { struct private_data *priv =3D dom->conn->privateData; remote_domain_get_time_args args =3D {0}; - remote_domain_get_time_ret ret =3D {0}; + g_auto(remote_domain_get_time_ret) ret =3D {0}; VIR_LOCK_GUARD lock =3D remoteDriverLock(priv); =20 make_nonnull_domain(&args.dom, dom); @@ -6940,7 +6685,6 @@ remoteDomainGetTime(virDomainPtr dom, =20 *seconds =3D ret.seconds; *nseconds =3D ret.nseconds; - xdr_free((xdrproc_t) &xdr_remote_domain_get_time_ret, (char *) &ret); return 0; } =20 @@ -6955,7 +6699,7 @@ remoteNodeGetFreePages(virConnectPtr conn, unsigned int flags) { remote_node_get_free_pages_args args =3D {0}; - remote_node_get_free_pages_ret ret =3D {0}; + g_auto(remote_node_get_free_pages_ret) ret =3D {0}; struct private_data *priv =3D conn->privateData; VIR_LOCK_GUARD lock =3D remoteDriverLock(priv); =20 @@ -6979,8 +6723,6 @@ remoteNodeGetFreePages(virConnectPtr conn, =20 memcpy(counts, ret.counts.counts_val, ret.counts.counts_len * sizeof(*= counts)); =20 - xdr_free((xdrproc_t) xdr_remote_node_get_free_pages_ret, (char *) &ret= ); - return ret.counts.counts_len; } =20 @@ -7035,7 +6777,7 @@ remoteNetworkGetDHCPLeases(virNetworkPtr net, size_t i; struct private_data *priv =3D net->conn->privateData; remote_network_get_dhcp_leases_args args =3D {0}; - remote_network_get_dhcp_leases_ret ret =3D {0}; + g_auto(remote_network_get_dhcp_leases_ret) ret =3D {0}; virNetworkDHCPLeasePtr *leases_ret =3D NULL; VIR_LOCK_GUARD lock =3D remoteDriverLock(priv); =20 @@ -7053,7 +6795,7 @@ remoteNetworkGetDHCPLeases(virNetworkPtr net, virReportError(VIR_ERR_INTERNAL_ERROR, _("Number of leases is %d, which exceeds max limit:= %d"), ret.leases.leases_len, REMOTE_NETWORK_DHCP_LEASES_M= AX); - goto cleanup; + return -1; } =20 if (leases) { @@ -7078,8 +6820,6 @@ remoteNetworkGetDHCPLeases(virNetworkPtr net, virNetworkDHCPLeaseFree(leases_ret[i]); VIR_FREE(leases_ret); } - xdr_free((xdrproc_t)xdr_remote_network_get_dhcp_leases_ret, - (char *) &ret); =20 return rv; } @@ -7097,7 +6837,7 @@ remoteConnectGetAllDomainStats(virConnectPtr conn, int rv =3D -1; size_t i; remote_connect_get_all_domain_stats_args args =3D {0}; - remote_connect_get_all_domain_stats_ret ret =3D {0}; + g_auto(remote_connect_get_all_domain_stats_ret) ret =3D {0}; virDomainStatsRecordPtr elem =3D NULL; virDomainStatsRecordPtr *tmpret =3D NULL; VIR_LOCK_GUARD lock =3D remoteDriverLock(priv); @@ -7158,8 +6898,6 @@ remoteConnectGetAllDomainStats(virConnectPtr conn, } virDomainStatsRecordListFree(tmpret); VIR_FREE(args.doms.doms_val); - xdr_free((xdrproc_t)xdr_remote_connect_get_all_domain_stats_ret, - (char *) &ret); =20 return rv; } @@ -7175,7 +6913,7 @@ remoteNodeAllocPages(virConnectPtr conn, unsigned int flags) { remote_node_alloc_pages_args args =3D {0}; - remote_node_alloc_pages_ret ret =3D {0}; + g_auto(remote_node_alloc_pages_ret) ret =3D {0}; struct private_data *priv =3D conn->privateData; VIR_LOCK_GUARD lock =3D remoteDriverLock(priv); =20 @@ -7208,11 +6946,10 @@ remoteDomainGetFSInfo(virDomainPtr dom, virDomainFSInfoPtr **info, unsigned int flags) { - int rv =3D -1; size_t i, j, len; struct private_data *priv =3D dom->conn->privateData; remote_domain_get_fsinfo_args args =3D {0}; - remote_domain_get_fsinfo_ret ret =3D {0}; + g_auto(remote_domain_get_fsinfo_ret) ret =3D {0}; remote_domain_fsinfo *src; VIR_LOCK_GUARD lock =3D remoteDriverLock(priv); =20 @@ -7229,7 +6966,7 @@ remoteDomainGetFSInfo(virDomainPtr dom, virReportError(VIR_ERR_INTERNAL_ERROR, _("Too many mountpoints in fsinfo: %d for limit %d"= ), ret.info.info_len, REMOTE_DOMAIN_FSINFO_MAX); - goto cleanup; + return -1; } =20 if (info) { @@ -7237,8 +6974,7 @@ remoteDomainGetFSInfo(virDomainPtr dom, =20 if (!ret.info.info_len) { *info =3D NULL; - rv =3D ret.ret; - goto cleanup; + return ret.ret; } =20 info_ret =3D g_new0(virDomainFSInfoPtr, ret.info.info_len); @@ -7266,12 +7002,7 @@ remoteDomainGetFSInfo(virDomainPtr dom, *info =3D info_ret; } =20 - rv =3D ret.ret; - - cleanup: - xdr_free((xdrproc_t)xdr_remote_domain_get_fsinfo_ret, - (char *) &ret); - return rv; + return ret.ret; } =20 =20 @@ -7286,7 +7017,7 @@ remoteDomainInterfaceAddresses(virDomainPtr dom, =20 virDomainInterfacePtr *ifaces_ret =3D NULL; remote_domain_interface_addresses_args args =3D {0}; - remote_domain_interface_addresses_ret ret =3D {0}; + g_auto(remote_domain_interface_addresses_ret) ret =3D {0}; struct private_data *priv =3D dom->conn->privateData; VIR_LOCK_GUARD lock =3D remoteDriverLock(priv); =20 @@ -7305,7 +7036,7 @@ remoteDomainInterfaceAddresses(virDomainPtr dom, virReportError(VIR_ERR_INTERNAL_ERROR, _("Number of interfaces, %d exceeds the max limit: = %d"), ret.ifaces.ifaces_len, REMOTE_DOMAIN_INTERFACE_MAX); - goto cleanup; + return -1; } =20 if (ret.ifaces.ifaces_len) @@ -7358,8 +7089,6 @@ remoteDomainInterfaceAddresses(virDomainPtr dom, virDomainInterfaceFree(ifaces_ret[i]); VIR_FREE(ifaces_ret); } - xdr_free((xdrproc_t)xdr_remote_domain_interface_addresses_ret, - (char *) &ret); return rv; } =20 @@ -7418,7 +7147,7 @@ remoteDomainRename(virDomainPtr dom, const char *new_= name, unsigned int flags) int rv =3D -1; struct private_data *priv =3D dom->conn->privateData; remote_domain_rename_args args =3D {0}; - remote_domain_rename_ret ret =3D {0}; + g_auto(remote_domain_rename_ret) ret =3D {0}; char *tmp =3D NULL; VIR_LOCK_GUARD lock =3D remoteDriverLock(priv); =20 @@ -7452,7 +7181,7 @@ remoteStorageVolGetInfoFlags(virStorageVolPtr vol, { struct private_data *priv =3D vol->conn->privateData; remote_storage_vol_get_info_flags_args args =3D {0}; - remote_storage_vol_get_info_flags_ret ret =3D {0}; + g_auto(remote_storage_vol_get_info_flags_ret) ret =3D {0}; VIR_LOCK_GUARD lock =3D remoteDriverLock(priv); =20 make_nonnull_storage_vol(&args.vol, vol); @@ -7479,10 +7208,9 @@ remoteNetworkPortGetParameters(virNetworkPortPtr por= t, int *nparams, unsigned int flags) { - int rv =3D -1; struct private_data *priv =3D port->net->conn->privateData; remote_network_port_get_parameters_args args =3D {0}; - remote_network_port_get_parameters_ret ret =3D {0}; + g_auto(remote_network_port_get_parameters_ret) ret =3D {0}; VIR_LOCK_GUARD lock =3D remoteDriverLock(priv); =20 make_nonnull_network_port(&args.port, port); @@ -7498,13 +7226,9 @@ remoteNetworkPortGetParameters(virNetworkPortPtr por= t, REMOTE_NETWORK_PORT_PARAMETERS_MAX, params, nparams) < 0) - goto cleanup; - - rv =3D 0; + return -1; =20 - cleanup: - xdr_free((xdrproc_t) xdr_remote_network_port_get_parameters_ret, (char= *) &ret); - return rv; + return 0; } =20 static int @@ -7514,10 +7238,9 @@ remoteDomainGetGuestInfo(virDomainPtr dom, int *nparams, unsigned int flags) { - int rv =3D -1; struct private_data *priv =3D dom->conn->privateData; remote_domain_get_guest_info_args args =3D {0}; - remote_domain_get_guest_info_ret ret =3D {0}; + g_auto(remote_domain_get_guest_info_ret) ret =3D {0}; VIR_LOCK_GUARD lock =3D remoteDriverLock(priv); =20 make_nonnull_domain(&args.dom, dom); @@ -7535,14 +7258,9 @@ remoteDomainGetGuestInfo(virDomainPtr dom, REMOTE_DOMAIN_GUEST_INFO_PARAMS_MAX, params, nparams) < 0) - goto cleanup; - - rv =3D 0; + return -1; =20 - cleanup: - xdr_free((xdrproc_t)xdr_remote_domain_get_guest_info_ret, - (char *) &ret); - return rv; + return 0; } =20 static int @@ -7551,11 +7269,10 @@ remoteDomainAuthorizedSSHKeysGet(virDomainPtr domai= n, char ***keys, unsigned int flags) { - int rv =3D -1; size_t i; struct private_data *priv =3D domain->conn->privateData; remote_domain_authorized_ssh_keys_get_args args =3D {0}; - remote_domain_authorized_ssh_keys_get_ret ret =3D {0}; + g_auto(remote_domain_authorized_ssh_keys_get_ret) ret =3D {0}; VIR_LOCK_GUARD lock =3D remoteDriverLock(priv); =20 make_nonnull_domain(&args.dom, domain); @@ -7571,19 +7288,14 @@ remoteDomainAuthorizedSSHKeysGet(virDomainPtr domai= n, virReportError(VIR_ERR_RPC, "%s", _("remoteDomainAuthorizedSSHKeysGet: " "returned number of keys exceeds limit")); - goto cleanup; + return -1; } =20 *keys =3D g_new0(char *, ret.keys.keys_len + 1); for (i =3D 0; i < ret.keys.keys_len; i++) - (*keys)[i] =3D g_strdup(ret.keys.keys_val[i]); - - rv =3D ret.keys.keys_len; + (*keys)[i] =3D g_steal_pointer(&ret.keys.keys_val[i]); =20 - cleanup: - xdr_free((xdrproc_t)xdr_remote_domain_authorized_ssh_keys_get_ret, - (char *) &ret); - return rv; + return ret.keys.keys_len; } =20 static int @@ -7624,11 +7336,10 @@ remoteDomainGetMessages(virDomainPtr domain, char ***msgs, unsigned int flags) { - int rv =3D -1; size_t i; struct private_data *priv =3D domain->conn->privateData; remote_domain_get_messages_args args =3D {0}; - remote_domain_get_messages_ret ret =3D {0}; + g_auto(remote_domain_get_messages_ret) ret =3D {0}; VIR_LOCK_GUARD lock =3D remoteDriverLock(priv); =20 make_nonnull_domain(&args.dom, domain); @@ -7637,26 +7348,21 @@ remoteDomainGetMessages(virDomainPtr domain, if (call(domain->conn, priv, 0, REMOTE_PROC_DOMAIN_GET_MESSAGES, (xdrproc_t) xdr_remote_domain_get_messages_args, (char *)&arg= s, (xdrproc_t) xdr_remote_domain_get_messages_ret, (char *)&ret)= =3D=3D -1) { - goto cleanup; + return -1; } =20 if (ret.msgs.msgs_len > REMOTE_DOMAIN_MESSAGES_MAX) { virReportError(VIR_ERR_RPC, "%s", _("remoteDomainGetMessages: " "returned number of msgs exceeds limit")); - goto cleanup; + return -1; } =20 *msgs =3D g_new0(char *, ret.msgs.msgs_len + 1); for (i =3D 0; i < ret.msgs.msgs_len; i++) - (*msgs)[i] =3D g_strdup(ret.msgs.msgs_val[i]); + (*msgs)[i] =3D g_steal_pointer(&ret.msgs.msgs_val[i]); =20 - rv =3D ret.msgs.msgs_len; - - cleanup: - xdr_free((xdrproc_t)xdr_remote_domain_get_messages_ret, - (char *) &ret); - return rv; + return ret.msgs.msgs_len; } =20 =20 --=20 2.39.1 From nobody Fri Apr 19 11:08:17 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of redhat.com designates 170.10.133.124 as permitted sender) client-ip=170.10.133.124; envelope-from=libvir-list-bounces@redhat.com; helo=us-smtp-delivery-124.mimecast.com; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 170.10.133.124 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1678293617; cv=none; d=zohomail.com; s=zohoarc; b=CKdHUAYLCt77hJPzEtQ8xqty4aWy8FGzlYpWfzwtLSlNA/r9QQEecR8/Z/z0bA6qNBNnQgma8qLt7zc9YwUyJE6Llhocv8vrae7uQhIPRHY0D6EZUHS+soO2Nz3JUMYbByV4LU2IMw60zkrR3RB/q3naHrTEmAb2X+ZaZam/W9s= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1678293617; h=Content-Type:Content-Transfer-Encoding:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=ukH7zulqyjAoXtZGiPCcY6GA2KrooYgc3RMooEF2G0E=; b=TilDPEFq7MBYl8+Iuc2b3Y8g+cBUbpDsu62fM6rS84S+wzfz8mVDGKRbqDtMpfAliW9LtvrDUprExMMUtDygDEWi20+fOPT4cn0OFl7AX2GbGtFXZOgw8IXDGsI5APvCTYsLfFrdJRmrqHu/VKNTsNbBIQ0yPgwgkbuYV8t1Nms= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 170.10.133.124 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by mx.zohomail.com with SMTPS id 1678293617848369.5905633779055; Wed, 8 Mar 2023 08:40:17 -0800 (PST) Received: from mimecast-mx02.redhat.com (mimecast-mx02.redhat.com [66.187.233.88]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-637-_APZySvaN1meElPzQeJzkw-1; Wed, 08 Mar 2023 11:39:40 -0500 Received: from smtp.corp.redhat.com (int-mx10.intmail.prod.int.rdu2.redhat.com [10.11.54.10]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 6D7CC886461; Wed, 8 Mar 2023 16:39:27 +0000 (UTC) Received: from mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com (unknown [10.30.29.100]) by smtp.corp.redhat.com (Postfix) with ESMTP id 52236492B15; Wed, 8 Mar 2023 16:39:27 +0000 (UTC) Received: from mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com (localhost [IPv6:::1]) by mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com (Postfix) with ESMTP id 9819C19472E2; Wed, 8 Mar 2023 16:39:23 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.rdu2.redhat.com [10.11.54.3]) by mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com (Postfix) with ESMTP id 735E019472C6 for ; Wed, 8 Mar 2023 16:39:20 +0000 (UTC) Received: by smtp.corp.redhat.com (Postfix) id 589B11121330; Wed, 8 Mar 2023 16:39:20 +0000 (UTC) Received: from virtlab420.virt.lab.eng.bos.redhat.com (virtlab420.virt.lab.eng.bos.redhat.com [10.19.152.148]) by smtp.corp.redhat.com (Postfix) with ESMTP id 39B5F1121314; Wed, 8 Mar 2023 16:39:20 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1678293616; h=from:from:sender:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:list-id:list-help: list-unsubscribe:list-subscribe:list-post; bh=ukH7zulqyjAoXtZGiPCcY6GA2KrooYgc3RMooEF2G0E=; b=dYfmazdUp71BdHovmahT1CAtFChHcZyrG4RwBaWPwWpSLdauwV4H/+U/WvtIlAKEqTw5da 42nyjFFconU9l9yG3nfUrLVhtwoiQ5wYIRyz/UAzbT8QjZFSzzolTujjwcQcvUw1fyOB6v dX0zOkGE70vNPXmUCWLb1uxZ5xrMjKI= X-MC-Unique: _APZySvaN1meElPzQeJzkw-1 X-Original-To: libvir-list@listman.corp.redhat.com From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= To: libvir-list@redhat.com Subject: [PATCH 16/16] rpc: add helpers for XDR type serialization Date: Wed, 8 Mar 2023 11:39:13 -0500 Message-Id: <20230308163913.338952-17-berrange@redhat.com> In-Reply-To: <20230308163913.338952-1-berrange@redhat.com> References: <20230308163913.338952-1-berrange@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.1 on 10.11.54.3 X-BeenThere: libvir-list@redhat.com X-Mailman-Version: 2.1.29 Precedence: list List-Id: Development discussions about the libvirt library & tools List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: libvir-list-bounces@redhat.com Sender: "libvir-list" X-Scanned-By: MIMEDefang 3.1 on 10.11.54.10 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1678293618951100003 As preparation for eliminating the use of the XDR library, introduce helpers for (de)serializing XDR types from/to the virNetMessage object. In contrast to the XDR APIs, when encoding data our helpers can dynamically resize the virNetMessage buffer. Our decode helpers also exhibit delayed error reporting, so that callers can deserialize a bunch of data and check for errors once at the end. Signed-off-by: Daniel P. Berrang=C3=A9 Reviewed-by: Michal Privoznik --- src/rpc/virnetmessage.c | 704 ++++++++++++++++++++++++++++++++++++++++ src/rpc/virnetmessage.h | 88 +++++ 2 files changed, 792 insertions(+) diff --git a/src/rpc/virnetmessage.c b/src/rpc/virnetmessage.c index c9698fb263..df9a1aea71 100644 --- a/src/rpc/virnetmessage.c +++ b/src/rpc/virnetmessage.c @@ -593,3 +593,707 @@ int virNetMessageAddFD(virNetMessage *msg, VIR_FORCE_CLOSE(newfd); return -1; } + +static void virNetMessageEncodePrealloc(virNetMessage *msg, size_t len) +{ + if ((msg->bufferLength - msg->bufferOffset) > len) + return; + + /* + * Over allocate by 64kb, since we'll almost certainly + * have more fields written soon + */ + msg->bufferLength +=3D len + (1024 * 64); + msg->buffer =3D g_realloc_n(msg->buffer, 1, msg->bufferLength); +} + +static bool virNetMessageDecodePending(virNetMessage *msg, size_t len) +{ + if ((msg->bufferLength - msg->bufferOffset) < len) { + msg->decodeErrno =3D ENOSPC; + } + + /* Always return msg->decodeErrno, even if we didn't set it, + * because we allow multiple decode calls to be run without + * the caller checking for errors + */ + return msg->decodeErrno =3D=3D 0; +} + +#define VIR_NET_MESSAGE_ENCODE_UINT32 \ + uint32_t p =3D htonl((uint32_t)v); \ + virNetMessageEncodePrealloc(msg, sizeof(uint32_t)); \ + memcpy(msg->buffer + msg->bufferOffset, &p, sizeof(p)); \ + msg->bufferOffset +=3D sizeof(p) + +#define VIR_NET_MESSAGE_DECODE_UINT32(t) \ + uint32_t p; \ + if (!virNetMessageDecodePending(msg, sizeof(uint32_t))) \ + return; \ + memcpy(&p, msg->buffer + msg->bufferOffset, sizeof(p)); \ + msg->bufferOffset +=3D sizeof(p); \ + *v =3D (t)ntohl((uint32_t)p); + +#define VIR_NET_MESSAGE_ENCODE_UINT64 \ + uint32_t p[2] =3D { \ + htonl((uint32_t)(((uint64_t)v >> 32) & 0xffffffff)), \ + htonl((uint32_t)((uint64_t)v & 0xffffffff)), \ + }; \ + virNetMessageEncodePrealloc(msg, sizeof(uint64_t)); \ + memcpy(msg->buffer + msg->bufferOffset, p, sizeof(p)); \ + msg->bufferOffset +=3D sizeof(p) + +#define VIR_NET_MESSAGE_DECODE_UINT64(t) \ + uint32_t p[2]; \ + if (!virNetMessageDecodePending(msg, sizeof(uint64_t))) \ + return; \ + memcpy(&p, msg->buffer + msg->bufferOffset, sizeof(p)); \ + msg->bufferOffset +=3D sizeof(p); \ + *v =3D (t)((((uint64_t)ntohl(p[0])) << 32) + ntohl(p[1])); + + +void virNetMessageEncodeInt8(virNetMessage *msg, int8_t v) +{ + VIR_NET_MESSAGE_ENCODE_UINT32; +} + +void virNetMessageDecodeInt8(virNetMessage *msg, int8_t *v) +{ + VIR_NET_MESSAGE_DECODE_UINT32(int8_t); +} + +void virNetMessageEncodeUInt8(virNetMessage *msg, uint8_t v) +{ + VIR_NET_MESSAGE_ENCODE_UINT32; +} + +void virNetMessageDecodeUInt8(virNetMessage *msg, uint8_t *v) +{ + VIR_NET_MESSAGE_DECODE_UINT32(uint8_t); +} + +void virNetMessageEncodeInt16(virNetMessage *msg, int16_t v) +{ + VIR_NET_MESSAGE_ENCODE_UINT32; +} + +void virNetMessageDecodeInt16(virNetMessage *msg, int16_t *v) +{ + VIR_NET_MESSAGE_DECODE_UINT32(int16_t); +} + +void virNetMessageEncodeUInt16(virNetMessage *msg, uint16_t v) +{ + VIR_NET_MESSAGE_ENCODE_UINT32; +} + +void virNetMessageDecodeUInt16(virNetMessage *msg, uint16_t *v) +{ + VIR_NET_MESSAGE_DECODE_UINT32(uint16_t); +} + +void virNetMessageEncodeInt32(virNetMessage *msg, int32_t v) +{ + VIR_NET_MESSAGE_ENCODE_UINT32; +} + +void virNetMessageDecodeInt32(virNetMessage *msg, int32_t *v) +{ + VIR_NET_MESSAGE_DECODE_UINT32(int32_t); +} + +void virNetMessageEncodeUInt32(virNetMessage *msg, uint32_t v) +{ + VIR_NET_MESSAGE_ENCODE_UINT32; +} + +void virNetMessageDecodeUInt32(virNetMessage *msg, uint32_t *v) +{ + VIR_NET_MESSAGE_DECODE_UINT32(uint32_t); +} + +void virNetMessageEncodeInt64(virNetMessage *msg, int64_t v) +{ + VIR_NET_MESSAGE_ENCODE_UINT64; +} + +void virNetMessageDecodeInt64(virNetMessage *msg, int64_t *v) +{ + VIR_NET_MESSAGE_DECODE_UINT64(int64_t); +} + +void virNetMessageEncodeUInt64(virNetMessage *msg, uint64_t v) +{ + VIR_NET_MESSAGE_ENCODE_UINT64; +} + +void virNetMessageDecodeUInt64(virNetMessage *msg, uint64_t *v) +{ + VIR_NET_MESSAGE_DECODE_UINT64(uint64_t); +} + +G_STATIC_ASSERT(sizeof(float) =3D=3D sizeof(uint32_t)); +void virNetMessageEncodeFloat(virNetMessage *msg, float v) +{ + VIR_NET_MESSAGE_ENCODE_UINT32; +} + +void virNetMessageDecodeFloat(virNetMessage *msg, float *v) +{ + VIR_NET_MESSAGE_DECODE_UINT32(float); +} + +G_STATIC_ASSERT(sizeof(double) =3D=3D sizeof(uint64_t)); +void virNetMessageEncodeDouble(virNetMessage *msg, double v) +{ + /* XXXX check I'm doing byte order right here */ + VIR_NET_MESSAGE_ENCODE_UINT64; +} + +void virNetMessageDecodeDouble(virNetMessage *msg, double *v) +{ + /* XXXX check I'm doing byte order right here */ + VIR_NET_MESSAGE_DECODE_UINT64(double); +} + +void virNetMessageEncodeBool(virNetMessage *msg, bool v) +{ + uint32_t p =3D htonl(v ? 1 : 0); + virNetMessageEncodePrealloc(msg, sizeof(p)); + memcpy(msg->buffer + msg->bufferOffset, &p, sizeof(p)); + msg->bufferOffset +=3D sizeof(p); +} + +void virNetMessageDecodeBool(virNetMessage *msg, bool *v) +{ + uint32_t p; + if (!virNetMessageDecodePending(msg, sizeof(uint32_t))) + return; + memcpy(&p, msg->buffer + msg->bufferOffset, sizeof(p)); + msg->bufferOffset +=3D sizeof(p); + *v =3D ntohl((uint32_t)p) =3D=3D 1 ? true : false; +} + +#define VIR_NET_MESSAGE_ENCODE_FIXED_ARRAY_UINT32 \ + do { \ + g_assert(len < (G_MAXUINT32 - 1)); \ + g_assert((G_MAXSIZE / sizeof(uint32_t)) > len); \ + virNetMessageEncodePrealloc(msg, sizeof(uint32_t) * len); \ + while (len) { \ + uint32_t p =3D htonl((uint32_t)*v); \ + memcpy(msg->buffer + msg->bufferOffset, &p, sizeof(p)); \ + msg->bufferOffset +=3D sizeof(p); \ + v++; \ + len--; \ + } \ + } while (0) + +#define VIR_NET_MESSAGE_DECODE_FIXED_ARRAY_UINT32(t) \ + do { \ + t *vp; \ + g_assert(len < (G_MAXUINT32 - 1)); \ + g_assert((G_MAXSIZE / sizeof(uint32_t)) > len); \ + if (!virNetMessageDecodePending(msg, sizeof(uint32_t) * len)) \ + return; \ + *v =3D vp =3D g_new0(t, len); \ + while (len) { \ + uint32_t p; \ + memcpy(&p, msg->buffer + msg->bufferOffset, sizeof(p)); \ + msg->bufferOffset +=3D sizeof(p); \ + *vp =3D (t)ntohl(p); \ + vp++; \ + len--; \ + } \ + } while (0) + +#define VIR_NET_MESSAGE_ENCODE_FIXED_ARRAY_UINT64 \ + do { \ + g_assert(len < (G_MAXUINT32 - 1)); \ + g_assert((G_MAXSIZE / sizeof(uint64_t)) > len); \ + virNetMessageEncodePrealloc(msg, sizeof(uint32_t) * len); \ + while (len) { \ + uint32_t p[2] =3D { \ + htonl((uint32_t)(((uint64_t)*v >> 32) & 0xffffffff)), \ + htonl((uint32_t)((uint64_t)*v & 0xffffffff)), \ + }; \ + memcpy(msg->buffer + msg->bufferOffset, p, sizeof(p)); \ + msg->bufferOffset +=3D sizeof(p); \ + v++; \ + len--; \ + } \ + } while (0) + +#define VIR_NET_MESSAGE_DECODE_FIXED_ARRAY_UINT64(t) \ + do { \ + t *vp; \ + g_assert(len < (G_MAXUINT32 - 1)); \ + g_assert((G_MAXSIZE / sizeof(uint64_t)) > len); \ + if (!virNetMessageDecodePending(msg, sizeof(uint64_t) * len)) \ + return; \ + *v =3D vp =3D g_new0(t, len); \ + while (len) { \ + uint32_t p[2]; \ + memcpy(p, msg->buffer + msg->bufferOffset, sizeof(p)); \ + msg->bufferOffset +=3D sizeof(p); \ + *vp =3D (t)((((uint64_t)ntohl(p[0])) << 32) + ntohl(p[1])); \ + vp++; \ + len--; \ + } \ + } while (0) + +void virNetMessageEncodeInt8FixedArray(virNetMessage *msg, int8_t *v, size= _t len) +{ + VIR_NET_MESSAGE_ENCODE_FIXED_ARRAY_UINT32; +} + +void virNetMessageDecodeInt8FixedArray(virNetMessage *msg, int8_t **v, siz= e_t len) +{ + VIR_NET_MESSAGE_DECODE_FIXED_ARRAY_UINT32(int8_t); +} + +void virNetMessageEncodeUInt8FixedArray(virNetMessage *msg, uint8_t *v, si= ze_t len) +{ + VIR_NET_MESSAGE_ENCODE_FIXED_ARRAY_UINT32; +} + +void virNetMessageDecodeUInt8FixedArray(virNetMessage *msg, uint8_t **v, s= ize_t len) +{ + VIR_NET_MESSAGE_DECODE_FIXED_ARRAY_UINT32(uint8_t); +} + +void virNetMessageEncodeInt16FixedArray(virNetMessage *msg, int16_t *v, si= ze_t len) +{ + VIR_NET_MESSAGE_ENCODE_FIXED_ARRAY_UINT32; +} + +void virNetMessageDecodeInt16FixedArray(virNetMessage *msg, int16_t **v, s= ize_t len) +{ + VIR_NET_MESSAGE_DECODE_FIXED_ARRAY_UINT32(int16_t); +} + +void virNetMessageEncodeUInt16FixedArray(virNetMessage *msg, uint16_t *v, = size_t len) +{ + VIR_NET_MESSAGE_ENCODE_FIXED_ARRAY_UINT32; +} + +void virNetMessageDecodeUInt16FixedArray(virNetMessage *msg, uint16_t **v,= size_t len) +{ + VIR_NET_MESSAGE_DECODE_FIXED_ARRAY_UINT32(uint16_t); +} + +void virNetMessageEncodeInt32FixedArray(virNetMessage *msg, int32_t *v, si= ze_t len) +{ + VIR_NET_MESSAGE_ENCODE_FIXED_ARRAY_UINT32; +} + +void virNetMessageDecodeInt32FixedArray(virNetMessage *msg, int32_t **v, s= ize_t len) +{ + VIR_NET_MESSAGE_DECODE_FIXED_ARRAY_UINT32(int32_t); +} + +void virNetMessageEncodeUInt32FixedArray(virNetMessage *msg, uint32_t *v, = size_t len) +{ + VIR_NET_MESSAGE_ENCODE_FIXED_ARRAY_UINT32; +} + +void virNetMessageDecodeUInt32FixedArray(virNetMessage *msg, uint32_t **v,= size_t len) +{ + VIR_NET_MESSAGE_DECODE_FIXED_ARRAY_UINT32(uint32_t); +} + +void virNetMessageEncodeInt64FixedArray(virNetMessage *msg, int64_t *v, si= ze_t len) +{ + VIR_NET_MESSAGE_ENCODE_FIXED_ARRAY_UINT64; +} + +void virNetMessageDecodeInt64FixedArray(virNetMessage *msg, int64_t **v, s= ize_t len) +{ + VIR_NET_MESSAGE_DECODE_FIXED_ARRAY_UINT64(int64_t); +} + +void virNetMessageEncodeUInt64FixedArray(virNetMessage *msg, uint64_t *v, = size_t len) +{ + VIR_NET_MESSAGE_ENCODE_FIXED_ARRAY_UINT64; +} + +void virNetMessageDecodeUInt64FixedArray(virNetMessage *msg, uint64_t **v,= size_t len) +{ + VIR_NET_MESSAGE_DECODE_FIXED_ARRAY_UINT64(uint64_t); +} + +void virNetMessageEncodeFloatFixedArray(virNetMessage *msg, float *v, size= _t len) +{ + VIR_NET_MESSAGE_ENCODE_FIXED_ARRAY_UINT32; +} + +void virNetMessageDecodeFloatFixedArray(virNetMessage *msg, float **v, siz= e_t len) +{ + VIR_NET_MESSAGE_DECODE_FIXED_ARRAY_UINT32(float); +} + +void virNetMessageEncodeDoubleFixedArray(virNetMessage *msg, double *v, si= ze_t len) +{ + VIR_NET_MESSAGE_ENCODE_FIXED_ARRAY_UINT64; +} + +void virNetMessageDecodeDoubleFixedArray(virNetMessage *msg, double **v, s= ize_t len) +{ + VIR_NET_MESSAGE_DECODE_FIXED_ARRAY_UINT64(double); +} + +#define VIR_NET_MESSAGE_ENCODE_DYN_ARRAY_UINT32 \ + do { \ + uint32_t lenp =3D htonl(len); \ + g_assert(len < (G_MAXUINT32 - 1)); \ + g_assert(((G_MAXSIZE - sizeof(uint32_t))/ sizeof(uint32_t)) > len)= ; \ + virNetMessageEncodePrealloc(msg, sizeof(uint32_t) + (sizeof(uint32= _t) * len)); \ + memcpy(msg->buffer + msg->bufferOffset, &lenp, sizeof(lenp)); \ + msg->bufferOffset +=3D sizeof(lenp); \ + while (len) { \ + uint32_t p =3D htonl((uint32_t)*v); \ + memcpy(msg->buffer + msg->bufferOffset, &p, sizeof(p)); \ + msg->bufferOffset +=3D sizeof(p); \ + v++; \ + len--; \ + } \ + } while (0) + +#define VIR_NET_MESSAGE_DECODE_DYN_ARRAY_UINT32(t) \ + do { \ + t *vp; \ + uint32_t lentmp; \ + virNetMessageDecodeUInt32(msg, &lentmp); \ + if (msg->decodeErrno !=3D 0) { \ + return; \ + } \ + if (lentmp > maxlen) { \ + msg->decodeErrno =3D EFBIG; \ + return; \ + } \ + g_assert(lentmp < (G_MAXUINT32 - 1)); \ + /* g_assert((G_MAXSIZE / sizeof(uint32_t)) > lentmp);*/ \ + if (!virNetMessageDecodePending(msg, sizeof(uint32_t) * lentmp)) \ + return; \ + *v =3D vp =3D g_new0(t, lentmp); \ + *len =3D lentmp; \ + while (lentmp) { \ + uint32_t p; \ + memcpy(&p, msg->buffer + msg->bufferOffset, sizeof(p)); \ + msg->bufferOffset +=3D sizeof(p); \ + *vp =3D (t)ntohl(p); \ + vp++; \ + lentmp--; \ + } \ + } while (0) + +#define VIR_NET_MESSAGE_ENCODE_DYN_ARRAY_UINT64 \ + do { \ + uint32_t lenp =3D htonl(len); \ + g_assert(len < (G_MAXUINT32 - 1)); \ + g_assert(((G_MAXSIZE - sizeof(uint32_t))/ sizeof(uint64_t)) > len)= ; \ + virNetMessageEncodePrealloc(msg, sizeof(uint32_t) + (sizeof(uint64= _t) * len)); \ + memcpy(msg->buffer + msg->bufferOffset, &lenp, sizeof(lenp)); \ + msg->bufferOffset +=3D sizeof(lenp); \ + while (len) { \ + uint32_t p[2] =3D { \ + htonl((uint32_t)(((uint64_t)*v >> 32) & 0xffffffff)), \ + htonl((uint32_t)((uint64_t)*v & 0xffffffff)), \ + }; \ + memcpy(msg->buffer + msg->bufferOffset, p, sizeof(p)); \ + msg->bufferOffset +=3D sizeof(p); \ + v++; \ + len--; \ + } \ + } while (0) + +#define VIR_NET_MESSAGE_DECODE_DYN_ARRAY_UINT64(t) \ + do { \ + t *vp; \ + uint32_t lentmp; \ + virNetMessageDecodeUInt32(msg, &lentmp); \ + if (msg->decodeErrno !=3D 0) { \ + return; \ + } \ + if (lentmp > maxlen) { \ + msg->decodeErrno =3D EFBIG; \ + return; \ + } \ + g_assert(lentmp < (G_MAXUINT32 - 1)); \ + /* g_assert((G_MAXSIZE / sizeof(uint32_t)) > lentmp);*/ \ + if (!virNetMessageDecodePending(msg, sizeof(uint32_t) * lentmp)) \ + return; \ + *v =3D vp =3D g_new0(t, lentmp); \ + *len =3D lentmp; \ + while (lentmp) { \ + uint32_t p[2]; \ + memcpy(p, msg->buffer + msg->bufferOffset, sizeof(p)); \ + msg->bufferOffset +=3D sizeof(p); \ + *vp =3D (t)((((uint64_t)ntohl(p[0])) << 32) + ntohl(p[1])); \ + vp++; \ + lentmp--; \ + } \ + } while (0) + + +void virNetMessageEncodeInt8DynArray(virNetMessage *msg, int8_t *v, size_t= len) +{ + VIR_NET_MESSAGE_ENCODE_DYN_ARRAY_UINT32; +} + +void virNetMessageDecodeInt8DynArray(virNetMessage *msg, size_t maxlen, in= t8_t **v, size_t *len) +{ + VIR_NET_MESSAGE_DECODE_DYN_ARRAY_UINT32(int8_t); +} + +void virNetMessageEncodeUInt8DynArray(virNetMessage *msg, uint8_t *v, size= _t len) +{ + VIR_NET_MESSAGE_ENCODE_DYN_ARRAY_UINT32; +} + +void virNetMessageDecodeUInt8DynArray(virNetMessage *msg, size_t maxlen, u= int8_t **v, size_t *len) +{ + VIR_NET_MESSAGE_DECODE_DYN_ARRAY_UINT32(uint8_t); +} + +void virNetMessageEncodeInt16DynArray(virNetMessage *msg, int16_t *v, size= _t len) +{ + VIR_NET_MESSAGE_ENCODE_DYN_ARRAY_UINT32; +} + +void virNetMessageDecodeInt16DynArray(virNetMessage *msg, size_t maxlen, i= nt16_t **v, size_t *len) +{ + VIR_NET_MESSAGE_DECODE_DYN_ARRAY_UINT32(int16_t); +} + +void virNetMessageEncodeUInt16DynArray(virNetMessage *msg, uint16_t *v, si= ze_t len) +{ + VIR_NET_MESSAGE_ENCODE_DYN_ARRAY_UINT32; +} + +void virNetMessageDecodeUInt16DynArray(virNetMessage *msg, size_t maxlen, = uint16_t **v, size_t *len) +{ + VIR_NET_MESSAGE_DECODE_DYN_ARRAY_UINT32(uint16_t); +} + +void virNetMessageEncodeInt32DynArray(virNetMessage *msg, int32_t *v, size= _t len) +{ + VIR_NET_MESSAGE_ENCODE_DYN_ARRAY_UINT32; +} + +void virNetMessageDecodeInt32DynArray(virNetMessage *msg, size_t maxlen, i= nt32_t **v, size_t *len) +{ + VIR_NET_MESSAGE_DECODE_DYN_ARRAY_UINT32(int32_t); +} + +void virNetMessageEncodeUInt32DynArray(virNetMessage *msg, uint32_t *v, si= ze_t len) +{ + VIR_NET_MESSAGE_ENCODE_DYN_ARRAY_UINT32; +} + +void virNetMessageDecodeUInt32DynArray(virNetMessage *msg, size_t maxlen, = uint32_t **v, size_t *len) +{ + VIR_NET_MESSAGE_DECODE_DYN_ARRAY_UINT32(uint32_t); +} + +void virNetMessageEncodeInt64DynArray(virNetMessage *msg, int64_t *v, size= _t len) +{ + VIR_NET_MESSAGE_ENCODE_DYN_ARRAY_UINT64; +} + +void virNetMessageDecodeInt64DynArray(virNetMessage *msg, size_t maxlen, i= nt64_t **v, size_t *len) +{ + VIR_NET_MESSAGE_DECODE_DYN_ARRAY_UINT64(int64_t); +} + +void virNetMessageEncodeUInt64DynArray(virNetMessage *msg, uint64_t *v, si= ze_t len) +{ + VIR_NET_MESSAGE_ENCODE_DYN_ARRAY_UINT64; +} + +void virNetMessageDecodeUInt64DynArray(virNetMessage *msg, size_t maxlen, = uint64_t **v, size_t *len) +{ + VIR_NET_MESSAGE_DECODE_DYN_ARRAY_UINT64(uint64_t); +} + +void virNetMessageEncodeFloatDynArray(virNetMessage *msg, float *v, size_t= len) +{ + VIR_NET_MESSAGE_ENCODE_DYN_ARRAY_UINT32; +} + +void virNetMessageDecodeFloatDynArray(virNetMessage *msg, size_t maxlen, f= loat **v, size_t *len) +{ + VIR_NET_MESSAGE_DECODE_DYN_ARRAY_UINT32(float); +} + +void virNetMessageEncodeDoubleDynArray(virNetMessage *msg, double *v, size= _t len) +{ + VIR_NET_MESSAGE_ENCODE_DYN_ARRAY_UINT64; +} + +void virNetMessageDecodeDoubleDynArray(virNetMessage *msg, size_t maxlen, = double **v, size_t *len) +{ + VIR_NET_MESSAGE_DECODE_DYN_ARRAY_UINT64(double); +} + +void virNetMessageEncodeString(virNetMessage *msg, char *v) +{ + virNetMessageEncodeOpaqueDynArray(msg, (uint8_t *)v, strlen(v)); +} + +void virNetMessageDecodeString(virNetMessage *msg, size_t maxlen, char **v) +{ + size_t len; + virNetMessageDecodeOpaqueDynArray(msg, maxlen, (uint8_t **)v, &len); +} + +void virNetMessageEncodeOpaqueFixedArray(virNetMessage *msg, uint8_t *v, s= ize_t len) +{ + size_t pad =3D 4 - (len % 4); + + g_assert(len < (G_MAXUINT32 - 1)); + g_assert((G_MAXSIZE - len) > pad); + + virNetMessageEncodePrealloc(msg, len + pad); + memcpy(msg->buffer + msg->bufferOffset, v, len); + msg->bufferOffset +=3D len; + memset(msg->buffer + msg->bufferOffset, 0, pad); + msg->bufferOffset +=3D pad; +} + +void virNetMessageDecodeOpaqueFixedArray(virNetMessage *msg, uint8_t **v, = size_t len) +{ + size_t pad =3D 4 - (len % 4); + + g_assert(len < (G_MAXUINT32 - 1)); + g_assert((G_MAXSIZE - len) > pad); + + if (!virNetMessageDecodePending(msg, len + pad)) + return; + + memcpy(*v, msg->buffer + msg->bufferOffset, len); + msg->bufferOffset +=3D len + pad; +} + +void virNetMessageEncodeOpaqueDynArray(virNetMessage *msg, uint8_t *v, siz= e_t len) +{ + uint32_t lenp =3D htonl(len); + size_t pad =3D 4 - (len % 4); + + g_assert(len < (G_MAXUINT32 - 1)); + g_assert((G_MAXSIZE - len) > (pad + 4)); + + virNetMessageEncodePrealloc(msg, len + pad + sizeof(lenp)); + memcpy(msg->buffer + msg->bufferOffset, &lenp, sizeof(lenp)); + msg->bufferOffset +=3D sizeof(lenp); + memcpy(msg->buffer + msg->bufferOffset, v, len); + msg->bufferOffset +=3D len; + memset(msg->buffer + msg->bufferOffset, 0, pad); + msg->bufferOffset +=3D pad; +} + +void virNetMessageDecodeOpaqueDynArray(virNetMessage *msg, size_t maxlen, = uint8_t **v, size_t *len) +{ + uint32_t lentmp; + size_t pad; + + g_assert(maxlen < (G_MAXUINT32 - 1)); + + virNetMessageDecodeUInt32(msg, &lentmp); + if (msg->decodeErrno !=3D 0) + return; + + if (lentmp > maxlen) { + msg->decodeErrno =3D EFBIG; + return; + } + + pad =3D 4 - (lentmp % 4); + + if ((G_MAXSIZE - lentmp) <=3D pad) { + msg->decodeErrno =3D EFBIG; + return; + } + + if (!virNetMessageDecodePending(msg, lentmp + pad)) + return; + + *v =3D g_new0(uint8_t, lentmp); + *len =3D lentmp; + memcpy(*v, msg->buffer + msg->bufferOffset, lentmp); + msg->bufferOffset +=3D lentmp + pad; +} + + +void virNetMessageEncodeAnyFixedArray(virNetMessage *msg, void *v, size_t = len, size_t size, + virNetMessageEncoder encoder) +{ + char *vp =3D v; + while (len) { + encoder(msg, vp); + vp +=3D size; + len--; + } +} + +void virNetMessageDecodeAnyFixedArray(virNetMessage *msg, void **v, size_t= len, size_t size, + virNetMessageDecoder decoder) +{ + char *val =3D g_malloc0_n(size, len); + *v =3D val; + while (len) { + decoder(msg, (void **)&val); + val +=3D size; + len--; + } +} + +void virNetMessageEncodeAnyDynArray(virNetMessage *msg, void *v, size_t le= n, size_t size, + virNetMessageEncoder encoder) +{ + char *vp =3D v; + uint32_t lenp =3D htonl(len); + g_assert(len < (G_MAXUINT32 - 1)); + g_assert(((G_MAXSIZE - sizeof(uint32_t))/size) > len); + virNetMessageEncodePrealloc(msg, sizeof(uint32_t)); + memcpy(msg->buffer + msg->bufferOffset, &lenp, sizeof(lenp)); + msg->bufferOffset +=3D sizeof(lenp); + while (len) { + encoder(msg, vp); + vp +=3D size; + len--; + } +} + +void virNetMessageDecodeAnyDynArray(virNetMessage *msg, size_t maxlen, siz= e_t size, + virNetMessageDecoder decoder, void **v= , size_t *len) +{ + uint32_t lentmp; + char *vp; + virNetMessageDecodeUInt32(msg, &lentmp); + if (msg->decodeErrno !=3D 0) { + return; + } + if (lentmp > maxlen) { + msg->decodeErrno =3D EFBIG; + return; + } + g_assert(lentmp < (G_MAXUINT32 - 1)); + /* g_assert((G_MAXSIZE / size) > lentmp);*/ + *v =3D vp =3D g_malloc0_n(lentmp, size); + *len =3D lentmp; + while (lentmp) { + decoder(msg, (void**)&vp); + vp +=3D size; + lentmp--; + } +} + +int virNetMessageHasDecodeError(virNetMessage *msg) +{ + if (msg->decodeErrno) { + virReportSystemError(msg->decodeErrno, "%s", + _("Message terminated unexpectedly")); + return -1; + } + return 0; +} diff --git a/src/rpc/virnetmessage.h b/src/rpc/virnetmessage.h index 849674fa53..264ddd3c05 100644 --- a/src/rpc/virnetmessage.h +++ b/src/rpc/virnetmessage.h @@ -20,6 +20,7 @@ =20 #pragma once =20 +#include #include "virnetprotocol.h" =20 typedef struct _virNetMessage virNetMessage; @@ -28,6 +29,7 @@ typedef void (*virNetMessageFreeCallback)(virNetMessage *= msg, void *opaque); =20 struct _virNetMessage { bool tracked; + int decodeErrno; =20 char *buffer; /* Initially VIR_NET_MESSAGE_INITIAL + VIR_NET_MESSAGE_L= EN_MAX */ /* Maximum VIR_NET_MESSAGE_MAX + VIR_NET_MESSAGE_L= EN_MAX */ @@ -94,3 +96,89 @@ int virNetMessageDupFD(virNetMessage *msg, =20 int virNetMessageAddFD(virNetMessage *msg, int fd); + +void virNetMessageEncodeInt8(virNetMessage *msg, int8_t v); +void virNetMessageDecodeInt8(virNetMessage *msg, int8_t *v); +void virNetMessageEncodeUInt8(virNetMessage *msg, uint8_t v); +void virNetMessageDecodeUInt8(virNetMessage *msg, uint8_t *v); +void virNetMessageEncodeInt16(virNetMessage *msg, int16_t v); +void virNetMessageDecodeInt16(virNetMessage *msg, int16_t *v); +void virNetMessageEncodeUInt16(virNetMessage *msg, uint16_t v); +void virNetMessageDecodeUInt16(virNetMessage *msg, uint16_t *v); +void virNetMessageEncodeInt32(virNetMessage *msg, int32_t v); +void virNetMessageDecodeInt32(virNetMessage *msg, int32_t *v); +void virNetMessageEncodeUInt32(virNetMessage *msg, uint32_t v); +void virNetMessageDecodeUInt32(virNetMessage *msg, uint32_t *v); +void virNetMessageEncodeInt64(virNetMessage *msg, int64_t v); +void virNetMessageDecodeInt64(virNetMessage *msg, int64_t *v); +void virNetMessageEncodeUInt64(virNetMessage *msg, uint64_t v); +void virNetMessageDecodeUInt64(virNetMessage *msg, uint64_t *v); + +void virNetMessageEncodeFloat(virNetMessage *msg, float v); +void virNetMessageDecodeFloat(virNetMessage *msg, float *v); +void virNetMessageEncodeDouble(virNetMessage *msg, double v); +void virNetMessageDecodeDouble(virNetMessage *msg, double *v); +void virNetMessageEncodeBool(virNetMessage *msg, bool v); +void virNetMessageDecodeBool(virNetMessage *msg, bool *v); + +void virNetMessageEncodeInt8FixedArray(virNetMessage *msg, int8_t *v, size= _t len); +void virNetMessageDecodeInt8FixedArray(virNetMessage *msg, int8_t **v, siz= e_t len); +void virNetMessageEncodeUInt8FixedArray(virNetMessage *msg, uint8_t *v, si= ze_t len); +void virNetMessageDecodeUInt8FixedArray(virNetMessage *msg, uint8_t **v, s= ize_t len); +void virNetMessageEncodeInt16FixedArray(virNetMessage *msg, int16_t *v, si= ze_t len); +void virNetMessageDecodeInt16FixedArray(virNetMessage *msg, int16_t **v, s= ize_t len); +void virNetMessageEncodeUInt16FixedArray(virNetMessage *msg, uint16_t *v, = size_t len); +void virNetMessageDecodeUInt16FixedArray(virNetMessage *msg, uint16_t **v,= size_t len); +void virNetMessageEncodeInt32FixedArray(virNetMessage *msg, int32_t *v, si= ze_t len); +void virNetMessageDecodeInt32FixedArray(virNetMessage *msg, int32_t **v, s= ize_t len); +void virNetMessageEncodeUInt32FixedArray(virNetMessage *msg, uint32_t *v, = size_t len); +void virNetMessageDecodeUInt32FixedArray(virNetMessage *msg, uint32_t **v,= size_t len); +void virNetMessageEncodeInt64FixedArray(virNetMessage *msg, int64_t *v, si= ze_t len); +void virNetMessageDecodeInt64FixedArray(virNetMessage *msg, int64_t **v, s= ize_t len); +void virNetMessageEncodeUInt64FixedArray(virNetMessage *msg, uint64_t *v, = size_t len); +void virNetMessageDecodeUInt64FixedArray(virNetMessage *msg, uint64_t **v,= size_t len); +void virNetMessageEncodeFloatFixedArray(virNetMessage *msg, float *v, size= _t len); +void virNetMessageDecodeFloatFixedArray(virNetMessage *msg, float **v, siz= e_t len); +void virNetMessageEncodeDoubleFixedArray(virNetMessage *msg, double *v, si= ze_t len); +void virNetMessageDecodeDoubleFixedArray(virNetMessage *msg, double **v, s= ize_t len); + +void virNetMessageEncodeInt8DynArray(virNetMessage *msg, int8_t *v, size_t= len); +void virNetMessageDecodeInt8DynArray(virNetMessage *msg, size_t maxlen, in= t8_t **v, size_t *len); +void virNetMessageEncodeUInt8DynArray(virNetMessage *msg, uint8_t *v, size= _t len); +void virNetMessageDecodeUInt8DynArray(virNetMessage *msg, size_t maxlen, u= int8_t **v, size_t *len); +void virNetMessageEncodeInt16DynArray(virNetMessage *msg, int16_t *v, size= _t len); +void virNetMessageDecodeInt16DynArray(virNetMessage *msg, size_t maxlen, i= nt16_t **v, size_t *len); +void virNetMessageEncodeUInt16DynArray(virNetMessage *msg, uint16_t *v, si= ze_t len); +void virNetMessageDecodeUInt16DynArray(virNetMessage *msg, size_t maxlen, = uint16_t **v, size_t *len); +void virNetMessageEncodeInt32DynArray(virNetMessage *msg, int32_t *v, size= _t len); +void virNetMessageDecodeInt32DynArray(virNetMessage *msg, size_t maxlen, i= nt32_t **v, size_t *len); +void virNetMessageEncodeUInt32DynArray(virNetMessage *msg, uint32_t *v, si= ze_t len); +void virNetMessageDecodeUInt32DynArray(virNetMessage *msg, size_t maxlen, = uint32_t **v, size_t *len); +void virNetMessageEncodeInt64DynArray(virNetMessage *msg, int64_t *v, size= _t len); +void virNetMessageDecodeInt64DynArray(virNetMessage *msg, size_t maxlen, i= nt64_t **v, size_t *len); +void virNetMessageEncodeUInt64DynArray(virNetMessage *msg, uint64_t *v, si= ze_t len); +void virNetMessageDecodeUInt64DynArray(virNetMessage *msg, size_t maxlen, = uint64_t **v, size_t *len); +void virNetMessageEncodeFloatDynArray(virNetMessage *msg, float *v, size_t= len); +void virNetMessageDecodeFloatDynArray(virNetMessage *msg, size_t maxlen, f= loat **v, size_t *len); +void virNetMessageEncodeDoubleDynArray(virNetMessage *msg, double *v, size= _t len); +void virNetMessageDecodeDoubleDynArray(virNetMessage *msg, size_t maxlen, = double **v, size_t *len); + +void virNetMessageEncodeString(virNetMessage *msg, char *v); +void virNetMessageDecodeString(virNetMessage *msg, size_t maxlen, char **v= ); +void virNetMessageEncodeOpaqueFixedArray(virNetMessage *msg, uint8_t *v, s= ize_t len); +void virNetMessageDecodeOpaqueFixedArray(virNetMessage *msg, uint8_t **v, = size_t len); +void virNetMessageEncodeOpaqueDynArray(virNetMessage *msg, uint8_t *v, siz= e_t len); +void virNetMessageDecodeOpaqueDynArray(virNetMessage *msg, size_t maxlen, = uint8_t **v, size_t *len); + +typedef void (*virNetMessageEncoder)(virNetMessage *msg, void *v); +typedef void (*virNetMessageDecoder)(virNetMessage *msg, void **v); +void virNetMessageEncodeAnyFixedArray(virNetMessage *msg, void *v, size_t = len, size_t size, + virNetMessageEncoder encoder); +void virNetMessageDecodeAnyFixedArray(virNetMessage *msg, void **v, size_t= len, size_t size, + virNetMessageDecoder decoder); +void virNetMessageEncodeAnyDynArray(virNetMessage *msg, void *v, size_t le= n, size_t size, + virNetMessageEncoder encoder); +void virNetMessageDecodeAnyDynArray(virNetMessage *msg, size_t maxlen, siz= e_t size, + virNetMessageDecoder decoder, void **v= , size_t *len); + +int virNetMessageHasDecodeError(virNetMessage *msg); --=20 2.39.1