%PDF- %PDF-
Mini Shell

Mini Shell

Direktori : /home/rappan/www/cgi_hicnt200/
Upload File :
Create Path :
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;

Zerion Mini Shell 1.0