#!/usr/local/bin/perl # ###################################################################### ### ### ### CGIカウンター簡易版 TcounT Lite Ver.2.01 ### [1/1] 本体 (tclite.cgi) ### (c) 1996-1999 Takahiro Nishida ### http://www.mytools.net/ ### ### ###################################################################### # ### 変数設定部 (詳細は上記ページをご覧下さい) ###################### $basedir = "."; ### 変数設定部 (ここまで)########################################### $lockfile="$basedir/lockdir/tc.lock"; $verno = "2.01"; require 'gifcat.pl'; &main; sub main{ &lock; &check_input; &show_counter; &unlock; } ##### 入力のチェック sub check_input{ @prm = split("&", $ENV{'QUERY_STRING'}); ($prm[0] =~ /^\w+$/) || &error("",3); ($prm[1] == 0) || ($prm[1]=1); ($prm[2] =~ /^\d+$/) || ($prm[2] = 5); ($prm[3] =~ /^\w+$/) || ($prm[3] = "img"); } ##### カウンタの表示 sub show_counter{ $cntfile="$basedir/data/$prm[0].txt"; (-f $cntfile) || &error($cntfile, 2); open(NUM,"$cntfile") || die &error($cntfile, 2); $cnt=; close(NUM); ($prm[1]) && ($cnt = &increase_count($prm[0], $cnt)); $cnt =~ s/\n//ig; &show_number_image($cnt, $prm[2], $prm[3]); } ##### カウントアップ sub increase_count{ local($file, $cntnow) = @_; $cntfile = "$basedir/data/$file.txt"; $cntnow++; open(NUM, ">$cntfile") || die &error($cntfile,1); print NUM $cntnow; close(NUM); $cntnow; } ##### 画像の出力 sub show_number_image{ local($cnt, $keta, $type) = @_; (-f "$basedir/$type/1.gif") || &error("$basedir/$type/1.gif",2); @nos=split("",$cnt); while(@nos<$keta){ unshift(@nos, "0"); } for(0..$#nos){ $nos[$_]="$basedir/$type/$nos[$_].gif"; } print "Content-type: image/gif\n\n"; binmode(STDOUT); $| = 1; print &gifcat'gifcat(@nos); } ##### ロック sub lock{ $try = 5; while(!(symlink("$$",$lockfile))){ if(--$try <= 0){ &error("",0); } sleep(1); } } ##### symlink が使えないサーバー用のファイルロック #sub lock{ # $try=5; # while(-f $lockfile){ # if(--$try<=0){ &error("",0); } # sleep(1); # } # open(FILE,">$lockfile") || die &error("",0); # close(FILE); #} ############################################## ##### ロック解除 sub unlock{ unlink($lockfile); } ##### エラー処理 sub error{ ($file, $id)=@_; local(@sts) = lstat($lockfile); local($tn) = time(); @msg=('ロック中です' ,'に書き込めません' ,'がありません' ,'パラメータが不正です' ); print "Content-type: text/plain\n\n"; print "<< Error Message from TcounT Lite Ver.$verno>>\n"; print "$file$msg[$id]"; &unlock if ($id); # ID が 0 以外の場合はロック解除 &unlock if ($tn - $sts[9] > 15); # 約15秒以上ロックが続いてたら自動解除 exit; }