#!/usr/bin/perl

#++++++++++++++++++++++++++++++++++++++++++#
# JAM-COUNTER             v1.0(2001/1/20~)
# CopyRight(C)   SABBATH-JAM 2001 (BY JIM)
# MAIL:web@sabbath-jam.com
# URL:http://sabbath-jam.com
#++++++++++++++++++++++++++++++++++++++++++#

$version = 'JAM-COUNTER(Nomal Version)v1.0'; #バージョン
$sabbath_url = 'http://sabbath-jam.com'; #sabbath-jam HOME-URL

#################################################################

#----------
#初期設定
#----------

#ファイルの名前や階層を変更したりしないのであれば初期値でＯＫ---------

#このスクリプト名
$cgi = "./count.cgi";

# ログファイルを置く場所
$log_folder     = './logs/';

# ログファイルの拡張子
$log_extension = '.log';

# ファイルロック処理
$f_lock = 1;		#Y = 1 / N = 0

# ログファイル名を指定しない場合の初期ファイル名
$i_log = 'count';

# 画像の入っているディレクトリ（フォルダ)名
$img_dir = "./img/";

# 桁数を指定しない場合の初期値（桁）
$i_figure = 0;		# 000123 の様に頭に0を付けたくない時は０にして下さい。

#以上です。

#################################################################
&decode;
if ($FORM{'put'}){$day_count = 1;}
if ($FORM{'log'}){$log       = $FORM{'log'};   }else{$log = $i_log;}
if ($FORM{'img'}) {$img_dir  = $FORM{'img'};}
$log = "$log_folder$log$log_extension";
$addr = $ENV{'REMOTE_ADDR'};
$method   = "post";
$log_lock = $log . '.lock';
if (!%FORM){die "Acces error!";}
&count;													#カウントする
exit;

######################################################################

#----------
#主プロセス
#----------

#最初にアクセスしてきた時#############################################
sub count{
	if (($f_lock)&&($FORM{s})){&f_lock;}
	if (!-e $log){
		die "A log is not found!";
	}
	open(LOG,"$log");
	if ($day_count){
		($count,$t_count,$y_count,$today,$old_addr) = <LOG>;
		chomp $count;chomp $t_count;chomp $y_count;chomp $today;chomp $old_addr;
		my ($dmy, $dmy, $dmy, $day) = (localtime(time));
		if ($today != $day){
			$y_count = $t_count;
			$t_count = 0;
			$today   = $day;
		}
		if ($FORM{s}){
			$count ++;$t_count++;
			$write = "$count\n$t_count\n$y_count\n$today\n$addr\n";
		}
	} else {
		($count,$old_addr) = <LOG>;
		chomp $count;chomp $old_addr;
		if ($FORM{s}){
			$count ++;
			$write = "$count\n$addr\n";
		}
	}
	close(LOG);
	if ($FORM{s} && ($addr ne $old_addr)){
		open(LOG,">$log");
		print LOG $write;
		close(LOG);
	}
	if (-e $log_lock){unlink($log_lock);}
	&put_counter;
	exit;
}

######################################################################

#----------
#子プロセス
#----------

#カウンター出力#######################################################
sub put_counter{
	if     ($FORM{put} eq "t"){@put = split //,$t_count;}
	 elsif ($FORM{put} eq "y"){@put = split //,$y_count;}
	  else                    {@put = split //,  $count;}
	@put = reverse @put;
	if ($FORM{'fig'}){$fig = $FORM{fig};}else{die "Please specify the digit!";}
	if (!$put[$fig -1]){$img = "0";}else{$img = $put[$fig -1];}
	open(FILE,"$img_dir$img\.gif") || die "failed in reading the image!";
	print "Content-type: image\/gif\n\n";
	binmode FILE;
	binmode STDOUT;
	print <FILE>;
	close(FILE);
	exit;
}

#ロック処理###########################################################
sub f_lock{
	my @log;
	foreach $log_lock(@log){
		my $lock = 0;
		for ($i = 0;$i <= 5;$i ++){
			unless (-e $log_lock) {
				if (!open(FILE,">$log_lock")){next;}
				close(FILE);
				$lock = 1;
				last;
			}else{
				 sleep(1);
			}
		}
		if ($lock == 0) {
			if (-e $lockfile){unlink($log_lock);}
			die "failed in the lock. \($log_lock\)";
		}
	}
}

#デコード#############################################################
sub decode{
	if($ENV{'REQUEST_METHOD'} eq "POST"){
		read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
	}else{
		$buffer = $ENV{'QUERY_STRING'};
	}
	foreach(split(/&/, $buffer)){
		my ($key, $val) = split(/=/, $_);
		$val =~ tr/+/ /;$key =~ tr/+/ /;
		$key =~ s/%([A-Fa-f0-9]{2})/pack("c",hex($1))/ge;
		$val =~ s/%([A-Fa-f0-9]{2})/pack("c",hex($1))/ge;
		$FORM{$key} = $val;
	}
}
