|
Packit |
3de91b |
#!./perl
|
|
Packit |
3de91b |
|
|
Packit |
3de91b |
BEGIN {
|
|
Packit |
3de91b |
require Config; import Config;
|
|
Packit |
3de91b |
if ($Config{'extensions'} !~ /\bSocket\b/ &&
|
|
Packit |
3de91b |
!(($^O eq 'VMS') && $Config{d_socket})) {
|
|
Packit |
3de91b |
print "1..0\n";
|
|
Packit |
3de91b |
exit 0;
|
|
Packit |
3de91b |
}
|
|
Packit |
3de91b |
$has_alarm = $Config{d_alarm};
|
|
Packit |
3de91b |
}
|
|
Packit |
3de91b |
|
|
Packit |
3de91b |
use Socket qw(:all);
|
|
Packit |
3de91b |
use Test::More tests => 6;
|
|
Packit |
3de91b |
|
|
Packit |
3de91b |
$has_echo = $^O ne 'MSWin32';
|
|
Packit |
3de91b |
$alarmed = 0;
|
|
Packit |
3de91b |
sub arm { $alarmed = 0; alarm(shift) if $has_alarm }
|
|
Packit |
3de91b |
sub alarmed { $alarmed = 1 }
|
|
Packit |
3de91b |
$SIG{ALRM} = 'alarmed' if $has_alarm;
|
|
Packit |
3de91b |
|
|
Packit |
3de91b |
SKIP: {
|
|
Packit |
3de91b |
unless(socket(T, PF_INET, SOCK_STREAM, IPPROTO_TCP)) {
|
|
Packit |
3de91b |
skip "No PF_INET", 3;
|
|
Packit |
3de91b |
}
|
|
Packit |
3de91b |
|
|
Packit |
3de91b |
pass "socket(PF_INET)";
|
|
Packit |
3de91b |
|
|
Packit |
3de91b |
arm(5);
|
|
Packit |
3de91b |
my $host = $^O eq 'MacOS' || ($^O eq 'irix' && $Config{osvers} == 5) ?
|
|
Packit |
3de91b |
'127.0.0.1' : 'localhost';
|
|
Packit |
3de91b |
my $localhost = inet_aton($host);
|
|
Packit |
3de91b |
|
|
Packit |
3de91b |
SKIP: {
|
|
Packit |
3de91b |
unless($has_echo && defined $localhost && connect(T,pack_sockaddr_in(7,$localhost))) {
|
|
Packit |
3de91b |
skip "Unable to connect to localhost:7", 2;
|
|
Packit |
3de91b |
}
|
|
Packit |
3de91b |
|
|
Packit |
3de91b |
arm(0);
|
|
Packit |
3de91b |
|
|
Packit |
3de91b |
pass "PF_INET echo localhost connected";
|
|
Packit |
3de91b |
|
|
Packit |
3de91b |
diag "Connected to " .
|
|
Packit |
3de91b |
inet_ntoa((unpack_sockaddr_in(getpeername(T)))[1])."\n";
|
|
Packit |
3de91b |
|
|
Packit |
3de91b |
arm(5);
|
|
Packit |
3de91b |
syswrite(T,"hello",5);
|
|
Packit |
3de91b |
arm(0);
|
|
Packit |
3de91b |
|
|
Packit |
3de91b |
arm(5);
|
|
Packit |
3de91b |
$read = sysread(T,$buff,10); # Connection may be granted, then closed!
|
|
Packit |
3de91b |
arm(0);
|
|
Packit |
3de91b |
|
|
Packit |
3de91b |
while ($read > 0 && length($buff) < 5) {
|
|
Packit |
3de91b |
# adjust for fact that TCP doesn't guarantee size of reads/writes
|
|
Packit |
3de91b |
arm(5);
|
|
Packit |
3de91b |
$read = sysread(T,$buff,10,length($buff));
|
|
Packit |
3de91b |
arm(0);
|
|
Packit |
3de91b |
}
|
|
Packit |
3de91b |
|
|
Packit |
3de91b |
ok(($read == 0 || $buff eq "hello"), "PF_INET echo localhost reply");
|
|
Packit |
3de91b |
}
|
|
Packit |
3de91b |
}
|
|
Packit |
3de91b |
|
|
Packit |
3de91b |
SKIP: {
|
|
Packit |
3de91b |
unless(socket(S, PF_INET, SOCK_STREAM, IPPROTO_TCP)) {
|
|
Packit |
3de91b |
skip "No PF_INET", 3;
|
|
Packit |
3de91b |
}
|
|
Packit |
3de91b |
|
|
Packit |
3de91b |
pass "socket(PF_INET)";
|
|
Packit |
3de91b |
|
|
Packit |
3de91b |
SKIP: {
|
|
Packit |
3de91b |
arm(5);
|
|
Packit |
3de91b |
unless($has_echo && connect(S,pack_sockaddr_in(7,INADDR_LOOPBACK))) {
|
|
Packit |
3de91b |
skip "Unable to connect to localhost:7", 2;
|
|
Packit |
3de91b |
}
|
|
Packit |
3de91b |
|
|
Packit |
3de91b |
arm(0);
|
|
Packit |
3de91b |
|
|
Packit |
3de91b |
pass "PF_INET echo INADDR_LOOPBACK connected";
|
|
Packit |
3de91b |
|
|
Packit |
3de91b |
diag "Connected to " .
|
|
Packit |
3de91b |
inet_ntoa((unpack_sockaddr_in(getpeername(S)))[1])."\n";
|
|
Packit |
3de91b |
|
|
Packit |
3de91b |
arm(5);
|
|
Packit |
3de91b |
syswrite(S,"olleh",5);
|
|
Packit |
3de91b |
arm(0);
|
|
Packit |
3de91b |
|
|
Packit |
3de91b |
arm(5);
|
|
Packit |
3de91b |
$read = sysread(S,$buff,10); # Connection may be granted, then closed!
|
|
Packit |
3de91b |
arm(0);
|
|
Packit |
3de91b |
|
|
Packit |
3de91b |
while ($read > 0 && length($buff) < 5) {
|
|
Packit |
3de91b |
# adjust for fact that TCP doesn't guarantee size of reads/writes
|
|
Packit |
3de91b |
arm(5);
|
|
Packit |
3de91b |
$read = sysread(S,$buff,10,length($buff));
|
|
Packit |
3de91b |
arm(0);
|
|
Packit |
3de91b |
}
|
|
Packit |
3de91b |
|
|
Packit |
3de91b |
ok(($read == 0 || $buff eq "olleh"), "PF_INET echo INADDR_LOOPBACK reply");
|
|
Packit |
3de91b |
}
|
|
Packit |
3de91b |
}
|