Move the existing rpcgen_fix.pl script to rpcgenprotocol.pl and adjust it so that the script runs 'rpcgen' itself via a pipe, avoiding the need for any intermediate files. * Makefile.am: Re-write RPC generator rules * remote/rpcgen_fix.pl -> rpc/genprotocol.pl * remote/qemu_protocol.h, remote/remote_protocol.h, rpc/virnetprotocol.h: Re-generate --- src/Makefile.am | 75 ++++++++------------------ src/remote/qemu_protocol.h | 6 +- src/remote/remote_protocol.h | 6 +- src/remote/rpcgen_fix.pl | 91 ------------------------------- src/rpc/genprotocol.pl | 124 ++++++++++++++++++++++++++++++++++++++++++ src/rpc/virnetprotocol.h | 6 +- 6 files changed, 156 insertions(+), 152 deletions(-) delete mode 100644 src/remote/rpcgen_fix.pl create mode 100644 src/rpc/genprotocol.pl diff --git a/src/Makefile.am b/src/Makefile.am index 334d535..178a274 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -160,8 +160,7 @@ REMOTE_DRIVER_SOURCES = \ remote/qemu_protocol.c \ remote/qemu_protocol.h -EXTRA_DIST += remote/remote_protocol.x remote/qemu_protocol.x \ - remote/rpcgen_fix.pl +EXTRA_DIST += remote/remote_protocol.x remote/qemu_protocol.x # Ensure that we don't change the struct or member names or member ordering # in remote_protocol.x The embedded perl below needs a few comments, and @@ -496,58 +495,29 @@ if HAVE_RPCGEN # non-Linux people needing to test changes during dev. # rpcgen-normal: - rm -f rp.c-t rp.h-t rp.c-t1 rp.c-t2 rp.h-t1 - $(RPCGEN) -h -o rp.h-t $(srcdir)/remote/remote_protocol.x - $(RPCGEN) -c -o rp.c-t $(srcdir)/remote/remote_protocol.x -if HAVE_GLIBC_RPCGEN - perl -w $(srcdir)/remote/rpcgen_fix.pl rp.h-t > rp.h-t1 - perl -w $(srcdir)/remote/rpcgen_fix.pl rp.c-t > rp.c-t1 - (echo '#include <config.h>'; cat rp.c-t1) > rp.c-t2 - chmod 0444 rp.c-t2 rp.h-t1 - mv -f rp.h-t1 $(srcdir)/remote/remote_protocol.h - mv -f rp.c-t2 $(srcdir)/remote/remote_protocol.c - rm -f rp.c-t rp.h-t rp.c-t1 -else - chmod 0444 rp.c-t rp.h-t - mv -f rp.h-t $(srcdir)/remote/remote_protocol.h - mv -f rp.c-t $(srcdir)/remote/remote_protocol.c -endif + $(AM_V_GEN)perl -w $(srcdir)/rpc/genprotocol.pl $(RPCGEN) -h \ + $(srcdir)/remote/remote_protocol.x \ + $(srcdir)/remote/remote_protocol.h + $(AM_V_GEN)perl -w $(srcdir)/rpc/genprotocol.pl $(RPCGEN) -c \ + $(srcdir)/remote/remote_protocol.x \ + $(srcdir)/remote/remote_protocol.c + rpcgen-qemu: - rm -f rp_qemu.c-t rp_qemu.h-t rp_qemu.c-t1 rp_qemu.c-t2 rp_qemu.h-t1 - $(RPCGEN) -h -o rp_qemu.h-t $(srcdir)/remote/qemu_protocol.x - $(RPCGEN) -c -o rp_qemu.c-t $(srcdir)/remote/qemu_protocol.x -if HAVE_GLIBC_RPCGEN - perl -w $(srcdir)/remote/rpcgen_fix.pl rp_qemu.h-t > rp_qemu.h-t1 - perl -w $(srcdir)/remote/rpcgen_fix.pl rp_qemu.c-t > rp_qemu.c-t1 - (echo '#include <config.h>'; cat rp_qemu.c-t1) > rp_qemu.c-t2 - chmod 0444 rp_qemu.c-t2 rp_qemu.h-t1 - mv -f rp_qemu.h-t1 $(srcdir)/remote/qemu_protocol.h - mv -f rp_qemu.c-t2 $(srcdir)/remote/qemu_protocol.c - rm -f rp_qemu.c-t rp_qemu.h-t rp_qemu.c-t1 -else - chmod 0444 rp_qemu.c-t rp_qemu.h-t - mv -f rp_qemu.h-t $(srcdir)/remote/qemu_protocol.h - mv -f rp_qemu.c-t $(srcdir)/remote/qemu_protocol.c -endif + $(AM_V_GEN)perl -w $(srcdir)/rpc/genprotocol.pl $(RPCGEN) -h \ + $(srcdir)/remote/qemu_protocol.x \ + $(srcdir)/remote/qemu_protocol.h + $(AM_V_GEN)perl -w $(srcdir)/rpc/genprotocol.pl $(RPCGEN) -c \ + $(srcdir)/remote/qemu_protocol.x \ + $(srcdir)/remote/qemu_protocol.c rpcgen-net: - rm -f rp_net.c-t rp_net.h-t rp_net.c-t1 rp_net.c-t2 rp_net.h-t1 - $(RPCGEN) -h -o rp_net.h-t $(srcdir)/rpc/virnetprotocol.x - $(RPCGEN) -c -o rp_net.c-t $(srcdir)/rpc/virnetprotocol.x -if HAVE_GLIBC_RPCGEN - perl -w $(srcdir)/remote/rpcgen_fix.pl rp_net.h-t > rp_net.h-t1 - perl -w $(srcdir)/remote/rpcgen_fix.pl rp_net.c-t > rp_net.c-t1 - (echo '#include <config.h>'; cat rp_net.c-t1) > rp_net.c-t2 - chmod 0444 rp_net.c-t2 rp_net.h-t1 - mv -f rp_net.h-t1 $(srcdir)/rpc/virnetprotocol.h - mv -f rp_net.c-t2 $(srcdir)/rpc/virnetprotocol.c - rm -f rp_net.c-t rp_net.h-t rp_net.c-t1 -else - chmod 0444 rp_net.c-t rp_net.h-t - mv -f rp_net.h-t $(srcdir)/rpc/virnetprotocol.h - mv -f rp_net.c-t $(srcdir)/rpc/virnetprotocol.c -endif + $(AM_V_GEN)perl -w $(srcdir)/rpc/genprotocol.pl $(RPCGEN) -h \ + $(srcdir)/rpc/virnetprotocol.x \ + $(srcdir)/rpc/virnetprotocol.h + $(AM_V_GEN)perl -w $(srcdir)/rpc/genprotocol.pl $(RPCGEN) -c \ + $(srcdir)/rpc/virnetprotocol.x \ + $(srcdir)/rpc/virnetprotocol.c # # Maintainer-only target for re-generating the derived .c/.h source @@ -1121,8 +1091,9 @@ EXTRA_DIST += $(LIBVIRT_QEMU_SYMBOL_FILE) noinst_LTLIBRARIES += libvirt-net-rpc.la libvirt-net-rpc-server.la libvirt-net-rpc-client.la EXTRA_DIST += \ - rpc/virnetprotocol.x \ - rpc/gendispatch.pl + rpc/virnetprotocol.x \ + rpc/gendispatch.pl \ + rpc/genprotocol.pl libvirt_net_rpc_la_SOURCES = \ ../daemon/event.c \ diff --git a/src/remote/qemu_protocol.h b/src/remote/qemu_protocol.h index b822187..26f11fb 100644 --- a/src/remote/qemu_protocol.h +++ b/src/remote/qemu_protocol.h @@ -3,8 +3,8 @@ * It was generated using rpcgen. */ -#ifndef _RP_QEMU_H_RPCGEN -#define _RP_QEMU_H_RPCGEN +#ifndef _QEMU_PROTOCOL_H_RPCGEN +#define _QEMU_PROTOCOL_H_RPCGEN #include <rpc/rpc.h> @@ -54,4 +54,4 @@ extern bool_t xdr_qemu_procedure (); } #endif -#endif /* !_RP_QEMU_H_RPCGEN */ +#endif /* !_QEMU_PROTOCOL_H_RPCGEN */ diff --git a/src/remote/remote_protocol.h b/src/remote/remote_protocol.h index bbff882..7e9fd1c 100644 --- a/src/remote/remote_protocol.h +++ b/src/remote/remote_protocol.h @@ -3,8 +3,8 @@ * It was generated using rpcgen. */ -#ifndef _RP_H_RPCGEN -#define _RP_H_RPCGEN +#ifndef _REMOTE_PROTOCOL_H_RPCGEN +#define _REMOTE_PROTOCOL_H_RPCGEN #include <rpc/rpc.h> @@ -3014,4 +3014,4 @@ extern bool_t xdr_remote_procedure (); } #endif -#endif /* !_RP_H_RPCGEN */ +#endif /* !_REMOTE_PROTOCOL_H_RPCGEN */ diff --git a/src/remote/rpcgen_fix.pl b/src/remote/rpcgen_fix.pl deleted file mode 100644 index 3cf5479..0000000 --- a/src/remote/rpcgen_fix.pl +++ /dev/null @@ -1,91 +0,0 @@ -# Fix XDR code (generated by rpcgen) 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 Red Hat, Inc. -# -# See COPYING for the license of this software. -# -# Richard Jones <rjones@xxxxxxxxxx> - -use strict; - -my $in_function = 0; -my @function = (); - -while (<>) { - if (m/^{/) { - $in_function = 1; - print; - next; - } - - s/\t/ /g; - - # 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/(?<!IXDR_GET_INT32 )IXDR_GET_LONG/IXDR_GET_INT32/g; - s,#include "\./remote/remote_protocol\.h",#include "remote_protocol.h",; - - if (m/^}/) { - $in_function = 0; - - # Note: The body of the function is in @function. - - # Remove decl of buf, if buf isn't used in the function. - my @uses = grep /\bbuf\b/, @function; - @function = grep !/\bbuf\b/, @function if @uses == 1; - - # Remove decl of i, if i isn't used in the function. - @uses = grep /\bi\b/, @function; - @function = grep !/\bi\b/, @function if @uses == 1; - - # (char **)&objp->... gives: - # warning: dereferencing type-punned pointer will break - # strict-aliasing rules - # so rewrite it. - my %uses = (); - my $i = 0; - foreach (@function) { - $uses{$1} = $i++ if m/\(char \*\*\)\&(objp->[a-z_.]+_val)/i; - } - if (keys %uses >= 1) { - my $i = 1; - - foreach (keys %uses) { - $i = $uses{$_}; - unshift @function, - (" char **objp_cpp$i = (char **) (void *) &$_;\n"); - $i++; - } - @function = - 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 - # be ignored. Correct both these mistakes. - @function = - map { s/\bIXDR_PUT_((U_)?)LONG\b/(void)IXDR_PUT_$1INT32/; $_ } - map { s/\bXDR_INLINE\b/(int32_t*)XDR_INLINE/; $_ } - @function; - - print (join ("", @function)); - @function = (); - } - - unless ($in_function) { - print; - } else { - push @function, $_; - } -} diff --git a/src/rpc/genprotocol.pl b/src/rpc/genprotocol.pl new file mode 100644 index 0000000..9144fe9 --- /dev/null +++ b/src/rpc/genprotocol.pl @@ -0,0 +1,124 @@ +# +# 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 Red Hat, Inc. +# +# See COPYING for the license of this software. +# +# Richard Jones <rjones@xxxxxxxxxx> + +use strict; + +my $in_function = 0; +my @function = (); + +my $rpcgen = shift; +my $mode = shift; +my $xdrdef = shift; +my $target = shift; + +unlink $target; + +open RPCGEN, "-|", $rpcgen, $mode, $xdrdef + or die "cannot run $rpcgen $mode $xdrdef: $!"; +open TARGET, ">$target" + or die "cannot create $target: $!"; + +my $fixup = $^O eq "linux"; + +if ($mode eq "-c") { + print TARGET "#include <config.h>\n"; +} + +while (<RPCGEN>) { + unless ($fixup) { + print TARGET; + next; + } + + if (m/^{/) { + $in_function = 1; + print TARGET; + next; + } + + s/\t/ /g; + + # 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/(?<!IXDR_GET_INT32 )IXDR_GET_LONG/IXDR_GET_INT32/g; + s,#include "\./remote/remote_protocol\.h",#include "remote_protocol.h",; + + if (m/^}/) { + $in_function = 0; + + # Note: The body of the function is in @function. + + # Remove decl of buf, if buf isn't used in the function. + my @uses = grep /\bbuf\b/, @function; + @function = grep !/\bbuf\b/, @function if @uses == 1; + + # Remove decl of i, if i isn't used in the function. + @uses = grep /\bi\b/, @function; + @function = grep !/\bi\b/, @function if @uses == 1; + + # (char **)&objp->... gives: + # warning: dereferencing type-punned pointer will break + # strict-aliasing rules + # so rewrite it. + my %uses = (); + my $i = 0; + foreach (@function) { + $uses{$1} = $i++ if m/\(char \*\*\)\&(objp->[a-z_.]+_val)/i; + } + if (keys %uses >= 1) { + my $i = 1; + + foreach (keys %uses) { + $i = $uses{$_}; + unshift @function, + (" char **objp_cpp$i = (char **) (void *) &$_;\n"); + $i++; + } + @function = + 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 + # be ignored. Correct both these mistakes. + @function = + 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 = (); + } + + 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/virnetprotocol.h b/src/rpc/virnetprotocol.h index 9f4a79a..9d0021c 100644 --- a/src/rpc/virnetprotocol.h +++ b/src/rpc/virnetprotocol.h @@ -3,8 +3,8 @@ * It was generated using rpcgen. */ -#ifndef _RP_NET_H_RPCGEN -#define _RP_NET_H_RPCGEN +#ifndef _VIRNETPROTOCOL_H_RPCGEN +#define _VIRNETPROTOCOL_H_RPCGEN #include <rpc/rpc.h> @@ -133,4 +133,4 @@ extern bool_t xdr_virNetMessageError (); } #endif -#endif /* !_RP_NET_H_RPCGEN */ +#endif /* !_VIRNETPROTOCOL_H_RPCGEN */ -- 1.7.2.3 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list