----- Command Infomation ----- argc is 1 argv is util.pl ----- Script Infomation of util.pl----- # CGI用ユーティリティ集 # by Naotoshi Haraguchi # 2001/03/06 作成 # 2001/03/19 ロック系処理のバグ修正 # 2001/03/20 getparamサブルーチンの追加 # # exitERR(msg) # msg: AP生成エラーメッセージ # 無し # sub exitERR{ local($msg) = @_; $msg =~ s/\n/
\n/g; print < エラー出力 $msg

$! END_OF_ERR_HTML exit(1); } #ロック関連設定値 $useflock = 1; #flockシステムコール(使用する:1、使用しない:0) $LOCK_SH = 1; #共有ロック $LOCK_EX = 2; #排他ロック $LOCK_NB = 4; #非ブロック $LOCK_UN = 8; #ロック解除 $Lprefix = "L-"; #ロックファイルのプレフィックス # # lockopen(fh, modefile) # fh: ファイルハンドル # modefile: ファイル名(モードを含む) # true or false # sub lockopen{ local($fh, $modefile) = @_; local($retry) = 100; #ロックファイルの作成で制御する場合のリトライ回数 local($interval) = 0.1; #ロックファイルの作成で制御する場合のリトライ間隔(秒) local($rtn); #返却値 local($lockfile); #ロックファイル名 local($i); #ループカウンタ local($kekka); #処理結果フラグ #前処理 $modefile =~ s/^\s*//; #前スペース削除 $modefile =~ s/\s*$//; #後スペース削除 $modefile =~ /^(\+?({0,2}\s*))((.*(\/|\\))*)(.*)$/; local($mode) = $1; #1番目のパターン:(\+?({0,2}\s*)) local($path) = $3; #3番目のパターン:((.*(\/|\\))*) local($file) = $6; #6番目のパターン:(.*) #ファイルオープン open($fh, $modefile) || exitERR("lockopen: $modefile のオープンに失敗しました。"); #ロック処理 if($useflock == 1){ #flockを使用する場合 $rtn = flock($fh, $LOCK_EX); if(!$rtn){ close($fh); exitERR("lockopen: ファイルハンドル$fh のロックに失敗しました。"); } } else{ #ロックファイルで制御する場合 $lockfile = $path.$Lprefix.$file; $kekka = 0; for($i=0 ; $i < $retry ; $i++){ if(-f $lockfile){ sleep($interval); } else{ open(LOCKFILE, ">$lockfile") || exitERR("lockopen: $lockfile を作成できません。"); close(LOCKFILE); $kekka = 1; last; } } if($kekka != 1){ exitERR("lockopen: $path.$file のロックに失敗しました。") } } return 1; } # # unlockclose(fh) # fh: ファイルハンドル # fname: ファイル名(モードは含まない) # true or false # sub unlockclose{ local($fh, $fname) = @_; local($rtn); #返却値 local($lockfile); #ロックファイル名 local($i); #ループカウンタ #前処理 $fname =~ s/^\s*//; #前スペース削除 $fname =~ s/\s*$//; #後スペース削除 $fname =~ /^((.*(\/|\\))*)(.*)$/; local($path) = $1; #1番目のパターン:((.*(\/|\\))*) local($file) = $4; #4番目のパターン:(.*) #ファイルクローズ close($fh) || exitERR("unlockclose: ファイルハンドル$fh のクローズに失敗しました。"); #アンロック処理 if($useflock == 1){ #flockを使用する場合、close時点でアンロック終了済み } else{ #ロックファイルで制御する場合 $lockfile = $path.$Lprefix.$file; unlink($lockfile) || exitERR("unlockclose: $lockfile の削除に失敗しました。"); } return 1; } # # getparam(jcode) # jcode: 取得時の日本語コード("euc" or "jis" or "sjis" or "") # %data: 取得データの連想配列 # sub getparam{ local($jcode) = @_; unshift(@INC, "."); require "jcode.pl"; local(*data); #取得データ local($rtn); #返却値 local($i); #ループカウンタ #クエリーの読込み local($method) = $ENV{"REQUEST_METHOD"}; if($method eq "get" || $method eq "GET"){ $query = $ENV{"QUERY_STRING"}; } elsif($method eq "post" || $method eq "POST"){ read(STDIN, $query, $ENV{"CONTENT_LENGTH"}); } # @query = split(/&/, $query); foreach $i (@query){ $i =~ tr/+/ /; local($key, $val) = split(/=/, $i); $key =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C", hex($1))/ge; # decode $val =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C", hex($1))/ge; # decode $val =~ s/\r\n/\n/g; # WIN to UNIX $val =~ s/\r/\n/g; # MAC to UNIX jcode'convert(*key, $jcode) if($jcode); jcode'convert(*val, $jcode) if($jcode); $data{$key} = $val; } return %data; } 1;