#!/usr/local/bin/perl
# Connect to a series of machine in an attempt to find someone to do TCP
#  pings off.
# Kees Cook 1996

@MACHINES=(
"locutus.cso.uiuc.edu");

if ($ARGV[0] =~ /^-v/i) {
	$verbose=1;
	shift @ARGV;
}
unshift(@MACHINES,@ARGV);
$delay=10;

sub Quit {
	&Close;
	print "$0: Quitting\n\r";
	exit;
}

sub Int {
	&Close;
	print "$0: Interrupted\n\r";
	exit;
}

sub Term {
	&Close;
	print "$0: Terminated\n\r";
	exit;
}

sub Close {
	print "Closing socket to $TO:$port...\n" if ($verbose);
	close(REMOTE) || warn "close($TO): $!";
}

sub Connect {
local($TO) = @_;

$AF_INET=2;
$SOCK_STREAM=1;
$sockaddr='S n a4 x8';

($name,$aliases,$proto)=getprotobyname('tcp');
($name,$aliases,$port)=getservbyname('echo','tcp');

$this=pack($sockaddr,$AF_INET,$port,"\0\0\0\0");

select(STDOUT);
$|=1;

chop($hostname = `hostname`);
($name,$aliases,$type,$len,$thisaddr)=gethostbyname($hostname);
($name,$aliases,$type,$len,$thataddr)=gethostbyname($TO);

$this = pack($sockaddr,$AF_INET,0,$thisaddr);
$that = pack($sockaddr, $AF_INET,$port,$thataddr);

undef $bad;
print "Creating socket to $TO:$port...\n" if ($verbose);
socket(REMOTE,$AF_INET,$SOCK_STREAM,$proto) || ($bad=1,warn "socket: $!");
$bad || bind(REMOTE,$this) || ($bad=1,warn "bind($hostname): $!");
$bad || connect(REMOTE,$that) || ($bad=1,warn "connect($TO): $!");

select(REMOTE);
$|=1;
select(STDOUT);

print "$0: Pinging $TO\n\r";
print REMOTE "Ping!\n";
print "Ping? " if ($verbose);
if (!$bad) {
while(<REMOTE>) {
	sleep $delay;
	print if ($verbose);
	print REMOTE "Ping!\n";
	print "Ping? " if ($verbose);
}
}

print "$0: $TO closed connection!\n\r";
&Close;
}

$SIG{'INT'}='Int';
$SIG{'QUIT'}='Quit';
$SIG{'TERM'}='Term';

for (;;) {
	foreach $machine (@MACHINES) {
		&Connect($machine);
	}
}
