#!/usr/bin/perl ################################################################## # Program : ibbs2.cgi(Perl) $ver = 5.1; # Permission : 755 # Date_written : 2001/01/13 # Author : 良寛 # E-mail : ryokan@po.minc.ne.jp # HomePage : http://www.minc.ne.jp/~ryokan/ ################################################################## # # -----注意事項--------------------------------------------------- # (1)このスクリプトはフリーソフトです。このスクリプトを使用した # いかなる損害に対して作者は一切の責任を負いません。 # (2)設置に関する質問は質問コーナーにお願いいたします。 # ---------------------------------------------------------------- # require './jcode.pl'; require './init.pl'; #=== フォームデータの受信 ====================================== if ($ENV{'REQUEST_METHOD'} eq "POST") { read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); } else { $buffer = $ENV{'QUERY_STRING'}; } #=== 受信データの編集 ========================================== @buffer = split(/&/, $buffer); foreach $pair (@buffer) { local($name, $value) = split(/=/, $pair); $name =~ tr/+/ /; $name =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; $value =~ s//>/ig; $value =~ s/\r\n/
/g; $value =~ s/\n/
/g; $value =~ s/\r/
/g; $value =~ s/\,/,/g; &jcode'convert(*name,'sjis'); &jcode'convert(*value,'sjis'); &jcode'h2z_sjis(*value); $FORM{$name} = $value; } $now = $FORM{'now'}; $submit = $FORM{'submit'}; $pass = $FORM{'pass'}; $num = $FORM{'num'}; $delpass = $FORM{'delpass'}; #=== ブラウザ確認 ============================================== $body1 = ''; # iモード Version1.0用(モノクロ) $body2 = ''; # iモード Version2.0用(カラー) $body3 = ''; # iモード以外 $imode = 0; # パソコン $body = $body3; if ( $ENV{'HTTP_USER_AGENT'} =~ /DoCoMo/ ) { $imode = 1; # i-mode if ( $ENV{'HTTP_USER_AGENT'} =~ /502/ ) { $body = $body2; } else { $body = $body1; } } # j-sky判別部修正(2001/01/06) $jp1 = $ENV{'HTTP_X_JPHONE_COLOR'}; $jp2 = $ENV{'HTTP_X_JPHONE_DISPLAY'}; $jp3 = $ENV{'HTTP_X_JPHONE_MSNAME'}; $jp4 = $ENV{'HTTP_X_JPHONE_SOUND'}; if ( ($jp1 ne "") || ($jp2 ne "") || ($jp3 ne "") || ($jp4 ne "") ) { $imode = 2; # J-SkyWeb $body = $body1; } if ($ENV{'HTTP_USER_AGENT'} =~ /UP\.Browser/) { $imode = 3; # EZWeb $body = $body1; } #=== ホスト名を取得 ============================================= &get_host; #$rehost #=== 処理の振り分け ============================================ $| = 1; if ( $FORM{'submit'} eq '戻る' ){ &yomikomi; } &yomikomi; if ( $imode == 0 ) { &output_web; } if ( $imode == 1 ) { &output_imode; } if ( $imode == 2 ) { &output_jmode; } if ( $imode == 3 ) { &output_emode; } exit; #******************** SUBROUTINE ******************************* #=== 読込 ====================================================== sub yomikomi { if( !open (IN,"$bbs_data") ) { push(@err,'bbs_data read error'); &error; } @lines = ; close (IN); @rev_lines = reverse(@lines); $i = 0; $j = 0; @work = (); @child = (); foreach $line (@rev_lines) { # $p[$j]=1:親記事 $p[$j]=0:レス記事 ($p[$j],$name[$j],$date[$j],$email[$j],$tele[$j],$title[$j], $message[$j],$delpass[$j]) = split(/\|\|\|/, $line); # 親記事とレス記事の判別 if ( $p[$j] == 1 ) { $i++; push(@work,$line); # レス記事を古い順に並び替える @child = reverse(@child); push(@work,@child); @child = (); } else { push(@child,$line); } $j++; } # 親記事数-1 $n = $i - 1; $j = 0; foreach $line (@work) { chop($line); # $p[$j]=1:親記事 $p[$j]=0:レス記事 ($p[$j],$name[$j],$date[$j],$email[$j],$tele[$j],$title[$j], $message[$j],$delpass[$j]) = split(/\|\|\|/, $line); $j++; } } #=== 出力(i-mode) ============================================= sub output_imode { &count; print "Content-type: text/html\n\n"; print "$title\n"; print "$body\n"; print "
$title
\n"; if ( $submit eq "" ) { # 初期ロード $i = 0; $now = 0; } if ( $submit eq '次' ) { # 次ボタンクリック $i = $now + $imax; if ( $i > $n ) { $i = $now; } $now = $i; } if ( $submit eq '前' ) { # 前ボタンクリック $i = $now - $imax; if ( $i < 0 ) { $i = 0; } $now = $i; } print "
\n"; print "\n"; # トップへ print "\n"; print "\n"; print "\n"; print "書く\n"; # 書く print "
\n"; $i = $now; for ( $j = 0 ; $j < $imax ; $j++ ) { if ( $i > $n ) { last; } $i++; } # 表示用 $j,$n(内部処理は0から始まるため) local($dj); local($dn) = $n + 1; local($hajime) = $now + 1; local($owari) = $i; if ( $dn == 0 ) { $hajime = 0; } local($counter) = sprintf("%04d",$count); $hajime = sprintf("%02d",$hajime); $owari = sprintf("%02d",$owari); $dn = sprintf("%02d",$dn); print "[$counter]($hajime\-$owari)\/$dn
\n"; # [2]大愚 良寛 # がんばってくださ‥ のようなフォーマットで local($string); $i = $now; # トップに表示される親記事の通し番号をサーチ $k = 0; for ( $j = 0; $j < $#work; $j++ ) { if ( $p[$j] == 1 ) { if ( $k == $now ) { last; } $k++; } } $k = $j; for ( $j = 0; $j < $imax; $j++ ) { if ( $i > $n ) { last; } if ( $p[$k] ) { # 親記事 $dj = $j + 1; $rdj= $dj%10; print "[$rdj]\n"; $string = $name[$k]; if ( length($string) > 12 ) { $string = substr($string,0,10); $string .= "\‥"; print "$string
\n"; } else { print "$name[$k]
\n"; } $string = $title[$k]; if ( length($string) > 16 ) { $string = substr($string,0,14); $string .= "\‥"; print "$string
\n"; } else { print "$title[$k]
\n"; } $i++; $k++; } else { # レス記事 while ( $p[$k] == 0 ) { $string = $title[$k]; if ( length($string) > 14 ) { $string = substr($string,0,12); $string .= "\‥"; print "$string
\n"; } else { print "$string
\n"; } $k++; } $j--; } } # レス記事掃出し local($m) = $#work; while ( $p[$k] == 0 ) { if ( $k > $m ) { last; } $string = $title[$k]; if ( length($string) > 14 ) { $string = substr($string,0,12); $string .= "\‥"; print "$string
\n"; } else { print "$string
\n"; } $k++; } print "\n"; } #=== 出力(j-mode) ============================================= sub output_jmode { &count; print "Content-type: text/html\n\n"; print "$title\n"; print "$body\n"; print "
$title
\n"; if ( $submit eq "" ) { # 初期ロード $i = 0; $now = 0; } if ( $submit eq '次' ) { # 次ボタンクリック $i = $now + $imax; if ( $i > $n ) { $i = $now; } $now = $i; } if ( $submit eq '前' ) { # 前ボタンクリック $i = $now - $imax; if ( $i < 0 ) { $i = 0; } $now = $i; } print "
\n"; print "\n"; # トップへ print " \n"; # 書く print "
\n"; $i = $now; for ( $j = 0 ; $j < $imax ; $j++ ) { if ( $i > $n ) { last; } $i++; } # 表示用 $j,$n(内部処理は0から始まるため) local($dj); local($dn) = $n + 1; local($hajime) = $now + 1; local($owari) = $i; if ( $dn == 0 ) { $hajime = 0; } local($counter) = sprintf("%04d",$count); $hajime = sprintf("%02d",$hajime); $owari = sprintf("%02d",$owari); $dn = sprintf("%02d",$dn); print "[$counter]($hajime\-$owari)\/$dn
\n"; # [2]大愚 良寛 # がんばってくださ‥ のようなフォーマットで local($string); $i = $now; # トップに表示される親記事の通し番号をサーチ $k = 0; for ( $j = 0; $j < $#work; $j++ ) { if ( $p[$j] == 1 ) { if ( $k == $now ) { last; } $k++; } } $k = $j; for ( $j = 0; $j < $imax; $j++ ) { if ( $i > $n ) { last; } if ( $p[$k] ) { # 親記事 $dj = $j + 1; $rdj= $dj%10; print "[$rdj]\n"; $string = $name[$k]; if ( length($string) > 12 ) { $string = substr($string,0,10); $string .= "\‥"; print "$string
\n"; } else { print "$name[$k]
\n"; } $string = $title[$k]; if ( length($string) > 16 ) { $string = substr($string,0,14); $string .= "\‥"; print "$string
\n"; } else { print "$title[$k]
\n"; } $i++; $k++; } else { # レス記事 while ( $p[$k] == 0 ) { $string = $title[$k]; if ( length($string) > 14 ) { $string = substr($string,0,12); $string .= "\‥"; print "$string
\n"; } else { print "$string
\n"; } $k++; } $j--; } } # レス記事掃出し local($m) = $#work; while ( $p[$k] == 0 ) { if ( $k > $m ) { last; } $string = $title[$k]; if ( length($string) > 14 ) { $string = substr($string,0,12); $string .= "\‥"; print "$string
\n"; } else { print "$string
\n"; } $k++; } # 次ページ、前ページボタン print "
\n"; print "
\n"; print "\n"; print "\n"; print "\n"; print "
\n"; print "
\n"; print "\n"; } #=== 出力(e-mode) ============================================= sub output_emode { &count; print "Content-Type: text/x-hdml; charset=Shift_jis\n\n"; print "\n"; print "\n"; print "
$title
\n"; print "
===============
\n"; if ( $submit eq "" ) { # 初期ロード $i = 0; $now = 0; } if ( $submit eq "next" ) { # 次ボタンクリック $i = $now + $imax; if ( $i > $n ) { $i = $now; } $now = $i; } if ( $submit eq "before" ) { # 前ボタンクリック $i = $now - $imax; if ( $i < 0 ) { $i = 0; } $now = $i; } print "ホームへ \n"; $submit = "before"; print "\n"; $submit = "next"; print " \n"; print "書く
\n"; $i = $now; for ( $j = 0 ; $j < $imax ; $j++ ) { if ( $i > $n ) { last; } $i++; } # 表示用 $j,$n(内部処理は0から始まるため) local($dj); local($dn) = $n + 1; local($hajime) = $now + 1; local($owari) = $i; if ( $dn == 0 ) { $hajime = 0; } local($counter) = sprintf("%04d",$count); $hajime = sprintf("%02d",$hajime); $owari = sprintf("%02d",$owari); $dn = sprintf("%02d",$dn); print "
[$counter]($hajime\-$owari)\/$dn
\n"; # [2]大愚 良寛 # がんばってくださ‥ のようなフォーマットで local($string); $i = $now; # トップに表示される親記事の通し番号をサーチ $k = 0; for ( $j = 0; $j < $#work; $j++ ) { if ( $p[$j] == 1 ) { if ( $k == $now ) { last; } $k++; } } $k = $j; for ( $j = 0; $j < $imax; $j++ ) { if ( $i > $n ) { last; } if ( $p[$k] ) { # 親記事 $dj = $j + 1; $rdj= $dj%10; print "
===============
\n"; print "[$rdj]\n"; $string = $name[$k]; if ( length($string) > 12 ) { $string = substr($string,0,10); $string .= "\‥"; print "$string
\n"; } else { print "$name[$k]
\n"; } $string = $title[$k]; if ( length($string) > 16 ) { $string = substr($string,0,14); $string .= "\‥"; print "$string
\n"; } else { print "$title[$k]
\n"; } $i++; $k++; } else { # レス記事 while ( $p[$k] == 0 ) { $string = $title[$k]; if ( length($string) > 14 ) { $string = substr($string,0,12); $string .= "\‥"; print "\"Re\"$string
\n"; } else { print "\"Re\"$string
\n"; } $k++; } $j--; } } # レス記事掃出し local($m) = $#work; while ( $p[$k] == 0 ) { if ( $k > $m ) { last; } $string = $title[$k]; if ( length($string) > 14 ) { $string = substr($string,0,12); $string .= "\‥"; print "\"Re\"$string
\n"; } else { print "\"Re\"$string
\n"; } $k++; } print "\n"; } #=== 出力(web) ================================================ sub output_web { &count; print "Content-type: text/html\n\n"; print "$title\n"; print "$body\n"; print "
$title
\n"; if ( $submit eq "" ) { # 初期ロード $i = 0; $now = 0; } if ( $submit eq '次' ) { # 次ボタンクリック $i = $now + $imax; if ( $i > $n ) { $i = $now; } $now = $i; } if ( $submit eq '前' ) { # 前ボタンクリック $i = $now - $imax; if ( $i < 0 ) { $i = 0; } $now = $i; } print "\n"; print "
\n"; print "\n"; print "\n"; print "\n"; print "
\n"; print "トップへ\n"; print "

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

\n"; print "書く
\n"; $i = $now; for ( $j = 0 ; $j < $imax ; $j++ ) { if ( $i > $n ) { last; } $i++; } # 表示用 $j,$n(内部処理は0から始まるため) local($dj); local($dn) = $n + 1; local($hajime) = $now + 1; local($owari) = $i; if ( $dn == 0 ) { $hajime = 0; } local($counter) = sprintf("%04d",$count); $hajime = sprintf("%02d",$hajime); $owari = sprintf("%02d",$owari); $dn = sprintf("%02d",$dn); print "[$counter]($hajime\-$owari)\/$dn\n"; print "
\n"; # [2]大愚 良寛 # がんばってくださ‥ のようなフォーマットで local($string); $i = $now; # トップに表示される親記事の通し番号をサーチ $k = 0; for ( $j = 0; $j < $#work; $j++ ) { if ( $p[$j] == 1 ) { if ( $k == $now ) { last; } $k++; } } $k = $j; for ( $j = 0; $j < $imax; $j++ ) { if ( $i > $n ) { last; } if ( $p[$k] ) { # 親記事 $dj = $j + 1; $rdj= $dj%10; print "[$rdj]\n"; $string = $name[$k]; if ( length($string) > 12 ) { $string = substr($string,0,10); $string .= "\‥"; print "$string
\n"; } else { print "$name[$k]
\n"; } $string = $title[$k]; if ( length($string) > 16 ) { $string = substr($string,0,14); $string .= "\‥"; print "$string
\n"; } else { print "$title[$k]
\n"; } $i++; $k++; } else { # レス記事 while ( $p[$k] == 0 ) { $string = $title[$k]; if ( length($string) > 14 ) { $string = substr($string,0,12); $string .= "\‥"; print "$string
\n"; } else { print "$string
\n"; } $k++; } $j--; } } # レス記事掃出し local($m) = $#work; while ( $p[$k] == 0 ) { if ( $k > $m ) { last; } $string = $title[$k]; if ( length($string) > 14 ) { $string = substr($string,0,12); $string .= "\‥"; print "$string
\n"; } else { print "$string
\n"; } $k++; } print "
\n"; print "
\n"; ## 著作権を表示(削除禁止)タグは使えるか不明 print "
\n"; print "- top -\n"; print "
\n"; print "\n"; } #=== カウント処理 ============================================== sub count { # ファイルロック if ( $lockkey == 1 ) { $lockflag = &lock; if ( $lockflag == 0 ){ push(@err,'BUSY'); &error; } } # カウント処理 if(!open (IN,"$count_data")){ push(@err,'count_data read error'); &error; } $line = ; close (IN); chop($line); ($count,$remote,$time1) = split(/\|\|\|/, $line); $time2 = time; $deftime = $time2 - $time1; # 現在の訪問者と前の訪問者が異なるか、あるいは # 3分以上経過のときはカウントする if ( $remote ne $rehost || $deftime > 60*3 ) { $count++; $line = "$count|||$rehost|||$time2"; if (!open (OUT,">$count_data")){ push(@err,'count_data write error'); &error; } print OUT "$line\n"; close (OUT); } # ロックファイルの削除 if ( $lockkey == 1 ) { if ( -e $lockfile ) { unlink($lockfile); } } } #=== ホスト名を取得 ============================================ sub get_host { $rehost = $ENV{'REMOTE_HOST'}; $readdr = $ENV{'REMOTE_ADDR'}; if ($rehost eq "" || $rehost eq "$readdr") { ($p1,$p2,$p3,$p4) = split(/\./,$readdr); $pack = pack("C4",$p1,$p2,$p3,$p4); $rehost = gethostbyaddr("$pack", 2); if ($rehost eq "") { $rehost = $readdr; } } } #=== ロックファイル ============================================ sub lock { local($flag) = 0; foreach (1..10) { unless(-e $lockfile){ open(LOCK,">$lockfile"); close(LOCK); $flag = 1; last; } sleep(1); } $flag; } #=== エラー表示サブルーチン ==================================== sub error { if ( $imode == 3 ) { print "Content-Type: text/x-hdml; charset=Shift_jis\n\n"; print "\n"; print "\n"; print "
エラー
\n"; foreach (@err) { print "$_\n"; print "
\n"; } print "\n"; print "\n"; } else { print "Content-type: text/html\n\n"; print "エラー\n"; print "\n"; print "
ERROR
\n"; foreach (@err) { print "$_\n"; print "
\n"; } print "
\n"; print "\n"; } # ロックファイルの削除 if ( $lockkey == 1 ) { if ( -e $lockfile ) { unlink($lockfile); } } exit; }