#/usr/local/bin/perl
#
# A very simple gopher client in Perl 4.036
#
require "chat2.pl";
require "win.pl";
$args = "gocamel feenix.metronet.com 70 1/perlinfo";
$pager = "/usr/local/bin/less";
$mailer = "/usr/local/bin/mush -h";
$title =" GOCAMEL: A perl script delivery tool",
$footer =
"Enter Item Number or : f - forward page b - back page q - quit u - up";
($junk, $host, $port, $path) = split(' ',$args);
# get initial menu , start recursion
&get_selection($host,$path,$port,$title,$footer);
print "\e"."["."2"."J"; # clean up
print "\e"."["."0"."m"; # restore good mode
##############################################################################
sub send_request{
local($path, $port,$host) = @_;
local($line,$i) = (1,0);
local(@page);
$timeout = 2;
local($N) = &chat'open_port($host,$port);
if(!defined $N){ die "open control: $!";}
&chat'print($N,"$path\r\n");
while(1){ #While receiving data
$line = &chat'expect($N, $timeout, '^(.*)\r?\n', '"$1"' );
last if ($line =~ /^[\.]/);
$page[$i++] = $line;
}
&chat'close($N);
@page;
}
sub get_selection{
local($host,$path,$port,$title,$footer) = @_;
local($line,$selection,$i,$j,$b,$cur,@A,@types,@text,@paths,@hosts,@ports);
local(@cur_types,@cur_text,@cur_paths,@cur_hosts,@cur_ports,@tmpfile);
local(@win1)=(0,21,79,1,0,7,$title,$footer);
print "\e"."["."2"."J";
&win'title(@win1);
&win'footer(@win1);
local(@buffer) = &send_request($path, $port, $host);
foreach $b (@buffer){
if($j==19){$j=0;$i++;}
@A = split(/\t/,$b);
$A[0] =~ s/^[0-9]// && ( $types[$i] = $1);
$types[$i].=" #"; $text[$i].=($j+1)."> "."$A[0]#";
$paths[$i].="$A[1]#"; $hosts[$i].="$A[2]#";$ports[$i].="$A[3]#";
$j++;
}
while($j<19){
$types[$i].=" #"; $text[$i].=" #";
$paths[$i].=" #"; $hosts[$i].=" #";$ports[$i].=" #";
$j++;
}
$cur=0;
while($selection ne "q"){
@cur_text = split(/#/,$text[$cur]);
&win'refresh(scalar(@cur_text),@cur_text,scalar(@win1),@win1);
chop($selection=&win'getdata(10,23,"Enter Your Selection > ",7));
if( $selection =~ /^[fF]/){
if($cur < $i) {$cur++;next;}
}
elsif ($selection =~ /^[bB]/){
if($cur > 0) {$cur--;next;}
}
elsif ($selection =~ /^[uU]/){
return;
}
elsif (($selection < 20) && ($selection > 0)){
$selection--;
@cur_hosts=split(/#/,$hosts[$cur]); @cur_paths=split(/#/,$paths[$cur]);
@cur_ports=split(/#/,$ports[$cur]); @cur_types=split(/#/,$types[$cur]);
if(($cur_paths[$selection] =~ /^1/) || ($cur_paths[$selection] =~ /^ftp/)){
&get_selection($cur_hosts[$selection],$cur_paths[$selection],
$cur_ports[$selection],$cur_text[$selection],$footer);
print "\e"."["."2"."J";
&win'title(@win1);
&win'footer(@win1);
next;
}
elsif($cur_paths[$selection] =~ /^7/){
chop($keyword =&win'getdata(10,23,"Keyword to search for? > ",7));
if(length($keyword) < 1){
&win'getdata(10,23,"Bad Keyword, hit Return > ",7);
next;
}
&get_selection($cur_hosts[$selection],$cur_paths[$selection]."\t".$keyword,
$cur_ports[$selection],$cur_text[$selection],$footer);
print "\e"."["."2"."J";
&win'title(@win1);
&win'footer(@win1);
next;
}
elsif($cur_types[$selection] == 0 || $cur_paths[$selection] =~ /^.*0\//){
$cur_paths =~ s#^.*/##;
@tmpfile = &send_request($cur_paths[$selection], $cur_ports[$selection],
$cur_hosts[$selection]);
open(LOOKATME,">/tmp/gocam$$")||die "couldnt open that file, dude(ette)";
foreach $line (@tmpfile){
print LOOKATME $line;
print LOOKATME "\n";
}
close LOOKATME;
system "clear";
system "$pager /tmp/gocam$$";
print "\e"."["."2"."J";
chop($keyword =&win'getdata(10,23,
"s to save, m to mail, or anything else to continue > ",7));
if($keyword eq "m"){
system "$mailer /tmp/gocam$$";
system "rm -f /tmp/gocam$$";
print "\e"."["."2"."J";
&win'title(@win1);
&win'footer(@win1);
next;}
elsif($keyword eq "s"){
print "\e"."["."2"."J";
chop($keyword =&win'getdata(11,23,
"Enter name of file to save to > ",7));
if (length($keyword)<2){print "error there, bud"; next;}
system "mv /tmp/gocam$$ $ENV{'HOME'}/$keyword";
&win'title(@win1);
&win'footer(@win1);
next;
}
else{
system "rm -f /tmp/gocam$$";
print "\e"."["."2"."J";
&win'title(@win1);
&win'footer(@win1);
next;
}
}
else{print" Not implemented, sorry bout that"; next;}
}
else{next;}
}
print "\e"."["."2"."J";
exit 0;
}