#!/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=<NUM>;
	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;
}
