Skip to content

Commit

Permalink
Support gcc-4.x on HP-UX PA-RISC/64
Browse files Browse the repository at this point in the history
Correct the socketsize. Probably due to big-endian versus
little-endian, this has always worked on Intel CPUs. This
is a very very old problem,  and it has been the reason I
never used gcc-4 on PA-RISC,  because perl would not pass
the test suite in 64bitall.

Noticeable effects of wrong "$socksizetype" are return codes
of 0 (pass) from functions like getpeername (),  but invalid
(or none) data in the returned structures or a return length
of 0 or 256. In the latter case, the length is stored in the
second part of the 64bit long and the 32bit first part is 0.
This might be true on Intel-like machines too, but the tests
will pass, as the significant part of the returned length is
in the first 32bits and a pointer to int will still see that
correct.  Mind that in that case the 32bits after that might
have been overridden => can of worms.
  • Loading branch information
H.Merijn Brand committed Aug 4, 2011
1 parent 4eb81ef commit 9cfd094
Show file tree
Hide file tree
Showing 3 changed files with 29 additions and 4 deletions.
14 changes: 10 additions & 4 deletions ext/Socket/t/getaddrinfo.t
@@ -1,6 +1,6 @@
use strict;
use warnings;
use Test::More tests => 29;
use Test::More tests => 30;

use Socket qw(
AI_NUMERICHOST AF_INET SOCK_STREAM IPPROTO_TCP
Expand All @@ -21,9 +21,15 @@ is( $res[0]->{socktype}, SOCK_STREAM,
'$res[0] socktype is SOCK_STREAM' );
ok( $res[0]->{protocol} == 0 || $res[0]->{protocol} == IPPROTO_TCP,
'$res[0] protocol is 0 or IPPROTO_TCP' );
is_deeply( [ unpack_sockaddr_in $res[0]->{addr} ],
[ 80, inet_aton( "127.0.0.1" ) ],
'$res[0] addr is {"127.0.0.1", 80}' );
ok( defined $res[0]->{addr},
'$res[0] addr is defined' );
if (length $res[0]->{addr}) {
is_deeply( [ unpack_sockaddr_in $res[0]->{addr} ],
[ 80, inet_aton( "127.0.0.1" ) ],
'$res[0] addr is {"127.0.0.1", 80}' );
} else {
fail( '$res[0] addr is empty: check $socksizetype' );
}

# Check actual IV integers work just as well as PV strings
( $err, @res ) = getaddrinfo( "127.0.0.1", 80, { socktype => SOCK_STREAM } );
Expand Down
10 changes: 10 additions & 0 deletions hints/hpux.sh
Expand Up @@ -263,6 +263,16 @@ EOM
case "$ccisgcc" in
$define|true|[Yy])
# The fixed socket.h header file is wrong for gcc-4.x
# on PA-RISC2.0W, so Sock_type_t is size_t which is
# unsigned long which is 64bit which is too long
case "$gccversion" in
4*) case "$archname" in
PA-RISC*) socksizetype=int ;;
esac
;;
esac
# For the moment, don't care that it ain't supported (yet)
# by gcc (up to and including 2.95.3), cause it'll crash
# anyway. Expect auto-detection of 64-bit enabled gcc on
Expand Down
9 changes: 9 additions & 0 deletions pod/perldelta.pod
Expand Up @@ -339,6 +339,15 @@ XXX Any changes to platform support should be listed in the sections below.
[ Within the sections, list each platform as a =item entry with specific
changes as paragraphs below it. ]

=over 4

=item HP-UX PA-RISC/64 now supports gcc-4.x

A fix to correct the socketsize now makes the test suite pass on HP-UX
PA-RISC for 64bitall builds.

=back

=head2 New Platforms

XXX List any platforms that this version of perl compiles on, that previous
Expand Down

0 comments on commit 9cfd094

Please sign in to comment.