#!/usr/local/bin/perl # 設定変数の定義 # # ログの保存行数 $maxlog = 30; # 1ページ当たりの表示発言数 $pageline = 10; # 発言文字色 @msgcol = ('#000000','#ff0000','#008000','#000080','#0080ff'); # スクリプト名 $mycgi = 'bbs1.cgi'; # ログファイル名 $logfile = 'bbs1.log'; # 入力内容のデコード # if($ENV{'REQUEST_METHOD'} eq "POST"){ read(STDIN,$in,$ENV{'CONTENT_LENGTH'}); }else{ $in = $ENV{'QUERY_STRING'}; } @in = split/&/,$in; foreach(@in){ ($key,$val) = split/=/; $val =~ tr/+/ /; $val =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C",hex($1))/eg; $val =~ s//>/g; $val =~ s/\r//g; if($key eq 'body'){ $val =~ s/\n+$//g; $val =~ s/\n/
/g; }else{ $val =~ s/\n//g; } $in{$key} = $val; } # 処理モード判定 # if($in{'submit'}){ &insert(); } else{ &view(); } exit; # 発言処理 # sub insert{ $in{'name'} eq '' and &error('お名前が入力されていません。'); $in{'title'} eq '' and &error('タイトルが入力されていません。'); $in{'body'} eq '' and &error('本文が入力されていません。'); $in{'color'} eq '' and &error('文字色が選択されていません。'); # 発言日時の取得 ($ss,$mm,$hh,$d,$m,$y,$w) = localtime(); $y += 1900; $m++; @wday = ('日','月','火','水','木','金','土'); $date = sprintf("%d/%02d/%02d(%s)%02d:%02d:%02d",$y,$m,$d,$wday[$w],$hh,$mm,$ss); # 追加するログデータの作成 $newlog = "
$in{'title'} $in{'name'} $date
$in{'body'}
\n"; # ロック開始 &lock() or &error('只今混雑しているようです。','Lock ERROR!'); # ログファイル読込 open FILE,$logfile; @log = ; close FILE; # 先頭に新規ログデータを追加 unshift @log,$newlog; # 保存行数を超える分末尾を削除 while(@log > $maxlog){ pop @log; } # 更新されたデータでログファイルに上書き open FILE,">$logfile"; print FILE @log; close FILE; # ロック終了 &unlock(); # 出力処理へ飛ばす print "Location:$mycgi\n\n"; } # 出力処理 # sub view{ # ログファイル読込 open FILE,$logfile; @logdat = ; close FILE; # 総ページ数 $maxpage = int((@logdat - 1)/$pageline) + 1; # ページの指定が無ければ1ページ目 ($in{'page'} >= 1 and $in{'page'} <= $maxpage) or $in{'page'} = 1; # 表示するページのログ取得 foreach$l(0..$#logdat){ $l >= ($in{'page'} - 1) * $pageline and $l < $in{'page'} * $pageline and $log .= $logdat[$l]; } # ページ切り替えリンク作成 foreach$p(1..$maxpage){ if($p == $in{'page'}){ $pagelink .= <<"EOT"; $p EOT }else{ $pagelink .= <<"EOT"; [$p] EOT } } # 色選択フォーム作成 foreach(@msgcol){ $colform .= <<"EOT";   EOT } # 出力 print &header(); print <<"EOT";
お名前
タイトル
本文
文字色$colform
$pagelink
$log EOT } # HTMLヘッダ # sub header{ return <<"EOT"; Content-Type: text/html; charset:SHIFT_JIS; 掲示板 EOT } # ロック開始 # sub lock{ # 古いロックは削除(3分) if(-e "$logfile.lock"){ (stat("$logfile.lock"))[9] < time - 180 and &unlock("$logfile.lock"); } local $retry = 5; while(!mkdir("$logfile.lock",0755)){ --$retry <= 0 and return 0; sleep(1); } return 1; } # ロック解除 # sub unlock{ rmdir("$logfile.lock"); } # エラー画面 # sub error{ my ($body,$title) = @_; $title or $title = 'ERROR!!'; print &header(); print <<"EOT";

$title

$body EOT exit; }