#!/usr/bin/perl

## CUPID COUNTER v0.5 : ベータ版
## Copyright(C) KENT WEB 1997-200
## webmaster@kent-web.com
## http://www.kent-web.com/

# バージョン情報
$ver = 'Cupid v0.5';

## -------------------------------------------------------------------
## 1. このスクリプトはフリーソフトです。このスクリプトを使用したいか
##    なる損害も作者はその責を負いません。
## 2. 設置に関する質問は直接メールではお答え致しませんので、サポート
##    コーナへお願いいたします。
## -------------------------------------------------------------------
## [タグの書き方の例]
##
##  総カウント数
##  <img src="http://〜〜/cupid.cgi">
##
##  本日・昨日のカウント数
##  <SCRIPT LANGUAGE="JavaScript" SRC="http://〜〜/cupid.js"></SCRIPT>
##  <SCRIPT LANGUAGE="JavaScript">
##  <!--
##  document.write("昨日：" + Y);
##  document.write("　");
##  document.write("本日：" + T);
##  // -->
##  </SCRIPT>
##
##  ＊チェックのしかた (ブラウザから最後に ?check をつけて呼出す）
##    http://〜〜/cupid.cgi?check
## -------------------------------------------------------------------

#============#
#  設定項目  #
#============#

# 画像連結ライブラリ取り込み
require './gifcat.pl';

# ログファイル
$logfile = "./cupid.js";

# GIF画像ディレクトリ
$gifdir = "./gif";

# GIFカウンタの桁数
$digit = 6;

# 二重カウント防止機能 (0=no 1=yes)
#  --> 直前のIPアドレスをチェックし同一のIPであればカウントしない
$ip_chk = 1;

# ファイルロック機構 (0=no 1=symlink 2=open)
$lockkey = 0;

# ロックファイル名
$lockfile = "./cupid.lock";

#============#
#  設定完了  #
#============#

# テストモード
if ($ENV{'QUERY_STRING'} eq "check") { &CheckMode; }

# 時間を取得
$ENV{'TZ'} = "JST-9";
($sec,$min,$hour,$mday) = localtime(time);

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

# ロック開始
if ($lockkey == 1) { &lock1; }
elsif ($lockkey == 2) { &lock2; }

open(IN,"$logfile") || &error;
$data = <IN>;
close(IN);

($x,$day,$x,$count,$x,$yest,$x,$to,$x) = split(/\'/, $data);

($day,$ip) = split(/:/, $day);

$flag=0;
if ($ip_chk && $addr eq "$ip") { $flag = 1; }
if (!$ip_chk) { $addr = ""; }

if (!$flag) {
	if ($mday == $day) {
		$cnt = $count + 1;
		$to++;

		$data = "D=\'$day\:$addr\'\;C=\'$cnt\'\;Y=\'$yest\'\;T=\'$to\'\;";
	}
	else {
		$cnt = $count + 1;
		$data = "D=\'$mday\:$addr\'\;C=\'$cnt\'\;Y=\'$to\'\;T=\'1\'\;";
	}

	# 更新
	open(OUT,">$logfile") || &error;
	print OUT $data;
	close(OUT);
}

# ロック解除
if (-e $lockfile) { unlink($lockfile); }

# 画像出力
&count_view;
exit;

#---------------#
#  GIF出力処理  #
#---------------#
sub count_view {
	while (length($count) < $digit) { $count = '0' . $count; }
	$length = length($count);
	@GIF=();
	foreach (0 .. $length-1) {
		$n = substr($count,$_,1);
		push(@GIF,"$gifdir\/$n\.gif");
	}
	print "Content-type: image/gif\n\n";
	binmode(STDOUT);
	print &gifcat'gifcat(@GIF);
}

#--------------------------------#
#  ロックファイル : symlink関数  #
#--------------------------------#
sub lock1 {
	local($retry) = 5;
	while (!symlink(".", $lockfile)) {
		if (--$retry <= 0) { &error; }
		sleep(1);
	}
}

#-----------------------------#
#  ロックファイル : open関数  #
#-----------------------------#
sub lock2 { 
	local($flag) = 0;
	foreach (1 .. 5) {
		if (-e $lockfile) { sleep(1); }
		else {
			open(LOCK,">$lockfile") || &error;
			close(LOCK);
			$flag = 1;
			last;
		}
	}
	if (!$flag) { &error; }
}

#--------------#
#  エラー処理  #
#--------------#
sub error {
	if (-e $lockfile) { unlink($lockfile); }

	@err_gif = ('47','49','46','38','39','61','2d','00','0f','00','80','00','00','00','00','00','ff','ff','ff','2c', '00','00','00','00','2d','00','0f','00','00','02','49','8c','8f','a9','cb','ed','0f','a3','9c','34', '81','7b','03','ce','7a','23','7c','6c','00','c4','19','5c','76','8e','dd','ca','96','8c','9b','b6', '63','89','aa','ee','22','ca','3a','3d','db','6a','03','f3','74','40','ac','55','ee','11','dc','f9', '42','bd','22','f0','a7','34','2d','63','4e','9c','87','c7','93','fe','b2','95','ae','f7','0b','0e', '8b','c7','de','02','00','3b');

	print "Content-type: image/gif\n\n";
	foreach (@err_gif) {
		$data = pack('C*',hex($_));
		print $data;
	}
	exit;
}

#------------------#
#  チェックモード  #
#------------------#
sub CheckMode {
	print "Content-type: text/html\n\n";
	print "<html><head><title>CUPID COUNTER</title></head>\n";
	print "<body>\n<UL>\n";

	# ログファイルのパス確認
	if (-e $logfile) { print "<LI>ログファイルのパス : OK!"; }
	else { print "<LI>ログファイルがありません。"; }

	# ログファイルのパーミッション（読みこみ）
	if (-r $logfile) { print "<LI>ログファイルの読みこみパーミッション : OK!"; }
	else { print "<LI>ログファイルの読みこみパーミッションが不正です。"; }

	# ログファイルのパーミッション（書きこみ）
	if (-w $logfile) { print "<LI>ログファイルの書きこみパーミッション : OK!"; }
	else { print "<LI>ログファイルが書きこみパーミッションが不正です。"; }

	# 画像ディレクトリのパス確認
	if (-d $gifdir) { print "<LI>gifディレクトリのパス : OK!"; }
	else { print "<LI>gifディレクトリのパスが不正です。"; }

	# 画像チェック
	$flag=0;
	foreach (0 .. 9) {
		$giffile = $_ . '.gif';
		unless (-e "$gifdir\/$giffile") {
			$flag=1;
			print "<LI>$gifdir\/$giffile がありません。";
		}
	}
	if (!$flag) { print "<LI>gifディレクトリ内のGIF画像 : OK!"; }

	# 著作権表示：削除禁止
	print "<P><small><!-- $ver -->\n";
	print "- <a href=\"http://www.kent-web.com/\">Cupid Counter</a> -\n";
	print "</small>\n</UL>\n</body></html>\n";
	exit;
}
