Commit | Line | Data |
---|---|---|
37120919 AD |
1 | #!./perl |
2 | ||
8bb05de3 N |
3 | use v5.6.1; |
4 | use strict; | |
5 | use warnings; | |
6 | ||
7 | our %Config; | |
8 | my $has_alarm; | |
37120919 | 9 | BEGIN { |
37120919 | 10 | require Config; import Config; |
c2654555 | 11 | if ($Config{'extensions'} !~ /\bSocket\b/ && |
3149255e | 12 | !(($^O eq 'VMS') && $Config{d_socket})) { |
1004cf1c SH |
13 | print "1..0\n"; |
14 | exit 0; | |
37120919 | 15 | } |
ae054b0e | 16 | $has_alarm = $Config{d_alarm}; |
37120919 | 17 | } |
1004cf1c | 18 | |
38f5dce2 | 19 | use Socket qw(:all); |
eabcd9c8 | 20 | use Test::More tests => 6; |
37120919 | 21 | |
8bb05de3 N |
22 | my $has_echo = $^O ne 'MSWin32'; |
23 | my $alarmed = 0; | |
ae054b0e JH |
24 | sub arm { $alarmed = 0; alarm(shift) if $has_alarm } |
25 | sub alarmed { $alarmed = 1 } | |
26 | $SIG{ALRM} = 'alarmed' if $has_alarm; | |
27 | ||
bd71e0a1 PE |
28 | SKIP: { |
29 | unless(socket(T, PF_INET, SOCK_STREAM, IPPROTO_TCP)) { | |
1004cf1c | 30 | skip "No PF_INET", 3; |
bd71e0a1 PE |
31 | } |
32 | ||
33 | pass "socket(PF_INET)"; | |
34 | ||
35 | arm(5); | |
36 | my $host = $^O eq 'MacOS' || ($^O eq 'irix' && $Config{osvers} == 5) ? | |
1004cf1c | 37 | '127.0.0.1' : 'localhost'; |
bd71e0a1 PE |
38 | my $localhost = inet_aton($host); |
39 | ||
40 | SKIP: { | |
1004cf1c SH |
41 | unless($has_echo && defined $localhost && connect(T,pack_sockaddr_in(7,$localhost))) { |
42 | skip "Unable to connect to localhost:7", 2; | |
43 | } | |
ef5a6dd7 | 44 | |
1004cf1c | 45 | arm(0); |
ae054b0e | 46 | |
1004cf1c | 47 | pass "PF_INET echo localhost connected"; |
37120919 | 48 | |
1004cf1c SH |
49 | diag "Connected to " . |
50 | inet_ntoa((unpack_sockaddr_in(getpeername(T)))[1])."\n"; | |
37120919 | 51 | |
1004cf1c SH |
52 | arm(5); |
53 | syswrite(T,"hello",5); | |
54 | arm(0); | |
ae054b0e | 55 | |
1004cf1c SH |
56 | arm(5); |
57 | my $buff; | |
58 | my $read = sysread(T,$buff,10); # Connection may be granted, then closed! | |
59 | arm(0); | |
ae054b0e | 60 | |
1004cf1c SH |
61 | while ($read > 0 && length($buff) < 5) { |
62 | # adjust for fact that TCP doesn't guarantee size of reads/writes | |
63 | arm(5); | |
64 | $read = sysread(T,$buff,10,length($buff)); | |
65 | arm(0); | |
66 | } | |
bd71e0a1 | 67 | |
1004cf1c | 68 | ok(($read == 0 || $buff eq "hello"), "PF_INET echo localhost reply"); |
bd71e0a1 | 69 | } |
37120919 AD |
70 | } |
71 | ||
bd71e0a1 PE |
72 | SKIP: { |
73 | unless(socket(S, PF_INET, SOCK_STREAM, IPPROTO_TCP)) { | |
1004cf1c | 74 | skip "No PF_INET", 3; |
bd71e0a1 PE |
75 | } |
76 | ||
77 | pass "socket(PF_INET)"; | |
78 | ||
79 | SKIP: { | |
1004cf1c SH |
80 | arm(5); |
81 | unless($has_echo && connect(S,pack_sockaddr_in(7,INADDR_LOOPBACK))) { | |
82 | skip "Unable to connect to localhost:7", 2; | |
83 | } | |
37120919 | 84 | |
ae054b0e JH |
85 | arm(0); |
86 | ||
1004cf1c | 87 | pass "PF_INET echo INADDR_LOOPBACK connected"; |
37120919 | 88 | |
1004cf1c SH |
89 | diag "Connected to " . |
90 | inet_ntoa((unpack_sockaddr_in(getpeername(S)))[1])."\n"; | |
37120919 | 91 | |
1004cf1c SH |
92 | arm(5); |
93 | syswrite(S,"olleh",5); | |
94 | arm(0); | |
ae054b0e | 95 | |
1004cf1c SH |
96 | arm(5); |
97 | my $buff; | |
98 | my $read = sysread(S,$buff,10); # Connection may be granted, then closed! | |
99 | arm(0); | |
ae054b0e | 100 | |
1004cf1c SH |
101 | while ($read > 0 && length($buff) < 5) { |
102 | # adjust for fact that TCP doesn't guarantee size of reads/writes | |
103 | arm(5); | |
104 | $read = sysread(S,$buff,10,length($buff)); | |
105 | arm(0); | |
106 | } | |
bd71e0a1 | 107 | |
1004cf1c | 108 | ok(($read == 0 || $buff eq "olleh"), "PF_INET echo INADDR_LOOPBACK reply"); |
bd71e0a1 | 109 | } |
37120919 | 110 | } |