#!/usr/bin/perl -w
use CGI;
$query=new CGI;
$nmax=15;
$book=$query->param('book');
if(!$book) {$book="gexpress"};
$book=~s/^.*\///o;
$fname="$book.dat";
$runmode=$query->param('runmode');
if($runmode eq "window") {
$query->param('runmode','write');
print $query->header;
print $query->start_html();
print $query->startform(-method=>'get');
print "Your email (or name):\n";
print $query->textfield('email');
print "
your Comments
\n";
print $query->textarea('text','',10,50);
print param2html();
print "
\n",$query->submit();
print $query->end_form();
print $query->end_html();
} elsif ($runmode eq "write") {
$q[0]=time();
$q[1]=$query->remote_host();
$q[2]=$query->param('email');
$q[2]=~s/\:/;/og;
$q[3]=$query->param('text');
$q[3]=~s/\\/\\\\/og;
$q[3]=~s/\r\n/\n/og;
$q[3]=~s/\r/\n/og;
$q[3]=~s/\n/\\n/og;
@inf=readfile ($fname);
if(length($q[2]) && length($q[3])) {
unshift @inf, [@q];
}
writefile($fname,@inf);
$query->delete('runmode');
$query->delete('text');
$query->delete('email');
print $query->redirect($query->self_url());
} else {
$query->param('runmode','window');
@inf=readfile ($fname);
$form=$query->startform(-method=>'get');
$form=$form.param2html().$query->submit().$query->end_form().$query->end_html();
print $query->header;
my $a,$b,$c;
if(open(TEMP,"$book.tmp")) {
($a,$b,$c)=split("",join("",),3);
close(TEMP);
} else {
$a='';
$b='%email%date
%text
';
$c='%form';
}
print concat($a,"","","",$form);
foreach $i (@inf) {
$lt=localtime(@$i[0]);
print concat($b,@$i[2],$lt,@$i[3],$form);
}
print concat($c,"","","",$form);
}
print "\n";
### SUBROUTINES
sub concat {
my ($a,$email,$date,$txt,$form)=@_;
$txt=~s/&/&/og;
$txt=~s/</og;
$txt=~s/>/>/og;
$txt=~s/([^\\])\\n/$1
/go;
$txt=~s/([^\\])\\n/$1
/go;
$txt=~s/\\\\/\\/og;
$a=~s/%book/$book/geo;
$a=~s/%email/$email/geo;
$a=~s/%text/$txt/geo;
$a=~s/%date/$date/geo;
$a=~s/%form/$form/geo;
$a=~s/%url/$query->self_url()/geo;
$a=~s/%query/$query->dump/geo;
$a=~s/%remote_host/$query->remote_host()/geo;
$a=~s/%user_agent/$query->user_agent/geo;
$a=~s/%referer/$query->referer()/geo;
return $a;
}
sub param2html {
my $a="";
foreach($query->param) {
$a=$a.$query->hidden($_);
}
return $a;
}
sub readfile {
my ($fname) = @_;
my (@inf);
if(open(INPUT,"$fname")) {
flock(INPUT, 1) || die "Locking (share) $fname: $!\n";
while() {
chomp;
push @inf,[split(":",$_,4)];
}
flock(INPUT,8);
close(INPUT);
} else {
# $inf[0]=["system",time(),"Error reading $fname: $!\n" ];
}
return @inf;
}
sub writefile {
my ($fname,@inf) = @_;
if(open(OUTPUT,">$fname")) {
if(!flock(OUTPUT,2)) {
my $myloc=$query->self_url();
print $query->header(-type=>"text/plain",-refresh=>"5; URL=$myloc");
print "Locking (exclusive) $fname: $!\n";
exit 0;
}
for($j=0;$j<=$#inf && $j<$nmax;$j++) {
$i=$inf[$j];
$a=join(":",@$i);
print OUTPUT "$a\n";
}
flock(OUTPUT,8);
close(OUTPUT);
} else {
$query->delete("runmode");
$query->delete("text");
$query->delete("email");
my $myloc=$query->self_url();
print $query->header(-type=>"text/plain",-refresh=>"5; URL=$myloc");
print "Error writing $fname: $!\n";
exit 0
}
}