%PDF- %PDF-
Direktori : /home/rappan/www/cgi_hicnt200/ |
Current File : //home/rappan/www/cgi_hicnt200/hilib.pl |
#┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ #┃Hi Library Ver 2.01 ┃ #┃オリジナル汎用ライブラリ ┃ #┃Copyright(C) 2002-2006 Hisashi All Rights Reserved. ┃ #┃ Web: http://www.e-hws.net/ ┃ #┃---[注意事項]-------------------------------------------┃ #┃このスクリプトはフリーソフトです。このスクリプトを使用 ┃ #┃したいかなる損害に対して作者は一切の責任を負いません。 ┃ #┃--------------------------------------------------------┃ #┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ #┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ #┃<変更履歴> ┃ #┃ -Date- -Ver- -Comment- ┃ #┃----------------------------------------------------------------------------------------┃ #┃2006.08.11 2.01 url_decode()追加 ┃ #┃2006.07.28 2.00 hilib.plを全スクリプト共通用に編集 ┃ #┃2006.01.10 1.12 disp_html()追加 ┃ #┃2005.07.13 1.11 get_osinf() get_server_os() deldir()追加 ┃ #┃2005.03.08 1.10 get_skin() substr2()追加 ┃ #┃2004.04.19 1.09 set_pass() get_pass()追加 ┃ #┃2004.02.20 1.08 アクセス判別処理追加 ┃ #┃2003.08.26 1.07 ページ移動処理にてtop.を削除 ┃ #┃2003.02.12 1.06 デバッグログにファイル名・行数を表示するように変更 ┃ #┃ 終了処理を削除 ┃ #┃2003.02.07 1.05 クッキー保存・取得処理追加 ┃ #┃2003.01.31 1.04 エラー画面出力処理追加 ┃ #┃2003.01.15 1.03 ユーザ情報ログ取得処理追加 ┃ #┃ デバッグログ取得処理にて最大出力ログ行数の設定追加 ┃ #┃2002.12.09 1.02 デコード処理にてPOST時の処理を追加 ┃ #┃ 曜日算出処理追加 ┃ #┃2002.12.03 1.01 ファイルロック・ロック解除処理追加 ┃ #┃2002.12.01 1.00 ローカル公開 ┃ #┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ #┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ #┃◆初期設定 ┃ #┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ $dbglogmax = 100; # デバッグログ最大行数 $dbg_log = "dbg.cgi"; # デバッグログファイル名 #┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ #┃時刻取得処理 ┃ #┃Param1 : 取得する時刻タイプ ┃ #┃ 0 = YYYY/MM/DD HH:MM:SS ┃ #┃ 1 = YYYY年M月D日(月) H:MM:SS ┃ #┃ 2 = YYYY/MM/DD(月) HH:MM:SS ┃ #┃ 3 = YYYYMM ┃ #┃ 4 = YYYYMMDD ┃ #┃ 5 = YYYY/MM/DD ┃ #┃ 6 = HH:MM:SS ┃ #┃ 7 = YYYY/M/D H:MM:SS ┃ #┃ 8 = YYYY,MM,DD ┃ #┃Return : 時刻情報 ┃ #┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ sub gettime{ my($type) = @_; my(@ret); if( $type eq "" ){ $type = 0; } my($times) = time;#18時間時差があるなら、$times = time+18*60*60とする。 my($sec,$min,$hour,$mday,$month,$year,$wday,$yday,$isdst) = localtime($times); $year = $year + 1900; $month++; my($youbi) = ('Sun','Mon','Tue','Wed','Thu','Fri','Sat') [$wday]; my($youbi2) = ('日','月','火','水','木','金','土') [$wday]; $ret[0] = sprintf("%04d/%02d/%02d %02d:%02d:%02d", $year, $month, $mday, $hour, $min, $sec); $ret[1] = sprintf("%04d年%d月%d日(%s) %d:%02d:%02d", $year, $month, $mday, $youbi2, $hour, $min, $sec); $ret[2] = sprintf("%04d/%d/%d(%s) %d:%02d", $year, $month, $mday, $youbi2, $hour, $min); $ret[3] = sprintf("%04d%02d", $year, $month); $ret[4] = sprintf("%04d%02d%02d", $year, $month, $mday); $ret[5] = sprintf("%04d/%02d/%02d", $year, $month, $mday) ; $ret[6] = sprintf("%02d:%02d:%02d", $hour, $min, $sec) ; $ret[7] = sprintf("%04d/%d/%d %d:%02d:%02d", $year, $month, $mday, $hour, $min, $sec); if( $type == 8 ){ return($year, $month, $mday); } return($ret[$type]); }#gettime END #┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ #┃ファイルロック処理 ┃ #┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ sub lock{ my($lockdir) = @_; $lockdir = "${lockdir}loc"; $sleepcnt = 0; while(1){ if (!mkdir("$lockdir", 0777)){ # (ロックされている場合) # 最大リトライ回数を超えたらエラー画面表示 if( $sleepcnt >= $sleepmax ){ ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,$atime,$mtime,$ctime,$blksize,$blocks) = stat($lockdir); # ディレクトリ作成日付より10分以上経過しているか? if( $mtime + (10 * 60) < time ){ # (経過している場合) # ロックディレクトリを削除し、新たにロックディレクトリを作成 rmdir($lockdir); # ロックディレクトリが作成できなければビジー if (!mkdir("$lockdir", 0777)){ &errhtml("ただ今混み合っています。しばらくたってから再度実行して下さい。"); } last; } # (経過していない場合) # ビジー &errhtml("ただ今混み合っています。しばらくたってから再度実行して下さい。"); } sleep(1); $sleepcnt = $sleepcnt + 1; }else{ # (ロックされていない場合) last; } } }# lock END #┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ #┃ファイルロック解除処理 ┃ #┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ sub unlock{ my($lockdir) = @_; $lockdir = "${lockdir}loc"; rmdir("$lockdir"); }# unlock END #┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ #┃曜日算出処理 ┃ #┃入力値:年 ┃ #┃入力値:月 ┃ #┃入力値:日 ┃ #┃入力値:出力タイプ(0:日曜日、1:日、2:Sun、なし:Sun) ┃ #┃戻り値:曜日 ┃ #┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ sub whatday{ my($yyyy, $mm, $dd, $type) = @_; my($whatday,$wday); # 曜日算出 if ($mm < 3) {--$yyyy; $mm+=12;} $wday=($yyyy+int($yyyy/4)-int($yyyy/100)+int($yyyy/400)+int((13*$mm+8)/5)+$dd)%7; if( $type == 0 ){ $whatday = ('日曜日','月曜日','火曜日','水曜日','木曜日','金曜日','土曜日') [$wday]; }elsif( $type == 1 ){ $whatday = ('日','月','火','水','木','金','土') [$wday]; }elsif( $type == 2 ){ $whatday = ('Sun','Mon','Tue','Wed','Thu','Fri','Sat') [$wday]; }else{ $whatday = ('Sun','Mon','Tue','Wed','Thu','Fri','Sat') [$wday]; } return($whatday); }# whatday END #┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ #┃ページ移動処理 ┃ #┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ sub disp_page{ print "Location: $_[0]\n\n"; exit; }# disp_page END #┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ #┃デバッグ用ログ出力 ┃ #┃ Param1:出力ログメッセージ ┃ #┃ Param2:ファイル名 ┃ #┃ Param3:行数 ┃ #┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ sub dbglog{ local($dbgmsg, $file, $line) = @_; &lock("$dbg_log"); $date = &gettime(0); open(DBG, $dbg_log); my(@dbgdata) = <DBG>; close(DBG); if( $file ne "" and $line ne "" ){ unshift(@dbgdata, "[$date] $file:$line > $dbgmsg\n"); }elsif( $file ne "" ){ unshift(@dbgdata, "[$date] $file > $dbgmsg\n"); }elsif( $line ne "" ){ unshift(@dbgdata, "[$date] $line > $dbgmsg\n"); }else{ unshift(@dbgdata, "[$date] > $dbgmsg\n"); } if( @dbgdata > $dbglogmax ){ $x = pop(@dbgdata); } open(DBG, ">$dbg_log"); print DBG @dbgdata; close(DBG); &unlock("$dbg_log"); }# dbglog END #┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ #┃エラー画面出力 ┃ #┃ Param1:エラーメッセージ ┃ #┃ Param2:エラーファイル ┃ #┃ Param3:エラー行数 ┃ #┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ sub errend{ local($errmsg, $errfile, $errline) = @_; print "Content-type: text/html\n\n"; print <<"_HTML_"; <html> <head> <meta http-equiv="content-type" content="text/html; charset=Shift_JIS"> <meta http-equiv="Content-Style-Type" content="text/css"> <meta http-equiv="Pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <title>Error Report.</title> </head> <body> <font color="red">Error Report.</font> <hr size="1"> <table border="0"> <tr> <td> File </td> <td> : $errfile </td> </tr> <tr> <td> Line </td> <td> : $errline </td> </tr> </table> <hr size="1"> $errmsg </body> </html> _HTML_ exit; }# errend END #┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ #┃クッキー取得処理 ┃ #┃ Param1:クッキーID ┃ #┃ Return:取得した値 ┃ #┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ sub get_cookie{ my($cookie_id) = @_; my($cooks); $cooks = $ENV{'HTTP_COOKIE'}; $cooks='' unless($cooks =~s/.*$cookie_id=(.*)chdend.*/$1/); return($cooks); }# get_cookie END #┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ #┃クッキー保存処理 ┃ #┃ Param1:クッキーID ┃ #┃ Param2:保存期間(月単位、0:ブラウザ閉じるまで) ┃ #┃ Param3:保存する値 ┃ #┃ Return:なし ┃ #┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ sub set_cookie{ my($cookie_id,$save,$value) = @_; local($dmy,$mdc,$monc,$yrc,$wdayc,$mc,$yc); if( $save != 0 ){ ($dmy,$dmy,$dmy,$mdc,$monc,$yrc,$wdayc,$dmy,$dmy) = localtime(time + ($save*31*24*60*60)); $yc = ('Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday') [$wdayc]; $mc = ('Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec') [$monc]; $yrc = $yrc+1900; $mdc = "0$mdc" if ($mdc < 10); print "Set-Cookie: $cookie_id=$value; expires=$yc, $mdc-$mc-$yrc 00:00:00 GMT\n"; }else{ print "Set-Cookie: $cookie_id=$value;\n"; } return; }# set_cookie END #┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ #┃スキンファイル読み込み処理 ┃ #┃入力値:スキンファイル名 ┃ #┃ :__FILE__ ┃ #┃ :__LINE__ ┃ #┃戻り値:スキンファイルデータ ┃ #┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ sub get_skin{ my($skin_file, $file, $line) = @_; my($skinhtml); # ファイルオープン open( IN, $skin_file ) || &errend("File Open Error. ( $skin_file )", $file, $line ); $skinhtml = join('', <IN>); close(IN); return( $skinhtml ); }# get_skin END #┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ #┃文字列抽出処理(半角全角混在) ┃ #┃入力値:文字列 ┃ #┃ :抽出開始位置 ┃ #┃ :抽出文字数 ┃ #┃戻り値:スキンファイルデータ ┃ #┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ sub substr2{ my($str, $st, $en) = @_; my($klen) = 0; my($len) = length($str); my($cn, $string, $i); my($ksubstring) = ''; for ($i = 0; $i < $len; $i++) { $string = substr($str, $i, 1); $cn = unpack("C", $string); if ($cn >= 129 && $cn <= 159 || $cn >= 224 && $cn <= 252) { $i++; $string .= substr($str, $i, 1); } if ($klen >= $st && $klen < $st + $en) { $ksubstring .= $string; } $klen++; } return($ksubstring); }# substr2 END #┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ #┃サーバOS取得処理 ┃ #┃入力値:なし ┃ #┃戻り値:"win"/"mac" ┃ #┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ sub get_server_os{ my($server_os); # OS取得 $server_os = $^O; # 環境変数から取得 if($server_os eq ""){ $server_os = $ENV{'OS'}; } # AnHTTPd /OmniHTTPd/IIS対策 if($ENV{'SERVER_SOFTWARE'} =~ /AnWeb|Omni|IIS\//i){ $server_os= 'win'; } # Win Apache 対策 if($ENV{'WINDIR'} ne ""){ $server_os= 'win'; } if($server_os eq ""){ $server_os = "mac"; } return($server_os); }# get_server_os END #┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ #┃ディレクトリ削除処理 ┃ #┃入力値:削除するディレクトリ ┃ #┃戻り値:0 = 成功 ┃ #┃ 1 = 失敗 ┃ #┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ sub deldir{ my($dir) = @_; my($ret) = 1; my($file); if( opendir(DIR, $dir) ){ foreach $file (readdir DIR){ if($file ne '.' && $file ne '..'){ if(-d "$dir/$file"){ $ret = &deldir("$dir/$file"); if( $ret ){ &dbglog("deldir($dir/$file) error. [$!]", __FILE__, __LINE__); $ret = 0; last; } }else{ $ret = unlink("$dir/$file"); if( !$ret ){ &dbglog("unlink($dir/$file) error. [$!]", __FILE__, __LINE__); $ret = 0; last; } } } } closedir(DIR); $ret = rmdir($dir); if( !$ret ){ &dbglog("rmdir($dir) error. [$!]", __FILE__, __LINE__); $ret = 0; } }else{ $ret = 0; } return(!$ret); }# deldir END #┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ #┃ディレクトリコピー処理 ┃ #┃入力値:コピー元ディレクトリ ┃ #┃入力値:コピー先ディレクトリ ┃ #┃戻り値:0 = 成功 ┃ #┃ 1 = 失敗 ┃ #┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ sub cpydir{ my($from_dir, $to_dir) = @_; my $ret = 1; my($f_file); # コピー先ディレクトリがなければ作成する if( -e "$to_dir" ){ }else{ # ディレクトリ作成 $ret = mkdir("$to_dir", 0777); if( !$ret ){ &dbglog("mkdir($to_dir) error. [$!]", __FILE__, __LINE__); } } if( opendir(F_DIR, $from_dir) ){ foreach $f_file (readdir F_DIR){ # .と..はスキップ if($f_file ne '.' && $f_file ne '..'){ # ディレクトリであれば再帰呼出し if(-d "$from_dir/$f_file"){ # ディレクトリコピー $ret = &cpydir("$from_dir/$f_file", "$to_dir/$f_file"); if( $ret == 1 ){ &dbglog("cpydir($from_dir/$f_file -> $to_dir/$f_file) error.", __FILE__, __LINE__); $ret = 0; last; }else{ $ret = 1; } }else{ # ファイルコピー $ret = copy( "${from_dir}/$f_file", "${to_dir}/$f_file" ) ; if( !$ret ){ &dbglog("copy($from_dir/$f_file -> $to_dir/$f_file) error. [$!]", __FILE__, __LINE__); last; } } } } closedir(F_DIR); }else{ &dbglog("mkdir($from_dir/$f_file) error. [$!]", __FILE__, __LINE__); $ret = 0; } return(!$ret); }# cpydir END #┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ #┃ディレクトリ移動処理 ┃ #┃入力値:移動元ディレクトリ ┃ #┃入力値:移動先ディレクトリ ┃ #┃戻り値:0 = 成功 ┃ #┃ 1 = 失敗 ┃ #┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ sub movdir{ my($from_dir, $to_dir) = @_; my($ret) = 0; # ディレクトリコピー $ret = &cpydir($from_dir,$to_dir); if( $ret ){ &dbglog("cpydir($from_dir -> $to_dir) error.", __FILE__, __LINE__); }else{ # 移動元ディレクトリ削除 $ret = &deldir($from_dir); if( $ret ){ &dbglog("deldir($from_dir) error.", __FILE__, __LINE__); } } return($ret); }# movdir END #┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ #┃HTML表示処理 ┃ #┃入力値:表示HTMLデータ ┃ #┃入力値:文字コード("sjis","u8") ┃ #┃戻り値:なし ┃ #┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ sub disp_html{ my ($html,$chara_code) = @_; print "Content-type: text/html\n\n"; print <<"_HTML_"; $html _HTML_ return; }# disp_html END #┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ #┃URLデコード処理 ┃ #┃入力値:エンコードされた文字列 ┃ #┃戻り値:デコードした文字列 ┃ #┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ sub url_decode{ local($str) = @_; $str =~ tr/+/ /; $str =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; &jcode'convert(*str,'sjis'); return($str); }# url_decode END #┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ #┃↓↓↓ 「1;」は削除しないで!! ↓↓↓ ┃ #┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ 1;