#!/usr/local/bin/perl

#
# Maximum number of messages
#
$max_msgs = 0;

#
# Return URL
#
$return_url = "../top.html";

#
# Allow HTML tags
#
$allow_html = 1;

#
# Set timezone
#
$ENV{'TZ'} = "JST-9";

#
# Remove lockfile when terminated by signal
#
sub sigexit { rmdir("lock/board.loc"); exit(0); }
$SIG{'PIPE'} = $SIG{'INT'} = $SIG{'HUP'} = $SIG{'QUIT'} = $SIG{'TERM'} = "sigexit";

#
# Constant variables
#
@wdays = ( "SUN", "MON", "TUE", "WED", "THU", "FRI", "SUN", "DAY" );

#
# Test mode
#
if ($ARGV[0] eq "test") {
	print "Content-type: text/html\n";
	print "\n";
	print "<HTML>\n";
	print "<HEAD>\n";
	print "<TITLE>wwwboard test</TITLE>\n";
	print "</HEAD>\n";
	print "<BODY TEXT=black BGCOLOR=#29479a>\n";
	print "CGIスクリプトは正常に動作しています。\n";
	if (! -d "lock") {
		print "<BR>NG. lockディレクトリが存在しません。\n";
	} elsif (! -w "lock") {
		print "<BR>NG. lockディレクトリに書き込みができません。\n";
	} elsif (-d "lock/board.loc") {
		print "<BR>NG. lock/board.loc が残っています。\n";
	}
	if (! -f "board.dat") {
		print "<BR>NG. board.dat が存在しません。\n";
	} elsif (! -w "board.dat") {
		print "<BR>NG. board.dat に書き込みできません。\n";
	}
	if (! -f "board.tmp") {
		print "<BR>NG. board.tmp が存在しません。\n";
	} elsif (! -w "board.tmp") {
		print "<BR>NG. board.tmp に書き込みできません。\n";
	}
	print "</BODY>\n";
	print "</HTML>\n";
	exit(0);
}

#
# Japanese KANJI code
#
if (-f "jcode.pl") {
	$jflag = true;
	require "jcode.pl";
	$code = ord(substr("漢", 0, 1));
	if ($code == 0xb4) {
		$ccode = "euc";
		$hcode = "x-euc-jp";
	} elsif ($code == 0x1b) {
		$ccode = "jis";
		$hcode = "iso-2022-jp";
	} else {
		$ccode = "sjis";
		$hcode = "x-sjis";
	}
}

#
# Read variables
#
if ($ENV{'REQUEST_METHOD'} eq "POST") {
	read(STDIN, $query_string, $ENV{'CONTENT_LENGTH'});
	@a = split(/&/, $query_string);
	foreach $x (@a) {
		($name, $value) = split(/=/, $x);
		$value =~ tr/+/ /;
		$value =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C", hex($1))/eg;
		if ($allow_html) {
			$value =~ s/<!--/&lt;!--/g;
			$value =~ s/-->/--&gt;/g;
		} else {
			$value =~ s/&/&amp;/g;
			$value =~ s/"/&quot;/g;
			$value =~ s/</&lt;/g;
			$value =~ s/>/&gt;/g;
		}
		if ($jflag) {
			&jcode'convert(*value, $ccode);
		}
		$FORM{$name} = $value;
	}
}

#
# File lock
#
foreach $i ( 1, 2, 3, 4, 5, 6 ) {
	if (mkdir("lock/board.loc", 755)) {
		last;
	} elsif ($i == 1) {
		($mtime) = (stat("lock/board.loc"))[9];
		if ($mtime < time() - 600) {
			rmdir("lock/board.loc");
		}
	} elsif ($i < 6) {
		sleep(2);
	} else {
		print "Content-type: text/html\n";
		print "\n";
		print "<HTML>\n";
		print "<HEAD>\n";
		print "<TITLE>掲示板</TITLE>\n";
		print "</HEAD>\n";
		print "<BODY>\n";
		print "<H1>掲示板</H1>\n";
		print "<HR>\n";
		print "只今、掲示板が混雑しております。しばらくお待ちの上、";
		print "再度アクセスお願いします。\n";
		print "<HR>\n";
		print "</BODY>\n";
		print "</HTML>\n";
		exit(1);
	}
}

#
# Write to date file
#
if ($FORM{'MESSAGE'} ne "") {

	#
	# Get date and time
	#
	($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst)
			= localtime(time);
	$date = sprintf("%02d/%02d/%02d(%s) %02d:%02d",
			$year, $mon + 1, $mday, @wdays[$wday], $hour, $min);

	#
	# Write current message.
	#
	$FORM{'MESSAGE'} =~ s/\r*$//g;
	$FORM{'MESSAGE'} =~ s/\r/<BR>/g;
	open(OUT, "> board.tmp");
	print OUT "<TABLE><TR><TD>\n";
	if ($FORM{'URL'} eq "") {
	    print OUT "<FONT COLOR=\"#FF0000\">$FORM{'FROM'}</FONT> $date\n";
	} elsif ($FORM{'URL'} =~ /^http:/) {
	    print OUT "<A HREF=\"$FORM{'URL'}\">$FORM{'FROM'}</A> $date\n";
	} else {
	    print OUT "<A HREF=\"mailto:$FORM{'URL'}\">$FORM{'FROM'}</A> $date\n";
	}
	print OUT "<BR>$FORM{'MESSAGE'}\n";
	print OUT "</TD></TR></TABLE>\n";
	print OUT "<HR>\n";

	#
	# Append messages.
	#
	open(IN, "board.dat");
	while (<IN>) {
		print OUT;
	}
	close(IN);
	close(OUT);

	#
	# Copy .tmp to .dat
	#
	open(IN, "board.tmp");
	open(OUT, "> board.dat");
	$msgs = 0;
	while (<IN>) {
		if ($_ =~ /^<TABLE><TR><TD>/) {
			if ($max_msgs != 0) {
				if ($msgs++ >= $max_msgs) {
					last;
				}
			}
		}
		print OUT;
	}
	close(IN);
	close(OUT);
}

#if ($ARGV[0] eq "reload") {
#	rmdir("lock/board.loc");
#	print "Location: $ENV{'SCRIPT_NAME'}\n";
#	print "\n";
#	exit(0);
#}

#
# Print HTML document
#
print "Content-type: text/html\n";
print "\n";
print "<HTML>\n";
print "<HEAD>\n";
print "<TITLE>家電探究記掲示板</TITLE>\n";
print "</HEAD>\n";
print "<BODY TEXT=black BGCOLOR=#9511b0>\n";
print "<H2>家電掲示板</H2>\n";
if ($return_url ne "") {
	print "<A HREF=\"$return_url\">[GO TOP]</A>\n";
}
print "<HR>\n";
#print "<FORM METHOD=POST ACTION=\"board.cgi?reload\">\n";
print "<FORM METHOD=POST ACTION=\"board.cgi\">\n";
print "<TABLE BORDER=1>\n";
print "<TR>";
print "<TD>あなたのお名前：</TD>";
print "<TD><INPUT TYPE=text NAME=FROM SIZE=54 VALUE=\"$FORM{'FROM'}\"></TD>\n";
print "</TR>\n";
print "<TR>";
print "<TD>ＵＲＬ：</TD>";
print "<TD><INPUT TYPE=text NAME=URL SIZE=54 VALUE=\"$FORM{'URL'}\"></TD>";
print "</TR>\n";
print "<TR>";
print "<TD COLSPAN=2><SMALL>URLにはメールアドレスか、http:で始まるホームページアドレスを入れてください。省略可。</SMALL></TD>\n";
print "</TR>\n";
print "<TR><TD COLSPAN=2>";
print "<TEXTAREA ROWS=3 COLS=60 NAME=MESSAGE></TEXTAREA></TD></TR>\n";
print "</TABLE>\n";
print "<P><INPUT TYPE=submit VALUE=\"投稿 / 再読\">\n";
print "</FORM>\n";
print "<HR>\n";
open(IN, "board.dat");
while (<IN>) {
	print;
}
close(IN);
print "</BODY>\n";
print "</HTML>\n";

#
# File unlock
#
rmdir("lock/board.loc");

