1N/A#!./perl
1N/A
1N/A# Check for presence and correctness of .ph files; for now,
1N/A# just socket.ph and pals.
1N/A# -- Kurt Starsinic <kstar@isinet.com>
1N/A
1N/ABEGIN {
1N/A chdir 't' if -d 't';
1N/A @INC = '../lib';
1N/A}
1N/A
1N/A# All the constants which Socket.pm tries to make available:
1N/Amy @possibly_defined = qw(
1N/A INADDR_ANY INADDR_LOOPBACK INADDR_NONE AF_802 AF_APPLETALK AF_CCITT
1N/A AF_CHAOS AF_DATAKIT AF_DECnet AF_DLI AF_ECMA AF_GOSIP AF_HYLINK AF_IMPLINK
1N/A AF_INET AF_LAT AF_MAX AF_NBS AF_NIT AF_NS AF_OSI AF_OSINET AF_PUP
1N/A AF_SNA AF_UNIX AF_UNSPEC AF_X25 MSG_DONTROUTE MSG_MAXIOVLEN MSG_OOB
1N/A MSG_PEEK PF_802 PF_APPLETALK PF_CCITT PF_CHAOS PF_DATAKIT PF_DECnet PF_DLI
1N/A PF_ECMA PF_GOSIP PF_HYLINK PF_IMPLINK PF_INET PF_LAT PF_MAX PF_NBS PF_NIT
1N/A PF_NS PF_OSI PF_OSINET PF_PUP PF_SNA PF_UNIX PF_UNSPEC PF_X25 SOCK_DGRAM
1N/A SOCK_RAW SOCK_RDM SOCK_SEQPACKET SOCK_STREAM SOL_SOCKET SOMAXCONN
1N/A SO_ACCEPTCONN SO_BROADCAST SO_DEBUG SO_DONTLINGER SO_DONTROUTE SO_ERROR
1N/A SO_KEEPALIVE SO_LINGER SO_OOBINLINE SO_RCVBUF SO_RCVLOWAT SO_RCVTIMEO
1N/A SO_REUSEADDR SO_SNDBUF SO_SNDLOWAT SO_SNDTIMEO SO_TYPE SO_USELOOPBACK
1N/A);
1N/A
1N/A
1N/A# The libraries which I'm going to require:
1N/Amy @libs = qw(Socket "sys/types.ph" "sys/socket.ph" "netinet/in.ph");
1N/A
1N/A
1N/A# These are defined by Socket.pm even if the C header files don't define them:
1N/Amy %ok_to_miss = (
1N/A INADDR_NONE => 1,
1N/A INADDR_LOOPBACK => 1,
1N/A);
1N/A
1N/A
1N/Amy $total_tests = scalar @libs + scalar @possibly_defined;
1N/Amy $i = 0;
1N/A
1N/Aprint "1..$total_tests\n";
1N/A
1N/A
1N/Aforeach (@libs) {
1N/A $i++;
1N/A
1N/A if (eval "require $_" ) {
1N/A print "ok $i\n";
1N/A } else {
1N/A print "# Skipping tests; $_ may be missing\n";
1N/A foreach ($i .. $total_tests) { print "ok $_\n" }
1N/A exit;
1N/A }
1N/A}
1N/A
1N/A
1N/Aforeach (@possibly_defined) {
1N/A $i++;
1N/A
1N/A $pm_val = eval "Socket::$_()";
1N/A $ph_val = eval "main::$_()";
1N/A
1N/A if (defined $pm_val and !defined $ph_val) {
1N/A if ($ok_to_miss{$_}) { print "ok $i\n" }
1N/A else { print "not ok $i\n" }
1N/A next;
1N/A } elsif (defined $ph_val and !defined $pm_val) {
1N/A print "not ok $i\n";
1N/A next;
1N/A }
1N/A
1N/A # Socket.pm converts these to network byte order, so we convert the
1N/A # socket.ph version to match; note that these cases skip the following
1N/A # `elsif', which is only applied to _numeric_ values, not literal
1N/A # bitmasks.
1N/A if ($_ eq 'INADDR_ANY'
1N/A or $_ eq 'INADDR_LOOPBACK'
1N/A or $_ eq 'INADDR_NONE') {
1N/A $ph_val = pack("N*", $ph_val); # htonl(3) equivalent
1N/A }
1N/A
1N/A # Since Socket.pm and socket.ph wave their hands over macros differently,
1N/A # they could return functionally equivalent bitmaps with different numeric
1N/A # interpretations (due to sign extension). The only apparent case of this
1N/A # is SO_DONTLINGER (only on Solaris, and deprecated, at that):
1N/A elsif ($pm_val != $ph_val) {
1N/A $pm_val = oct(sprintf "0x%lx", $pm_val);
1N/A $ph_val = oct(sprintf "0x%lx", $ph_val);
1N/A }
1N/A
1N/A if ($pm_val == $ph_val) { print "ok $i\n" }
1N/A else { print "not ok $i\n" }
1N/A}
1N/A
1N/A