xref: /onnv-gate/usr/src/cmd/perl/5.8.4/distrib/lib/ph.t (revision 0:68f95e015346)
1#!./perl
2
3# Check for presence and correctness of .ph files; for now,
4# just socket.ph and pals.
5#   -- Kurt Starsinic <kstar@isinet.com>
6
7BEGIN {
8    chdir 't' if -d 't';
9    @INC = '../lib';
10}
11
12# All the constants which Socket.pm tries to make available:
13my @possibly_defined = qw(
14    INADDR_ANY INADDR_LOOPBACK INADDR_NONE AF_802 AF_APPLETALK AF_CCITT
15    AF_CHAOS AF_DATAKIT AF_DECnet AF_DLI AF_ECMA AF_GOSIP AF_HYLINK AF_IMPLINK
16    AF_INET AF_LAT AF_MAX AF_NBS AF_NIT AF_NS AF_OSI AF_OSINET AF_PUP
17    AF_SNA AF_UNIX AF_UNSPEC AF_X25 MSG_DONTROUTE MSG_MAXIOVLEN MSG_OOB
18    MSG_PEEK PF_802 PF_APPLETALK PF_CCITT PF_CHAOS PF_DATAKIT PF_DECnet PF_DLI
19    PF_ECMA PF_GOSIP PF_HYLINK PF_IMPLINK PF_INET PF_LAT PF_MAX PF_NBS PF_NIT
20    PF_NS PF_OSI PF_OSINET PF_PUP PF_SNA PF_UNIX PF_UNSPEC PF_X25 SOCK_DGRAM
21    SOCK_RAW SOCK_RDM SOCK_SEQPACKET SOCK_STREAM SOL_SOCKET SOMAXCONN
22    SO_ACCEPTCONN SO_BROADCAST SO_DEBUG SO_DONTLINGER SO_DONTROUTE SO_ERROR
23    SO_KEEPALIVE SO_LINGER SO_OOBINLINE SO_RCVBUF SO_RCVLOWAT SO_RCVTIMEO
24    SO_REUSEADDR SO_SNDBUF SO_SNDLOWAT SO_SNDTIMEO SO_TYPE SO_USELOOPBACK
25);
26
27
28# The libraries which I'm going to require:
29my @libs = qw(Socket "sys/types.ph" "sys/socket.ph" "netinet/in.ph");
30
31
32# These are defined by Socket.pm even if the C header files don't define them:
33my %ok_to_miss = (
34    INADDR_NONE         => 1,
35    INADDR_LOOPBACK     => 1,
36);
37
38
39my $total_tests = scalar @libs + scalar @possibly_defined;
40my $i           = 0;
41
42print "1..$total_tests\n";
43
44
45foreach (@libs) {
46    $i++;
47
48    if (eval "require $_" ) {
49        print "ok $i\n";
50    } else {
51        print "# Skipping tests; $_ may be missing\n";
52        foreach ($i .. $total_tests) { print "ok $_\n" }
53        exit;
54    }
55}
56
57
58foreach (@possibly_defined) {
59    $i++;
60
61    $pm_val = eval "Socket::$_()";
62    $ph_val = eval "main::$_()";
63
64    if (defined $pm_val and !defined $ph_val) {
65        if ($ok_to_miss{$_}) { print "ok $i\n" }
66        else                 { print "not ok $i\n" }
67        next;
68    } elsif (defined $ph_val and !defined $pm_val) {
69        print "not ok $i\n";
70        next;
71    }
72
73    # Socket.pm converts these to network byte order, so we convert the
74    # socket.ph version to match; note that these cases skip the following
75    # `elsif', which is only applied to _numeric_ values, not literal
76    # bitmasks.
77    if ($_ eq 'INADDR_ANY'
78    or  $_ eq 'INADDR_LOOPBACK'
79    or  $_ eq 'INADDR_NONE') {
80        $ph_val = pack("N*", $ph_val);  # htonl(3) equivalent
81    }
82
83    # Since Socket.pm and socket.ph wave their hands over macros differently,
84    # they could return functionally equivalent bitmaps with different numeric
85    # interpretations (due to sign extension).  The only apparent case of this
86    # is SO_DONTLINGER (only on Solaris, and deprecated, at that):
87    elsif ($pm_val != $ph_val) {
88        $pm_val = oct(sprintf "0x%lx", $pm_val);
89        $ph_val = oct(sprintf "0x%lx", $ph_val);
90    }
91
92    if ($pm_val == $ph_val) { print "ok $i\n" }
93    else                    { print "not ok $i\n" }
94}
95
96
97