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/>/>/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;