#!/usr/local/bin/perl
#==========================================================#
# BBOARD CGI (bboard.cgi) (2001/05/26) #
# 告知版 #
# Copyright(C) KG works. 2002 #
# info@kg-works.dip.jp #
# http://kg-works.dip.jp/ #
#==========================================================#
# [History]
# 01/12/02
# 02/07/15 最大件数、カウンタ、管理者モードでの削除機能をPOST
# 02/12/24 HTMLの見直しファイル構成変更
# 02/12/27 画像再登録機能
$ver = 'BBoard v1.14'; # バージョン情報
# ライブラリ取り込み
require './lib/jcode.pl';
require './lib/cgi-lib.pl';
#=== 設定項目 ===
# タイトル名
$title = "画像付き子犬出産情報掲示板";
# タイトルにGIF画像を使う場合 (GIFファイル名)
$t_gif = "../../images/notice_title2.gif";
$t_wid = 286; # 画像の横サイズ(ピクセル)
$t_hgt = 82; # 〃 縦サイズ(ピクセル)
# フッタにGIF画像を使う場合 (GIFファイル名)
$f_gif = "./img/mini.gif";
$f_wid = 50; # 画像の横サイズ(ピクセル)
$f_hgt = 20; # 〃 縦サイズ(ピクセル)
# newにGIF画像を使う場合 (GIFファイル名)
$new_gif = "./img/new.gif";
$new_wid = 30; # 画像の横サイズ(ピクセル)
$new_hgt = 12; # 〃 縦サイズ(ピクセル)
# homeにGIF画像を使う場合 (GIFファイル名)
$h_gif = "../images/ask.gif";
$h_wid = 92; # 画像の横サイズ(ピクセル)
$h_hgt = 20; # 〃 縦サイズ(ピクセル)
# 内容に画像を使う場合 (ファイル名)
$nai_gif = "";
$n_wid = 100; # 画像の横サイズ(ピクセル)
$n_hgt = 30; # 〃 縦サイズ(ピクセル)
# コメントに画像を使う場合 (ファイル名)
$rem_gif = "";
$r_wid = 100; # 画像の横サイズ(ピクセル)
$r_hgt = 30; # 〃 縦サイズ(ピクセル)
# 内容・コメントの項目名
# コメントは、使用しない場合は、""にしてください。
$w_nai = "■ 内容";
$w_rem = "■ コメント";
# 初期表示
# 新規投稿時に表示されます。使用しない場合は、""にしてください。
$i_nai = "";
$i_rem = "";
# 環境設定
$bground = "../../images/bbs_bg.gif"; # 壁紙
$bgcolor = "#ffffff"; # 背景色
$text = "#333333"; # 文字色
$link = "#0000FF"; # リンク色(未訪問)
$vlink = "#800080"; # リンク色(既訪問)
$alink = "#FF0000"; # リンク色(訪問中)
# 本文文字サイズ(スタイルシート)
$f_size = '10pt';
# 基本色
$t_color = "#FF5A4D";
# 題名の色
$sub_color = "#FF5A4D";
# 記事背景の色
$g_color = "#ffffff";
# 帯の色
$b_color = "#FF5A4D";
# 文字の色
$f_color = "#ffffff";
# スクリプト名
# 絶対パスなら http:// からのURLパス
$script = "bboard.cgi";
# 戻り先
# 絶対パスなら http:// からのURLパス
$home = "javascript:this.close();";
# 管理用パスワード
$adminpass = 'japetbapys';
# ログファイル名
# 絶対パスなら / から始まるパス(http://からではない)
$logfile = "./data/bboard.log";
# バックアップ機能
# 0 : no 1 : yes
$bup = 1;
$bup_f = "./data/bboard.bak";
# データ件数(これより大きくしないでね)
$d_max = 1000;
# 1ページあたりの記事表示件数
$p_log = 10;
# NEWの表示日数
$newtime = 20;
# 新着情報件数
$new = 5;
# トップコメント
$top_com = "";
# カウンタ機能
# カウンタの設置
# 0 : 無 1 : 有
$counter = 1;
# カウンタの桁数
$cnt_keta = 5;
# カウンタの線の色
$cnt_tbcolor = "#FF6600";
# カウンタの背景色
$cnt_bgcolor = "#FFFFFF";
# カウンタの文字色
$cnt_color = "#FF6600";
# カウンタファイルの名前
$cnt_file = './data/count.dat';
# カウンタのロック
# 0=no 1=symlink関数 2=mkdir関数
$cnt_lockkey = 0;
# カウンタのロックファイル
$cnt_lock= "./data/dcnt.lock";
### 以下 KENT WEB (http://www.kent-web.com/) より
# アップロードディレクトリ
# → パスの最後は / で終わること
# → フルパスだと / から記述する
$ImgDir = "./tmp/";
# アップロードディレクトリのURLパス
# → パスの最後は / で終わること
$ImgUrl = "./tmp/";
# アップロードファイル名(ファイル規則)
$ImgNam = "img";
# アップロードを許可するファイル形式
# 0:no 1:yes
$gif = 1; # GIFファイル
$jpeg = 1; # JPEGファイル
$png = 0; # PNGファイル
# 投稿受理最大サイズ (bytes)
# → 例 : 102400 = 100KB
$cgi_lib'maxdata = '102400';
# 画像ファイルの最大表示の大きさ(単位:ピクセル)
# → これを超える画像は縮小表示します
$MaxW = 150; # 横幅
$MaxH = 150; # 縦幅
# ホスト名取得方式
# 0 : $ENV{'REMOTE_HOST'}で取得
# 1 : gethostbyaddr関数で取得
$gethostbyaddr = 0;
# ロックファイル機構 (0=no 1=symlink関数 2=mkdir関数)
$lockkey = 1;
# ロックファイル名
# → 絶対パスなら / から始まるパス(http://からではないので注意)
$lockfile = "./lock/bboard.lock";
# 投稿処理の権限
# 0: 誰でも投稿可能
# 1: 管理者のみが投稿
$PostMode = 1;
# タグ許可
# 0 = no 1 = yes
# PostMode = 1 のみ有効
$tagkey = 0;
# 登録時メール通知機能
# 0: no 1: yes
$mailing = 0;
# sendmailのパス(メール通知する場合)
$sendmail = '/usr/sbin/sendmail';
# メール通知先アドレス(メール通知する場合)
$mailto = '';
# アクセス制限(ホスト名を記述)
@deny = (
"anonymizer",
"cache*.*.interlog.com",
"",
"",
"",
""
);
#=== 設定はここまで ===
if ($ImgDir !~ /\/$/) { $ImgDir .= "/"; }
if ($ImgUrl !~ /\/$/) { $ImgUrl .= "/"; }
&decode;
&axs_check;
if ($mode eq 'regist') { ®ist; }
elsif ($mode eq 'find') { &find; }
elsif ($mode eq 'admin') { &admin; }
elsif ($mode eq 'check') { ✓ }
elsif ($mode eq 'num') { &henshu; }
elsif ($mode eq 'h_w') { &henwri; }
elsif ($mode eq 'bma') { &bma; }
elsif ($mode eq 'detail') { &detail; }
elsif ($mode eq 'new') { &new;}
&html;
#--------------------
# アクセス制限
#--------------------
sub axs_check {
# ホスト名を取得
&get_host;
$flag=0;
foreach (@deny) {
if (!$_) { next; }
$_ =~ s/\*/\.\*/g;
if ($host =~ /$_/i) { $flag=1; last; }
}
if ($flag) { error("アクセスを許可されていません"); }
}
#--------------------
# 記事表示処理
#--------------------
sub html {
&header;
print <<"EOM";
◇ 閉じる
◇ 新着情報
◇ ワード検索
◇ 管理用
EOM
if ($counter == 1) { &cntup; }
# ページ区切り処理
if (!$page) { $page = 1; }
$start = $page;
$end = $page + $p_log;
$match = 0;
open(IN,"$logfile") || error("Open Error : $logfile");
# 件数カウント
while () {
$match++;
}
close(IN);
# 01/06/07 ページ数表示
$pages = $match - 1;
$pages = int($pages / $p_log);
print <<"EOM";
$top_com
※気になる仔犬がいましたら、お問い合わせください。クリック
お急ぎの方はお電話ください。受付時間 10:00〜23:00年中無休
◆電話03-3865-4504 |
 |
子犬の価格には消費税込み・送料・ワクチン別途かかります。
ベイピーズにて購入の子犬には生後半年までの生命保証・健康保証
『ジャペット生体保証制度』が付いております。 |
チワワはこちら / その他の犬種はこちら
・新規に登録された情報は $newtime日間 New !が表\示されます。
写真をクリックすると大きな画像が表\示されます。 |
EOM
if ($pages > 0) {
$si = $page;
$ei = $si + $p_log;
$ei = $ei - 1;
if ($ei > $match) { $ei = $match; }
print <<"EOM";
| ($match 件中 $si 〜 $ei 件目を表\示) |
EOM
print " | ";
for ($h = 0 ; $h <= $pages ; $h++) {
$page_line = $h * $p_log + 1;
$hh ++;
if ($page_line == $page) {
print "[ $hh ] ";
}
else {
print "[ $hh ]";
}
}
print " | \n";
print <<"EOM";
EOM
}
$i=0;
open(IN,"$logfile") || error("Open Error : $logfile");
while () {
$i++;
if ($i < $start) { next; }
if ($i >= $end) { last; }
&stok;
print <<"EOM";
EOM
print " Vol.$no $name ";
if ($times - $nowDate < $newtime*24*60*60) {
if ($new_gif) {
print " ";
}
else {
print "New !";
}
}
print " | \n";
print <<"EOM";
EOM
print " ";
if ($user) {
print "■ 投稿者:$user";
}
if ($email) {
print " $email";
}
print "
| \n";
print " ";
if ($url) {
if ($h_gif) {
print " ";
}
else {
print "http://$url";
}
}
print " $datev | \n";
print " \n";
urllink($naiyo);
if ($img) {
print <<"EOM";
| $naiyo |
EOM
if ($W > $MaxW) {
$H = $H * $MaxW / $W;
$W = $MaxW;
}
print <<"EOM";
 |
EOM
}
else {
print <<"EOM";
| $naiyo |
EOM
}
if ($rem) {
print <<"EOM";
| [ 詳細 ] |
EOM
}
print <<"EOM";
|
|
EOM
}
close(IN);
$next_page = $page + $p_log;
$back_page = $page - $p_log;
print "\n \n";
if ($back_page >= 0) {
print <<"EOM";
|
|
EOM
}
if ($next_page <= $i) {
print <<"EOM";
|
EOM
}
print "
\n
\n";
# 投稿フォーム
if (!$PostMode) { &form; }
&footer;
}
#--------------------
# 記事表示処理
#--------------------
sub detail {
&header;
print <<"EOM";
EOM
open(IN,"$logfile") || error("Open Error : $logfile");
while () {
&stok;
if ($no eq $kiji) {
&shoshiki;
last;
}
}
close(IN);
&footer;
}
## --- 詳細書式
sub shoshiki {
print <<"EOM";
EOM
print " Vol.$no $name ";
if ($times - $nowDate < $newtime*24*60*60) {
if ($new_gif) {
print " ";
}
else {
print " New !";
}
}
print " | \n";
print <<"EOM";
EOM
print " | ■ 投稿者:$user";
if ($email) {
print " $email";
}
print " | \n";
print " ";
if ($url) {
if ($h_gif) {
print " ";
}
else {
print "http://$url";
}
}
print " | \n";
print " \n";
urllink($naiyo);
if ($nai_gif) {
print <<"EOM";
 |
EOM
}
else {
print <<"EOM";
| $w_nai |
EOM
}
print " \n";
if ($img) {
print <<"EOM";
| $naiyo |
 |
EOM
}
else {
print <<"EOM";
$naiyo |
EOM
}
print <<"EOM";
|
EOM
if ($rem) {
print <<"EOM";
EOM
if ($w_rem) {
print " \n";
urllink($rem);
if ($rem_gif) {
print <<"EOM";
 |
EOM
}
else {
print <<"EOM";
$w_rem |
EOM
}
print <<"EOM";
| $rem |
EOM
}
print <<"EOM";
|
|
EOM
}
}
## --- 自動リンク
sub urllink {
$_[0]=~ s/([^=^\"]|^)((http|ftp)\:[\w\.\~\-\/\?\&\+\=\:\@\%\;\#]+)/$1$2<\/A>/g;
}
## --- 新着情報表示
sub new {
&header;
print <<"EOM";
・新着情報を $new件 表\示しています。
EOM
$cnt = 0;
open(IN,"$logfile") || error("Open Error : $logfile");
while () {
&stok;
if ($cnt < $new) {
&shoshiki;
}
else {
last;
}
$cnt++;
}
close(IN);
&footer;
}
#--------------------
# 書きこみ処理
#--------------------
sub regist {
# POSTチェック
if (!&MethPost()) { error("METHOD形式が POST でありません"); }
# パスワードチェック
if ($PostMode && $in{'pass'} ne $adminpass) { error("パスワードが認証できません"); }
# フォーム内容をチェック
if (!$in{'name'}) { error("タイトルが入力されていません"); }
if (!$in{'naiyo'}) { error("$w_naiが入力されていません"); }
# if ($in{'user'} eq "") { error("名前が入力されていません"); }
&set_cookie;
# ロック処理
if ($lockkey) { &lock; }
if($bup){&backup;}
$i = 0;
$no = 1;
open(IN,"$logfile") || error("Open Error : $logfile");
while () {
$i++;
@val = split(/<>/);
# 記事Noを採番
if ($i == 1) { $no = $val[0] + 1; }
last;
}
close(IN);
# ファイル添付処理
if ($in{'upfile'}) {
&UpFile;
$img = "$ImgNam$no$tail";
$in{'img'} = $img;
$in{'W'} = $W;
$in{'H'} = $H;
}
### KENT WEB (http://www.kent-web.com/) より
# テンポラリーファイルを定義
$temp = "$$";
if (!$temp) {
srand;
$temp = 1000000000000000 * rand;
}
$tmpfile = "./tmp/$temp\.tmp";
open(IN,"$logfile") || error("Open Error : $logfile");
open(OUT,">$tmpfile") || error("Open Error : $tmpfile");
# 更新
print OUT "$no<>$in{'name'}<>$in{'naiyo'}<>$in{'rem'}<>$img<>$W<>$H<>$in{'user'}<>$in{'email'}<>$url<>$times<>$date\n";
$cnti = 1;
if ($i > 0) {
while () {
if ($cnti < $d_max) {
$cnti++;
print OUT $_;
}
}
}
close(OUT);
close(IN);
rename ($tmpfile,$logfile) || error("Rename Error : $tmpfile --> $logfile");
chmod (0666,$logfile);
if (-e $tmpfile) { unlink($tmpfile); }
# ロック解除
if ($lockkey) { &unlock; }
# メール通知処理
if ($mailing) { &mail_to; }
# 管理者限定投稿の完了画面
if ($PostMode && $in{'action'} eq "regist") {
&header;
print <<"EOM";
正常に登録できました
EOM
&footer;
}
}
#--------------------
# 画像アップロード ### KENT WEB (http://www.kent-web.com/) より
#--------------------
sub UpFile {
# 画像処理
$macbin=0;
foreach (@in) {
if ($_ =~ /(.*)Content-type:(.*)/i) { $tail=$3; }
if ($_ =~ /(.*)filename=(.*)/i) { $fname=$2; }
if ($_ =~ /application\/x-macbinary/i) { $macbin=1; }
}
$tail =~ s/\r//g;
$tail =~ s/\n//g;
#$fname =~ s/\"//g;
$fname =~ tr/\"\x0D\x0A//d;
# ファイル形式を認識
$flag=0;
if ($tail =~ /image\/gif/i && $gif) { $tail=".gif"; $flag=1; }
if ($tail =~ /image\/jpeg/i && $jpeg) { $tail=".jpg"; $flag=1; }
if ($tail =~ /image\/x-png/i && $png) { $tail=".png"; $flag=1; }
if (!$flag) {
if ($fname =~ /\.gif$/i && $gif) { $tail=".gif"; $flag=1; }
if (($fname =~ /\.jpe?g$/i && $jpeg)) { $tail=".jpg"; $flag=1; }
if ($fname =~ /\.png$/i && $png) { $tail=".png"; $flag=1; }
}
if (!$flag) { error("アップロードできないファイル形式です"); }
$upfile = $in{'upfile'};
# マックバイナリ対策
if ($macbin) {
$length = substr($upfile,83,4);
$length = unpack("%N",$length);
$upfile = substr($upfile,128,$length);
}
# 添付データを書き込み
$ImgFile = "$ImgDir$ImgNam$no$tail";
open(OUT,"> $ImgFile") || error("画像のアップロードに失敗しました");
binmode(OUT);
binmode(STDOUT);
print OUT $upfile;
close(OUT);
chmod (0666,$ImgFile);
# 画像サイズ取得
if ($tail eq ".jpg") { ($W, $H) = &JpegSize($ImgFile); }
elsif ($tail eq ".gif") { ($W, $H) = &GifSize($ImgFile); }
elsif ($tail eq ".png") { ($W, $H) = &PngSize($ImgFile); }
}
#--------------------
# ワード検索
#--------------------
sub find {
&header;
print <<"EOM";
・検索したいキーワードを入力し、検索条件を選択して「検索ボタン」を押してください。
・キーワードは「半角スペース」で区切って複数指定することもできます。 |
|
EOM
# ワード検索の実行と結果表示
if ($in{'word'}) {
# キーワードを配列化
$in{'word'} =~ s/ / /g;
@pairs = split(/\s+/, $in{'word'});
# 検索処理
print "
\n";
open(IN,"$logfile") || error("Open Error : $logfile");
$i=0;
print <<"EOM";
| No |
タ イ ト ル |
Update |
EOM
while () {
$flag=0;
foreach $pair (@pairs) {
if (index($_,$pair) >= 0) {
$flag=1;
if ($in{'cond'} eq 'or') { last; }
}
else {
if ($in{'cond'} eq 'and') { $flag=0; last; }
}
}
if ($flag == 0) { next; }
# 結果を表示
$i++;
&stok;
print <<"EOM";
| $no |
EOM
print " $name";
if ($times - $nowDate < $newtime*24*60*60) {
if ($new_gif) {
print " ";
}
else {
print " New !";
}
}
print " | \n";
print <<"EOM";
$datev |
EOM
}
close(IN);
print <<"EOM";
|
- 検索結果は $i件です -
EOM
}
&footer;
}
#--------------------
# 管理モード
#--------------------
sub admin {
if ($in{'pass'} && $in{'pass'} ne $adminpass) {
error("パスワードが違います");
}
if ($PostMode && $in{'action'} eq "form") { &PostForm; }
&header;
print <<"EOM";
EOM
if (!$in{'pass'}) {
# クッキー情報を取得
&get_cookie;
print <<"EOM";
EOM
}
else {
# 削除処理
if ($in{'del'}) {
# ロック処理
if ($lockkey) { &lock; }
# 削除情報をマッチングし更新
open(IN,"$logfile") || error("Open Error : $logfile");
@lines = ;
close(IN);
@new=();
foreach (@lines) {
$flag=0;
&stok;
if ($no eq $in{'del'}) {
$flag=1;
if (-e "$ImgDir$img") { unlink("$ImgDir$img"); }
}
if ($flag == 0) { push(@new,$_); }
}
open(OUT,">$logfile") || error("Write Error : $logfile");
print OUT @new;
close(OUT);
# ロック解除
if ($lockkey) { &unlock; }
}
# ページ区切り処理
if ($page eq '') { $page = 1; }
$start = $page;
$end = $page + $p_log;
$match = 0;
open(IN,"$logfile") || error("Open Error : $logfile");
# 件数カウント
while () {
$match++;
}
close(IN);
$pages = $match - 1;
$pages = int($pages / $p_log);
if ($pages > 0) {
$si = $page;
$ei = $si + $p_log;
$ei = $ei - 1;
if ($ei > $match) { $ei = $match; }
print <<"EOM";
| ($match 件中 $si 〜 $ei 件目を表\示) |
EOM
print " | ";
for ($h = 0 ; $h <= $pages ; $h++) {
$page_line = $h * $p_log + 1;
$hh ++;
if ($page_line == $page) {
print "[ $hh ] ";
}
else {
print "[ $hh ]";
}
}
print " | \n";
print <<"EOM";
EOM
}
# 削除画面を表示
print <<"EOM";
- 【編集】:「編集」を押して下さい。
- 【削除】:「削除」を押して下さい。
|
|
|
| No |
タ イ ト ル |
修正・削除 |
EOM
open(IN,"$logfile") || error("Open Error : $logfile");
while () {
$i++;
if ($i < $start) { next; }
if ($i >= $end) { last; }
&stok;
print <<"EOM";
| $no |
$name |
|
EOM
}
print <<"EOM";
|
EOM
close(IN);
# 改頁処理
$next_line = $page + $p_log;
$back_line = $page - $p_log;
print <<"EOM";
|
EOM
# 前頁処理
if ($back_line > 0) {
print <<"EOM";
EOM
}
print " | \n";
# 次頁処理
print " \n";
if ($next_line <= $i) {
print <<"EOM";
EOM
}
print <<"EOM";
|
EOM
if ($bup) {
if (-e $bup_f) {
$bl = int(-M $bup_f);
$bs = -s $bup_f;
$bc = "$bs バイト、$bl 日前のバックアップあり。";
print <<"EOM";
EOM
}
else {
$bc = "バックアップはありません。";
print <<"EOM";
$bc
EOM
}
}
}
&footer;
}
#--------------------
# 投稿フォーム
#--------------------
sub form {
# クッキー情報を取得
&get_cookie;
print <<"EOM";
EOM
}
#--------------------
# 管理者用投稿フォーム
#--------------------
sub PostForm {
# パスワードチェック
if ($PostMode && $in{'pass'} ne $adminpass) { error("パスワードが認証できません"); }
&header;
print <<"EOM";
EOM
&form;
&footer;
}
#--------------------
# 記事編集ページ
#--------------------
sub henshu {
# パスワードチェック
if ($in{'pass'} ne $adminpass) { error("パスワードが認証できません"); }
&header;
open(IN,"$logfile") || error("Open Error : $logfile");
while () {
&stok;
if ($no eq $kiji) {
$naiyo =~ s/
/\n/ig;
$rem =~ s/
/\n/ig;
if ($tagkey) {
$naiyo =~ s/</g; $naiyo =~ s/>/>/g;
$rem =~ s/</g; $rem =~ s/>/>/g;
}
print <<"EOM";
EOM
last;
}
}
close(IN);
&footer;
}
#--------------------
# 編集記事を書きかえる
#--------------------
sub henwri {
# パスワードチェック
if ($in{'pass'} ne $adminpass) { error("パスワードが認証できません"); }
# ロック処理
if ($lockkey) { &lock; }
open(IN,"$logfile") || error("Open Error : $logfile");
@lines = ;
close(IN);
# ファイル添付処理
if ($in{'upfile'}) {
$no = $kiji;
&UpFile;
$img = "$ImgNam$no$tail";
$in{'img'} = $img;
$in{'W'} = $W;
$in{'H'} = $H;
} else {
if ($in{'pic_del'}) {
unlink("$ImgDir$in{'img'}");
$in{'img'} = "";
$in{'W'} = "";
$in{'H'} = "";
}
}
@new = ();
$flag = 0;
foreach $line (@lines) {
$line =~ s/\n//g;
@val = split(/<>/,$line);
if ($val[0] eq $kiji) {
$line = "$val[0]<>$in{'name'}<>$in{'naiyo'}<>$in{'rem'}<>$in{'img'}<>$in{'W'}<>$in{'H'}<>$in{'user'}<>$in{'email'}<>$url<>$times<>$date";
$flag = 1;
}
push(@new,"$line\n");
}
close(IN);
if ($flag == 1) {
open (OUT,">$logfile") || error("Write Error : $logfile");
print OUT @new;
close(OUT);
}
else {
error("編集ナンバーが不正です。");
}
# ロック解除
if ($lockkey) { &unlock; }
&header;
print <<"EOM";
編集は正常に終了しました
EOM
&footer;
}
#--------------------
# デコード処理
#--------------------
sub decode {
&ReadParse;
while (($key,$val) = each %in) {
if ($key ne "upfile") {
# シフトJISコードに変換
&jcode'convert(*val, "sjis", "", "z");
$val =~ s/\,/,/g;
$val =~ s///g; # SSI 禁止
# タグ処理
if ($PostMode && $tagkey) {
$val =~ s/<>/<>/g;
} else {
$val =~ s/\"/"/g;
$val =~ s/</g;
$val =~ s/>/>/g;
}
# 改行処理
if ($key ne "name") {
$val =~ s/\r\n/
/g;
$val =~ s/\r/
/g;
$val =~ s/\n/
/g;
} else {
$val =~ s/\r\n//g;
$val =~ s/\r//g;
$val =~ s/\n//g;
}
}
$in{$key} = $val;
}
$mode = $in{'mode'};
$kiji = $in{'kiji'};
$no = $in{'no'};
$page = $in{'page'};
$url = $in{'url'}; $url=~ s/^http\:\/\///;
if ($in{'new'} ne "") {
$new = $in{'new'};
}
# 日時の取得
$ENV{'TZ'} = "JST-9";
$times = time;
($sec,$min,$hour,$mday,$mon,$year,$wday) = localtime($times);
# 日時のフォーマット
@week = ('Sun','Mon','Tue','Wed','Thu','Fri','Sat');
$date = sprintf("%04d/%02d/%02d(%s) %02d:%02d",
$year+1900,$mon+1,$mday,$week[$wday],$hour,$min);
}
#--------------------
# 読み込み
#--------------------
sub stok {
($no,$name,$naiyo,$rem,$img,$W,$H,$user,$email,$url,$nowDate,$datev) = split(/<>/);
}
## --- カウンタ処理
sub cntup {
open(IN,"$cnt_file") || error("Open Error : $cnt_file");
$cnt = ;
close(IN);
if (!$mode) {
# ロック処理
if ($cnt_lockkey) { &clock; }
$cnt++;
open(OUT,">$cnt_file") || error("Write Error : $cnt_file");
print OUT $cnt;
close(OUT);
# ロック解除
if ($cnt_lockkey) { &cunlock; }
while(length($cnt) < $cnt_keta){ $cnt = 0 . $cnt; }
print <<"EOM";
EOM
}
}
#--------------------
# HTMLヘッダ
#--------------------
sub header {
$head_flag = 1; # ヘッダ表示フラグ
print "Content-type: text/html\n\n";
print <<"EOM";
$title
EOM
if ($bground) {
print "\n";
}
else {
print "\n";
}
print <<"EOM";
EOM
if ($t_gif) {
print " \n";
}
else {
print "$title\n";
}
}
#--------------------
# フッタ表示
#--------------------
sub footer {
# 著作権表示(削除・改変は禁止)
print <<"EOM";
EOM
if ($f_gif) {
print <<"EOM";
EOM
}
print <<"EOM";
- $ver -
|
EOM
exit;
}
#--------------------
# エラー処理
#--------------------
sub error {
# ロック解除
if ($lockkey) { &unlock; }
&header if (!$head_flag);
print <<"EOM";
ERROR !
$_[0]
EOM
&footer;
}
#--------------------
# ホスト名取得
#--------------------
sub get_host {
$host = $ENV{'REMOTE_HOST'};
$addr = $ENV{'REMOTE_ADDR'};
if ($gethostbyaddr) {
if (!$host || $host eq "$addr") {
$host = gethostbyaddr(pack("C4", split(/\./, $addr)), 2);
}
}
if (!$host) { $host = $addr; }
}
## --- クッキーの発行
sub set_cookie {
$ENV{'TZ'} = "GMT"; # 国際標準時を取得
($secg,$ming,$hourg,$mdayg,$mong,$yearg,$wdayg,$ydayg,$isdstg)=localtime(time+30*24*60*60);
$yearg += 1900;
if ($secg < 10) { $secg = "0$secg"; }
if ($ming < 10) { $ming = "0$ming"; }
if ($hourg < 10) { $hourg = "0$hourg"; }
if ($mdayg < 10) { $mdayg = "0$mdayg"; }
$month = ('Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec')[$mong];
$youbi = ('Sun','Mon','Tue','Wed','Thu','Fri','Sat')[$wdayg];
$ENV{'TZ'} = "Japan";
$date_gmt = "$youbi, $mdayg\-$month\-$yearg $hourg:$ming:$secg GMT";
$cook="user\:$in{'user'}\,email\:$in{'email'},url\:$url,pass\:$in{'pass'}";
print "Set-Cookie: BBOARD=$cook; expires=$date_gmt\n";
}
## --- クッキーを取得
sub get_cookie {
$cookies = $ENV{'HTTP_COOKIE'};
@pairs = split(/;/, $cookies);
foreach $pair (@pairs) {
local($name, $value) = split(/=/, $pair);
$name =~ s/ //g;
$DUMMY{$name} = $value;
}
@pairs = split(/,/, $DUMMY{'BBOARD'});
foreach $pair (@pairs) {
local($name, $value) = split(/:/, $pair);
$COOKIE{$name} = $value;
}
$c_user = $COOKIE{'user'};
$c_email = $COOKIE{'email'};
$c_url = $COOKIE{'url'};
$c_pass = $COOKIE{'pass'};
}
#--------------------
# ロック処理
#--------------------
sub lock {
local($retry)=5;
# 1分以上古いロックは削除する
if (-e $lockfile) {
local($mtime) = (stat($lockfile))[9];
if ($mtime && $mtime < time - 60) { &unlock; }
}
# symlink関数式ロック
if ($lockkey == 1) {
while (!symlink(".", $lockfile)) {
if (--$retry <= 0) { error("LOCK Error"); }
sleep(1);
}
# mkdir関数式ロック
} elsif ($lockkey == 2) {
while (!mkdir($lockfile, 0755)) {
if (--$retry <= 0) { error("LOCK Error"); }
sleep(1);
}
}
$lockflag=1;
}
#--------------------
# ロック解除
#--------------------
sub unlock {
if ($lockkey == 1) { unlink($lockfile); }
elsif ($lockkey == 2) { rmdir($lockfile); }
$lockflag=0;
}
#--------------------
# メール送信
#--------------------
sub mail_to {
$m_sub = "[$title : $no]投稿お知らせ";
$m_name = $in{'name'};
$m_naiyo = $in{'naiyo'};
$m_rem = $in{'rem'};
$m_user = $in{'user'};
$url = $in{'url'};
$m_naiyo =~ s/<//g;
$m_naiyo =~ s/
/\015\012/ig;
$m_rem =~ s/<//g;
$m_rem =~ s/
/\015\012/ig;
&jcode'convert(*m_sub,'jis');
&jcode'convert(*m_name,'jis');
&jcode'convert(*m_naiyo,'jis');
&jcode'convert(*m_rem,'jis');
&jcode'convert(*m_user,'jis');
if (!open(MAIL,"| $sendmail -t")) { error("メール送信に失敗しました"); }
print MAIL "To: $mailto\n";
# メールアドレスがない場合はダミーメールに置き換え
if (!$in{'email'}) { $email = 'nomail@xxx.xxx'; }
else { $email = $in{'email'}; }
print MAIL "From: $email\n";
print MAIL "Subject: $m_sub\n";
print MAIL "MIME-Version: 1.0\n";
print MAIL "Content-type: text/plain; charset=ISO-2022-JP\n";
print MAIL "Content-Transfer-Encoding: 7bit\n";
print MAIL "X-Mailer: $ver\n\n";
print MAIL "--------------------------------------------------------\n";
print MAIL "TIME : $date\n";
print MAIL "HOST : $host\n";
print MAIL "NO : $no\n";
print MAIL "NAME : $m_user\n";
print MAIL "MAIL : $email\n";
print MAIL "URL : $url\n";
print MAIL "TITLE : $m_name\n";
print MAIL "NAIYO : $m_naiyo\n";
print MAIL "REM : $m_rem\n";
print MAIL "--------------------------------------------------------\n";
close(MAIL);
}
#--------------------
# JPEGサイズ認識
#--------------------
sub JpegSize {
local($jpeg) = @_;
local($t, $m, $c, $l, $W, $H);
open(JPEG, "$jpeg") || return (0,0);
binmode JPEG;
read(JPEG, $t, 2);
while (1) {
read(JPEG, $t, 4);
($m, $c, $l) = unpack("a a n", $t);
if ($m ne "\xFF") { $W = $H = 0; last; }
elsif ((ord($c) >= 0xC0) && (ord($c) <= 0xC3)) {
read(JPEG, $t, 5);
($H, $W) = unpack("xnn", $t);
last;
}
else {
read(JPEG, $t, ($l - 2));
}
}
close(JPEG);
return ($W, $H);
}
#--------------------
# GIFサイズ認識
#--------------------
sub GifSize {
local($gif) = @_;
local($data);
open(GIF,"$gif") || return (0,0);
binmode(GIF);
sysread(GIF,$data,10);
close(GIF);
if ($data =~ /^GIF/) { $data = substr($data,-4); }
$W = unpack("v",substr($data,0,2));
$H = unpack("v",substr($data,2,2));
return ($W, $H);
}
#--------------------
# PNGサイズ認識 # WWWis (http://www.bloodyeck.com/wwwis/) より引用
#--------------------
sub PngSize {
local($PNG) = @_;
local($head, $a, $b, $c, $d, $e, $f, $g, $h);
open(PNG,"$PNG") || return (0,0);
binmode(PNG);
if (defined(PNG) && read(PNG, $head, 8) == 8 &&
$head eq "\x89\x50\x4e\x47\x0d\x0a\x1a\x0a" &&
read(PNG, $head, 4) == 4 && read(PNG, $head, 4) == 4 &&
$head eq "IHDR" && read(PNG, $head, 8) == 8) {
($a,$b,$c,$d,$e,$f,$g,$h) = unpack("C"x8, $head);
}
else { return (0,0); }
close(PNG);
return ($a<<24|$b<<16|$c<<8|$d, $e<<24|$f<<16|$g<<8|$h);
}
#--------------------
# バックアップ処理
#--------------------
sub backup{
open(IN,"$logfile") || error("Open Error : $logfile");
open(OUT,">$bup_f") || error("Write Error : $bup_f");
while () {
print OUT $_;
}
close(OUT);
close(IN);
}
#--------------------
# 修復処理
#--------------------
sub bma {
# ロック処理
if ($lockkey) { &lock; }
rename ($bup_f,$logfile) || error("Rename Error : $bup_f >> $logfile");
# ロック解除
if ($lockkey) { &unlock; }
&header;
print <<"EOM";
修復は正常に終了しました
EOM
&footer;
}