print "HTTP/1.1 200 OK\n";
#!/usr/bin/perl

## --------------------------------------------------------------------------
## Lime Counter v1.1
## by KENT (99/05/22)
## E-Mail: webmaster@kent-web.com
## WWW: http://www.kent-web.com/
## ・このスクリプトはフリーソフトです。
## ・このスクリプトを使用したいかなる損害も作者はその責を負いません。
## ・メールによる設置に関する質問はご遠慮ください。
## ----------------------------------------------------------------------------
## Lime Counter+W v4.4
## Edit By りゅういち
## E-MAIL: ryu@cj-c.com
## W W W : http://www.cj-c.com/
## KENTさんに感謝 => このスクリプトの質問はりゅういちまで
## ---------------------------------------------------------------------------

#--- ファイル設定 ------*

require './jcode.pl';	# jcode.pl  までのパス(URLは×)
require './gifcat.pl';	# gifcat.pl までのパス(URLは×)
require './set.cgi';	# set.cgi   までのパス(URLは×)

#--- ここまで ----------*

$Del=1; $HEN=0;
$buffer = $ENV{'QUERY_STRING'};
if($buffer=~/^1/){$HEN=1;}
if($HEN){$buffer=~ s/^1//; @pairs=split(/:&/, $buffer);}else{@pairs=split(/&/, $buffer);}
foreach $pair (@pairs) {
	if($HEN){($name,$value)=split(/:=/, $pair);}else{($name,$value)=split(/=/, $pair);}
	$value =~ tr/+/ /;
	$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;

	$value =~ s/"/&quot\;/g;
	$value =~ s/<>/&gt\;&lt\;/g;

	$FORM{$name} = $value;
}
$c   =$FORM{'c'};
$f   =$FORM{'f'};
$g   =$FORM{'g'};
$page=$FORM{'page'};
$name=$FORM{'name'};
$mode=$FORM{'mode'};
$hp  =$FORM{'hp'};
$down=$FORM{'down'};
$down =~ s/^http\:\/\///;
$down =~ s/^http\:\///;
if($c){ if($f){$f=$f;}else{$f=$fig;} if($g){$gif=$gif[$g];}else{$gif=$gif[0];} }
# チェックモード
if (!$buffer || $mode eq "check") { &check; }
# URLの引数がない場合はリンク元情報を取得する
if ($hp eq "") {
	$hp = $ENV{'HTTP_REFERER'};
	$hp =~ s/\%7E/\~/ig;
}
$hp =~ s/^http\:\/\///;
$hp =~ s/^http\:\///;

$ENV{'TZ'} = "JST-9";
($sec,$min,$hour,$mday,$mons,$year,$wday) = localtime(time);
$mons++;
$thisday = (1,2,3,4,5,6,7) [$wday];
#1=日 2=月 3=火 4=水 5=木 6=金 7=土
$year+=1900;
$date = "$year\/$mons\/$mday";

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

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

	# ログを開く
	if ($down) { $page = $down; }
	if ($c == 2){&dg_;}

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

	# マッチング／カウントアップ処理
	$flag=0;
	@new=();
	foreach $line (@lines) {
		if(length($line) < 5){next;}
		($no,$hpg,$count,$title,$ip,$time) = split(/<>/, $line);
		if ($page eq "$no") {
			# IPアドレスが同じ場合はカウントアップしない
			if($ipc==0){if ($addr eq "$ip") { $flag=2; last; }}

			# $hpg, $title がない場合
			if ($hpg eq "") { $hpg = $hp; }
			if ($title eq "") {
				&jcode'convert(*name,'sjis');
				$title = $name;
			}
			$flag=1;
			$count++;
			$line = "$no<>$hpg<>$count<>$title<>$addr<>$time<>\n";
		}
		push(@new,$line);
	}

	# 既存ログ更新
	if($flag == 1){
		open(OUT,">$logfile") || &error("$logfile");
		print OUT @new;
		close(OUT);

	# 新規ページ追加更新
	} elsif ($flag == 0 && $hp ne "") {
		# ページ名を S-JIS コードへ
		&jcode'convert(*name,'sjis');

		open(OUT,">>$logfile") || &error("$logfile");
		print OUT "$page<>$hp<>1<>$name<>$addr<>$date<>\n";
		close(OUT);
	}
	# ロック解除
	if(-e $lockf){if($lockkey==1){unlink($lockf);}elsif($lockkey==2){rmdir($lockf);}}
}
# 週間機能
if($day) {&week_("$dayfile", "$daylock", "$hour");}
if($week){&week_("$weekfile","$weeklock","$thisday");}
if($mon) {&week_("$monfile", "$monlock", "$mday");}

# ダウンロードカウンタの場合
if ($down) {
	if($Loc){
		print"Content-type: text/html\n\n";
		print'<html><head>';
		print'<script language="JavaScript">';
		print"<!--\n";
		print"location.href=\"http://$hp\"\;";
		print"//-->\n";
		print'</script>';
		print"<meta http-equiv=\"Refresh\" content=\"1\;url=http://$down\">";
		print"</head><body><center><a href=\"http://$down\">http://$down</a>";
#		print"<meta http-equiv=\"Refresh\" content=\"1\;url=http://$hp\">";
		print"</head><body><center><a href=\"http://$hp\">$name</a>";
		print"</center></body></html>";
		exit;
	}else{
		if ($ENV{PERLXS} eq "PerlIS") { # IISサーバ(PerlIS)対応
			print "HTTP/1.0 302 Temporary Redirection\r\n";
			print "Content-type: text/html\n";
		}
#		print "Location: http://$down\n\n";
		print "Location: http://$$hp\n\n";
	}
} else {
	# ダミー画像を表示
	if($c){&dg_;}
	else{
		print "Content-type: image/gif\n\n";
		if($dummy){
			open(GIF,"$dummy");
			binmode(GIF);
			binmode(STDOUT);
			print <GIF>;
			close(GIF);
		}else{
			@dmygif=(
			"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"
			);
			foreach (@dmygif) { 
				$DMY = pack('C*',hex($_));
				binmode(GIF);
				binmode(STDOUT);
				print "$DMY";
			}
		}
	}
}
exit;

## --- ロックファイル（symlink関数）処理
sub lock1 {
	local($retry) = 5;
	while (!symlink(".", $lockf)) {
		if (--$retry <= 0) { &error('lock'); }
		sleep(1);
	}
}
## --- ロックファイル
sub lock2 {
$lflag = 0;
foreach (1 .. 5) {if(mkdir($_[0], 0755)){$lflag=1; last;}else{sleep(1);}}
if ($lflag == 0) {
	if(-e $_[0]){rmdir($_[0]);}
	&error("LOCK is BUSY (ロック中)","1");
}
}
## --- エラー処理
sub error {
	if(-e $lockf){if($lockkey==1){unlink($lockf);}elsif($lockkey==2){rmdir($lockf);}}
	die "Error : $_[0]";
}

## --- 週間カウント
sub week_ {

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

# ログを開く
if($down){$page=$down;}

open(IN,"$_[0]") || &error("$_[0]");
@lines = <IN>;
close(IN);
($no,$hpg,$count,$title,$ip,$time,$days) = split(/<>/, $lines[0]);
if($_[2] < "$days"){&del_;}

# マッチング／カウントアップ処理
$flag=0;
@new=(); $FM=0;
foreach $line (@lines) {
	if(length($line) < 5){next;}
	($no,$hpg,$count,$title,$ip,$time,$days,$r) = split(/<>/, $line);
	$r =~ s/\n//;
	if($page eq "$no") {
		# IPアドレスが同じ場合はカウントアップしない
		if($ipc==0){if ($addr eq "$ip") { $flag=2; last; }}
		# $hpg, $title がない場合
		if ($hpg eq "") { $hpg = $hp; }
		if ($title eq "") {
			&jcode'convert(*name,'sjis');
			$title = $name;
		}
		$flag=1;
		$count++;
		$line = "$no<>$hpg<>$count<>$title<>$addr<>$time<>$_[2]<>$r<>\n";
	}
	push(@new,$line);
}
if($flag == 0 && $FM && $Del){
	&jcode'convert(*name,'sjis');
	$line = "$page<>$hp<>1<>$name<>$addr<>$date<>$_[2]<>$r<>\n";
	push(@new,$line); $flag=1;
}
# 既存ログ更新
if($flag == 1) {
	open(OUT,">$_[0]") || &error("$_[0]");
	print OUT @new;
	close(OUT);

# 新規ページ追加更新
} elsif ($flag == 0 && $hp ne "") {
	# ページ名を S-JIS コードへ
	&jcode'convert(*name,'sjis');

	open(OUT,">>$_[0]") || &error("$_[0]");
	print OUT "$page<>$hp<>1<>$name<>$addr<>$date<>$_[2]<>0<>\n";
	close(OUT);
}
# ロック解除
if(-e $lockf){if($lockkey==1){unlink($lockf);}elsif($lockkey==2){rmdir($lockf);}}
}
sub dg_ { #カウント画像表示
open(IN,"$logfile") || &error("$logfile");
@lines = <IN>;
close(IN);
$count=0;
foreach $line (@lines) {
	($no,$hpg,$count,$title,$ip,$time) = split(/<>/, $line);
	if($page eq "$no"){$cnt=$count;last;}
	if($page eq "T*"){$cnt+=$count;}
}
$sc = sprintf(sprintf("%%0%dld", $f), $cnt);
printf("Content-type: image/gif\n");
printf("\n");
for ($i=0; $i<length($sc); $i++) {
	$n = substr($sc, $i, 1);
	push(@files, "$gif/$n.gif");
}
binmode(STDOUT);
print &gifcat'gifcat(@files);
exit;
}
## --- チェックモード
sub check {
print "Content-type: text/html\n\n";
print "<html><head><title>LIME COUNTER</title></head>\n";
print "<body>\n<UL>\n";

$LOGR="ログ読みこみパーミッション";
$LOGW="ログ書きこみパーミッション";

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

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

# ログファイルのパーミッション（書きこみ）
if(-w _){print "<LI>$LOGW: OK!";}else{print "<LI>$LOGWが不正";}
print "<hr width=40\% align=left>\n";

if ($day) {
	if(-e $dayfile){print"<LI>日間ログのパス: OK!";}else{print"<LI>日間ログがありません";}
	if(-r _){print"<LI>日間$LOGR: OK!";}else{print"<LI>日間$LOGRが不正";}
	if(-w _){print"<LI>日間$LOGW: OK!";}else{print"<LI>日間$LOGWが不正";}
	print "<hr width=40\% align=left>\n";
}
if ($week) {
	if(-e $weekfile){print"<LI>週間ログのパス: OK!";}else{print"<LI>週間ログがありません";}
	if(-r _){print"<LI>週間$LOGR: OK!";}else{print"<LI>週間$LOGRが不正";}
	if(-w _){print"<LI>週間$LOGW: OK!";}else{print"<LI>週間$LOGWが不正";}
	print "<hr width=40\% align=left>\n";
}
if ($mon) {
	if(-e $monfile){print"<LI>月間ログのパス: OK!";}else{print"<LI>月間ログがありません";}
	if(-r _){print"<LI>月間$LOGR: OK!";}else{print"<LI>月間$LOGRが不正";}
	if(-w _){print"<LI>月間$LOGW: OK!";}else{print"<LI>月間$LOGWが不正";}
	print "<hr width=40\% align=left>\n";
}
print "</UL>\n</body></html>\n";
exit;
}
sub del_ {#ログフォーマット
foreach $line (@lines) {
	if(length($line) < 5){next;}
	($no,$hpage,$count,$title,$ip,$time) = split(/<>/,$line);
	$count{$no} = $count;
	$title{$no} = $title;
	$hpage{$no} = $hpage;
	$ip{$no}    = $ip;
}
$rank1=0; $rank2=1; $count_tmp=0; @new=();
foreach (sort { ($count{$b} <=> $count{$a}) || ($a cmp $b)} keys(%count)) {
	($count{$_} == $count_tmp) || ($rank1 = $rank2);
	push(@new,"$_<>$hpage{$_}<>0<>$title{$_}<>$ip{$no}<>$date<>$_[2]<>$rank1:$count{$_}<>\n");
	$count_tmp = $count{$_};
	$rank2++;
	$cnt3 = '';
}
open(OUT,">$_[0]") || &error("$_[0]");
print OUT @new;
close(OUT);

@lines=@new;
}
