package lib; ############################################################ # ウェッブカレンダ&スケジューラ用ライブラリ # # 制作者: Koji Onishi # 制作日: 98.10.15 # 種類: フリーウエア # 動作確認: FreeBSD & perl5 # # 変更履歴 # 98.11.25 クッキーに対応させるためgetinputfromwebを修正 # 99.06.10 いろいろ変更 ############################################################ # NT & Perl32 の場合は下記のようにフルパスで書いたほうがいいようです。 #require "C:\\inetpub\\wwwroot\\webcal\\jcode.pl"; require "jcode.pl"; ############################################################ # 月末の数字 @monthday = ('31','28','31','30','31','30','31','31','30','31','30','31'); ############################################################ # ディレクトリがあるかないかをチェックし、 # なければ書込みモードでディレクトリを作成する # 引き数:ディレクトリパス # 戻り値:1=ディレクトリが存在する、もしくはディレクトリが作成された #     0=ディレクトリを作成できない # sub check_make_dir { local($dir) = @_; if(-d "$dir"){ return 1; }else{ if(mkdir("$dir",0777)){ chmod 0777, "$dir"; return 1; }else{ return 0; } } } ############################################################ # Windows対応flock # 引き数:ロックファイル名 # 戻り値:1=ロックファイルが存在する #     0=ロックファイルが存在しない # sub flock_on { local($lockfile) = @_; if(-f "$lockfile"){ return 1; }else{ if(open(LOCK,">$lockfile")){ print LOCK "lock"; close(LOCK); chmod 0777, "$lockfile"; return 0; }else{ return 0; } } } ############################################################ # Windows対応unflock # 引き数:ロックファイル名 # 戻り値:なし # sub flock_off { local($lockfile) = @_; unlink("$lockfile"); } ############################################################ # 月末の数字を求める # 引き数:年、月 # 戻り値:月末の数字 # sub getgetumatu { local($year,$mon) = @_; if($mon != 2){ return(@monthday[$mon-1]); }else{ if(&leapyear($year)){ return(29); }else{ return(28); } } } ############################################################ # 曜日を求める # 引き数:年、月、日 # 戻り値:曜日の数字 # 0="日",1="月",2="火",3="水",4="木",5="金",6="土" # sub getyoubi { local($year,$mon,$day) = @_; $time = &gettime($year,$mon,$day); ($sec,$min,$hour,$day,$mon,$year,$wday,$yday,$isdst) = gmtime($time); return($wday); } ############################################################ # localtimeやgmtimeの引き数にできる数字を求める # 引き数:年、月、日 # 戻り値:localtimeやgmtimeの引き数にできる数字 # sub gettime { local($year,$mon,$day) = @_; local($daynum,$time); $daynum = 0; $mon = $mon - 1; $daynum += ($year-1)*365+($year-1)/4-($year-1)/100+($year-1)/400; $daynum = int($daynum); for($i = 0; $i < $mon; $i++){ $daynum += $monthday[$i]; if($i == 1 && &leapyear($year)){ $daynum++; } } $daynum += $day; $time = ($daynum - 719163) * 24 * 60 * 60; return ($time); } ############################################################ # 閏年の判定 # 引き数:年 # 戻り値:1=閏年、0=閏年じゃない # sub leapyear { local($year) = @_; if(($year % 4 == 0 && $year % 100 != 0) || $year % 400 == 0){ return 1; }else{ return 0; } } ############################################################ # 2000年問題に対応した日付けを求める # 引き数:gettimeやtimeの戻り値 # 戻り値:年、月、日、曜日、時間、分、秒 # sub getdatetime { local($time) = @_; if($time eq ""){$time = time;} ($sec,$min,$hour,$day,$mon,$year,$wday,$yday,$isdst) = localtime($time); $year = $year+1900; $mon = $mon+1; # $mon = sprintf("%02d", $mon); # $day = sprintf("%02d", $day); $wday = @wdays[$wday]; # $hour = sprintf("%02d", $hour); # $min = sprintf("%02d", $min); # $sec = sprintf("%02d", $sec); return($year,$mon,$day,$wday,$hour,$min,$sec); } ############################################################ # WEBから送信されたフォームを読み込む # 引き数:jcode.plの文字コード(sjis,jis,euc,etc) # 戻り値:フォームの配列(%FORM) # sub read_input { $charset = $_[0]; $charset = 'euc' if ( $charset eq '' ); local ($buffer, @pairs, $pair, $envname, $value, %FORM); $ENV{'REQUEST_METHOD'} =~ tr/a-z/A-Z/; if ($ENV{'REQUEST_METHOD'} eq "POST"){ read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); }else{ $buffer = $ENV{'QUERY_STRING'}; } @pairs = split(/&/, $buffer); foreach $pair (@pairs){ ($envname, $value) = split(/=/, $pair); $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; $value =~ s//>/g; $value =~ s/\r\n/
/g; $value =~ s/\n/
/g; $value =~ s/\t/ /g; &jcode'convert(*value, $charset); $FORM{$envname} = $value; } %FORM; } ############################################################ # WEBから送信されたフォームを読み込みメインルーチンへ渡す # 引き数:jcode.plの文字コード(sjis,jis,euc,etc) # 戻り値:フォームの配列(form{'name'}) # sub getinputfromweb { %main'form = &read_input( @_ ); } ############################################################ # クッキーのデータを読み込む # 引き数:jcode.plの文字コード(sjis,jis,euc,etc) # 戻り値:クッキーの配列(%COOKIE) # sub read_cookie { $charset = $_[0]; $charset = 'euc' if ( $charset eq '' ); local ($cookies, @pairs, $pair, $cookie_name, $cookie_value, %COOKIE); $cookies = $ENV{'HTTP_COOKIE'}; @pairs = split(/;\s/, $cookies); foreach $pair (@pairs){ ($cookie_name, $cookie_value) = split(/=/, $pair); $cookie_value =~ tr/+/ /; $cookie_value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; &jcode'convert(*cookie_value, $charset); $COOKIE{$cookie_name} = $cookie_value; } %COOKIE; } ############################################################ # クッキーのデータを読み込みメインルーチンへ渡す # 引き数:jcode.plの文字コード(sjis,jis,euc,etc) # 戻り値:クッキーの配列(cookie{'name'}) # sub get_cookie{ %main'cookie = &read_cookie( @_ ); } ############################################################ # クッキーを食べさせる # 引き数:クッキー名、クッキーの値、削除までの日数 # 戻り値:クッキーのヘッダ # sub set_cookie{ local($cookie_name, $cookie_value, $expires) = @_; local($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst,$result); if($expires != 0){ ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = gmtime(time + $expires*24*60*60); $year = $year+1900; $sec = sprintf("%02d", $sec); $min = sprintf("%02d", $min); $hour = sprintf("%02d", $hour); @week_str = ("Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"); $wday = @week_str[$wday]; @month_str = ("Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"); $mon = @month_str[$mon]; $gm_date = "$wday, $mday\-$mon\-$year $hour:$min:$sec GMT"; }else{ $gm_date = "Thu, 1-Jan-1980 00:00:00 GMT"; } $result = "$cookie_name=$cookie_value; expires=$gm_date; domain=$ENV{'SERVER_NAME'}"; print "Set-Cookie: $result\n"; } ############################################################ # クッキーを削除 # 引き数:クッキー名 # 戻り値:クッキーのヘッダ # sub expire_cookie{ local($cookie_name) = @_; &set_cookie($cookie_name, 0, 0); } 1;