#!/usr/local/bin/perl # 設定変数の定義 # # スクリプト名 $mycgi = 'linebbs2.cgi'; # ログファイル名 $logfile = 'linebbs.log'; # ログの保存行数 $maxlog = 10; # 入力内容のデコード(POST限定) # read(STDIN,$in,$ENV{'CONTENT_LENGTH'}); @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/\r//g; $val =~ s/\n//g; $val =~ s//>/g; $in{$key} = $val; } # 処理モード判定 # if($in{'submit'}){ &insert(); } else{ &view(); } exit; # 発言処理 # sub insert{ $in{'name'} eq '' and &error('お名前が入力されていません。'); $in{'body'} eq '' and &error('本文が入力されていません。'); # 追加するログデータの作成 $newlog = "
$in{'name'} > $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; @log = ; close FILE; # 出力 print &header(); print <<"EOT";
お名前
本文
@log EOT } # HTMLヘッダ # sub header{ return <<"EOT"; Content-Type: text/html; charset:SHIFT_JIS; 一行掲示板 EOT } # ロック開始 # sub lock{ # 古いロックは削除(3分) if(-e "$logfile.lock"){ my $t = (stat("$logfile.lock"))[9]; if($t < time - 180){ &unlock("$logfile.lock"); } } local $retry = 5; while(!mkdir("$logfile.lock",0755)){ if(--$retry <= 0){ 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; }