#!/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/>/>/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";
$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";
}
#=== 出力(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 "
$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";
}
#=== 出力(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";
$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";
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;
}