Re: Making IO::Socket pass test on Win32
[p5sagit/p5-mst-13.2.git] / ext / IO / t / io_multihomed.t
CommitLineData
cf7fe8a2 1#!./perl
2
3BEGIN {
4 unless(grep /blib/, @INC) {
5 chdir 't' if -d 't';
20822f61 6 @INC = '../lib';
cf7fe8a2 7 }
8}
9
10use Config;
11
12BEGIN {
90b9a713 13 my $reason;
14 if ($ENV{PERL_CORE} and $Config{'extensions'} !~ /\bSocket\b/) {
15 $reason = 'Socket extension unavailable';
16 }
17 elsif ($ENV{PERL_CORE} and $Config{'extensions'} !~ /\bIO\b/) {
18 $reason = 'IO extension unavailable';
19 }
2f78ce11 20 elsif (
21 ! eval {
22 my $pid= fork();
23 ! defined($pid) and die "Fork failed!";
24 ! $pid and exit;
25 defined waitpid($pid, 0);
26 }
27 ) {
28 $reason = "no fork: $@";
90b9a713 29 }
30 if ($reason) {
31 print "1..0 # Skip: $reason\n";
32 exit 0;
cf7fe8a2 33 }
34}
35
36$| = 1;
37
38print "1..8\n";
39
560d348b 40eval {
41 $SIG{ALRM} = sub { die; };
42 alarm 60;
43};
cf7fe8a2 44
45package Multi;
46require IO::Socket::INET;
47@ISA=qw(IO::Socket::INET);
48
49use Socket qw(inet_aton inet_ntoa unpack_sockaddr_in);
50
51sub _get_addr
52{
53 my($sock,$addr_str, $multi) = @_;
54 #print "_get_addr($sock, $addr_str, $multi)\n";
55
56 print "not " unless $multi;
57 print "ok 2\n";
58
59 (
60 # private IP-addresses which I hope does not work anywhere :-)
61 inet_aton("10.250.230.10"),
62 inet_aton("10.250.230.12"),
63 inet_aton("127.0.0.1") # loopback
64 )
65}
66
67sub connect
68{
69 my $self = shift;
70 if (@_ == 1) {
71 my($port, $addr) = unpack_sockaddr_in($_[0]);
72 $addr = inet_ntoa($addr);
73 #print "connect($self, $port, $addr)\n";
362d283a 74 if($addr eq "10.250.230.10") {
75 print "ok 3\n";
76 return 0;
77 }
78 if($addr eq "10.250.230.12") {
79 print "ok 4\n";
80 return 0;
81 }
cf7fe8a2 82 }
83 $self->SUPER::connect(@_);
84}
85
86
87
88package main;
89
90use IO::Socket;
91
92$listen = IO::Socket::INET->new(Listen => 2,
93 Proto => 'tcp',
94 Timeout => 5,
95 ) or die "$!";
96
97print "ok 1\n";
98
99$port = $listen->sockport;
100
101if($pid = fork()) {
102
103 $sock = $listen->accept() or die "$!";
104 print "ok 5\n";
105
106 print $sock->getline();
107 print $sock "ok 7\n";
108
109 waitpid($pid,0);
110
111 $sock->close;
112
113 print "ok 8\n";
114
115} elsif(defined $pid) {
116
117 $sock = Multi->new(PeerPort => $port,
118 Proto => 'tcp',
119 PeerAddr => 'localhost',
120 MultiHomed => 1,
121 Timeout => 1,
122 ) or die "$!";
123
124 print $sock "ok 6\n";
125 sleep(1); # race condition
126 print $sock->getline();
127
128 $sock->close;
129
130 exit;
131} else {
132 die;
133}