#!/usr/bin/perl

#
# アクセスカウンター
#

# カウントを記録するファイル
#$filename ="/web/counter/counter.txt";
my $filename ="./counter.txt";
# 表示する桁数
my $keta =6;

#リトライ
my $max=10;

$LOCK_SH = 1;
$LOCK_EX = 2;
$LOCK_NB = 4;
$LOCK_UN = 8;


$count = "";
my $i=0;

for ($i=0;$i<$max;$i++)
{
	if(open(DATA_FILE, "+< " . $filename)){
		flock(DATA_FILE,$LOCK_EX);

		seek DATA_FILE, 0, 2;
		$size = tell DATA_FILE;

		seek(DATA_FILE, 0, 0);
		read( DATA_FILE, $count, $size );
		$count = int($count) + 1;
		seek(DATA_FILE, 0, 0);
		print DATA_FILE $count;

		flock(DATA_FILE,$LOCK_UN);
		close(DATA_FILE);
		last;
	}
	sleep(1);
}
if ($i>=$max)
{
	$count = "0";
	$count = int($count) + 1;
	&CounterFileWrite($count);
}


#カウンターを表示
$buffer = &CounterEdit($count);

#bgcolor="#e8e8e8" text="#e8e8e8"
print "Content-Type: text/plain\n\n";
print "document.write('$buffer');\n";
#print $buffer;


#エラー表示
sub errcnt()
{
	$buffer = "";
	my $i = 0;
	for ($i=0; $i<$keta; $i++)
	{
		$buffer.= "*";
	}
	return $buffer;
}

#ファイル書き込み
sub CounterFileWrite()
{
	my($count)=@_;

	if(!open(OUT, "> $filename"))
	{
		print &errcnt();
		exit;
	}

	print OUT $count;
	close(OUT);

}

#カウンターセロ埋め
sub CounterEdit()
{
	my($count)=@_;
	my $buffer = sprintf("%s", $count);
	my $len = length($buffer);
	my $i = 0;

	for ($i=0; $i <($keta - $len); $i++)
	{
		$buffer = "0$buffer";
	}

	return $buffer;
}
