#!/usr/bin/perl ############################################### # cnt11.cgi # V1.0 (2003.10.14) # Copyright(C) CGI-design ############################################### require './gifcat.pl'; $base = './cntdata'; #データ格納ディレクトリ $lockfile = "$base/lock"; #ロック ### @pair = split(/&/,$ENV{'QUERY_STRING'}); foreach (@pair) { ($n,$val) = split(/=/); $in{$n} = $val; } $id = $in{'id'}; $cnt = $in{'n'}; if (!$id) {$id = 'count';} $addr = $ENV{'REMOTE_ADDR'}; $cntfile = "$base/$id.txt"; if (-e $cntfile) { &lock; open IN,"$cntfile"; ($cnt,$paddr) = split(/<>/,); close IN; if ($addr ne $paddr) { $cnt++; open OUT,">$cntfile"; print OUT "$cnt<>$addr<>"; close OUT; } &unlock; } else {open OUT,">$cntfile"; print OUT "$cnt<>$addr<>"; close OUT; chmod(0666,$cntfile);} $size = length($cnt); if ($size < 4) {$cnt = sprintf("%04d",$cnt); $size = 4;} print "Content-type: image/gif\n\n"; foreach (0 .. $size-1) { $n = substr($cnt,$_,1); $n = "$base/$n.gif"; push (@img,$n); } binmode(STDOUT); print &gifcat'gifcat(@img); exit; ### sub lock { $retry = 3; if (-e $lockfile) { $locktime = (stat($lockfile))[9]; if ($locktime < time - 60) {&unlock;} } while (!mkdir($lockfile, 0755)) { if (--$retry < 0) {exit;} sleep(1); } } ### sub unlock {rmdir($lockfile);}