This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Resync with mainline
[perl5.git] / t / lib / io_multihomed.t
CommitLineData
cf7fe8a2
GS
1#!./perl
2
3BEGIN {
4 unless(grep /blib/, @INC) {
5 chdir 't' if -d 't';
93430cb4 6 unshift @INC, '../lib' if -d '../lib';
cf7fe8a2
GS
7 }
8}
9
10use Config;
11
12BEGIN {
13 if(-d "lib" && -f "TEST") {
45c0de28
GS
14 my $reason;
15 if (! $Config{'d_fork'}) {
16 $reason = 'no fork';
17 }
18 elsif ($Config{'extensions'} !~ /\bSocket\b/) {
19 $reason = 'Socket extension unavailable';
20 }
21 elsif ($Config{'extensions'} !~ /\bIO\b/) {
22 $reason = 'IO extension unavailable';
23 }
45c0de28
GS
24 if ($reason) {
25 print "1..0 # Skip: $reason\n";
cf7fe8a2
GS
26 exit 0;
27 }
28 }
29}
30
31$| = 1;
32
33print "1..8\n";
34
35
36package Multi;
37require IO::Socket::INET;
38@ISA=qw(IO::Socket::INET);
39
40use Socket qw(inet_aton inet_ntoa unpack_sockaddr_in);
41
42sub _get_addr
43{
44 my($sock,$addr_str, $multi) = @_;
45 #print "_get_addr($sock, $addr_str, $multi)\n";
46
47 print "not " unless $multi;
48 print "ok 2\n";
49
50 (
51 # private IP-addresses which I hope does not work anywhere :-)
52 inet_aton("10.250.230.10"),
53 inet_aton("10.250.230.12"),
54 inet_aton("127.0.0.1") # loopback
55 )
56}
57
58sub connect
59{
60 my $self = shift;
61 if (@_ == 1) {
62 my($port, $addr) = unpack_sockaddr_in($_[0]);
63 $addr = inet_ntoa($addr);
64 #print "connect($self, $port, $addr)\n";
362d283a
GB
65 if($addr eq "10.250.230.10") {
66 print "ok 3\n";
67 return 0;
68 }
69 if($addr eq "10.250.230.12") {
70 print "ok 4\n";
71 return 0;
72 }
cf7fe8a2
GS
73 }
74 $self->SUPER::connect(@_);
75}
76
77
78
79package main;
80
81use IO::Socket;
82
83$listen = IO::Socket::INET->new(Listen => 2,
84 Proto => 'tcp',
85 Timeout => 5,
86 ) or die "$!";
87
88print "ok 1\n";
89
90$port = $listen->sockport;
91
92if($pid = fork()) {
93
94 $sock = $listen->accept() or die "$!";
95 print "ok 5\n";
96
97 print $sock->getline();
98 print $sock "ok 7\n";
99
100 waitpid($pid,0);
101
102 $sock->close;
103
104 print "ok 8\n";
105
106} elsif(defined $pid) {
107
108 $sock = Multi->new(PeerPort => $port,
109 Proto => 'tcp',
110 PeerAddr => 'localhost',
111 MultiHomed => 1,
112 Timeout => 1,
113 ) or die "$!";
114
115 print $sock "ok 6\n";
116 sleep(1); # race condition
117 print $sock->getline();
118
119 $sock->close;
120
121 exit;
122} else {
123 die;
124}