Commit | Line | Data |
---|---|---|
50f6e060 KS |
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 | ||
0d975196 MB |
7 | BEGIN { |
8 | chdir 't' if -d 't'; | |
20822f61 | 9 | @INC = '../lib'; |
0d975196 | 10 | } |
50f6e060 | 11 | |
50f6e060 KS |
12 | # All the constants which Socket.pm tries to make available: |
13 | my @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: | |
29 | my @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: | |
33 | my %ok_to_miss = ( | |
34 | INADDR_NONE => 1, | |
35 | INADDR_LOOPBACK => 1, | |
36 | ); | |
37 | ||
38 | ||
39 | my $total_tests = scalar @libs + scalar @possibly_defined; | |
40 | my $i = 0; | |
41 | ||
42 | print "1..$total_tests\n"; | |
43 | ||
44 | ||
45 | foreach (@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 | ||
58 | foreach (@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 |