#! /usr/local/bin/perl &main; #************************************************ # はじめにお読み下さい # #このプログラムは、掲示板用のCGIです。 # #■設置方法■ #1.CGI設置するディレクトリを作成し、パーミッションを777と設定する。 #2.bbs.cgi内のuser_setup関数、header関数、footer関数を # お好みに併せて編集する。 #3.bbs.cgi (744) # jcode.pl (744) # をFTPでサーバーにアップし、 # パーミッションを上記のように設定する。 #4.bbs.cgiにアクセスする。 # # #■メンテナンス方法■ #編集したい記事の返信欄の名前入力フォームに、 #user_setup関数で設定した管理者パスワードを入力すると #編集画面に移ります。 # #************************************************ #************************************************ # ユーザー設定 #************************************************ sub user_setup{ $cgi_file ='bbs.cgi'; #このファイル名 $max_log = '50'; #1つのログファイルに、何件の記事を書き込むかの設定 $bottomnum = '0'; #ログの開始番号 $cookieID ='bbs'; #クッキーID $new_hour =24; #最新記事マーク表示時間 $main_title ='掲示板'; #掲示板のタイトル $pass = '0000'; #管理者用パスワード $last_mes ='【注】これ以前の記事は、管理人が保管しております
必要でしたらメールでお知らせ下さい。'; #最終書き込み表示の際のメッセージ @error_tag =('font','form','img','table','!--','input','select','script','textarea','html','body'); #使用禁止タグ(小文字で指定) $no_tag =1; #1=全てのタグを禁止  0=禁止タグのみ禁止 $new ='new'; #newと表示させる部分 $subject_color ='#0000aa'; #記事のサブジェクト部分の色 $name_color ='#00aa00'; } #************************************************ # ヘッダー表示関数 # #ページのヘッダー部分に表示される部分です。 # #_HTML_と_HTML_との間に、 #普通にHTMLをお書き下さい。 #なお、user_setup関数で設定したように #$maintitle→メインタイトル #$cgi_file→このファイル名 #に変換されます。 #************************************************ sub header { if($_[0] ne ""){$main_title="$main_title $_[0]";} print "Content-type: text/html\n\n"; print<<"_HTML_"; $main_title
[TOPへ]
$main_title
_HTML_ } #************************************************ # ログ表示関数 # #すべてのページのフッター部分に表示されます。 #このスクリプトの著作権表示は消さないで下さい。 # #************************************************ sub footer { # このスクリプトの著作権表示 print<<"_HTML_";
qqq bbs Ver1.00
_HTML_ } #************************************************ # メインプログラム #************************************************ sub main{ require 'jcode.pl'; system("rm core"); &setup; #初期設定 &user_setup; #初期設定 &hensu; &getcookie; #クッキー取り込み関数 # フォーム入力されたデータを$bufferに格納する # getかpostかによって取得方法が異なる if ($ENV{'REQUEST_METHOD'} eq "POST") { read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); } else { $buffer = $ENV{'QUERY_STRING'}; } if ($buffer eq ""){ &header(); #ヘッダーhtml &input_form; &html; #ログ表示関数 }else { &buf_read; #バッファ読み込み関数 $date_now=&time_set(time); #時間処理関数 if(($FORM{pass} ne "")&&($FORM{pass} eq $pass)){&header();&file_lock;&log_write_op;&file_unlock;&input_form;&html;} elsif($bbs_preview ne ""){&header(" -プレビュー画面");&input_form;&preview;} elsif($bbs_res ne ""){&file_lock;&res_write;&file_unlock;&header();&input_form;&html;} elsif(($sort_area ne "")||($bbs_article ne "")){&header();&input_form;&html;} else{ &file_lock; &log_write; #ログ書き込み書き込み関数 &file_unlock; &header();&input_form;&html; } } &footer; } #************************************************ # 初期変数設定 #************************************************ sub setup{ $file_lock='file.lock'; $max = '30'; # 一画面の読み込み件数の最大登録数の設定です。 $sort_num =$max; $id = $ENV{'REMOTE_HOST'}; $log_head = 'bbs'; #ログの頭文字 $log_foot = 'log'; #ログの拡張子 $sort_num_sel{'30'}=' selected'; $sort_area='all'; $sort_new_sel{$new_hour}=' selected'; $now_time =time; #現在時刻(秒) } #************************************************ # ログ表示関数 #************************************************ sub input_form { # HTMLの出力 ' 'の間に通常のHTML文を書けばよい if($premes ne ""){$premes="
▼お知らせ▼
$premes



";} $bbs_name=~ s/\"/"/g; $bbs_title=~ s/\"/"/g; print<<"_HTML_"; $premes
投稿者*
タイトル
メール*
URL*

内容(特にInternetExploreの方は、適宜改行をいれてください。)


       (*印項目)

_HTML_ } #************************************************ # 検索結果表示関数 #************************************************ sub sort_form { print''; print " _HTML_ if ($view{'last_end'} ne ""){ print "\n"; } if ($view{'next_start'} ne ""){ print "\n"; } if ($view{'start'} ne 1){ print "\n"; } print'
\n"; print<<"_HTML_"; 返信順 最新 に$new
\n"; print "\n"; print "\n"; print "\n"; print "\n"; print ""; print ""; print ""; print "
\n"; print "\n"; print "\n"; print "\n"; print "\n"; print ""; print ""; print "
\n"; print "\n"; print "\n"; print ""; print ""; print "\n"; print "

'; } #************************************************ # ログ表示関数 #************************************************ sub html { &get_log; &sort_log; %view=&log_limit($logall,$loghit,$bbs_article,$max); if($sort_renew eq ""){print'〜記事番号順〜
';} else{print'〜新着書き込み及び返信順〜
';} print "総記事$view{'all'}件中 検索結果$view{'hit'}件 $view{'start'}〜$view{'end'}件表\示\n"; &sort_form; if($sort_num eq 'all'){$sort_num2='全件表\示';} else{$sort_num2="最大表\示件数$sort_num件";} print "$sort_num2。データ容量$file_size\KB
最新の返信記事は【返信順】をチェックして検索してください。

\n\n"; ###記事一覧処理### ###配列<@lines>から1件ずつデータを取り出して処理する### $log_count = 1; print"


"; if($sort_renew eq ""){ foreach $line (@lines) {if($line ne ''){&html2($line);}} }else{foreach (sort{$b <=> $a} keys %arrow_line) {&html2($lines[$arrow_line{$_}]);}} if(($view{'next_start'} eq "")&&($sort_val eq "")){ print $last_mes; } &sort_form; } sub html2{ local($line,$dnum)=split(/\n/,$_[0]); if($line eq ''){return;} if ($log_count>=$view{'start'}){ local($date,$num,$name,$email,$value,$url,$id,$title,$restime,$nores,@res) = split(/\t/,$line); $date_form=&time_set($date); if($now_time-$date<$new_hour*60*60){$new_mark=$new.' ';} else{$new_mark='';} print &art_link($num,$dnum)."$new_mark"; if ($email ne "") { print "$title 【$name】 $email"; }else { print "$title 【$name】"; } if ($url ne ""){print" WEB\n";} print "
投稿日:$date_form

\n"; $value=~ s/
/
\n/g; print "$value\n\n"; ###一行レス表示### print "

\n"; foreach(@res){ if($_=~ /(.*)\](\d+)\[(.*)$/){ if($now_time-$2<$new_hour*60*60){$new_mark=$new.' ';} else{$new_mark='';} $val=$1; }else{$val=$_;$new_mark='';} print"
$new_mark$val\n"; } ###一行レスフォーム### print ""; print "
"; print "\n"; $bbs_name=~ s/\"/"/g; print<<"_HTML_"; 名前:  内容:

_HTML_ } $log_count++; if($log_count>$view{'end'}) { last; } } #************************************************ # プレビュー表示関数 #************************************************ sub preview { # HTMLの出力 ' 'の間に通常のHTML文を書けばよい $bbs_value =~ s/\r/
/g; print"
【プレビュー表\示】

"; if ($bbs_email ne "") { print "$bbs_title 【$bbs_name】 $bbs_email"; }else {print "$bbs_title 【$bbs_name】";} if ($bbs_url ne ""){print" WEB\n";} print "
投稿日:$date_now

\n"; &link_tag($bbs_value); print "$bbs_value\n\n"; } #************************************************ # バッファを変数に読み込む #************************************************ sub buf_read { @pairs = split(/&/,$buffer); foreach $pair (@pairs) { ($name, $value) = split(/=/, $pair); $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; $value =~ s/\n//g; $value =~ s/\t//g; $value =~ s/^//g; # 掲示板に書き込まれたくないタグが含まれる行を消去する $dumy=$value; $dumy=~ tr/A-Z/a-z/; if($no_tag){$value=~ s//>/g;} else{ foreach $tag(@error_tag){ if($dumy=~ /<$tag/){ $value=~ s//>/g; last; } } } &jcode'convert(*value,'sjis'); $FORM{$name} = $value; } $sort_area =$FORM{$xsort_area}; $bbs_article =$FORM{$xarticle}; $bbs_res =$FORM{$xres}; $bbs_dres =$FORM{$xdres}; if($FORM{'type'} eq 'r'){ #レス書きこみ $bbs_name =$FORM{$xname}; $bbs_value =$FORM{$xvalue}; $sort_num =$FORM{$xsort_num}; $sort_new =$FORM{$xsort_new}; $sort_renew =$FORM{$xrenew}; $sort_val =$FORM{$xsort_val}; $sort_area_sel{$sort_area}=' selected'; if($sort_renew ne ""){$sort_renew_ch =' checked';} if($sort_num ne ""){$max=$sort_num;undef %sort_num_sel;$sort_num_sel{$sort_num}=' selected';} if($sort_new ne ""){$new_hour=$sort_new;undef %sort_new_sel;$sort_new_sel{$sort_new}=' selected';} }elsif($FORM{'type'} eq "n"){ $bbs_name =$FORM{$xname}; $bbs_email =$FORM{$xemail}; $bbs_value =$FORM{$xvalue}; $bbs_url =$FORM{$xurl}; $bbs_title =$FORM{$xtitle}; $bbs_preview =$FORM{$xpreview}; if($FORM{$xremember} ne ""){ &setcookie;&header(); $premes='[投稿者名][メール][URL]をブラウザに記憶しました。'; &input_form;&html;&footer;exit; } }else{ $sort_val =$FORM{$xsort_val}; $sort_num =$FORM{$xsort_num}; $sort_new =$FORM{$xsort_new}; $sort_renew =$FORM{$xrenew}; if($sort_renew ne ""){$sort_renew_ch =' checked';} $sort_area_sel{$sort_area}=' selected'; if($sort_num ne ""){$max=$sort_num;undef %sort_num_sel;$sort_num_sel{$sort_num}=' selected';} if($sort_new ne ""){$new_hour=$sort_new;undef %sort_new_sel;$sort_new_sel{$sort_new}=' selected';} } $bbs_url=~ s/\"/"/g; $bbs_email=~ s/\"/"/g; # 入力されたデータのチェック if($FORM{'type'} eq 'r'){ if($bbs_res eq ""){&error;} if ($bbs_name eq $pass){&op;} if ($bbs_name eq "") { $bbs_value="";&error(1); } if ($bbs_value eq "") { &error(2); } }elsif($FORM{'type'} eq 'n'){ if ($bbs_name eq "") { &error(1); } if ($bbs_value eq "") { &error(2); } if ($bbs_title eq "") { &error(4); } if ($bbs_email ne "") { if (!($bbs_email =~ /(.*)\@(.*)\.(.*)/)) { &error(3); } } } if(&comp_tag($bbs_value)){&error(5);} $izon=&izon("$bbs_name$bbs_email$bbs_value$bbs_url$bbs_title"); if($izon ne ''){&error("記事に、機種依存文字『$izon』が使われています。");} } #************************************************ # ログ書き込み #************************************************ sub log_write{ $bbs_value =~ s/\r/
/g; # 記録ファイルを読み出しオープンして、配列<@lines>に格納する local(@active)=&active_log; if (open(DB,"$log_head$active[1].$log_foot")) {@lines = ;close(DB);} &link_tag($bbs_value); $value =join("\t",time,$active[0],$bbs_name,$bbs_email,$bbs_value,$bbs_url,$id,$bbs_title,time,"","\n"); local($date,$num,$name,$email,$val,$url,$id,$title,$restime,$nores,@res)=split(/\t/,$lines[0]); if(($val ne $bbs_value)||($name ne $bbs_name)||($email ne $bbs_email)||($url ne $bbs_url)||($title ne $bbs_title)){ unshift(@lines,$value); if (open(DB,">$log_head$active[1].$log_foot")) {print DB @lines;close(DB);} $premes="新規記事を書きこみました。
この記事は".&art_link($active[0])."のリンクで一発表\示できます。"; }else{ $premes="新規記事を書きこみました。
この記事は".&art_link($active[0]-1)."のリンクで一発表\示できます。"; } ($bbs_title,$bbs_value)=(); # 記録ファイルを上書きオープンして、配列<@new>を書き出す } #************************************************ # 管理者用ログ書き込み #************************************************ sub log_write_op{ $FORM{$xvalue} =~ s/\n/
/g; foreach(keys %FORM){ if($_=~ /r(\d+)/){push(@resnum,$1);} } @resnum=sort{$a <=> $b}@resnum; foreach(@resnum){ if($FORM{"r$_"} ne ""){ if($FORM{"t$_"} eq ''){$FORM{"t$_"}=time;} push(@opres,$FORM{"r$_"}."\]".$FORM{"t$_"}."\[".$FORM{"h$_"}); } } $opvalue=join("\t",$FORM{$xdate},$FORM{$xnum},$FORM{$xname},$FORM{$xemail},$FORM{$xvalue},$FORM{$xurl},$FORM{$xid},$FORM{$xtitle},$FORM{$xrestime},$FORM{$xnores},@opres); $opvalue="$opvalue\n"; @file_list=&dir_list($log_head,$log_foot); foreach $file(@file_list){ if (open(DB,$file)){@log_list = ;close(DB);} @new=(); foreach $log(@log_list) { local($date,$num,$name,$email,$value,$url,$id,$title,$restime,@res) = split(/\t/,$log); if(($write ne 1)&&($FORM{$xnum} eq $num)){ if($FORM{$xdel} eq ""){ $log=$opvalue; }else{$log="";} $write=1; } if($log ne ""){push(@new,$log);} } if($write eq 1){if (open(DB,">$file")){print DB @new;close(DB);}last;} } if($write ne 1){print'
▼お知らせ▼
記事が見つかりませんでした。
正常に編集できませんでした



';} else{print'
▼お知らせ▼
正常に編集が終了しました。



';} } #************************************************ # レス書き込み #************************************************ sub res_write{ local(%DNUM); # 記録ファイルを読み出しオープンして、配列<@lines>に格納する local(@file_list,@log_list,$file,$log,$write); @file_list=&dir_list($log_head,$log_foot); # 記録件数処理 $write=0; $bbs_value=~ s/\r//g; &link_tag($bbs_value); $bbs_name=~ s/\r//g; foreach $file(@file_list){ if (open(DB,$file)){@log_list = ;close(DB);} @new=(); foreach $log (@log_list) { $log =~ s/\n//g; local($date,$num,$name,$email,$value,$url,$id,$title,$restime,$nores,@res) = split(/\t/,$log); if($nores eq 1){ $bbs_value=""; $premes=&art_link($bbs_res)."への返信は禁止されています。"; return; } $DNUM{$num}++; if(($write ne 1)&&($bbs_res eq $num)&&(($bbs_dres eq '')||($bbs_dres eq $DNUM{$num}))){ $write2=1; foreach(@res){ if($_=~ /(.*)\](\d+)\[(.*)$/){ if($1 eq "$bbs_name:$bbs_value"){$write2 = 0;} } } if($write2 eq 1){ push(@res,"$bbs_name:$bbs_value\]$now_time\[$ENV{'REMOTE_HOST'}"); $log=join("\t",$date,$num,$name,$email,$value,$url,$id,$title,time,$nores,@res); } $bbs_value=""; $write=1; $w_dres=$DNUM{$num}; } $log="$log\n"; push(@new,$log); } if($write eq 1){ if (open(DB,">$file")){print DB @new;close(DB);} $premes=&art_link($bbs_res,$w_dres)."に返信書きこみを行いました。"; last;} } } #************************************************ # ディレクトリ内ファイルリスト # &dir_list($kakuchou) # @listの各要素を文字列$sepaleteで分割し # $pal番目のキーで@listをソートする。 # $return :逆順ソート # $str :1=辞書的にソート,他=数的にソート #************************************************ sub dir_list{ local($list,@files,$file,@newfiles); local($head,$kakuchou)=@_; if (!opendir(DIR,".")) { &error(0); } @list = readdir(DIR); foreach $file(@list) { next if -d $file; if ($file=~ /^$head(\d+)\.$kakuchou/) { push(@files,"$1"); } } close(DIR); @files=sort{$a <=> $b}@files; foreach(@files){ unshift(@newfiles,"$head$_.$kakuchou"); } return @newfiles; } #************************************************ # ログのソート #************************************************ sub sort_log{ local(@arrow,%DNUM); $logall=0; for($i=0;$i<=$#lines;$i++){ $lines[$i]=~ s/\n//g; local($date,$num,$name,$email,$value,$url,$id,$title,$restime,$nores,@res) = split(/\t/,$lines[$i]); @res_val=(); foreach(@res){ $_=~ /(.*)\](\d+)\[(.*)/; push(@res_val,$1); } unless($date =~ /^\d+$/){$lines[$i]='';next;} unless($num =~ /^\d+$/){$lines[$i]='';next;} $logall++; $DNUM{$num}++; $lines[$i].="\n$DNUM{$num}"; if($sort_val ne ""){ if($sort_area eq "value"){unless(&search($value,$sort_val,1,1)){$lines[$i]='';}} elsif($sort_area eq "res"){unless(&search(join("\t",@res_val),$sort_val,1,1)){$lines[$i]='';}} elsif($sort_area eq "name"){unless(&search($name,$sort_val,1,1)){$lines[$i]='';}} elsif($sort_area eq "title"){unless(&search($title,$sort_val,1,1)){$lines[$i]='';}} elsif($sort_area eq "num"){ if($num ne $sort_val){$lines[$i]='';} elsif(($bbs_dres ne '')&&($bbs_dres ne $DNUM{$num})){$lines[$i]='';} }else{ unless($num eq $sort_val){ unless(&search(join("\t",$value,@res_val,$name,$title),$sort_val,1,1)){$lines[$i]='';} } } if($lines[$i] ne ''){$loghit++;} }else{$loghit++;} } if($sort_renew ne ""){ $y=0; foreach (@lines){ local($date,$num,$name,$email,$value,$url,$id,$title,$restime,$nores,@res)=split(/\t/,$_); $arrow_line{$restime}=$y; $y++; } } } #************************************************ # 全ログの読み込み #************************************************ sub get_log{ local(@file_list,@log_list,$line); @lines=(); @file_list=&dir_list($log_head,$log_foot); foreach(@file_list){ if(open(DB,$_)){ @log_list = ; close(DB); push(@lines,@log_list); $file_size=$file_size+int((-s $_)/1024); if((-s $_) % 1024 > 0){$file_size++;} } } } #************************************************ # アクティブログファイル #************************************************ sub active_log{ local(@file_list,@log_list,$max,$num,@lines,@return); @file_list=&dir_list($log_head,$log_foot); if ($file_list[0]=~ /$head(\d+)\.$kakuchou/) {$max=$1; } if($max eq ""){$max = 1;} if (open(DB,"$log_head$max.$log_foot")) {@lines = ;close(DB);} $num=@lines; $return[0]=1; &get_log; foreach (@lines){ local(@dumy)=split(/\t/,$_); if($return[0]<=$dumy[1]){$return[0]=$dumy[1]+1;} } if($num <$max_log){$return[1]=$max;} else{$return[1]=$max+1; open(DB,">$log_head$return[1].$log_foot");close(DB); chmod 0666,"$log_head$return[1].$log_foot"; } return @return; } #************************************************ # 記事表示数処理 # log_limit($all,$hit,$start,$num) #************************************************ sub log_limit{ local($all,$hit,$start,$num,$list); @list=(); local($all,$hit,$start,$num)=@_; $list{'all'}=$all; if($hit>=1){ $list{'hit'}=$hit; if($num eq "all"){$num=$hit;$list{'num'}="all";} elsif($num<1){$num=1;$list{'num'}=$num;} else{$list{'num'}=$num;} if(($hit<$start)||($start<1)){$start=1;} $list{'start'}=$start; if($hit<$start+$num-1){$list{'end'}=$hit+0;} else{$list{'end'}=$start+$num-1;} if($list{'start'}>1){ $list{'last_end'}=$list{'start'}-1; if($list{'start'}-$num>0){$list{'last_start'}=$list{'start'}-$num;} else{$list{'last_start'}=1;} } if($hit>$list{'end'}){ $list{'next_start'}=$list{'end'}+1; if($hit>=$list{'next_start'}+$num-1){$list{'next_end'}=$list{'next_start'}+$num-1;} else{$list{'next_end'}=$hit;} } }else{$list{'hit'}=0;$list{'end'}=0;$list{'start'}=0;} return %list; } #************************************************ # クッキーから読み込み #************************************************ sub getcookie{ local(@pairs,$pair,$name,$value); @pairs = split(/;/,$ENV{'HTTP_COOKIE'}); foreach $pair (@pairs) { ($name,$value) = split(/=/,$pair,2); $name =~ s/ //g; $DUMMY{$name} = $value; } @pairs = split(/,/,$DUMMY{$cookieID}); foreach $pair (@pairs) { ($name,$value) = split(/:/,$pair,2); $COOKIE{$name} = $value; } $bbs_name = $COOKIE{'N'}; #名前 $bbs_email = $COOKIE{'M'}; #メール $bbs_url = $COOKIE{'U'}; #URL $bbs_ran = $COOKIE{'R'}; #荒らし用 } #************************************************ # クッキーへ書き込み #************************************************ sub setcookie{ ($secg,$ming,$hourg,$mdayg,$mong,$yearg,$wdayg,$ydayg,$isdstg) = gmtime(time + 90*24*60*60); $y0="Sunday"; $y1="Monday"; $y2="Tuesday"; $y3="Wednesday"; $y4="Thursday"; $y5="Friday"; $y6="Saturday"; @youbi = ($y0,$y1,$y2,$y3,$y4,$y5,$y6); $m0="Jan"; $m1="Feb"; $m2="Mar"; $m3="Apr"; $m4="May"; $m5="Jun"; $m6="Jul"; $m7="Aug"; $m8="Sep"; $m9="Oct"; $m10="Nov"; $m11="Dec"; @monthg = ($m0,$m1,$m2,$m3,$m4,$m5,$m6,$m7,$m8,$m9,$m10,$m11); $date_gmt = sprintf("%s\, %02d\-%s\-%04d %02d:%02d:%02d GMT",$youbi[$wdayg],$mdayg,$monthg[$mong],$yearg +1900,$hourg,$ming,$secg); $data="N\:$FORM{$xname}\,M\:$FORM{$xemail},U\:$FORM{$xurl},R\:$bbs_ran"; print "Set-Cookie: $cookieID=$data; expires=$date_gmt\n"; }#このクッキーはだいたい3ヶ月間有効です。 #************************************************ # 時間表示処理 #************************************************ sub time_set{ local($time); $time=$_[0]; ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = gmtime($time+9*60*60); # 時分秒を2桁に統一する処理 if ($sec < 10) { $sec = "0$sec"; } if ($min < 10) { $min = "0$min"; } # 上記の$monには0から11までの数字が入るので修正処理 $month = ($mon + 1); # 曜日変換処理 # $wdayには0から6までの数字が入り曜日に対応している $y0="日"; $y1="月"; $y2="火"; $y3="水"; $y4="木"; $y5="金"; $y6="土"; $youbi = ($y0,$y1,$y2,$y3,$y4,$y5,$y6) [$wday]; # 時刻フォーマット return "$month月$mday日($youbi)$hour時$min分$sec秒"; } #************************************************ # ログ管理 #************************************************ sub op{ &header('管理者用'); local($log); &get_log; foreach(@lines){ $_=~ s/\n//g; local($date,$num,$name,$email,$value,$url,$id,$title,$restime,$nores,@res)=split(/\t/,$_); if($num eq $bbs_res){$log = $_;} } local($date,$num,$name,$email,$value,$url,$id,$title,$restime,$nores,@res)=split(/\t/,$log); $value=~ s/
/\r/g; $value=~ s/\&/&/g; if(&get_nores($num) eq 1){$nores=" checked";} $date_time=&time_set($date); $res_time=&time_set($restime); print<<"_HTML_";

_HTML_ $i=0; foreach(@res){ $i++; $_=~ s/\&/&/g; $_=~ s/"/"/g; $_=~ /(.*)\](\d+)\[(.*)/; print ""; print ""; } $i++; print ""; print ""; print ""; $i++; print ""; print ""; print ""; $i++; print ""; print ""; print ""; print''; print'
記事を削除  返信禁止
記事番号
名前
email
home page
日付 $date_time
タイトル
書き込み
IP
最新
res時間
$res_time
返信内容時刻(秒)ホスト
res$i "; print &time_set($2); print "
追加用$i
追加用$i
追加用$i


'; &footer; exit; } #************************************************ # エラー表示 #************************************************ sub error { $error = $_[0]; if ($error eq "0") { &header('エラー'); &in_table('記録ファイルの入出力にエラーが発生しました。'); }elsif ($error eq "1") { &header('入力エラー'); &in_table('投稿者名が記入されていません。'); &input_form; }elsif ($error eq "2") { &header('入力エラー'); &in_table('内容が書かれていません。または記録禁止のタグが書かれています。'); &input_form; }elsif ($error eq "3") { &header('入力エラー'); &in_table('メールアドレスが正しく入力されていません。'); &input_form; }elsif ($error eq "4") { &header('入力エラー'); &in_table('タイトルが記入されていません。'); &input_form; }elsif ($error eq "5") { &header('タグエラー'); &in_table('タグが正しくありません。'); &input_form; }elsif ($error eq "6") { &header('ビジー'); &in_table('現在書き込みが殺到しております。
もう一度リロードしてみてください。'); &input_form; }elsif ($error ne "") { &header('エラー'); &in_table($error); &input_form; }else { &header('エラー'); &in_table("$error処理に何らかのエラーが発生し作業は中止されました。"); } &html; &footer; exit; } sub in_table{ local($mes); $mes=$_[0]; print"


【エラー】
$mes




"; } #************************************************ # リンクタグ挿入 #************************************************ sub link_tag { unless ($_[0]=~/$1<\/a>/g; $_[0] =~ s/(ftp:\/\/[\w\$\#\~\.\/\-\?\=\&]+)/$1<\/a>/g; $_[0] =~ s/([\w\$\~\.\/\-]+\@[\w\$\~\.\/\-]+)/$1<\/a>/g; } @_; } #************************************************ # noresファイルに含まれているか判定 # get_nores($num) #************************************************ sub get_nores { local($num); $num=$_[0]; open(DB,"$nores_file"); local(@nores)=; close(DB); foreach(@nores){ $_=~ s/\n//g; if($num eq $_){return 1;} } return 0; } #************************************************ # URL引数変換 #************************************************ sub hensu{ $xname ='na'; $xnum ='nu'; $xemail ='e'; $xvalue ='v'; $xurl ='u'; $xtitle ='t'; $xpreview ='p'; $xsort_val ='sv'; $xsort_num ='snu'; $xsort_new ='sne'; $xsort_area ='sa'; $xrenew ='rne'; $xrenum ='rnu'; $xres ='rs'; $xdres ='rd'; $xrestime ='rt'; $xarticle ='a'; $xdel ='dl'; $xdate ='dt'; $xnores ='nr'; $xid ='i'; $xsend ='sd'; $xremember ='rm' } #************************************************ # 記事番号にURLを張る関数 #************************************************ sub art_link{ return"[$_[0]]" } #************************************************ # 発言内のタグの閉じ忘れ防止 # &comp_tag($value) #************************************************ sub comp_tag{ local($tag); local($value)=$_[0]; local($dumy,@tags) =split(//,$_); $len=length($dumy); $dumy=~ s/\"//g; $len2=$len-length($dumy); if($len2 % 2 ne 0){return 1;} if($_=~ /^([\w]+)(.*)/){ $tag=$1; $tag=~ tr/A-Z/a-z/; unless($tag=~ /(img|br|hr)/){ $flg=0; foreach $ch_tag(@tags[$i+1..$#tags]){ $ch_tag=~ tr/A-Z/a-z/; if($ch_tag=~ /^(\/)([\w]+)(.*)/){if($2 eq $tag){$flg=1;last;}} } if($flg eq 0){return 1;} } } $i++; } return 0; } #************************************** # 機種依存文字判定関数 #************************************** sub izon{ local($word)=$_[0]; local(@word)=&div_2byte($word); local(@izon)=( '@','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S' ,'T','U','V','W','X','Y','Z','[','\\',']','@','A','B','C','D','E','F','G','H','I' ,'_','`','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u' ,'','','','','','','','','','','','','','','~' ,'','','≒','≡','∫','','','√','⊥','∠','','','∵','∩','∪'); foreach(@izon){$izon_word{$_}++;} foreach(@word){ if($izon_word{$_}>0){return $_;} } } #************************************************ # 文字毎に分裂 #************************************************ sub div_2byte{ local($word)=@_; local(@words,$dumy,$num); local($len)=length($word); for($num=0;$num<$len;$num++){ $dumy=substr($word,$num,1); $dumy =~ s/([^0-9A-Za-z_ ])/'%'.unpack('H2',$1)/ge; $dumy =~ s/\s/+/g; if((index($dumy,'%8')>=0)||(index($dumy,'%9')>=0)){ push(@words,substr($word,$num,2)); $num++; }else{push(@words,substr($word,$num,1));} } return @words; } #************************************** # search関数 # search($word,$key,$and,$div) # $word =被検索文字 # $key =検索対象 # $and =and検索かor検索か # $div =単語分割するかどうか #************************************** sub search{ local($word,$key,$and,$div)=@_; if($div eq '1'){$key =~ s/ / /g;} $key =~ s/(\W)/\\$1/g; # 非英数字をエスケープ処理 if($div eq '1'){@keys = split(/\\\s+/,$key);} # スペースで分ける else{@keys = ($key);} if($and eq "1"){ foreach $key(@keys){unless($word =~ /$key/){return 0;}} return 1; }else{ foreach $key(@keys){if($word =~ /$key/){return 1;}} return 0; } } #************************************************ # ファイルロック #************************************************ sub file_lock{ $count=20;$lock=0; while($count--){ if(-f $file_lock){ if((-M $file_lock)*60*60*24 < 30){sleep(1);} else{$lock=1;$count=0;} } else{$lock=1;$count=0;} } if($lock ne 1){ if($bbs_res ne ""){$bbs_value="";} else{$bbs_value =~ s/\r/
/g;} &error(6); } open(DB,">$file_lock"); close(DB); } #************************************************ # ファイルアンロック #************************************************ sub file_unlock{ unlink "$file_lock"; }