#!/usr/local/bin/perl require 'jcode.pl'; #最大保存ログ数 $max=200; #表示ツリー件数/1ページ $pmax=20; #new!マークを付ける発言数 $new=5; #タイトル $title=""; #バック先URL $url="../keijiban.html"; #BODY設定 $body='
'; #書きこみフォームのバックカラー $bg='#FFFFFF'; #返信フォームに引用文字をあらかじめ表示するなら0を1に $hens=0; #パスワード $pass="whbbs"; #======================================================================# # フォームデータ処理 srand;push(@rand,rand(9999999)); if($ENV{'REQUEST_METHOD'} eq "POST"){ read(STDIN, $QUERY, $ENV{'CONTENT_LENGTH'}); }else{ $QUERY = $ENV{'QUERY_STRING'}; } @QUERY = split(/&/,$QUERY); foreach (@QUERY){ ($name, $value) = split(/=/); $seeks=$value if $name eq "seek"; $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/[\n\t]//g; &jcode'convert(*value,'sjis'); $FORM{$name} = $value; } #======================================================================# # 書き込みデータ表示処理 if($FORM{'log'}){ open(A,"treebbs.dat")||&err('ファイルをオープンできません'); $t=; chop $t; $w=$t - $FORM{'log'} + 2; while(){ if($. == $w){ ($re,$log_f,$ls,$dai,$log_n,$log_e,$log_h,$log_t)=split(/\t/,$_); last; } } close(A); &head; $mail="" if $log_e; print<"; &last; exit; #======================================================================# # 検索処理 }elsif($FORM{'seek'}){ &head; print""; open(A,"treebbs.dat")||&err('ファイルをオープンできません'); $i="00"; while(){ if(/^\d+\t\d+\t/){ last if $i++ >= 20; ($log_c,$log_n,$log_s,$log_d,$log_n,$log_e,$log_h)=split(/\t/); print"$log_c:$log_d [$log_n] $log_h
\n"; } } print"
"; print<"; &last; exit; #======================================================================# # 書き込み削除処理 }elsif($FORM{'del'} >= 1 && $FORM{'pass'} eq $pass){ &err("只今混雑しているので30秒ほどお待ちになってください。") if &lock == 0; open(A,"treebbs.dat")||&err('ファイルをオープンできません'); @open=; close(A); $sss=$open[0]; chop $sss; $ss = $sss - $FORM{'del'} + 1; ($log_c,$log_n,$log_s,$log_d,$log,$log_e,$log_h)=split(/\t/,$open[$ss]); $open[$ss]="$log_c\t$log_n\t$log_s\t---\t---\t\t$log_h\tこの記事は何らかの理由で削除されました\n"; open(A,">treebbs.dat")||&err('ログファイルをオープンできません'); print A @open; close(A); open(C,">lock.txt")&&close(C); } #======================================================================# # 書き込みリスト表示ヘッダー部分 &head; print<▼検索:
HTML if(($FORM{'next'} - 1) >= 0){ $back=$FORM{'next'} - 1; print"▲ BACK\n"; } $FORM{'seek'}=~ s/ / /og; $FORM{'seek'}=~ s/([\\\+\?\.\*\(\)\[\]\{\}\|])/\\$1/og; @seek=split(/ /,$FORM{'seek'}); foreach (@seek){ push(@key,$_); } $log=$FORM{'next'} * 20; open(A,"treebbs.dat") || &error("エラー"); $dummy=; while(){ $i=0; $word=$_; foreach (@key){ next if $word =~ /$_/i; $i = 1; last; } next if $i == 1; $no++; next if $log-- > 0; if($log < - 20){ $f=$FORM{'next'} + 1; last; } ($log_c,$log_n,$log_s,$log_d,$log_n,$log_e,$log_h)=split(/\t/,$word); print"$log_c:$log_d [$log_n] $log_h
\n"; } close(LIST); print"▼ NEXT\r\n" if $f > 0; print"$FORM{'seek'} に該当する投稿記事はありません" if $no == 0; print"
▼検索: HTML $i=$FORM{'logs'}; $i=1 unless $i; $back=$i - $pmax; &tree(0); print"\n"; print"<< BACK " if ($FORM{'logs'} && 0 < $back); print"NEXT >>\n" if $next; print<HTML &last; exit; #======================================================================# # ツリー表示処理 sub tree{ local($log,$c,$n)=@_; local(@aaa,$a); open(A,"treebbs.dat")||&err('ファイルをオープンできません'); $open = ; $news = $open - $new; while (){ last if /^$log\t/; if(/^\d+\t$log\t/){ $s++ if $log eq "0"; if($log eq "0"){ next if $i > $s ; if( $s >= $i + $pmax){ $next = $s; last; } } /^([^\t]*\t[^\t]*\t[^\t]*\t[^\t]*\t[^\t]*\t[^\t]*\t[^\t]*\t)/; push(@aaa,$1); } } close(A); if($n eq "└"){ $c.=" "; }elsif($n){ $c.="│"; } $a=@aaa; foreach $dat (@aaa){ ($log_c,$log_no,$log_s,$log_d,$log_n,$log_e,$log_h)=split(/\t/,$dat); --$a; $n="├"; $n="└" if $a == 0; print"HTML &last; exit; } #======================================================================# # HTML フッター表示 sub last{ print'
│
$c$n●" if 0 eq $log_no; print"
$c$n○" if 0 ne $log_no; print"$log_c:$log_d [$log_n] $log_h"; print' new!' if $log_c > $news; print"\n"; &tree($log_c,$c,$n); undef $dat; } undef @aaa; undef $a; } #======================================================================# # HTML ヘッダー表示 sub head{ print<$title $body新規発言 | ツリー | 発言順一覧
HTML } #======================================================================# # 書き込みフォーム sub ha{ &head; $li="" if $FORM{'s'}; $FORM{'re'}="0" unless $FORM{'re'}; if($FORM{'name'} eq ""){ &get_cookie; $FORM{'name'}=$coo[0]; $FORM{'email'}=$coo[1]; } print<
'; } #======================================================================# # クッキー獲得 sub get_cookie{ foreach (split(/\;/,$ENV{'HTTP_COOKIE'})){ ($name,$value) = split(/=/); $name =~ s/ //g; $cna=$value if $name eq "CGIROOMTREE"; last if $cna; } if($cna){ @coo=split(/\t/,$cna); $cna=$coo[0]; $maile=$coo[1]; } } #======================================================================# # エラー表示 sub err{ local($err)=@_; print"Content-type: text/html\n\n$bodyERROR
$err
"; print"ブラウザの戻るボタンから戻ってください
"; exit; } #======================================================================# # ロック処理 sub lock{ foreach (1..10){ if(-z "lock.txt"){ if(!open(LOCK,">>lock.txt")){ &err("lock.txtに書き込めません"); exit; } push(@rand,rand(9999999)); print LOCK "$ENV{'REMOTE_ADDR'}$ENV{'HTTP_USER_AGENT'}$ENV{'HTTP_REFERER'} @rand $FORM{'rand'}"; close(LOCK); if(!open(LOCK,"lock.txt")){ &err("lock.txt開けません"); exit; } $dummy=; close(LOCK); if($dummy eq "$ENV{'REMOTE_ADDR'}$ENV{'HTTP_USER_AGENT'}$ENV{'HTTP_REFERER'} @rand $FORM{'rand'}"){ return 1; } } $times=(stat("lock.txt"))[9]; $timer=time - 20; if($times <= $timer){ open(LOCK,">lock.txt")&&close(LOCK); }else{ sleep 1; } } return 0; } __END__ 1999/06/01 Ver 2.10