#!/usr/bin/perl -w use CGI; $query=new CGI; $nmax=15; $book=$query->param('book'); if(!$book) {$book="raamat"}; $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/([^\\])\\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 } }