#!/usr/bin/perl
#                                                                    +---------+
#  dopvSTAR* アクセスログ書き込みスクリプト                | dsw.cgi |
#--------------------------------------------------------------------+---------+
# 20050728

#-------------------------------------------------------------------------------
#-------------------------------------------------------------------- 初期設定▼
$| = 1;
require './dsi.pl';
&dsw_ini;

# 一定の確率でログを取得しない
if($rnd > 0) {
	srand(time/$$);
	$rnd2 = int(rand($rnd));
	if($rnd2 != 0) {
		&put_data(0); exit;
	}
}

require './lib/require.pl';



#-------------------------------------------------------------------------------
#------------------------------------------- Jcode.pm の対応自動判定&読み込み▼
eval 'use Jcode;';
if($@ || $INI{'jc'} == 1){
	$jcnv = 'jcode::convert';
	$jh2z = 'jcode::h2z_euc';
	&require($INI_require_path{'jcode'});
}else{
	require Jcode::H2Z;
	$jcnv = 'Jcode::convert';
	$jh2z = 'Jcode::H2Z::h2z';
}



#-------------------------------------------------------------------------------
#---------------------------------------------------------------- 引数受け取り▼
if($ENV{'QUERY_STRING'} =~ /([a-zA-Z])=(.*)/){
	#--- JavaScript + IMG式 or IMG式 or SSI式で情報が送られてきた場合
	&require($INI_require_path{'get_form'});
	%COM = &get_query;
	#--- カウンタ出力処理
	if($COM{'count'} ne ''){
		&require($INI_require_path{'count'});
		if($COM{'count'} eq 'today'){
			&put_cnt("$INI{'today_count_file_path'}","$INI{'cnt_tyday_keta'}");
			exit;
		}elsif($COM{'count'} eq 'yesterday'){
			&put_cnt("$INI{'yesterday_count_file_path'}","$INI{'cnt_tyday_keta'}");
			exit;
		}elsif($COM{'count'} eq 'total'){
			&put_cnt("$INI{'count_file_path'}","$INI{'cnt_total_keta'}");
			exit;
		}elsif($COM{'count'} eq 'today_pg'){
			&put_cnt("$INI{'page_count_dir'}$COM{'pg'}\_today\.cgi","$INI{'cnt_page_tyday_keta'}");
			exit;
		}elsif($COM{'count'} eq 'yesterday_pg'){
			&put_cnt("$INI{'page_count_dir'}$COM{'pg'}\_yesterday\.cgi","$INI{'cnt_page_tyday_keta'}");
			exit;
		}elsif($COM{'count'} eq 'total_pg'){
			&put_cnt("$INI{'page_count_dir'}$COM{'pg'}\_total\.cgi","$INI{'cnt_page_total_keta'}");
			exit;
		}
	}
	#--- 無効な情報は取得しない
	foreach (keys %INI_deny_info){
		if($INI_deny_info{$_} ne '' && $COM{$_} =~ /$INI_deny_info{$_}/){ $COM{$_} = ''; }
	}
}


#--- ログ取得モードの自動判定
if($COM{'md'} eq '' && $ENV{'SERVER_PROTOCOL'} eq 'INCLUDED'){
	$COM{'md'} = 's';
}elsif($COM{'md'} eq '' && $COM{'pf'} ne ''){
	$COM{'md'} = 'j';
}


#--- ページ名の不正を変換
if($INI{'page_name_check'} == 1){
	$COM{'pg'} =~ s/[^_a-zA-Z0-9-\/]//g;
}


#--- ページ名が空
if($COM{'pg'} eq ''){
	if($INI{'page_name_deny'} == 0){
		&put_data(0); exit;
	}else{
		#--- ページ名が設定されていない時はパスをページ名とする
		$COM{'pg'} = $ENV{'REQUEST_URI'};
		$COM{'pg'} =~ s/xx=\d+\&\&//;
	}
}


#--- SSI式ならロボットのみ取得判定とリンク元の取得
if($COM{'md'} eq 's'){
	if($COM{'bot'} == 1){
		&require($INI_require_path{'jua'});
		%jua = &jua($ENV{'HTTP_USER_AGENT'});
		if($jua{'platform'} ne '検索ロボット'){
			&put_data(0); exit;
		}
	}
	if($COM{'nobot'} == 1){
		if($COM{'bot'} != 1){
			&require($INI_require_path{'jua'});
			%jua = &jua($ENV{'HTTP_USER_AGENT'});
		}
		if($jua{'platform'} eq '検索ロボット'){
			&put_data(0); exit;
		}
	}
	$i = $ENV{'HTTP_REFERER'};
	&$jcnv(\$i,'euc'); # EUC変換
	$i =~ s/\,/\./g;
	$COM{'rf'} = "$i";
}


#--- %7E を チルダに変換
$COM{'rf'} =~ s/\/\%7e/\/\~/ig;


#--- リンク元情報によるログ取得拒否
foreach (@INI_deny_referrer_nolog){
	if($_ ne '' && $COM{'rf'} =~ /\Q$_\E/){
		&put_data(0); exit;
	}
}


#--- ブックマーク判定用リンク元変換処理
$COM{'rf'} = 'B' if($COM{'rf'} eq 'b');
if($COM{'md'} =~ /^(s|j)$/ && $COM{'rf'} eq ''){
	$COM{'rf'} = 'b';
}
$COM{'rf'} = 'Nj' if($COM{'rf'} eq 'nj');
if($COM{'md'} eq 'nj'){
	$COM{'rf'} = 'nj';
}
$COM{'rf'} = 'I' if($COM{'rf'} eq 'i');
if($COM{'md'} eq 'i'){
	$COM{'rf'} = 'i';
}


#--- リンク元情報の取得拒否(ログは取得します)
foreach (@INI_deny_referrer){
	if($_ ne '' && $COM{'rf'} =~ /\Q$_\E/){
		$COM{'rf'} = '';
		last;
	}
}

#--- リンク元情報によるカウントアップ拒否(ログは取得します)
foreach (@INI_deny_referrer_nocount){
	if($_ ne '' && $COM{'rf'} =~ /\Q$_\E/){
		$COM{'cnt'} = 'no';
		last;
	}
}


#-------------------------------------------------------------------------------
#---------------------------------------------------------- クッキーによる処理▼
if($COM{'md'} ne 's'){
	&require($INI_require_path{'cookie'});
	#--- 管理者のクッキーがあるならログを取得しない
	%ADMIN_COOKIE = &get_cookie("$INI{'admin_cookie_name'}$INI{'cookie_path'}");
	if($ADMIN_COOKIE{'who'} eq 'admin'){ &put_data(0); exit; }

	#--- クッキーを取得
	%COOKIE = &get_cookie("$INI{'cookie_name'}$INI{'cookie_path'}");
	if($COOKIE{'cnt'} eq ''){ $COOKIE{'cnt'} = 0; }

	#--- 滞在時間の取得
	$INI{'stay_time'} = $INI{'time'} - $COOKIE{'t'};

	#--- 同一ページへの連続アクセスを弾く
	if($INI{'wwcheck_by_cookie'} == 1 && $COOKIE{'pg'} eq $COM{'pg'} && $INI{'stay_time'} <= $INI{'stay_time_border'}){
		&put_data(0); exit;
	}else{
		#--- 訪問回数を増やす
		$COOKIE{'cnt'}++;
	}
	#--- 滞在時間と認められなければクリア
	if($INI{'stay_time'} >= $INI{'stay_time_border'}){ $INI{'stay_time'} = ''; }
}



#-------------------------------------------------------------------------------
#------------------------------------------------------ リモートホスト名の取得▼
$INI{'remote_host'} = $ENV{'REMOTE_HOST'};
$INI{'remote_addr'} = $ENV{'REMOTE_ADDR'};
if($INI{'remote_host'} eq '' || $INI{'remote_host'} eq $INI{'remote_addr'}){
	$INI{'remote_host'} = gethostbyaddr(pack('C4',split(/\./,$INI{'remote_addr'})),2);
	if($INI{'remote_host'} eq ''){ $INI{'remote_host'} = $INI{'remote_addr'}; }
}

#--- ホスト名によるログ取得拒否
foreach (@INI_deny_host){
	if($_ ne '' && ($INI{'remote_host'} =~ /\Q$_\E/ || $INI{'remote_addr'} =~ /\Q$_\E/)){
		&put_data(0); exit;
	}
}



#-------------------------------------------------------------------------------
#------------------------------------------------------------ ブラウザ名の取得▼
$i = $ENV{'HTTP_USER_AGENT'};
if($i ne ''){
	&$jcnv(\$i,'euc');
	$i =~ s/\,/\./g;
}
$INI{'hua'} = $i;



#-------------------------------------------------------------------------------
#---------------------------------- ホスト名とブラウザ名によるログ取得拒否処理▼
foreach (keys %INI_deny_host_agent){
	if($_ ne '' && $INI_deny_host_agent{$_} ne '' && $INI{'hua'} =~ /\Q$INI_deny_host_agent{$_}\E/ && ($INI{'remote_host'} =~ /\Q$_\E/ || $INI{'remote_addr'} =~ /\Q$_\E/)){
		&put_data(0); exit;
	}
}



#-------------------------------------------------------------------------------
#-------------------------------------------------------- プロクシチェック処理▼
&require($INI_require_path{'proxy'});
($INI{'proxy'},$INI{'true_host'}) = &proxy($INI{'hua'},$INI{'remote_host'});

#--- プロクシ経由ならログ取得拒否
if($INI{'proxy_check'} > 0){
	if(($INI{'proxy_check'} == 3 && $INI{'proxy'} =~ /e|ha/) || ($INI{'proxy_check'} == 2 && $INI{'proxy'} =~ /eh|ea|ha/) || ($INI{'proxy_check'} == 1 && $INI{'proxy'} eq 'eha')){
		&put_data(0); exit;
	}
}



#-------------------------------------------------------------------------------
#---------------------------------------------------------------------- ID作成▼
if($INI{'use_remote_user_id'} == 1){
	if($ENV{'REMOTE_USER'} ne ''){
		$COOKIE{'id'} = "$INI{'remote_user_chara'}$ENV{'REMOTE_USER'}";
	}
}

if($COOKIE{'id'} eq ''){
	if($jua{'id'} eq ''){
		&require($INI_require_path{'id'});
		$COOKIE{'id'} = &make_id($INI{'remote_host'},$INI{'remote_addr'},$INI{'hua'});
	}elsif($INI{'mobile_id'} == 1){
		$COOKIE{'id'} = "$INI{'mobile_id_chara'}$jua{'id'}";
	}
}

#--- IDによるログ取得拒否
foreach (@INI_deny_id){
	if($_ ne '' && $COOKIE{'id'} =~ /\Q$_\E/){
		&put_data(0); exit;
	}
}



#-------------------------------------------------------------------------------
#------------------------------------------ ログ記録による連続アクセスチェック▼
if($INI{'wwcheck'} > 0){

	if(-e $INI{'wwcheck_log_file'}){
		#--- ファイルロック
		&require($INI_require_path{'filelock'});
		1 while (not defined($INI{'lfh'} = &filelock($INI{'filelock_dir'},$INI{'wwcheck_lock_file'},$INI{'lock_timeout'},$INI{'lock_retry'})));

		#--- 連続アクセスチェック用ログファイルを開く
		open(RAX,"<$INI{'wwcheck_log_file'}") || &error("連続アクセスチェック用のログファイルが開けません。");
		for($INI{'i'} = 0; $INI{'i'} < $INI{'wwcheck'}; $INI{'i'}++){
			$INI{'j'} = <RAX>;
			push(@wwcheck_log,$INI{'j'});
			$INI{'j'} = '';
		}
		close(RAX);

		#--- 連続アクセスであれば弾く
		foreach (@wwcheck_log){
			@wwcheck_log_line = split(/\,/,$_);
			chomp($wwcheck_log_line[2]);
			$INI{'i'} = $INI{'time'} - $wwcheck_log_line[0];
			if($INI{'i'} < $INI{'wwcheck_no'} && $wwcheck_log_line[1] eq $COM{'pg'} && $wwcheck_log_line[2] eq $COOKIE{'id'}){
				&unlock($INI{'lfh'}); &put_data(0); exit;
			}
			undef(@wwcheck_log_line);
		}

		#--- ログの数を調整
		pop @wwcheck_log;
		unshift(@wwcheck_log,"$INI{'time'}\,$COM{'pg'}\,$COOKIE{'id'}\n");

		#--- 連続アクセスチェック用ログの更新
		open(WAX,">$INI{'wwcheck_log_file'}") || &error("連続アクセスチェック用のログファイルが開けません。");
		print WAX @wwcheck_log;
		close(WAX);
		&unlock($INI{'lfh'});# ロック解除

	}else{

		#--- 連続アクセスチェックログファイルが存在しない
		&error('連続アクセスチェック用のログファイルが見つかりません。','設置構成をご確認ください。');

	}

} # close if($INI{'wwcheck'} > 0)



#-------------------------------------------------------------------------------
#---------------------------------------------------- 各項目ごとの情報取得拒否▼
if($INI_deny_fact{'all'} != 0){
	if($INI_deny_fact{'id'} == 1){ $COOKIE{'id'} = ''; }
	if($INI_deny_fact{'pf'} == 1){ $COM{'pf'} = ''; }
	if($INI_deny_fact{'remote_host'} == 1){ $INI{'remote_host'} = ''; }
	if($INI_deny_fact{'remote_addr'} == 1){ $INI{'remote_addr'} = ''; }
	if($INI_deny_fact{'proxy'} == 1){ $INI{'proxy'} = ''; }
	if($INI_deny_fact{'true_host'} == 1){ $INI{'true_host'} = ''; }
	if($INI_deny_fact{'hua'} == 1){ $INI{'hua'} = ''; }
	if($INI_deny_fact{'lng'} == 1){ $COM{'lng'} = ''; }
	if($INI_deny_fact{'swh'} == 1){ $COM{'swh'} = ''; }
	if($INI_deny_fact{'cd'} == 1){ $COM{'cd'} = ''; }
	if($INI_deny_fact{'pd'} == 1){ $COM{'pd'} = ''; }
	if($INI_deny_fact{'pg'} == 1){ $COM{'pg'} = ''; }
	if($INI_deny_fact{'pg2'} == 1){ $COOKIE{'pg'} = ''; }
	if($INI_deny_fact{'stay_time'} == 1){ $INI{'stay_time'} = ''; }
	if($INI_deny_fact{'rf'} == 1){ $COM{'rf'} = ''; }
	if($INI_deny_fact{'cnt'} == 1){ $COOKIE{'cnt'} = ''; }
}



#-------------------------------------------------------------------------------
#-------------------------------------------------- ログファイルの書き込み処理▼
#--- 時刻調整
&require($INI_require_path{'dtime'});
@tm = &dtime($INI{'time'});


#--- ログ記録に関するもろもろの設定
$INI{'log_file_path'} = "$INI{'log_files_dir_path'}$tm[5]$tm[4]$tm[3]_$INI{'add_log_str'}\.cgi";
$INI{'log_data'} = "$INI{'time'}\,$COOKIE{'id'}\,$COM{'pf'}\,$INI{'remote_host'}\,$INI{'remote_addr'}\,$INI{'proxy'}\,$INI{'true_host'}\,$INI{'hua'}\,$COM{'lng'}\,$COM{'swh'}\,$COM{'cd'}\,$COM{'pd'}\,$COM{'pg'}\,$COOKIE{'pg'}\,$INI{'stay_time'}\,$COOKIE{'cnt'}\,$COM{'rf'}\n";


#--- ファイルロック
&require($INI_require_path{'filelock'});
1 while (not defined($INI{'lfh'} = &filelock($INI{'filelock_dir'},$INI{'log_lock_file'},$INI{'lock_timeout'},$INI{'lock_retry'})));


#--- ログファイルの有無により処理分岐
if(-e $INI{'log_file_path'}){
	#--- 既にログファイルがある場合
	open(ADDLOG,">>$INI{'log_file_path'}") || &error('ログファイルの読み込みオープンに失敗しました。');
	print ADDLOG $INI{'log_data'};
	close(ADDLOG);
	eval(chmod oct($INI{'pm_rw'}),$INI{'log_file_path'});
	#--- 本日カウント更新
	if($COM{'cnt'} ne 'no'){
		open(RCNT,"<$INI{'today_count_file_path'}") || &error('カウンタファイルが開けません。');
		$INI{'count_today'} = <RCNT>;
		close(RCNT);
		$INI{'count_today'}++;
		open(WCNT,">$INI{'today_count_file_path'}") || &error('カウンタファイルの書き込みに失敗しました。');
		print WCNT "$INI{'count_today'}";
		close(WCNT);
		eval(chmod oct($INI{'pm_rw'}),$INI{'today_count_file_path'});
		#--- ページごとのカウント処理
		if($INI{'page_count_dir'} ne ''){
			if(-e "$INI{'page_count_dir'}$COM{'pg'}_today.cgi"){
				open(RCNT,"<$INI{'page_count_dir'}$COM{'pg'}_today.cgi") || &error('カウンタファイルが開けません。');
				$INI{'count_today'} = <RCNT>;
				close(RCNT);
				$INI{'count_today'}++;
			}else{
				$INI{'count_today'} = 1;
			}
			open(WCNT,">$INI{'page_count_dir'}$COM{'pg'}_today.cgi") || &error('カウンタファイルの書き込みに失敗しました。');
			print WCNT "$INI{'count_today'}";
			close(WCNT);
			eval(chmod oct($INI{'pm_rw'}),"$INI{'page_count_dir'}$COM{'pg'}_today.cgi");
		}
	}
}else{
	#--- 新規にログファイルを作成する場合
	open(NEWLOG,">$INI{'log_file_path'}") || &error('ログファイルの新規作成に失敗しました。');
	print NEWLOG $INI{'log_data'};
	close(NEWLOG);
	eval(chmod oct($INI{'pm_rw'}),$INI{'log_file_path'});
	#--- 昨日・本日カウント更新
	if(-e "$INI{'today_count_file_path'}"){
		open(RCNT,"<$INI{'today_count_file_path'}") || &error('カウンタファイルが開けません。');
		$INI{'count_today'} = <RCNT>;
		close(RCNT);
	}else{
		$INI{'count_today'} = 0;
	}
	open(WCNT,">$INI{'yesterday_count_file_path'}") || &error('カウンタファイルの書き込みに失敗しました。');
	print WCNT "$INI{'count_today'}";
	close(WCNT);
	open(WCNT,">$INI{'today_count_file_path'}") || &error('カウンタファイルの書き込みに失敗しました。');
	if($COM{'cnt'} ne 'no'){
		print WCNT "1";
	}else{
		print WCNT "0";
	}
	close(WCNT);
	eval(chmod oct($INI{'pm_rw'}),$INI{'today_count_file_path'});
	eval(chmod oct($INI{'pm_rw'}),$INI{'yesterday_count_file_path'});
	#--- ページごとのカウント処理
	if($INI{'page_count_dir'} ne ''){
		opendir(DIR,"$INI{'page_count_dir'}") || &error('ページごとのカウンタディレクトリが開けません。');
		foreach (readdir(DIR)){
			if($_ =~ /(.+)\_today\.cgi$/){
				$INI{'pgcnt'} = "$1";
				open(RCNT,"<$INI{'page_count_dir'}$INI{'pgcnt'}_today.cgi") || &error('カウンタファイルが開けません。');
				$INI{'count_today'} = <RCNT>;
				close(RCNT);
				open(WCNT,">$INI{'page_count_dir'}$INI{'pgcnt'}_yesterday.cgi") || &error('カウンタファイルの書き込みに失敗しました。');
				print WCNT "$INI{'count_today'}";
				close(WCNT);
				open(WCNT,">$INI{'page_count_dir'}$INI{'pgcnt'}_today.cgi") || &error('カウンタファイルの書き込みに失敗しました。');
				if($COM{'cnt'} ne 'no' && $INI{'pgcnt'} eq $COM{'pg'}){
					print WCNT "1";
				}else{
					print WCNT "0";
				}
				close(WCNT);
				eval(chmod oct($INI{'pm_rw'}),"$INI{'page_count_dir'}$INI{'pgcnt'}_today.cgi");
				eval(chmod oct($INI{'pm_rw'}),"$INI{'page_count_dir'}$INI{'pgcnt'}_yesterday.cgi");
			}
		}
		closedir(DIR);
	}
	#--- ログの数を調整する処理
	if($INI{'save_log_num'} > 0){
		opendir(DIR,"$INI{'log_files_dir_path'}") || &error('ログ保存ディレクトリが開けません。');
		foreach (readdir(DIR)){
			if($_ =~ /^(\d\d\d\d\d\d\d\d)_$INI{'add_log_str'}\.cgi$/){
				push(@save_logs,$_);
			}
		}
		closedir(DIR);
		@save_logs = sort(@save_logs);
		while($#save_logs >= $INI{'save_log_num'}){
			$del_log_file = shift(@save_logs);
			unlink("$INI{'log_files_dir_path'}$del_log_file") || &error('ログファイルの削除に失敗しました。');
		}
	}
}
&unlock($INI{'lfh'});# ロック解除



#-------------------------------------------------------------------------------
#---------------------------------------------------------------- カウンタ処理▼
#--- ファイルロック
1 while (not defined($INI{'lfh'} = &filelock($INI{'filelock_dir'},$INI{'count_lock_file'},$INI{'lock_timeout'},$INI{'lock_retry'})));


#--- トータルカウンタ
if($COM{'cnt'} ne 'no'){
	if(-e $INI{'count_file_path'}){
		#--- カウンタファイルがある場合
		#--- カウント数読み込み
		open(RCNT,"<$INI{'count_file_path'}") || &error('カウンタファイルが開けません。');
		$INI{'count_total'} = <RCNT>;
		$INI{'count_since'} = <RCNT>;
		close(RCNT);
		chomp($INI{'count_total'});
		$INI{'count_total'}++;
		#--- カウント数書き込み
		open(WCNT,">$INI{'count_file_path'}") || &error('カウンタファイルの書き込みに失敗しました。');
		print WCNT "$INI{'count_total'}\n$INI{'count_since'}";
		close(WCNT);
	}elsif(!-e $INI{'count_file_path'}){
		#--- カウンタファイルがない場合(カウンタリセット)
		#--- カウント数書き込み
		if($COM{'cnt'} ne 'no'){
			$INI{'count_total'} = 1;
		}else{
			$INI{'count_total'} = 0;
		}
		open(WCNT,">$INI{'count_file_path'}") || &error('カウンタファイルの新規作成に失敗しました。');
		print WCNT "$INI{'count_total'}\n$tm[5]/$tm[4]/$tm[3] $tm[2]:$tm[1]:$tm[0]";
		close(WCNT);
	}
	eval(chmod oct($INI{'pm_rw'}),$INI{'count_file_path'});
	#--- ページごとのトータルカウンタ
	if($INI{'page_count_dir'} ne ''){
		if(-e "$INI{'page_count_dir'}$COM{'pg'}_total.cgi"){
			#--- カウンタファイルがある場合
			#--- カウント数読み込み
			open(RCNT,"<$INI{'page_count_dir'}$COM{'pg'}_total.cgi") || &error('カウンタファイルが開けません。');
			$INI{'pg_count_total'} = <RCNT>;
			$INI{'pg_count_since'} = <RCNT>;
			close(RCNT);
			chomp($INI{'pg_count_total'});
			$INI{'pg_count_total'}++;
			#--- カウント数書き込み
			open(WCNT,">$INI{'page_count_dir'}$COM{'pg'}_total.cgi") || &error('カウンタファイルの書き込みに失敗しました。');
			print WCNT "$INI{'pg_count_total'}\n$INI{'pg_count_since'}";
			close(WCNT);
		}else{
			#--- カウンタファイルがない場合(カウンタリセット)
			#--- カウント数書き込み
			open(WCNT,">$INI{'page_count_dir'}$COM{'pg'}_total.cgi") || &error('カウンタファイルの新規作成に失敗しました。');
			print WCNT "1\n$tm[5]/$tm[4]/$tm[3] $tm[2]:$tm[1]:$tm[0]";
			close(WCNT);
		}
		eval(chmod oct($INI{'pm_rw'}),"$INI{'page_count_dir'}$COM{'pg'}_total.cgi");
	}
}elsif(-e $INI{'count_file_path'}){
		#--- カウンタファイルがある場合
		#--- カウント数読み込み
		open(RCNT,"<$INI{'count_file_path'}") || &error('カウンタファイルが開けません。');
		$INI{'count_total'} = <RCNT>;
		$INI{'count_since'} = <RCNT>;
		close(RCNT);
		chomp($INI{'count_total'});
}

&unlock($INI{'lfh'});# ロック解除



#-------------------------------------------------------------------------------
#------------------------------------------------------ チェックメール送信処理▼
if($INI{'cmd_sendmail'} ne ''){
	# キーワードを含むログをメール
	foreach (@INI_mail_check_words){
		if($_ ne '' && ($INI{'log_data'} =~ /\Q$_\E/ || $_ eq 'all_log_mail')){
			if($_ eq 'all_log_mail'){
				$INI{'mail_msg'} = <<"_TXT_";
■全てのログをメールする設定です。$tm[5]/$tm[4]/$tm[3] $tm[2]:$tm[1]:$tm[0]

$INI{'log_data'}
_TXT_
			}else{
				$INI{'mail_msg'} = <<"_TXT_";
■「$_」を含むログが記録されました。\n$tm[5]/$tm[4]/$tm[3] $tm[2]:$tm[1]:$tm[0]

$INI{'log_data'}
_TXT_
			}
			&require($INI_require_path{'sendmail'});
			&sendmail($INI{'mail_master'},$INI{'mail_master'},$INI{'mail_title'},$INI{'mail_msg'});
		}
	}
	#--- キリ番ゲッターをメール
	if($INI{'kiri_mail'} == 1 && $INI{'count_total'} =~ /^0+$|^1+$|^2+$|^3+$|^4+$|^5+$|^6+$|^7+$|^8+$|^9+$/){
		$INI{'mail_msg'} = <<"_TXT_";
■キリ番「$INI{'count_total'}」がカウントされました。$tm[5]/$tm[4]/$tm[3] $tm[2]:$tm[1]:$tm[0]

$INI{'log_data'}
_TXT_
		&require($INI_require_path{'sendmail'});
		&sendmail($INI{'mail_master'},$INI{'mail_master'},$INI{'mail_title'},$INI{'mail_msg'});
	}
}


#--- 出力処理
&put_data(1);
exit; #--- dsw.cgi 処理終了



#-------------------------------------------------------------------------------
#---------------------------------------------------------------- データの出力▼
sub put_data {

	if($_[0] == 0 && $COM{'p'} ne 'n' && $COM{'p'} ne 'm'){
		if($INI{'count_total'} !~ /^(\d+)$/){
			#--- 総PVとカウント開始日の取得
			if(-e $INI{'count_file_path'}){
				#--- カウンタファイルがある場合
				open(RCNT,"<$INI{'count_file_path'}") || &error('カウンタファイルが開けません。');
				$INI{'count_total'} = <RCNT>;
				$INI{'count_since'} = <RCNT>;
				close(RCNT);
				chomp($INI{'count_total'});
				chomp($INI{'count_since'});
			}else{
				#--- カウンタファイルがない場合
				$INI{'count_total'} = "0000";
				$INI{'count_since'} = "---";
			}
		}
	}

	if($COM{'md'} ne 's'){
		# IMG + JavaScript or IMG
		if($INI{'wwcheck_by_cookie'} == 1){
			#--- クッキー書き込み
			&require($INI_require_path{'cookie'});
			&put_cookie("$INI{'cookie_name'}",$INI{'cookie_on_days'},"t:$INI{'time'}\,pg:$COM{'pg'}\,id:$COOKIE{'id'}\,cnt:$COOKIE{'cnt'}",$INI{'cookie_path'});
		}
		#--- 画像データ出力
		print "Content-type: image/gif\n";
		print "Pragma: no-cache\n";
		print "Cache-Control: no-cache\n";
		print "Expires: Thu, 01 Dec 1994 16:00:00 GMT\n\n";
		if($COM{'p'} eq 'n'){
			#--- 見た目何もナシの画像を出力
			foreach (@INI_image){
				$INI{'i'} = pack('C*',hex($_));
				print $INI{'i'};
			}
		}elsif($COM{'p'} eq 'm'){
			#--- d ロゴの出力
			if($INI{'logo_file_path'} ne ''){
				if(-e $INI{'logo_file_path'}){
					open(RIMG,"<$INI{'logo_file_path'}") || die('ロゴ画像ファイルが開けません');
					while(<RIMG>){
						print $_;
					}
					close(RIMG);
				}
			}else{
				foreach (@INI_image2){
					$INI{'i'} = pack('C*',hex($_));
					print $INI{'i'};
				}
			}
		}elsif($COM{'p'} eq 'g' || $COM{'p'} eq '' || $COM{'p'} eq 't'){
			#--- カウンタ画像の出力
			if($INI{'cnt_total_keta'} > 0){ $COM{'k'} = $INI{'cnt_total_keta'}; }
			$INI{'count_total'} = "0" x ($COM{'k'} - (length("$INI{'count_total'}"))) . "$INI{'count_total'}";
			@INI_put_image = split(//,$INI{'count_total'});
			$INI{'i'} = 0;
			foreach (@INI_put_image){
				$INI_put_image[$INI{'i'}] = "$INI{'cnt_images_path'}$_\.gif";
				$INI{'i'}++;
			}
			# 連結画像を出力
			&require($INI_require_path{'gifcat'});
			binmode(STDOUT);
			print &gifcat'gifcat(@INI_put_image);
		}

	}else{

		print "Content-type: text/html;\n";
		print "Pragma: no-cache\n";
		print "Cache-Control: no-cache\n";
		print "Expires: Thu, 01 Dec 1994 16:00:00 GMT\n\n";
		#--- SSI
		if($COM{'p'} eq 't'){
			#--- SSI でテキストカウンタ出力
			print $INI{'count_total'};
		}elsif($COM{'p'} eq 'g' || $COM{'p'} eq ''){
			#--- SSI でカウンタ画像の出力
			if($INI{'cnt_total_keta'} > 0){ $COM{'k'} = $INI{'cnt_total_keta'}; }
			$INI{'count_total'} = "0" x ($COM{'k'} - (length("$INI{'count_total'}"))) . "$INI{'count_total'}";
			@INI_put_image = split(//,$INI{'count_total'});
			foreach (@INI_put_image){
				print "<img src=\"$INI{'cnt_images_url_path'}$_\.gif\" border=0 alt=\"since $INI{'count_since'}\">";
			}
		}elsif($COM{'p'} eq 'm'){
			#--- SSI でカウンタ出力なし
			if($COM{'char'} eq 'sjis' || $COM{'char'} eq 'jis'){
				$i = $INI{'ssi_put_line'};
				&$jcnv(\$i,$COM{'char'});
			}else{
				$i = $INI{'ssi_put_line'};
			}
			print "$i";
		}elsif($COM{'p'} eq 'n'){
			#--- SSI で出力なし
			print " ";
		}

	} # close if($COM{'md'} ne 's')

	return;

}



#-------------------------------------------------------------------------------
#------------------------------------------------------------------ エラー処理▼
sub error {
	&require($INI_require_path{'filelock'});
	&unlock($INI{'lfh'});
	&put_data(0);
	die "$_[0] : $!";
	exit;
}





#-------------------------------------------------------------------------------
#               Copyright (c) 2001-CurrentYear bayashi.net. All rights reserved.
#                                                       http://tech.bayashi.net/