#!/ext/user.local/computer/a61/perl/bin/perl
#******************** counter.pl ******************************************
# PODIUM Bureau voor educatieve communicatie
# Alexander Martens (6/6/1996)
# SVK-op Internet
#**************************************************************************
# counter.pl is een perl5 script gebruik makend van GD.pm voor het tonen
# van het aantal bezoekers van de home-page
# in data directory (cgi-bin/data) worden de gegevens in de file count.txt
# opgeslagen. Het programma maakt gebruik van file-locking middels flock.
# Er wordt mbv GD.pm een gif-plaatje gegenereerd dat naar de standaard output
# wordt gezonden.
# voor het gebruik in html kan de volgende regel opgenomen worden
#
# bijzonderheden:
# - er wordt van een vast aantal digits uitgegaan, de achtergrond is
# - transparant.
use GD;
# flush de i/o buffer meteen
$| = 1;
#$exclusive_lock = 2;
#$unlock_lock = 8;
$counter_file = "/cp/htdocs/Netherlands/pavilions/techno/svk/write/count.txt";
$no_visitors = 1;
if (! (-e "/cp/htdocs/cgi-bin/Netherlands/svk/LOCAL"))
{
$lock = 1;
}
else
{
$lock = 0;
}
# kijk eerst of er uberhaupt al een counter-file is
if (! (-e $counter_file))
{
# nee, dus maak een nieuwe die start op 1
if (open (COUNTER, ">" . $counter_file))
{
if ($lock)
{
flock (COUNTER, $exclusive_lock);
}
print COUNTER $no_visitors;
if ($lock)
{
flock (COUNTER, $unlock_lock);
}
close (COUNTER);
}
else
{
&return_error (500, "Counter Error", "Cannot create file");
}
}
else
{
# er is al een counter-file dus probeer te openen, en op te hogen
if (! ((-r $counter_file) && (-w $counter_file)) )
{
print "Geen lezen mogelijk\n";
&return_error (500, "Counter Error", "Cannot read or write ");
}
else
{
open (COUNTER, "<" . $counter_file);
if ($lock)
{
flock (COUNTER, $exclusive_lock);
}
$no_visitors = ;
if ($lock)
{
flock (COUNTER, $unlock_lock);
}
close (COUNTER);
$no_visitors++;
open (COUNTER, ">" . $counter_file);
if ($lock)
{
flock (COUNTER, $exclusive_lock);
}
print COUNTER $no_visitors;
if ($lock)
{
flock (COUNTER, $unlock_lock);
}
close (COUNTER);
}
}
# maak nu het gif-plaatje
&graphic_counter();
exit(0);
sub return_error
{
# geef een foutmelding terug
local ($status, $keyword, $message) = @_;
print "Content-type: text/html", "\n";
print "Status: ", $Status, " ", $keyword, $keyword,"\n\n";
exit(1);
}
sub graphic_counter
{
local ($count_length, $font_length, $font_height, $distance,
$image_length, $image_height, $image, $background, $digitcolor,
$loop, $number, $temp_x, $tot_length);
$tot_length = 6;
$count_length = length ($no_visitors);
$font_length = 8;
$font_height = 16;
$distance = 3;
# bereken de 'grootte' v/h plaatje
$image_length = ($tot_length * $font_length) +
(($tot_length - 1) * $distance) ;
$image_height = $font_height;
# initialiseer het plaatje
$image = new GD::Image ($image_length, $image_height);
# ken de kleuren toe
$background = $image->colorAllocate (255, 255, 255);
$digitcolor = $image->colorAllocate (0, 0, 0);
# zorg nu voor transparant en interlaced
$image->transparent($background);
$image->interlaced('true');
# toon nu elke keer een karakter
$temp_x = $tot_length - $count_length;
for ($loop = 0; $loop <= ($count_length - 1); $loop++)
{
$number = substr ($no_visitors, $loop, 1);
$image->char (gdLargeFont, ($font_length * ($loop + $temp_x)) +
(($loop + $temp_x) * $distance), 0, $number, $digitcolor );
}
print "Content-type: image/gif", "\n\n";
print $image->gif;
}