#!/usr/local/bin/ruby
print "Content-type: text/html\n\n"
require "cgi-lib"
input = CGI.new
require "kconv"
#初期設定
CR = "\015"
LF = "\012"
EOL = CR + LF
BR = "<br>"
FILENAME = "bbs2.log"
LOCKFILENAME = "bbs2.log.lock"
MAXLOG = 10
$log = []
#ファイルロッククラス作成
class FileLockDir
def lock(lockdir)
begin
Dir.mkdir(lockdir)
lockflag = true
rescue Errno::EEXIST
lockflag = false
end
return(lockflag)
end
def unlock(lockdir)
begin
Dir.rmdir(lockdir)
lockflag = true
rescue
lockflag = false
end
return(lockflag)
end
end
#ログファイルの読みこみ関数
def read_log_file
c = 0
begin
fh = open(FILENAME)
rescue Errno::ENOENT
return
end
fh.each{|l|
$log[c] = l
c += 1
if c >= MAXLOG
break
end
}
fh.close
end
#ログファイルの書き込み関数
def write_log_file(writedata)
$log.unshift("#{writedata}\n")
c = 0
fh = open(FILENAME, "w")
$log.each{|l|
fh.print l
c += 1
if c >= MAXLOG
break
end
}
fh.close
end
#ファイルロッククラスの初期化
fillock = FileLockDir.new
#フォームからのデータ読みこみと日本語変換と改行の変換
if input["senddata"]
senddata = Kconv.tosjis(input["senddata"])
senddata.gsub!(/#{EOL}/, BR)
senddata.gsub!(/#{CR}/, BR)
senddata.gsub!(/#{LF}/, BR)
end
#ログファイルの読みこみ関数を呼び出す
read_log_file
#書き込みがあったら
if senddata.size != 0
begin
#ファイルロック設定
lockd = fillock.lock(LOCKFILENAME)
unless lockd
print <<EOF
他の人が書き込み中です。しばらく待ってからもう一度書いて下さい。
EOF
end
#ログファイルの書き込み関数を呼び出し
write_log_file(senddata)
ensure
#ファイルロック解除
fillock.unlock(LOCKFILENAME) if lockd
end
end
#HTMLの表示
print <<EOF;
<html>
<body>
<form method="POST">
<input type="text" name="senddata" size="80">
<input type="submit" value="送信">
</form>
<hr>
EOF
$log.each{|l|
print "#{l}\n<hr>\n"
}
print <<EOF;
</body>
</html>
EOF