#!/usr/local/bin/perl # ↑ Perl処理系のパスを指定。不明な場合はプロバイダかサーバー管理者に確認。 # WEBサイト アクセス解析ソフト (ログ取得用) # [アクセス・トラッカー] # - Version 2.01 / Apr 28, 2004 / Freesoft # - Copyright(C)2004 WEB POWER. All Rights Reserved. # - 最新版・最新情報は # <<注意事項>> # * 数字以外は''内に記述します。'を入れたい場合は 中の'は \'にしてください。 # ex) × $var = value; → ○ $var = 'value'; # ex) × $var = 'I can't'; → ○ $var = 'I can\'t'; # * $ # ; ' 等の記号は間違って消さないように注意してください。 # * 1文字のミスでもプログラムは動きません。設定・編集は慎重にしましょう。 # * 行の頭に"#"を付けると、その行は無効になります。(コメントアウト) # * 値を設定しない場合は、''かコメントアウトしてください。 # ex) × $var = ; → ○ $var = ''; # * 初期設定以外の部分を1バイトでも変更した場合の動作保証は一切しません。 # * 詳しくは本サイトの解説/FAQ等を参照してください。 # * 漢字コードは自動認識ですが、携帯電話で使う場合は"SHIFT_JIS"専用です。 # * ●は必須設定項目です。必ず設定してください。 # * ◎は確認必要項目です。サーバー環境によっては変更が必要です。 # * ○は任意設定項目です。必要に応じて設定してください。 #-------- 特定機能の使用に関する設定 ------------------------------------------ # # ◎印はサーバー環境によっては正常に動作しない場合があります。 # その場合は、その機能を無効にしてください。 # ○ ログの最大保持数 (あまり大きくしない) $max = 5000; $dmax = 90; # ○ 日付別ログの最大保持日数(あまり大きくしない) $days = 60; # ○ クッキーの有効日数(再訪問として扱う日数) $hold = 30; # ○ 重複記録防止のためのIPアドレス保持数 # * 0 にするとページビューで解析されます。 $plus = 0; # ○ 累計値にプラスする数値 (カウンター使用時のみ) $uvst = 0; # ○ ユニークビジターのみを解析(1:する/0:しない) # * 同一者は1日に1回しかカウントしない # ($holdを有効にしている必要があります) $lock = 2; # ◎ ファイルロック(1:使う/2:使う/0:使わない) $cchek = 0; # ○ ブラウザクッキーサポート確認(1:する/0:しない) # * 解析ページに確認用HTMLを記述する必要があります。 # ○ クッキーの名前 (通常変更不要) $cname = 'cookie'; #---<パス/URLの設定>------------------------------------------------------------ # # ・ パスとはサーバー内での場所です。httpで始まるURIとは違うものです。 # ・ 相対パスとはスクリプトの場所を基準としたパスの指定です。 # ../ => 1つ上のディレクトリ ./ => 同じディレクトリ # ・ 絶対パスとはサーバー内の一番上のディレクトリを基準としたパスの指定です。 # /usr/lib/sendmail /home/foo/public_html/cgi-bin/script.cgi # ・ 仮想アドレスとはURIの一部分(ドメイン名以降)を指します。 # http://www.domain.com/~foo/cgi-bin/script.cgi # ^ ドメイン名の後のスラッシュ"/"以降の部分 # (/~foo/cgi-bin/script.cgi のこと) # ◎ ライブラリ(stdio.pl)の[パス] require './stdio.pl'; # ◎ ライブラリ(jcode.pl)の[パス] require './jcode.pl'; # ◎ ライブラリ(gifcat.pl)の[パス] # * アクセスカウンターを使う場合のみ必要。使わない場合はコメントアウト。 #require 'gifcat.pl'; # ○ ログファイル格納用のディレクトリのパス $datadir = './data/'; # ○ エラーファイルの名前 (通常変更不要) $errname = './errors.txt'; # ○ あなたのサイトのトップディレクトリのURL (外部からの不正利用を防止する場合) # * http://..で指定する (例:'http://www.bar.ne.jp/~foo/') $site = 'http://www.dome-sss.com/jcah/'; #───────────────────────────────────────# # 初期設定ここまで (以下1バイトでも変更した場合の動作保証&サポートは一切なし) # #━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━# # ソースコードの文字コード認識 if (ord "漢" == 0xb4 || ord "漢" == -76) { $jcode = "euc"; #$JCODE2 = "EUC-JP"; #$CHARSET = "; charset=EUC-JP"; } elsif (ord "漢" == 0x8a || ord "漢" == -118) { $jcode = "sjis"; #$JCODE2 = "Shift_JIS"; #$CHARSET = "; charset=Shift_JIS"; } elsif (ord "漢" == 0x1b) { $jcode = "jis"; #$JCODE2 = "ISO-2022-JP"; #$CHARSET = "; charset=ISO-2022-JP"; } $SIG{'PIPE'} = $SIG{'INT'} = $SIG{'HUP'} = $SIG{'QUIT'} = $SIG{'TERM'} = "sigexit"; %FORM = stdio::QueryString(1,2); #/*--- エラーチェック ---*/ if ($ENV{'HTTP_REFERER'} !~ /$site/ && $site) { Errors(); } elsif (!$FORM{'file'}) { Errors('システムエラー','ファイル名が指定されていません。'); } #/*--- ファイル名の設定 ---*/ $FORM{'file'} = substr $FORM{'file'}, 0, 64; $FORM{'file'} =~ s/(^\/|\.\.\/)//g; $FORM{'file'} =~ s/\//-_-/g; $datafile = $datadir . $FORM{'file'} . ".acs"; $addrfile = $datadir . $FORM{'file'} . '.adr'; $cook = stdio::SetTime('ww2, dd-mm2-yyyy 23:59:59 GMT') if ($uvst); $date = stdio::SetTime('yyyy/mm/dd (ww) hh:nn:ss'); $now = $date; #/*--- 比較用日付の調整 ---*/ ($tday,$week,$time) = split(/ /, $date); $week =~ s/(\(|\))//g; ($time) = (split(/:/, $time))[0]; ($year,$month) = split(/\//, $tday); $month = $year . '/' . $month; #/*--- 環境変数の設定 ---*/ if ($ENV{'REMOTE_HOST'} eq $ENV{'REMOTE_ADDR'} || !$ENV{'REMOTE_HOST'}) { $ENV{'REMOTE_HOST'} = $ENV{'REMOTE_ADDR'} if (!$ENV{'REMOTE_HOST'}); $ENV{'REMOTE_HOST'} = gethostbyaddr(pack('C4',split(/\./,$ENV{'REMOTE_HOST'})),2) || $ENV{'REMOTE_ADDR'}; } $host = $ENV{'REMOTE_HOST'}; $USER_AGENT = substr $ENV{'HTTP_USER_AGENT'}, 0, 256; $USER_AGENT =~ tr/<>"&\a\b\t/()'-/d; #/*--- IPアドレスの記録 ---*/ if ($hold) { @ADDR = stdio::ReadFile($addrfile); if ($ADDR[0]) { foreach (@ADDR) { $ip = $_; chomp($ip); if ($ip eq $ENV{'REMOTE_ADDR'}) { $no_count = 1; last; } } } else { shift(@ADDR); } if (!$no_count) { unshift(@ADDR, "$ENV{'REMOTE_ADDR'}\n"); splice(@ADDR, $hold) if ($#ADDR >= $hold); if (open(FILE,">$addrfile")) { print FILE @ADDR; close(FILE); } } } if (!$FORM{'jump'}) { $FORM{'link'} = $FORM{'ref'} if ($FORM{'ref'} ne ""); $FORM{'link'} = substr $FORM{'link'}, 0, 256; $FORM{'link'} =~ tr/ /+/; $FORM{'link'} =~ s/<//g; $FORM{'link'} =~ s/"/"/g; $FORM{'link'} =~ s/&/&/g; $link = $link2 = $FORM{'link'}; $link =~ s/(.*)\?.*/$1?/i; #/*--- サーチエンジンの判別 ---*/ if ($link eq 'http://search.yahoo.co.jp/bin/search?' || $link eq 'http://google.yahoo.co.jp/bin/query?' || $link eq 'http://search.yahoo.com/bin/search?' || $link eq 'http://search.yahoo.co.jp/bin/query?') { $sname = 'p'; } elsif ($link eq 'http://www.infoseek.co.jp/Titles?' || $link eq 'http://japan.infoseek.com/Titles?') { $sname = 'qt'; } elsif ($link eq 'http://www.goo.ne.jp/default.asp?') { $sname = 'MT'; } elsif ($link eq 'http://www.excite.co.jp/search.gw?' || $link eq 'http://jp.excite.com/search.gw?') { $sname = 's'; } elsif ($link eq 'http://www.lycos.co.jp/cgi-bin/pursuit?') { $sname = 'query'; } elsif ($link eq 'http://search.netplaza.biglobe.ne.jp/cgi-bin/search-renew3.cgi?') { $sname = 'key'; } elsif ($link eq 'http://search.fresheye.com/?') { $sname = 'kw'; } elsif ($link eq 'http://para.cab.infoweb.ne.jp/cgi-bin/para?') { $sname = 'Querystring'; } elsif ($link eq 'http://kaze.csj.co.jp/search/lookup-main.cgi?') { $sname = 'key'; } elsif ($link eq 'http://www.altavista.com/cgi-bin/query?' || $link eq 'http://www.google.com/search?' || $link eq 'http://www.google.co.jp/search?') { $sname = 'q'; } elsif ($link eq 'http://search.msn.co.jp/spresults.aspx?') { $sname = 'q'; $unicode = 1; } else { $cant_get_key = 1; } #/*--- キーワードの取得 ---*/ if (!$cant_get_key) { my($q) = $FORM{'ref'} ne "" ? $link2 : $ENV{'QUERY_STRING'}; my($trash, $key) = split(/\?/, $q); my(@KEY) = split(/&/, $key); foreach (@KEY) { if ($_ eq 'oe=UTF-8' || $_ eq 'ie=UTF-8') { $unicode = 1; } ($name,$value) = split(/=/, $_); if ($name eq $sname) { $keyword = $value; } } # キーワードデコード if ($keyword) { $keyword =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; $keyword =~ tr/+/ /; $keyword =~ s/&/&/g; $keyword =~ s/"/"/g; $keyword =~ s//>/g; # UTF-8をSHIFT_JISに変換 if ($unicode) { $keyword =~ s/([\xc0-\xdf][\x80-\xbf]|[\xe0-\xef][\x80-\xbf][\x80-\xbf])/utf($1)/eg; } jcode::convert(*keyword, $jcode) if ($jcode); } } } else { $link = $link2 = substr $FORM{'link'}, 0, 256;; } #/*--- 個別クッキー1 (前回訪問日時記録用) ---*/ %COOKIE1 = stdio::GetCookie("$cname.1.$FORM{'file'}"); #/*--- 個別クッキー2 (重複記録防止用) ---*/ %COOKIE2 = stdio::GetCookie("$cname.2.$FORM{'file'}"); #/*--- 共通クッキー1 (移動状況把握用) ---*/ %COOKIE3 = stdio::GetCookie($cname); #/*--- 共通クッキー2 (クッキーサポート確認用) ---*/ %COOKIE4 = stdio::GetCookie('CookieStatus'); $repeat = $check = 0; $COOKIE4{'cookie_status'} = 1 if(!$cchek); #/*--- クッキーサポートのチェック ---*/ $check = -1 if (!$COOKIE4{'cookie_status'} && $cchek); $COOKIE2{'NoCount'} = 1 if ($FORM{'type'} eq 'today' || $FORM{'type'} eq 'ysday'); if (!$COOKIE2{'NoCount'}) { #/*--- 閲覧ページ数の設定 ---*/ $pages = $COOKIE3{'pages'} + 1 if ($COOKIE3{'pages'} && $COOKIE3{'pages'} > 0 && $COOKIE3{'pages'} =~ /^\d{1,3}$/); #/*--- 前回訪問日の取得 ---*/ $check = $COOKIE1{'repeat'} if ($COOKIE1{'repeat'} =~ /^\d{4}\/\d{2}\/\d{2} .. \d{2}:\d{2}$/ || $COOKIE1{'repeat'} =~ /^\d{4}\/\d{2}\/\d{2} \(..\) \d{2}:\d{2}:\d{2}$/); if ($COOKIE1{'revisit'} && $COOKIE1{'revisit'} > 0 && $COOKIE1{'revisit'} =~ /^\d{1,4}$/) { $COOKIE1{'revisit'} ++; } else { $COOKIE1{'revisit'} = 1; } } else { $pages = $COOKIE3{'pages'}; $no_count = 1; } #/*--- セッション内はカウントしない ---*/ if (!$no_count) { #/*--- ロックのチェック ---*/ if (!stdio::LockCheck($datafile,$lock)) { exit(1); } #/*--- ファイルリード ---*/ @FILE = stdio::ReadFile($datafile); ($urls) = split(/\?/, $ENV{'HTTP_REFERER'}); #/*--- ファイルが空の場合 ---*/ if (!$FILE[1]) { $FILE[0] = "0\t0\t0\t0\t$tday\t$urls\t$now"; $FILE[2] = "日:0|0|0:0|0|0\t月:0|0|0:0|0|0\t火:0|0|0:0|0|0\t水:0|0|0:0|0|0\t木:0|0|0:0|0|0\t金:0|0|0:0|0|0\t土:0|0|0:0|0|0\t$tday"; $FILE[3] = "0:0|0|0:0|0|0\t1:0|0|0:0|0|0\t2:0|0|0:0|0|0\t3:0|0|0:0|0|0\t4:0|0|0:0|0|0\t5:0|0|0:0|0|0\t" . "6:0|0|0:0|0|0\t7:0|0|0:0|0|0\t8:0|0|0:0|0|0\t9:0|0|0:0|0|0\t10:0|0|0:0|0|0\t11:0|0|0:0|0|0\t" . "12:0|0|0:0|0|0\t13:0|0|0:0|0|0\t14:0|0|0:0|0|0\t15:0|0|0:0|0|0\t16:0|0|0:0|0|0\t17:0|0|0:0|0|0\t" . "18:0|0|0:0|0|0\t19:0|0|0:0|0|0\t20:0|0|0:0|0|0\t21:0|0|0:0|0|0\t22:0|0|0:0|0|0\t23:0|0|0:0|0|0"; $FILE[4] = "$month:0:0"; $first = 1; } else { chomp($FILE[0]); chomp($FILE[1]); chomp($FILE[2]); chomp($FILE[3]); chomp($FILE[4]); } #/*--- 総合ログの集計 ---*/ ($count,$tocnt,$yscnt,$rept,$today,$url,$now) = split("\t", $FILE[0]); $count ++; if ($today ne $tday) { $yscnt = $tocnt; $tocnt = 1; } else { $tocnt ++; } $url = $urls if ($urls); $rept ++ if ($check && $check != -1); $data = "$count\t$tocnt\t$yscnt\t$rept\t$tday\t$url\t$now\n"; #/*--- 日付別ログの集計 ---*/ $i = $find = 0; @DAILY_LOG = split("\t", $FILE[1]); if ($tocnt != 1 && $FILE[1]) { foreach (@DAILY_LOG) { ($type,$visit,$repeat) = split(/:/, $_); if ($tday eq $type) { $visit ++; $repeat++ if ($check && $check != -1); $find = 1; last; } $i ++; } $new_log = "$type:$visit:$repeat"; splice(@DAILY_LOG, $i, 1, $new_log); } else { $repeat = 1 if ($check && $check != -1); $new_log = "$tday:1:$repeat"; unshift(@DAILY_LOG, $new_log); splice(@DAILY_LOG, $dmax) if ($#DAILY_LOG > $dmax); } $daily_log = join("\t", @DAILY_LOG); $daily_log .= "\n" if ($daily_log !~ /\n$/); #/*--- 週別ログの集計 ---*/ $i = $find = 0; @WEEKLY_LOG = split("\t", $FILE[2]); $fin = pop(@WEEKLY_LOG); foreach (@WEEKLY_LOG) { last if (!$_); ($type,$visit,$repeat) = split(/:/, $_); if ($week eq '日' && $fin ne $tday) { ($visit1,$visit2,$visit3) = split(/\|/, $visit); ($repeat1,$repeat2,$repeat3) = split(/\|/, $repeat); $visit3 = $visit2; $repeat3 = $repeat2; $visit2 = $repeat2 = 0; if ($week eq $type) { $visit1 ++; $visit2 ++; $repeat1 ++ if ($check && $check != -1); $repeat2 ++ if ($check && $check != -1); } $visit = "$visit1|$visit2|$visit3"; $repeat = "$repeat1|$repeat2|$repeat3"; $WEEKLY_LOG2[$i] = "$type:$visit:$repeat"; } elsif ($week eq $type) { ($visit1,$visit2,$visit3) = split(/\|/, $visit); ($repeat1,$repeat2,$repeat3) = split(/\|/, $repeat); $visit1 ++; $repeat1 ++ if ($check && $check != -1); $visit2 ++; $repeat2 ++ if ($check && $check != -1); $visit = "$visit1|$visit2|$visit3"; $repeat = "$repeat1|$repeat2|$repeat3"; $find = 1; push(@WEEKLY_LOG, $tday); last; } $i ++; } if ($find) { $new_log = "$type:$visit:$repeat"; splice(@WEEKLY_LOG, $i, 1, $new_log); } elsif (@WEEKLY_LOG2) { push(@WEEKLY_LOG2, $tday); @WEEKLY_LOG = @WEEKLY_LOG2; } else { Errors('ログエラー','曜日別アクセスのログが破損しています。'); } $weekly_log = join("\t", @WEEKLY_LOG); $weekly_log .= "\n" if ($weekly_log !~ /\n$/); #/*--- 時間別ログの集計 ---*/ $i = $find = 0; @HOUR_LOG = split("\t", $FILE[3]); if ($tocnt == 1 && !$first) { foreach (@HOUR_LOG) { ($type,$visit,$repeat) = split(/:/, $_); ($visit1,$visit2,$visit3) = split(/\|/, $visit); ($repeat1,$repeat2,$repeat3) = split(/\|/, $repeat); $visit3 = $visit2; $repeat3 = $repeat2; $repeat2 = $visit2 = 0; $visit = "$visit1|$visit2|$visit3"; $repeat = "$repeat1|$repeat2|$repeat3"; $NEW_HOUR_LOG[$i] = "$type:$visit:$repeat"; $i ++; } @HOUR_LOG = @NEW_HOUR_LOG; } $i = 0; foreach (@HOUR_LOG) { ($type,$visit,$repeat) = split(/:/, $_); ($visit1,$visit2,$visit3) = split(/\|/, $visit); ($repeat1,$repeat2,$repeat3) = split(/\|/, $repeat); if ($time == $type) { $visit1 ++; $repeat1 ++ if ($check && $check != -1); $visit2 ++; $repeat2 ++ if ($check && $check != -1); $visit = "$visit1|$visit2|$visit3"; $repeat = "$repeat1|$repeat2|$repeat3"; $find = 1; last; } $i ++; } if (!$find) { Errors('ログエラー','時間帯別アクセスのログが破損しています。'); } $new_log = "$type:$visit:$repeat"; splice(@HOUR_LOG, $i, 1, $new_log); $hour_log = join("\t", @HOUR_LOG); $hour_log .= "\n" if ($hour_log !~ /\n$/); #/*--- 月間別ログの集計 ---*/ $i = $find = 0; @MONTHLY_LOG = split("\t", $FILE[4]); ($type,$visit,$repeat) = split(/:/, $MONTHLY_LOG[$#MONTHLY_LOG]); if ($type eq $month) { $visit ++; $repeat++ if ($check && $check != -1); $MONTHLY_LOG[$#MONTHLY_LOG] = "$month:$visit:$repeat"; } else { $repeat = 0; $repeat = 1 if ($check && $check != -1); $new_log = "$month:1:$repeat"; push(@MONTHLY_LOG, $new_log); } $monthly_log = join("\t", @MONTHLY_LOG); $monthly_log .= "\n" if ($monthly_log !~ /\n$/); $FORM{'screen'} = "" if ($FORM{'screen'} !~ /^\d{3,4}\*\d{3,4}$/); $FORM{'color'} = "" if ($FORM{'color'} !~ /^\d{1,2}$/); #/*--- 個別ログの集計 ---*/ $logs = "$date\t$host\t$link2\t$USER_AGENT\t$keyword\t$check\t$COOKIE1{'revisit'}\t$pages\t$FORM{'screen'}\t$FORM{'color'}\n"; #/*--- 配列をシフト ---*/ for (1 .. 5) { shift(@FILE); } #/*--- 古いログを削除 ---*/ if ($max < $#FILE) { splice(@FILE, $max); } #/*--- レコードの統括 ---*/ unshift(@FILE, $logs); unshift(@FILE, $monthly_log); unshift(@FILE, $hour_log); unshift(@FILE, $weekly_log); unshift(@FILE, $daily_log); unshift(@FILE, $data); #/*--- ロックのチェック ---*/ if (!stdio::LockCheck($datafile,$lock)) { Error(); } #/*--- ファイルのロック/入出力 ---*/ $locked = stdio::FileLock($datafile,$lock,@FILE); if ($locked == -1) { Errors('システムエラー','このサーバーではシンボリックリンクが使えません。'); } elsif (!$locked) { Errors(); } #/*--- カウンターを表示する ---*/ } elsif ($FORM{'type'}) { #/*--- ファイルリード ---*/ if (open(FILE,$datafile)) { $count_data = ; close(FILE); } ($count,$tocnt,$yscnt) = split("\t", $count_data); } $pages = 1 if (!$pages); $date =~ s/(\W)/sprintf("%%%02X", unpack("C", $1))/eg; # レスポンスヘッダー出力 if ($FORM{'jump'}) { print "Location: $FORM{'link'}\n" ; } else { print "Content-Type: image/gif\n"; } # クッキー発行 stdio::SetCookie("$cname.1.$FORM{'file'}","repeat:$date&revisit:$COOKIE1{'revisit'}",$days); stdio::SetCookie("$cname.2.$FORM{'file'}","NoCount:1",$cook) if($hold); stdio::SetCookie($cname,"pages:$pages",""); print "\n"; exit if ($FORM{'jump'}); binmode STDOUT; # カウンター数字表示 if ($FORM{'type'}) { if ($FORM{'type'} eq 'today') { $count = $tocnt; } elsif ($FORM{'type'} eq 'ysday') { $count = $yscnt; } elsif ($FORM{'type'} eq 'revst') { $count = $COOKIE1{'revisit'}; } else { $count += $plus; } &PrintCounter($count,$FORM{'fig'},$FORM{'img'}) if (-d $FORM{'img'}); } # 代替画像を表示 if ($FORM{'img'} !~ /(^\/|\.\.\/\.\.\/\.\.\/)/ && -e $FORM{'img'}) { if (open IN, $FORM{'img'}) { my($buf); binmode IN; while (read IN, $buf, 1024) { print $buf; } close IN; } } # クリアGIF画像表示 my(@image_hex) = qw(47 49 46 38 39 61 01 00 01 00 91 ff 00 ff ff ff 00 00 00 c0 c0 c0 00 00 00 21 f9 04 01 00 00 02 00 2c 00 00 00 00 01 00 01 00 40 02 02 54 01 00 3b); foreach (@image_hex) { my($data) = pack('C*', hex($_)); print $data; } exit; #/*------------------- カウンターを表示する -----------------------------------------*/ sub PrintCounter { my($count, $fig, $imgdir) = @_; my(@img); return if ($FORM{'img'} =~ /(^\/|\.\.\/\.\.\/\.\.\/)/); $count = 0 if (!$count || $count =~ /\D/); $count = sprintf("%0$fig"."d",$count) if ($fig > 2 && $fig < 12); foreach (split(//, $count)) { push @img, "$imgdir/$_.gif"; } print gifcat::gifcat(@img); exit; } # ユニコード変換 sub utf #($str) { my($str) = $_[0]; my(@list, $code); &load_table("utf8", "sjis"); $str =~ s/(.)/$code.=sprintf("%0X", ord $1)/eg; if ($CODE{$code} =~ /([0-9A-F]{2})([0-9A-F]{2})?([0-9A-F]{2})?/) { $list[0] = hex $1; $list[1] = hex $2 if ($2 ne ""); $list[2] = hex $3 if ($3 ne ""); } return pack("C*", @list); } # UNICODE⇔UTF8⇔SHIFT_JIS⇔EUC-JP 変換テーブルをロード sub load_table #($key, $val) { # →仮引数 my($key, $val) = @_; # ! 局所変数宣言 my(%code) = ( 'sjis' => 0, 'euc' => 1, 'unicode' => 2, 'utf8' => 3 ); $key = $code{$key}; $val = $code{$val}; return if ($load || $key eq "" || $val eq ""); return if (!open IN, "unicode.txt"); while () { tr/\r\n//d; my(@code) = split / +/; $CODE{$code[$key]} = $code[$val]; } close IN; $load = 1; return; } #/*------------------- エラー発生時の処理 -------------------------------------------*/ sub Errors { $errfile = $datadir . $errname; if ($_[0]) { if (open(FILE,">>$errfile")) { print FILE "$now,$_[0],$_[1]\n"; close(FILE); } } if ($_[0] ne 'ログエラー') { print "Content-type: image/gif\n\n"; stdio::FileOutput($FORM{'img'}); exit(1); } } sub sigexit { if (-e $stdio::lockfile) { unlink($stdio::lockfile); } if (-e $stdio::tempfile) { unlink($stdio::tempfile); } exit(0); }