#!/usr/local/bin/perl

## LimeCounter v2.1
## Copyright (c) KentWeb

# 外部ファイル取り込み
require './init.cgi';

# 外部データ受け取り
$buf = $ENV{'QUERY_STRING'};
$buf =~ s/\W//g;

# ファイル定義
$datafile = "$datadir/$buf.dat";
$lockfile = "$lockdir/$buf.lock";

# チェックモード
if (!$buf || $buf eq "check") { ✓ }

# データが存在しない場合は終了
unless (-e $datafile) { &error("Not Exist: $datafile"); }

# IPアドレス取得
$addr = $ENV{'REMOTE_ADDR'};

# ロック開始
&lock if ($lockkey);

# データ読み取り
open(IN,"$datafile") || &error("Open Error: $datafile");
$data = <IN>;
close(IN);

# カウントアップ
($count,$ip) = split(/:/, $data);
if (!$ip_chk || ($ip_chk && $addr ne $ip)) {
	$count++;

	open(OUT,">$datafile") || &error("Write Error: $datafile");
	print OUT "$count:$addr";
	close(OUT);
}

# ロック解除
&unlock if ($lockkey);

# ページカウンタ
if ($type == 1) {

	# ダミーGIF画像
	local(@gif) = (
		"47","49","46","38","39","61","02","00","02","00","80","00",
		"00","00","00","00","ff","ff","ff","21","f9","04","01","00",
		"00","01","00","2c","00","00","00","00","02","00","02","00",
		"00","02","02","8c","53","00","3b");

	# ダミー画像を表示
	print "Content-type: image/gif\n\n";
	foreach (@gif) {
		print pack('C*',hex($_));
	}

# ダウンロードカウンタ
} else {

	# index読み取り
	$f=0;
	open(IN,"$idxfile");
	while (<IN>) {
		($id,$sub,$link,$file) = split(/<>/);

		if ($buf eq $id) { $f++; last; }
	}
	close(IN);

	if (!$f) { &error("IDが不正です"); }

	# Locationヘッダ
	if ($type == 2) {

		# IISサーバ (PerlIS) 対応
		if ($ENV{'PERLXS'} eq "PerlIS") {
			print "HTTP/1.0 302 Temporary Redirection\r\n";
			print "Content-type: text/html\n";
		}

		# ファイルへジャンプ
		print "Location: $file\n\n";

	# metaタグ
	} else {

		&header("<META HTTP-EQUIV=\"refresh\" CONTENT=\"1; URL=$file\">");
		print "<div align=center>自動でダウンロードできない場合は\n";
		print "<a href=\"$file\">ここ</a> をクリックしてください。<br>\n";
		print "<form><input type=button value='閉じる' onClick='top.close();'>\n";
		print "</form></div>\n</body></html>\n";
	}
}
exit;


#--------------#
#  エラー処理  #
#--------------#
sub error {
	# ロック中の時は解除
	&unlock if ($lockflag);

	# ダウンロードカウンタの場合
	if ($type) {
		&header();
		print "<h3>ERROR</h3>$_[0]\n";
		print "</body></html>\n";
		exit;

	# ページカウンタの場合
	} else {
		die "Error : $_[0]";
	}
}

#--------------#
#  HTMLヘッダ  #
#--------------#
sub header {
	local($meta) = @_;

	print "Content-type: text/html\n\n";
	print <<EOM;
<html>
<head>
<META HTTP-EQUIV="Content-type" CONTENT="text/html; charset=Shift_JIS">
$meta
<title>$ver</title></head>
<body>
EOM
}

#------------------#
#  チェックモード  #
#------------------#
sub check {
	&header();
	print <<EOM;
<h3>Check Mode</h3>
<ul>
EOM

	# indexのパス確認
	if (-e $idxfile) {
		print "<li>インデックスファイルのパス: OK!\n";

		# パーミッション
		if (-r $idxfile && -w $idxfile) {
			print "<li>インデックスファイルのパーミッション: OK!\n";
		} else {
			print "<li>インデックスファイルのパーミッション: NG → $idxfile\n";
		}
	} else {
		print "<li>インデックスファイルのパス: NG → $idxfile\n";
	}

	# データディレクトリ
	if (-d $datadir) {
		print "<li>データディレクトリのパス: OK!\n";

		if (-r $datadir && -w $datadir && -x $datadir) {
			print "<li>データディレクトリのパーミッション: OK!\n";
		} else {
			print "<li>データディレクトリのパーミッション: NG → $datadir\n";
		}
	} else {
		print "<li>データディレクトリのパス: NG → $datadir\n";
	}

	# ロックディレクトリ
	print "<li>ロック形式: ";
	if ($lockkey == 0) { print "ロック設定なし\n"; }
	else {
		if ($lockkey == 1) { print "symlink\n"; }
		else { print "mkdir\n"; }
		print "<li>ロックディレクトリ: $lockdir\n";

		if (-d $lockdir) {
			print "<li>ロックディレクトリのパス: OK!\n";
			if (-r $lockdir && -w $lockdir && -x $lockdir) {
				print "<li>ロックディレクトリのパーミッション: OK!\n";
			} else {
				print "<li>ロックディレクトリのパーミッション: NG → $lockdir\n";
			}
		} else {
			print "<li>ロックディレクトリのパス: NG → $lockdir\n";
		}
	}

	# 著作権表示:削除禁止
	print <<EOM;
<li>バージョン: <a href="http://www.kent-web.com/">$ver</a>
</ul>
</body>
</html>
EOM
	exit;
}


__END__