#!/usr/local/bin/perl # #上記はプロバイダの定めるPerlへのパス。(詳しくはプロバイダにお問い合わせください。) ############################################################################### #Message Board Ver.0.3 # written by みさお( http://www.nmt.ne.jp/~misao/ ) # 作成日:2000/9/9 最終更新:2006/11/16(訂正) ############################################################################### ######################### # 初期設定 # ######################### require 'jcode.pl'; $sendmail = '/usr/sbin/sendmail'; # 送信スクリプト(sendmail) プロバイダに聞くこと $mailsend = 0; #書き込み通知機能を使うかどうか。(sendmailが使える場合のみ有効)使う・・・1,使わない・・・0(半角) $mailsend2 = 1; #投稿者への返信通知機能を使うかどうか。(sendmailが使える場合のみ有効)使う・・・1,使わない・・・0(半角) $password = "master"; #パスワード。 $kanri ="管理人"; #ご自分の名前 $email = "xxx\@xxx.ne.jp"; #ご自分のメールアドレス。@の前には\をつけること。 $home = "../../cgi/index.html"; #戻るリンク先(相対パス。あるいはhttp://から始まるURL) $title = "Message Board"; #掲示板タイトル #書き込んでくれた人への返信連絡メールに添える署名。改行とタブは反映されます。@の前には\をつけること。 $sighn = "======================================= URL:http://www.homepage/~home/ ======================================="; #ここまでは変更必須。 $message = "あなたと私にしか見えない掲示板。どうぞ書き込んでね。"; #挨拶。 $homename = "もどる"; #$homeの名前。これにリンク。 #書き込んでくれた人への返信連絡メールに添えるメッセージ($mailsend2を1にした場合のみ有効。)改行とタブ、変数は反映されます。 $mailmsgs = "もしこのメールに覚えがないのでしたら、 お手数ですが、メールをこのまま送り返してください。"; $resup = 1; #1:返信のついた記事は上へ。0:返信がついても場所は変わらず。 $bgcolor = "#ffffff"; #背景色 $textcolor = "#666666"; #文字色 $linkcolor = "#0000ff"; #リンク色 $backimage = "bg.png"; #背景画像ファイル $titlecolor = "#ff2299"; #タイトルの文字色 $hr1 = ''; #罫1。タグで書く。 $hr2 = '
'; #罫2。タグで書く。 $tablecolor = "#fffff6"; #記事部分の背景色 $namecolor= "#ff0099"; #名前の色 $numcolor= "#9900ff"; #記事番号の色 $timecolor = "#0000ff"; #日時の色 $urlimage = ""; #URLの表示。デフォルトはurl.gifという画像にリンクがはられる。 $resimage = "\"返信を書く\""; #返信フォームへのリンク画像。タグOK。テキストも可。 $icon_mode = 1; #アイコン付きにするかどうか。アイコン付き・・・1,アイコンなし・・・0 #アイコン付きにする場合、次を設定。''で囲んで、,で区切ることで、いくつでも増やすことができる。 @icon_index=('にこにこ','まあまあ','怒!','やれやれ'); #アイコンの名前(選択肢として表示される分) @icon_file=('1.gif','2.gif','3.gif','4.gif'); #アイコンのファイル名(名前と位置を対応させること) $imagedir = ""; #アイコンのファイルがあるディレクトリ名。message.cgiと同じディレクトリの場合は空欄。 #以下は特に変更の必要はありません。 #その人が何も書き込んでいないし、管理者からの書き込みもないときに表示する注意書き。 $use = "名前と内容とパスワードは必須です。(パスワードは英数半角で適当なものを入力してください。)
"; #1行目 $use .= "パスワードとお名前があっていれば、ご自分の書きこみを見ることができます。$kanriの書きこみとそれに対する返信は全員が読めます。
"; #2行目 $use .= "$kanriとあなた以外に書き込みは見えませんので、気楽にどうぞ。(でもやっぱり大事な個人情報は避けてくださいね。)
"; #3行目 $use .= "詳しい使い方については、こちらをご覧ください。"; #4行目 $cgi = "message.cgi"; #このCGIスクリプトの名前。 $data = "message.dat"; #データファイルの名前。 $method = "post"; # $kijisuu = "10"; #1ページあたりに表示する記事の数 $lockdir="mlock"; #ロックディレクトリ $tagok = 1; #タグをOKにするかどうか(メッセージのみ)。OKにする・・・1,タグを禁止する・・・0 $forb = '!--|BODY|META|ISINDEX|HR|NOBR|XMP|BASEFONT|FORM|TABLE|FRAME|EMBED|BGSOUND|APPLET|SCRIPT'; #禁止するタグ $cookiename = "pmg"; $kikan = 50; #ここで設定した日数が経過した記事は自動的に削除する。 $credit = "Message Board Ver.0.3"; #クレジット。削除可。 #設定は以上。以下はCGIの分からない人はいじらないこと。 #------------------------- #処理の流れ &lock_check; &decode; &file_lock; &get_datafile; &write; &rewrite; &delete; &updata_file; &use_html; &resform_html; &match_pass; &show_html; &unlock; exit; #------------------------以下、サブルーチン集 sub lock_check{ if(-C "$lockdir">0.0004){ &unlock; } return; } sub decode { if ($ENV{'REQUEST_METHOD'} eq "POST") { read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); } else { $buffer = $ENV{'QUERY_STRING'}; } @pairs = split(/&/, $buffer); foreach $pair (@pairs) { ($vn, $value) = split(/=/, $pair); $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/&lt;/</g; $value =~ s/&gt;/>/g; $value =~ s/\t//g; $value =~ s/\cM//g; $value =~ s/\r/\n/g; $value =~ s/\r\n/\n/g; $value =~ s/\n/
/g; $value =~ s/

/

/g; $value =~ s/^( |\s)+//; # 先頭のスペースを削除 $value =~ s/( |\s)+$//; # 末尾のスペースを削除 &jcode'convert(*value, sjis); $value; $FORM{$vn} = $value; } $flag=0; #アップデート用の旗。 } sub file_lock{ $lockflag=0; if (mkdir($lockdir, 0755)) {return;} for ($i = 0; $i <= 5; $i++) { if (mkdir($lockdir, 0755)) { $lockflag=1; last; } else { sleep(1); } } if ($lockflag==0) { if(-e "$lockdir"){ &error(1,"他の方が使用中です。もう少し待ってからお願いします。

いつまでもこのメッセージが表\示されるようなら、
何らかのアクシデントで、ロックがかかったままの状態になっていると思われます。
"); } else {&error(1,"ロックディレクトリを作成できません。

CGIの入っているディレクトリがディレクトリの作成を許可するパーミッションでは
ないのが原因だと思います。ディレクトリのパーミッションを変更してください。"); } } $SIG{'TERM'} = $SIG{'PIPE'} = $SIG{'HUP'} = "sigexit"; sub sigexit { rmdir($lockdir); exit(1); } } sub get_datafile{ open (IN,"$data") || die &error(1, "データファイル$dataが開けません。"); @datas = ; close (IN); $host = $ENV{'REMOTE_HOST'}; $add = $ENV{'REMOTE_ADDR'}; ($host eq "" ) && ($host = $add); ($host eq $add) && ($host = ((gethostbyaddr(pack('C4',split(/\./,$add)),2))[0])); ($host eq "" ) && ($host = $add); &get_cookie; if($FORM{'mail'} && $FORM{'mail'} !~ /(.+)\@(.+)\.(.+)/){ &error(0,"メールアドレスが不正です。"); } if($FORM{'url'} && $FORM{'url'} !~ /^http:\/\//){ &error(0,"URLが不正です。"); } (($FORM{'name'} eq $kanri) && ($FORM{'pwd'} ne $password)) && &error(0,"その名前は管理者専用です。または、パスワードが間違っています。"); ($FORM{'name'}) && ($c_name=$FORM{'name'}); ($FORM{'mail'}) && ($c_mail=$FORM{'mail'}); ($FORM{'url'}) && ($c_url=$FORM{'url'}); ($FORM{'pwd'}) && ($c_pwd=$FORM{'pwd'}); ($FORM{'use_cookie'} eq "on") && &set_cookie; if ($FORM{'del_cookie'} eq "on") { $c_name="";$c_pwd="";$c_url="";$c_mail=""; &set_cookie; } if($FORM{'message'} && $tagok){ $FORM{'message'} =~ s/<//g; ($FORM{'message'} =~ /<($forb)/i) && ($FORM{'message'} =~ s//>/); ($FORM{'message'} =~ /<>/) && ($FORM{'message'} =~ s/<>/<>/g); } } sub write{ ($FORM{'mode'} ne "write") && return; (!$FORM{'message'}) && return; (!$c_name) && &error(0,"お名前を入力してください。"); (!$c_pwd) && &error(0,"パスワードを入力してください。"); $no = (split "\t",$datas[0])[0]+1; ($FORM{'message'} eq (split "\t",$datas[0])[6] && $c_name eq (split "\t",$datas[0])[2]) && return; $pwd = &crypt_pass($c_pwd); $value = "$no\t$^T\t$c_name\t$pwd\t$c_mail\t$c_url\t$FORM{'message'}\t$host\t$FORM{'icon'}\t$FORM{'renraku'}\t$^T\n"; unshift(@datas,$value); @datas = grep((split "\t")[$#_]>$^T-$kikan*60*60*24,@datas); $flag=1; } sub rewrite{ ($FORM{'mode'} ne "rewrite") && return; (!$FORM{'message'}) && return; (!$c_name) && &error(0,"お名前を入力してください。"); (!$c_pwd) && &error(0,"パスワードを入力してください。"); foreach $data(@datas){ @datano = split("\t",$data); $lasttime = splice(@datano,-1,1); if($FORM{'no'}==$datano[0]){ $resno = (split "<>",$datano[$#datano])[0]+1; ($FORM{'message'} eq (split "<>",$datano[$#datano])[6] && $c_name eq (split "<>",$datano[$#datano])[2]) && return; (($datano[2] eq $c_name && &solve_pass($c_pwd,$datano[3])) || ($c_name eq $kanri && $c_pwd eq $password)) || &error(0,"名前とパスワードが管理者、または親記事を書いた人と一致しないので返信できません。"); $pwd = &crypt_pass($c_pwd); $resvalue = "$resno<>$^T<>$c_name<>$pwd<>$c_mail<>$c_url<>$FORM{'message'}<>$host<>$FORM{'icon'}"; ($datano[9] && $mailsend2 && $datano[4]) && &renraku_mail($datano[2],$datano[4]); push (@datano,$resvalue); push (@datano,"$^T\n"); $data = join("\t",@datano); $flag=1; } push (@newdatas,"$data"); } (!$flag) && &error(0,"返信すべき記事がありません。"); @datas = @newdatas; } sub delete{ ($FORM{'mode'} ne "del")&& return; ($c_pwd eq "") && &error(0,"パスワードを入力してください。"); foreach $data(@datas){ $delflag=0; undef (@newbasedatas); @basedatas = split("\t",$data); if ($FORM{"$basedatas[0]\_0"} eq "on"){ (!&solve_pass($c_pwd,$basedatas[3]) && $c_pwd ne $password) && &error(0,"削除のパスワードが違います。"); (&solve_pass($c_pwd,$basedatas[3]) || $c_pwd eq $password) && (($flag=1) && next); } else { $lasttime = splice(@basedatas,-1,1); for ($j=0;$j<=$#basedatas;$j++){ if($j>=8){ ($resdatano,$restime,$resname,$respwd,$resmail,$resurl,$resmessage,$resuser) = split("<>",$basedatas[$j]); if ($FORM{"$basedatas[0]\_$resdatano"} eq "on"){ (!&solve_pass($c_pwd,$respwd) && $c_pwd ne $password) && &error(0,"削除のパスワードが違います。"); (&solve_pass($c_pwd,$respwd) || $c_pwd eq $password) && (($flag=1) && ($delflag=1)&& next); } } push (@newbasedatas,$basedatas[$j]); } $data = join("\t",@newbasedatas); ($delflag) && ($lasttime="$^T\n"); $data = "$data\t$lasttime"; } push (@newdatas,$data); } $flag=1; ($flag==0) && &error(0,"削除する記事をチェックしてください。"); @datas=@newdatas; } sub updata_file{ ($flag==1) || return; open (LINES,">$data") || &error(1, "データファイル$dataが開けません。"); eval 'flock(LINES,2);'; seek (LINES,0,0); print LINES (@datas); eval 'flock(LINES,8);'; close (LINES); ($mailsend) && &email; } sub use_html{ ($FORM{'mode'} eq 'howtouse') || return; $title = "$titleの使い方"; &html_header; print <<"_HTML_";

使い方

$titleへ _HTML_ &html_footer; } sub resform_html{ ($FORM{'mode'} eq 'res') || return; ($FORM{'no'}) || &error(1,"どの記事に返信するのか、指定されていません。"); foreach (@datas){ @basedatas = split("\t",$_); splice(@basedatas,-1,1); if ($FORM{'no'} == $basedatas[0]){ (($c_name eq $basedatas[2] && &solve_pass($c_pwd,$basedatas[3])) || ($c_name eq $kanri && $c_pwd eq $password)) || &error(0,"元記事を書いた方とお名前、パスワードが一致しませんので、
返信できません。"); last; } } &html_header; print "
$hr1

"; #記事表示 print "

\n"; print ""; print "\n"; $j=10; while ($basedatas[$j]){ ($resdatano,$restime,$resname,$respwd,$resmail,$resurl,$resmessage,$resuser,$resicon) = split("<>",$basedatas[$j]); print "\n"; } continue {$j++;} print "
  "; ($c_name eq $kanri && $c_pwd eq $password) && print "(No.$basedatas[0]) "; $basedatas[1] = &gettime($basedatas[1]); print "$basedatas[1]\n"; print "from "; (($basedatas[4]) && print "$basedatas[2]") || print "$basedatas[2]"; print "\n"; ($basedatas[9] && $basedatas[4]) && print "*"; ($c_name eq $kanri && $c_pwd eq $password) && print " ($basedatas[7])"; ($basedatas[5]) && print "$urlimage"; print "
"; ($basedatas[8] && $icon_mode) && print "\n"; print "$basedatas[6]\n"; print "
   "; ($c_name eq $kanri && $c_pwd eq $password) && print "(No.$basedatas[0]-$resdatano) "; $restime = &gettime($restime); print "$restime\n"; print "from "; (($resmail) && print "$resname") || print "$resname"; print "\n"; ($c_name eq $kanri && $c_pwd eq $password) && print " ($resuser)"; ($resurl) && print "$urlimage"; print "
"; ($resicon && $icon_mode) && print "\n"; print "$resmessage\n"; print "
\n"; print "
$hr1

\n"; #書き込みフォーム部分 print "

\n"; print "\n"; print "\n"; print ""; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "
名前:
Mail:
URL:
内容:
Password:\n"; if ($icon_mode){ print " アイコン\n"; } print "  \ \Cookieに記憶\n"; print "
\n"; print "
\n"; &html_footer; } sub match_pass{ @personsdata = @datas; ($FORM{'person'}) && (@datas = grep((split /\t/)[2] eq $FORM{'person'} || (split /\t/)[2] eq $kanri,@datas)); @datas = grep { @kijidatas = split("\t", $_); $kijidatas[2] eq $c_name && &solve_pass($c_pwd,$kijidatas[3]) || $kanri eq $c_name && $c_pwd eq $password || $kijidatas[2] eq $kanri && &solve_pass($password,$kijidatas[3]); } @datas; } sub show_html{ ($FORM{'mode'} eq "res" || $FORM{'mode'} eq "howtouse") && return; &html_header; #書き込みフォーム部分 print "
\n"; print "\n"; print ""; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "
名前:
Mail:
URL:
内容:
Password:\n"; if ($icon_mode){ print " アイコン\n"; } (!($c_name eq $kanri && $c_pwd eq $password) && ($mailsend2 && $sendmail)) && print " 返信をメールで連絡\n"; if ($c_name eq $kanri && $c_pwd eq $password){ undef(%count); @names = grep(!$count{(split /\t/)[2]}++ && $kanri ne (split /\t/)[2],@personsdata); print "の記事を表\示\n"; } print "
\n"; ($resup) && print "書き込み順に並べる \n"; print "Cookieに記憶\n"; ($COOKIE{'name'}) && print "Cookieを空欄に\n"; print "
\n"; print "
\n"; print "
$hr1

"; print "

\n"; print "\n"; print "\n"; if ($resup && !$FORM{'junjo'}){ @tmp = map {(split /\t/)[$#$_]} @datas; @datas = @datas[sort {$tmp[$b] <=> $tmp[$a]} 0 .. $#tmp]; } ($start=$FORM{'start'}) || ($start=0); $end=$start+$kijisuu; ($end>scalar(@datas)) && ($end=scalar(@datas)); ($end-$start<1) && print "
$use
\n"; for($i=$start;$i<$end;$i++){ @basedatas = split("\t",$datas[$i]); splice(@basedatas,-1,1); #記事表示 print "

\n"; print ""; print "\n"; $j=10; while ($basedatas[$j]){ ($resdatano,$restime,$resname,$respwd,$resmail,$resurl,$resmessage,$resuser,$resicon) = split("<>",$basedatas[$j]); print "\n"; } continue {$j++;} print "
"; ((($c_name eq $kanri && $c_pwd eq $password) || ($c_name eq $basedatas[2] && &solve_pass($c_pwd,$basedatas[3]))) && print "\n") || print "  "; ($c_name eq $kanri && $c_pwd eq $password) && print "(No.$basedatas[0]) "; $basedatas[1] = &gettime($basedatas[1]); print "$basedatas[1]\n"; print "from "; (($basedatas[4]) && print "$basedatas[2]") || print "$basedatas[2]"; print "\n"; ($basedatas[9] && $basedatas[4]) && print "*"; ($c_name eq $kanri && $c_pwd eq $password) && print " ($basedatas[7])"; ($basedatas[5]) && print "$urlimage"; (($c_name eq $kanri && $c_pwd eq $password) || ($c_name eq $basedatas[2] && &solve_pass($c_pwd,$basedatas[3]))) && print "$resimage\n"; print "
"; ($basedatas[8] && $icon_mode) && print "\n"; print "$basedatas[6]\n"; print "
 "; ((($c_name eq $kanri && $c_pwd eq $password) || ($c_name eq $resname && &solve_pass($c_pwd,$respwd))) && print "\n") || print "  "; ($c_name eq $kanri && $c_pwd eq $password) && print "(No.$basedatas[0]-$resdatano) "; $restime = &gettime($restime); print "$restime\n"; print "from "; (($resmail) && print "$resname") || print "$resname"; print "\n"; ($c_name eq $kanri && $c_pwd eq $password) && print " ($resuser)"; ($resurl) && print "$urlimage"; print "
"; ($resicon && $icon_mode) && print "\n"; print "$resmessage\n"; print "
\n"; } print "

\n"; print "\n"; print "

\n"; print "
$hr1

"; &nextpage; &html_footer; } sub unlock{ return rmdir($lockdir); } sub html_header{ print $cookieline; print "Content-type: text/html\n\n"; print <<"_HTML_"; $title [$homename][使い方]

$hr2

$title

$message
$hr2 _HTML_ } sub html_footer{ print <<"_HTML_";
$homename

$credit

_HTML_ } sub nextpage{ print "\n"; if ($start>0){ $start=$start-$kijisuu; ($start<0) && ($start=0); print "\n"; } if ($end
\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; } print "
\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "
\n"; } sub renraku_mail{ #投稿者へ返信したものをメールで連絡する ($name,$tomail)=@_; if (!open(OUT,"| $sendmail $tomail")) { return; } print OUT "To: $tomail\n"; (!$c_mail) && ($c_mail = $email); print OUT "From: $c_mail\n"; &jis("Subject: $titleの記事への返信"); print OUT "$msg\n"; print OUT "Content-Transfer-Encoding: 7bit\n"; print OUT 'Content-Type: text/plain; charset=iso-2022-jp' . "\n\n\n"; &jis("$nameさんへ\n$titleの書き込みに対する$c_nameからの返信です。"); print OUT "$msg\n"; $FORM{'message'} =~ s/

/\n\n/g; $FORM{'message'} =~ s/
/\n/g; &jis("\n$FORM{'message'}\n"); print OUT "$msg\n\n"; if ($mailmsgs){&jis("$mailmsgs"); print OUT "$msg\n";} &jis("$sighn"); print OUT "$msg"; close(OUT); } sub email{ # $kanriに投稿をメールする (!$FORM{'message'}) && return; (!open(OUT,"| $sendmail $email")) && return; print OUT "To: $email\n"; if ($c_mail ne ''){ print OUT "From: $c_mail\n";} else { print OUT "From: $email\n"; } if ($FORM{'mode'} eq "write") { $number = "No.$no";} if ($FORM{'mode'} eq "rewrite") { $number = "No.$FORM{'no'}-$resno";} &jis("Subject: [$title]$number"); print OUT "$msg\n"; print OUT "Content-Transfer-Encoding: 7bit\n"; print OUT 'Content-Type: text/plain; charset=iso-2022-jp' . "\n\n\n"; &jis("名前: $c_name"); print OUT "$msg\n"; &jis("Mail: $c_mail"); print OUT "$msg\n"; &jis("Web: $c_url"); print OUT "$msg\n"; $FORM{'message'} =~ s/

/\n\n/g; $FORM{'message'} =~ s/
/\n/g; &jis("$FORM{'message'}"); print OUT "\n$msg\n\n"; &jis("リモートホスト: $host"); print OUT "$msg\n"; close(OUT); } sub jis { $msg = $_[0]; &jcode'convert(*msg, 'jis'); } #########Cookie関係 #Cookieをセット。 sub set_cookie{ local($path, $cook); $expires = &get_time_GMT($^T + $kikan*60*60*24); ($path) = $ENV{'SCRIPT_NAME'} =~ m|^(.+/)[^/]+$|; $cook = "name<>$c_name\,pwd<>$c_pwd\,mail<>$c_mail\,url<>$c_url"; $cookieline="Set-Cookie: $cookiename=$cook; expires=$expires; path=$path;\n"; } #Cookie取得 sub get_cookie{ @pairs = split(/\;/,$ENV{'HTTP_COOKIE'}); foreach $pair (@pairs) { local($name, $value) = split(/\=/, $pair); $name =~ s/ //g; $DUMMY{$name} = $value; } @pairs = split(/\,/,$DUMMY{"$cookiename"}); foreach $pair (@pairs) { local($name, $value) = split(/<>/, $pair); $COOKIE{$name} = $value; } $c_name = $COOKIE{'name'}; $c_pwd = $COOKIE{'pwd'}; $c_mail = $COOKIE{'mail'}; $c_url = $COOKIE{'url'}; } #Cookie用にGMTを得る。 sub get_time_GMT{ local($time) = @_; local($sec, $min, $hour, $mday, $mon, $year, $wday) = gmtime($time); $wday = ('Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat')[$wday]; $mon = ('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec')[$mon]; $year += 1900; return sprintf("$wday, %02d-$mon-$year %02d:%02d:%02d GMT", $mday, $hour, $min, $sec); } #秒数を年月日に変換 sub gettime{ local($time) = @_; ($sec,$min,$hour,$dy,$mon,$year,$wday,$yday,$isdst) = localtime($time); @week = ('Sun.','Mon.','Tue.','Wed.','Thu.','Fri.','Sat.'); $time = sprintf("%04d/%02d/%02d\($week[$wday]\)%02d:%02d",$year+1900,$mon+1,$dy,$hour,$min); return $time; } #Password sub crypt_pass{ local($pass) = @_; srand(); $xx = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" . "abcdefghijklmnopqrstuvwxyz" . "0123456789./"; $salt = substr($xx, int(rand(64)), 1); $salt .= substr($xx, int(rand(64)), 1); $pass = crypt($pass,$salt); return $pass; } sub solve_pass{ local($pass,$pwd) = @_; #&solve_pass($入力されたパス,$保存されたパス) $salt = substr($pwd,0,2); ($pwd eq crypt($pass,$salt)) && return 1 || return 0; } sub error{ local ($id,$msg) = @_; &unlock; $fmsg[0] = "Backを押して戻ってください"; $fmsg[1] = "$kanriに連絡してください"; $title = "お知らせ"; &html_header; print <<"_HTML_";

$msg

$fmsg[$id]


_HTML_ &html_footer; exit; }