#!/usr/local/bin/perl
#--------------------------------------------------------------------------------------------#
#Copyright (C) 1998-2000 by pika@cgi-club.com
$script_nickname = 'imCTHTM';
$support_url     = 'http://www.cgi-club.com/';
#------------------ ver -------- [   DATE   ] - NOTE ----------------------------------------#
$script_version  = 'ver1.01';  # [2000/05/23]   デフォルトのファイル構成を変更、Javaと組み合わせHTML起動でリンク元が取得できるように変更
#script_version  = 'ver1.00';  # [2000/04/01]   作成
#--------------------------------------------------------------------------------------------#

# ユーザ変数設定（ここから）-----------------------------------------------------------------#
# 【注意】フレームを利用してカウンタを表示させる場合は$im_env{'set_url'}に存在しないURLを設定して下さい。

$im_env{'set_url'}      = "http://www.kenwa.or.jp/";#設置するホームページのＵＲＬ
$im_env{'gifcat_pl'}    = "./pgifcat.pl";            #画像連結スクリプト（このファイルからの相対パス）
$im_env{'dat_dir'}      = "./data";                  #データ用ディレクトリ（このファイルからの相対パス）
$im_env{'lock_dir'}     = "./lock";                  #ファイルロック用ディレクトリ（このファイルからの相対パス）
$im_env{'img_dir'}      = "./img";                   #カウンタ画像用ディレクトリ（このファイルからの相対パス）
$im_env{'count_dat'}    = "ct.dat";                  #カウントデータファイル名（ファイル名のみ指定）
$im_env{'access_log'}   = "ac.log";                  #アクセスログファイル名（ファイル名のみ指定）
$im_env{'ct_lock'}      = "ct.lock";                 #カウントデータ用ロックファイル名（ファイル名のみ指定）
$im_env{'ac_lock'}      = "ac.lock";                 #アクセスログ用ロックファイル名（ファイル名のみ指定）

$im_env{'use_lock'}     = "yes";      #ファイルロックがかかったままになるときは "no"（できるだけ "yes"で使用）
$im_env{'need_aclog'}   = "yes";      #アクセスログが必要ときは "yse" 不要なときは "no"("no"を指定した場合はリロードカウントアップ防止は機能しません）
$im_env{'access_num'}   = 200;        #アクセスロ最大記録行数（あまり多いと動作が遅くなります）
$im_env{'retry_limit'}  = 30;         #リロードカウントアップ防止時間（リロードによるカウントアップを禁止する時間：秒）
$im_env{'ct_digit'}     = 5;          #カウンタの最小表示桁数
$im_env{'ct_align'}     = "H";        #カウンタ画像の連結方向（"H"のとき水平方向、"V"のとき垂直方向）

# ユーザ変数設定（ここまで）-----------------------------------------------------------------#

require "$im_env{'gifcat_pl'}";

if($ENV{'QUERY_STRING'}=~s/ref=//){$ENV{'HTTP_REFERER'}=$ENV{'QUERY_STRING'};}

open(CT,"$im_env{'dat_dir'}/$im_env{'count_dat'}");
$ct=<CT>;
close(CT);unless($ct){$ct=0;}

# Refererチェックしない
#if($ENV{'HTTP_REFERER'}=~m/$im_env{'set_url'}/){
#   &exit_script($ct,*im_env);
#}
#els
if($im_env{'need_aclog'} eq "yes"){
    $time=time;
    $cht=$time-$im_env{'retry_limit'};
    open(ACLOG,"$im_env{'dat_dir'}/$im_env{'access_log'}");
    @ac_log=<ACLOG>;
    close(ACLOG);
    foreach $i (@ac_log){
        @buf=split(/,/,$i);
        if($buf[1]=~m/$ENV{'REMOTE_ADDR'}/){
            if($buf[2]>$cht){
                $i="$buf[0],$ENV{'REMOTE_ADDR'},$time,$ENV{'HTTP_USER_AGENT'},$buf[4]";
                $add_flag=1;
                last;
            }
        }
    }
    unless($add_flag){
        $ct++;
        $add_data="$ct,$ENV{'REMOTE_ADDR'},$time,$ENV{'HTTP_USER_AGENT'},$ENV{'HTTP_REFERER'}\n";
        unshift(@ac_log,$add_data);
    }
    if($im_env{'use_lock'} eq "yes"){&set_lock($im_env{'lock_dir'},$im_env{'ac_lock'});}
    open(ACLOG,">$im_env{'dat_dir'}/$im_env{'access_log'}");
    eval "flock(2,ACLOG)";
    seek(ACLOG,0,0);
    foreach $i (0 .. $#ac_log){
        if($i>$im_env{'access_num'}){last;}
        print ACLOG $ac_log[$i];
    }
    $file_size = tell(ACLOG);
    truncate(ACLOG,$file_size);
    close(ACLOG);
    if($im_env{'use_lock'} eq "yes"){&reset_lock($im_env{'lock_dir'},$im_env{'ac_lock'});}
}
else{$ct++;}

if($im_env{'use_lock'} eq "yes"){&set_lock($im_env{'lock_dir'},$im_env{'ct_lock'});}

#if(open(CT,">$im_env{'dat_dir'}/$im_env{'count_dat'}")){
    open(CT,">$im_env{'dat_dir'}/$im_env{'count_dat'}");
    eval "flock(2,CT)";
    seek(CT,0,0);
    print CT "$ct\n";
    close(CT);
#}

open(a,">>/tmp/test");
print a ">$im_env{'dat_dir'}/$im_env{'count_dat'}";
print a "test\n";
close(a);


if($im_env{'use_lock'} eq "yes"){&reset_lock($im_env{'lock_dir'},$im_env{'ct_lock'});}

&exit_script($ct,*im_env);

exit 0;

sub exit_script{
    local($out,*v)=@_;
    local($i,$x,@img_file);
    $out=sprintf('%0'.$v{'ct_digit'}.'d',$out);
    foreach $i (0..length($out)-1){
        $x=substr($out,$i,1);
        $img_file[$i]="$v{'img_dir'}/$x\.gif";
    }
    select(STDOUT);$|=1;
    binmode(STDOUT);
    print "Content-type: image/gif\n\n";
    if($v{'ct_align'} eq 'V'){
        print &gifcat'gifcatv(@img_file);
    }
    else{print &gifcat'gifcat(@img_file);}
    exit 0;
}

sub set_lock{
    local($s_l_file)="$_[0]/$_[1]";
    local($s_l_tmpfile)="$_[0]/$$".$_[1];
    local($s_l_retry)=5;
    while ($s_l_retry){
        if(rename($s_l_file,$s_l_tmpfile)){return 1;}
        else{sleep(1);$s_l_retry--;}
    }
    return 0;
}

sub reset_lock{
    local($r_l_file)="$_[0]/$_[1]";
    local($r_l_tmpfile)="$_[0]/$$".$_[1];
    if(rename($r_l_tmpfile,$r_l_file)){return 1;}
    return 0;
}
