-------- Original Message --------
Subject: Change 24441: Re: [PATCH] reentr.h changes so threaded Perl's compile on OpenBSD 3.7
Date: Tue, 10 May 2005 10:59:47 -0700
From: Abhijit Menon-Sen <[EMAIL PROTECTED]>
To: Anybody And Everybody <[email protected]>
Change 24441 by [EMAIL PROTECTED] on 2005/05/10 17:23:26
Subject: Re: [PATCH] reentr.h changes so threaded Perl's compile on
OpenBSD 3.7
From: Steve Peters <[EMAIL PROTECTED]>
Date: Tue, 10 May 2005 12:44:13 -0500
Message-Id: <[EMAIL PROTECTED]>Affected files ...
... //depot/perl/MANIFEST#1248 edit ... //depot/perl/README.openbsd#1 add ... //depot/perl/reentr.pl#35 edit
Differences ...
==== //depot/perl/MANIFEST#1248 (text) ==== Index: perl/MANIFEST --- perl/MANIFEST#1247~24426~ Mon May 9 04:11:35 2005 +++ perl/MANIFEST Tue May 10 10:23:26 2005 @@ -2453,6 +2453,7 @@ README.mint Perl notes for MiNT README.mpeix Perl notes for MPE/iX README.netware Perl notes for NetWare +README.openbsd Perl notes for OpenBSD README.os2 Perl notes for OS/2 README.os390 Perl notes for OS/390 README.os400 Perl notes for OS/400
==== //depot/perl/README.openbsd#1 (text) ==== Index: perl/README.openbsd --- /dev/null Tue May 5 13:32:27 1998 +++ perl/README.openbsd Tue May 10 10:23:26 2005 @@ -0,0 +1,30 @@ +If you read this file _as_is_, just ignore the funny characters you +see. It is written in the POD format (see pod/perlpod.pod) which is +specifically designed to be readable as is. + +=head1 NAME + +README.openbsd - Perl version 5 on OpenBSD systems + +=head1 DESCRIPTION + +This document describes various features of OpenBSD that will affect how Perl +version 5 (hereafter just Perl) is compiled and/or runs. + +=head2 OpenBSD core dumps from getprotobyname_r and getservbyname_r with ithreads + +When Perl is configured to use ithreads, it will use re-entrant library calls +in preference to non-re-entrant versions. There is an incompatability in +OpenBSD's C<getprotobyname_r> and C<getservbyname_r> function in versions 3.7 +and later that will cause a SEGV when called without doing a C<bzero> on +their return structs prior to calling these functions. Current Perl's +should handle this problem correctly. Older threaded Perls (5.8.6 or earlier) +will run into this problem. If you want to run a threaded Perl on OpenBSD +3.7 or higher, you will need to upgrade to at least Perl 5.8.7. + +=head1 AUTHOR + +Steve Peters <[EMAIL PROTECTED]> + +Please report any errors, updates, or suggestions to F<[EMAIL PROTECTED]>. +
==== //depot/perl/reentr.pl#35 (text) ==== Index: perl/reentr.pl --- perl/reentr.pl#34~24271~ Thu Apr 21 08:38:30 2005 +++ perl/reentr.pl Tue May 10 10:23:26 2005 @@ -41,7 +41,7 @@ /* * reentr.h * - * Copyright (C) 2002, 2003, by Larry Wall and others + * Copyright (C) 2002, 2003, 2005 by Larry Wall and others * * You may distribute under the terms of either the GNU General Public * License or the Artistic License, as specified in the README file. @@ -80,6 +80,17 @@ # define NETDB_R_OBSOLETE #endif
+/*
+ * As of OpenBSD 3.7, reentrant functions are now working, they just are
+ * incompatible with everyone else. To make OpenBSD happy, we have to
+ * memzero out certain structures before calling the functions.
+ */
+#if defined(__OpenBSD__)
+# define REENTR_MEMZERO(a,b) memzero(a,b),
+#else
+# define REENTR_MEMZERO(a,b)
+#endif +
#ifdef NETDB_R_OBSOLETE
# undef HAS_ENDHOSTENT_R
# undef HAS_ENDNETENT_R
@@ -679,6 +690,13 @@
$w = ", $w" if length $v;
}
my $call = "${func}_r($v$w)";
+
+ # Must make OpenBSD happy
+ my $memzero = '';
+ if($p =~ /D$/ &&
+ ($genfunc eq 'protoent' || $genfunc eq 'servent')) {
+ $memzero = 'REENTR_MEMZERO(&PL_reentrant_buffer->_' . $genfunc . '_data, sizeof(PL_reentrant_buffer->_' . $genfunc . '_data))';
+ }
push @wrap, <<EOF;
# if !defined($func) && ${FUNC}_R_PROTO == REENTRANT_PROTO_$p
EOF
@@ -691,7 +709,7 @@
my $rv = $v ? ", $v" : "";
if ($r eq 'I') {
push @wrap, <<EOF;
-# define $func($v) ((PL_reentrant_retint = $call)$test ? $true : (((PL_reentrant_retint == ERANGE) || (errno == ERANGE)) ? ($seent{$func} *) Perl_reentrant_retry("$func"$rv) : 0))
+# define $func($v) ($memzero(PL_reentrant_retint = $call)$test ? $true : (((PL_reentrant_retint == ERANGE) || (errno == ERANGE)) ? ($seent{$func} *) Perl_reentrant_retry("$func"$rv) : 0))
EOF
} else {
push @wrap, <<EOF;
End of Patch.
-- END ----------------------------------------------------------------------------- Philip M. Gollucci Senior Developer - Liquidity Services Inc. Phone: 202.558.6268 (Direct) E-Mail: [EMAIL PROTECTED] Web: http://www.liquidation.com
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]
