1 |
wakaba |
1.1 |
#!/usr/local/bin/perl |
2 |
|
|
|
3 |
|
|
#このスクリプトはじゃわ@中澤重人さん<jawa@big.or.jp> の |
4 |
|
|
# FlasH BBS Pro 1.41 をベースに、 |
5 |
|
|
#水無月ばけら<bakera@star.email.ne.jp> が改造を施したものです。 |
6 |
|
|
|
7 |
|
|
$max_tree = 10; # リストに表示するツリーの数 |
8 |
|
|
$jcode = '../jcode.pl'; |
9 |
|
|
$retry = 3; |
10 |
|
|
|
11 |
|
|
# [ メイン処理 ] |
12 |
|
|
|
13 |
|
|
&check_code; |
14 |
|
|
if ($ENV{'REQUEST_METHOD'} eq "POST") { read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); } else { $buffer = $ENV{'QUERY_STRING'}; } |
15 |
|
|
local(@pairs) = split(/&/,$buffer); |
16 |
|
|
foreach $pair (@pairs) { |
17 |
|
|
local($name,$value) = split(/=/,$pair); |
18 |
|
|
$value =~ tr/+/ /; |
19 |
|
|
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg; |
20 |
|
|
if ($name eq 'tree_del') { $tree_del[$value] = 1; $del_flag = 1; } |
21 |
|
|
elsif ($name eq 'del') { $del[$value] = 1; $del_flag = 1; } |
22 |
|
|
elsif ($name eq 'edit_no') { $edit_no = $value; $edit_flag = 1; } |
23 |
|
|
elsif ($name eq 'edit_tn') { $edit_tn = $value; $edit_flag = 1; } |
24 |
|
|
else { $FORM{$name} = &change_code($value); } |
25 |
|
|
} |
26 |
|
|
$ID = $FORM{'id'}; |
27 |
|
|
if ($ID eq 'html'){ |
28 |
|
|
$password = ""; |
29 |
|
|
}else{ |
30 |
|
|
$ID = 'flashbbs'; |
31 |
|
|
$password = ""; |
32 |
|
|
} |
33 |
|
|
if ($password ne $FORM{'pass'}) { &password_check; } |
34 |
|
|
|
35 |
|
|
$log_dir = '../bbs_log/'; |
36 |
|
|
$logfile = "$log_dir$ID.log"; |
37 |
|
|
|
38 |
|
|
if ($FORM{'mode'} eq 'download') { &download; } |
39 |
|
|
if ($FORM{'mode'} eq 'repair') { &repair; } |
40 |
|
|
if ($FORM{'mode'} eq 'regist') { ®ist; } |
41 |
|
|
if ($del_flag) { &delete; } |
42 |
|
|
if ($edit_flag) { &edit; } else { &ichiran; } |
43 |
|
|
exit; |
44 |
|
|
|
45 |
|
|
# [ パスワードのチェック ] |
46 |
|
|
|
47 |
|
|
sub password_check { |
48 |
|
|
&html_header("アクセス制限"); |
49 |
|
|
print<<"_EOF_"; |
50 |
|
|
<form action="./fbeditor.cgi" method="post"> |
51 |
|
|
<p>id: <input type="text" name="id" size="10"></p> |
52 |
|
|
<p>pass: <input type="password" name="pass" size="10"></p> |
53 |
|
|
<p><input type="submit" value="起動する"></p> |
54 |
|
|
</form> |
55 |
|
|
_EOF_ |
56 |
|
|
&html_footer; |
57 |
|
|
exit; |
58 |
|
|
} |
59 |
|
|
|
60 |
|
|
# [ 一覧表示 ] |
61 |
|
|
# |
62 |
|
|
|
63 |
|
|
sub ichiran { |
64 |
|
|
&read_all; |
65 |
|
|
&html_header("一覧表\示"); |
66 |
|
|
$size = (stat($logfile))[7]; |
67 |
|
|
$tree = $FORM{'tree'}; |
68 |
|
|
if ($tree > @logs) { $tree = 0; } |
69 |
|
|
if (!$tree) { $tree = 0; } |
70 |
|
|
$tree = int($tree/$max_tree)*$max_tree; |
71 |
|
|
print<<"_EOF_"; |
72 |
|
|
<form action="./fbeditor.cgi" method="post"> |
73 |
|
|
<input type="hidden" name="pass" value="$FORM{'pass'}"> |
74 |
|
|
<input type="hidden" name="id" value="$ID"> |
75 |
|
|
<p>ログファイルの容量は、約 $size バイト になっています。現在、<select name="tree"> |
76 |
|
|
_EOF_ |
77 |
|
|
for ($i=0;$i<@logs;$i+=$max_tree) { |
78 |
|
|
$j=$i/$max_tree+1; |
79 |
|
|
if ($tree == $i) { |
80 |
|
|
print" <option value=\"$i\" selected>$j ページを\n"; |
81 |
|
|
} else { |
82 |
|
|
print" <option value=\"$i\">$j ページを\n"; |
83 |
|
|
} |
84 |
|
|
} |
85 |
|
|
print<<"_EOF_"; |
86 |
|
|
</select>編集しています。</p><hr> |
87 |
|
|
<hr> |
88 |
|
|
_EOF_ |
89 |
|
|
$end_tree = $tree + $max_tree; |
90 |
|
|
if ($end_tree > @logs) { $end_tree = @logs; } |
91 |
|
|
for ($i=$tree;$i<$end_tree;$i++) { |
92 |
|
|
@datas = ÷_log($logs[$i]); |
93 |
|
|
$kiji = @datas; |
94 |
|
|
$tn = (÷_data($logs[$i]))[0]; |
95 |
|
|
print "<h3>ツリー No.$i</h3>"; |
96 |
|
|
print "<p>(記事数 $kiji) <input type=\"checkbox\" name=\"tree_del\" value=\"$tn\">[ツリー削除]<br>"; |
97 |
|
|
foreach (@datas) { |
98 |
|
|
local($no,$res,$lx,$tn,$title,$name,$email,$date,$act) = ÷_data($_); |
99 |
|
|
print "削<input type=\"checkbox\" name=\"del\" value=\"$no\">"; |
100 |
|
|
for ($s=0; $s<$lx; $s++) { print " "; } |
101 |
|
|
print "[$no]<a href=\"fbeditor.cgi?id=$ID&edit_no=$no&edit_tn=$tn&tree=$FORM{'tree'}&pass=$FORM{'pass'}\">$title</a> : $name <span class=\"date\">($date)</span><br>"; |
102 |
|
|
} |
103 |
|
|
print '</p><p class="submit"><input type="submit" value="削除開始"> <input type="reset"></p><hr>'; |
104 |
|
|
} |
105 |
|
|
print<<"_EOF_"; |
106 |
|
|
</form> |
107 |
|
|
<form action="./fbeditor.cgi" method="post"> |
108 |
|
|
<input type="hidden" name="id" value="$ID"> |
109 |
|
|
<input type="hidden" name="pass" value="$FORM{'pass'}"> |
110 |
|
|
<input type="hidden" name="mode" value="download"> |
111 |
|
|
<input type="submit" value="ダウンロード"> |
112 |
|
|
</form> |
113 |
|
|
<form action="./fbeditor.cgi" method="post"> |
114 |
|
|
<input type="hidden" name="id" value="$ID"> |
115 |
|
|
<input type="hidden" name="pass" value="$FORM{'pass'}"> |
116 |
|
|
<input type="hidden" name="mode" value="repair"> |
117 |
|
|
<input type="submit" value=" 最適化処理 "> |
118 |
|
|
</form> |
119 |
|
|
|
120 |
|
|
_EOF_ |
121 |
|
|
&html_footer; |
122 |
|
|
} |
123 |
|
|
|
124 |
|
|
# [ 削除処理 ] |
125 |
|
|
# |
126 |
|
|
|
127 |
|
|
sub delete { |
128 |
|
|
&read_all; |
129 |
|
|
foreach $data (@logs) { |
130 |
|
|
if (!$tree_del[(÷_data($data))[0]]) { |
131 |
|
|
@kiji_datas = ÷_log($data); |
132 |
|
|
$tree_data = '';$flag = 0; |
133 |
|
|
foreach $data (@kiji_datas) { |
134 |
|
|
if ($del[(÷_data($data))[0]]) { |
135 |
|
|
local($no,$res,$lx,$tn,$temp,$temp,$temp,$date,$act,$file_pwd,$rhost,$ipad,$temp) = ÷_data($data); |
136 |
|
|
$data = "$no<>$res<>$lx<>$tn<><em>[管理者削除]</em><><em>管理者</em><><>null<>9<>Null<><><>この記事は削除されました。"; |
137 |
|
|
} |
138 |
|
|
if ($flag) { $tree_data .= "<#>"; } else { $flag = 1; } |
139 |
|
|
$tree_data .= $data; |
140 |
|
|
} |
141 |
|
|
push (@new,"$tree_data\n"); |
142 |
|
|
} |
143 |
|
|
} |
144 |
|
|
&write_file($count,$last_nj,@new); |
145 |
|
|
} |
146 |
|
|
|
147 |
|
|
# [ 編集処理 ] |
148 |
|
|
# |
149 |
|
|
|
150 |
|
|
sub edit { |
151 |
|
|
&read_all; |
152 |
|
|
&html_header("編集"); |
153 |
|
|
$kiji_data = &search_no2data($edit_no,÷_log(&search_no2data($edit_tn,@logs))); |
154 |
|
|
local($no,$res,$lx,$tn,$title,$name,$email,$date,$act,$tm_pwd,$rhost,$ipad,$comment) = ÷_data($kiji_data); |
155 |
|
|
$kiji_size = length($kiji_data); |
156 |
|
|
$comment_size = length($comment); |
157 |
|
|
$comment =~ s/<BR>/\n/g; |
158 |
|
|
print<<"_EOF_"; |
159 |
|
|
<form action="./fbeditor.cgi" method="post"> |
160 |
|
|
<p>編集項目を全て編集した後、[内容更新]を押して下さい。 |
161 |
|
|
<input type="hidden" name="id" value="$ID"> |
162 |
|
|
<input type="hidden" name="pass" value="$FORM{'pass'}"> |
163 |
|
|
<input type="hidden" name="mode" value="regist"> |
164 |
|
|
<input type="hidden" name="tree" value="$FORM{'tree'}"> |
165 |
|
|
<input type="hidden" name="no" value="$no"> |
166 |
|
|
<input type="hidden" name="tn" value="$tn"></p> |
167 |
|
|
<p>タイトル:<input type="text" name="title" size="42" maxlength="80" value="$title"><br>ハンドル:<input type="text" name="name" size="42" maxlength="42" value="$name"><br> |
168 |
|
|
Eメール:<input type="text" name=email size="42" maxlength="120" value="$email"><br> |
169 |
|
|
<textarea name="comment" rows="8" cols="60">$comment</textarea></p> |
170 |
|
|
<p class="submit"><input type="submit" value="内容更新"> |
171 |
|
|
<input type="reset"></p> |
172 |
|
|
<p>記事情報: 記事番号=$no, 親記事番号=$res, 記事モード=$act</p> |
173 |
|
|
<p>投稿者情報: 登録日時=$date, リモートホスト=$rhost, IPアドレス=$ipad</p> |
174 |
|
|
<p>記事サイズ=約 $kiji_size bytes, コメントサイズ=約 $comment_size bytes</p> |
175 |
|
|
</form> |
176 |
|
|
_EOF_ |
177 |
|
|
&html_footer; |
178 |
|
|
} |
179 |
|
|
|
180 |
|
|
# [ 登録処理 ] |
181 |
|
|
# |
182 |
|
|
|
183 |
|
|
sub regist { |
184 |
|
|
&read_all; |
185 |
|
|
local($title,$name,$email,$comment) = ($FORM{'title'},$FORM{'name'},$FORM{'email'},$FORM{'comment'}); |
186 |
|
|
$title =~ s/\r\n//g; |
187 |
|
|
$title =~ s/\r|\n//g; |
188 |
|
|
$name =~ s/\r\n//g; |
189 |
|
|
$name =~ s/\r|\n//g; |
190 |
|
|
$email =~ s/\r\n//g; |
191 |
|
|
$email =~ s/\r|\n//g; |
192 |
|
|
$comment =~ s/\r\n/<BR>/g; |
193 |
|
|
$comment =~ s/\r|\n/<BR>/g; |
194 |
|
|
if (length($title) > 80) { |
195 |
|
|
&error(1,"タイトルの記入漏れ、又は文字数制限を過えています。"); |
196 |
|
|
} elsif (!$title) { $title = "無題"; } |
197 |
|
|
if ((!$name) || (length($name) > 42)) { |
198 |
|
|
&error(1,"名前の記入漏れ、又は文字数制限を過えています。"); |
199 |
|
|
} |
200 |
|
|
if ((($email !~ /(.*)\@(.*)\.(.*)/) && ($email)) || (length($email) > 120)) { |
201 |
|
|
&error(1,"メールアドレスの間違い、又は文字数制限を過えています。"); |
202 |
|
|
} |
203 |
|
|
if (!$comment) { |
204 |
|
|
&error(1,"メッセージの記入漏れです。"); |
205 |
|
|
} |
206 |
|
|
foreach $data (@logs) { |
207 |
|
|
if ($FORM{'tn'} == (÷_data($data))[0]) { |
208 |
|
|
@kiji_datas = ÷_log($data); |
209 |
|
|
$tree_data = '';$flag = 0; |
210 |
|
|
foreach $data (@kiji_datas) { |
211 |
|
|
if ($FORM{'no'} == (÷_data($data))[0]) { |
212 |
|
|
local($no,$res,$lx,$tn,$temp,$temp,$temp,$date,$act,$file_pwd,$rhost,$ipad,$temp) = ÷_data($data); |
213 |
|
|
$data = "$no<>$res<>$lx<>$tn<>$title<>$name<>$email<>$date<>0<>$file_pwd<>$rhost<>$ipad<>$comment"; |
214 |
|
|
} |
215 |
|
|
if ($flag) { $tree_data .= "<#>"; } else { $flag = 1; } |
216 |
|
|
$tree_data .= $data; |
217 |
|
|
} |
218 |
|
|
push (@new,"$tree_data\n"); |
219 |
|
|
} else { |
220 |
|
|
push (@new,$data); |
221 |
|
|
} |
222 |
|
|
} |
223 |
|
|
&write_file($count,$last_nj,@new); |
224 |
|
|
} |
225 |
|
|
|
226 |
|
|
# [ ダウンロード ] |
227 |
|
|
# |
228 |
|
|
|
229 |
|
|
sub download { |
230 |
|
|
print "Content-type: application/octet-stream\n\n"; |
231 |
|
|
open(LOG,$logfile) or &error('読み込みエラー','ログの読み込みが出来ません。管理者に連絡してください。'); |
232 |
|
|
print <LOG>; |
233 |
|
|
close(LOG); |
234 |
|
|
exit; |
235 |
|
|
} |
236 |
|
|
|
237 |
|
|
# [ 最適化処理 ] |
238 |
|
|
# |
239 |
|
|
|
240 |
|
|
sub repair { |
241 |
|
|
foreach $tree (@logs) { |
242 |
|
|
@datas = ÷_log($tree); |
243 |
|
|
foreach (@datas) { |
244 |
|
|
local($no) = ÷_data($_); |
245 |
|
|
$line = substr("0000",length($line)).$line; |
246 |
|
|
push(@num,"$no=$line"); |
247 |
|
|
$line++; |
248 |
|
|
} |
249 |
|
|
} |
250 |
|
|
@num = sort(@num); |
251 |
|
|
for($i=0;$i<@num;$i++) { |
252 |
|
|
($no,$line) = (split(/=/,$num[$i])); |
253 |
|
|
$num = $i + 1; |
254 |
|
|
$num3[$no] = $num; |
255 |
|
|
$num = substr("0000",length($num)).$num; |
256 |
|
|
push(@num2,"$line=$num"); |
257 |
|
|
} |
258 |
|
|
@num2 = sort(@num2); |
259 |
|
|
$line = 0; |
260 |
|
|
foreach $tree (@logs) { |
261 |
|
|
@datas = ÷_log($tree); |
262 |
|
|
$flag = 0; $tree_data = ''; |
263 |
|
|
foreach (@datas) { |
264 |
|
|
local($no,$res,$lx,$tn,$title,$name,$email,$date,$act,$file_pwd,$rhost,$ipad,$comment) = ÷_data($_); |
265 |
|
|
($temp,$no) = (split(/=/,$num2[$line++])); |
266 |
|
|
if ($res ne 'root') { $res = $num3[$res]; } |
267 |
|
|
$tn = $num3[$tn]; |
268 |
|
|
$kiji_data = "$no<>$res<>$lx<>$tn<>$title<>$name<>$email<>$date<>0<>$file_pwd<>$rhost<>$ipad<>$comment"; |
269 |
|
|
if ($flag){ $tree_data = "$tree_data<#>$kiji_data"; } |
270 |
|
|
else { $tree_data = $kiji_data; $flag = 1; } |
271 |
|
|
} |
272 |
|
|
push(@new,"$tree_data\n"); |
273 |
|
|
} |
274 |
|
|
|
275 |
|
|
&write_file($line,$last_nj,@new); |
276 |
|
|
&read_all; |
277 |
|
|
} |
278 |
|
|
|
279 |
|
|
# [ ヘッダー部分表示 ] |
280 |
|
|
# |
281 |
|
|
|
282 |
|
|
sub html_header { |
283 |
|
|
local($sub_title) = $_[0]; |
284 |
|
|
print "Content-type: text/html; charset=$charset_code\n\n"; |
285 |
|
|
print<<"_EOF_"; |
286 |
|
|
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" |
287 |
|
|
"http://www.w3.org/TR/html40/strict.dtd"> |
288 |
|
|
<html lang="ja"> |
289 |
|
|
<head> |
290 |
|
|
<title>FlasH BBS Pro Editor [$sub_title]</title> |
291 |
|
|
<style type="text/css"><!--p,h3{margin:0}p.submit{text-align:center}--></style> |
292 |
|
|
</head> |
293 |
|
|
<body> |
294 |
|
|
<h1>FlasH BBS Pro Editor</h1> |
295 |
|
|
<h2>$sub_title</h2> |
296 |
|
|
_EOF_ |
297 |
|
|
} |
298 |
|
|
|
299 |
|
|
# [ 著作権等の表示(必ずこのまま表示すること) ] |
300 |
|
|
# |
301 |
|
|
|
302 |
|
|
sub html_footer { |
303 |
|
|
print<<"_EOF_"; |
304 |
|
|
<hr> |
305 |
|
|
<p><!-- 著作権表\示 (必ず表\示してください。) --> |
306 |
|
|
FlasH BBS Pro Editor v1.40 [<a href="http://www7.big.or.jp/~jawa/">Shigeto Nakazawa</a>] |
307 |
|
|
</p> |
308 |
|
|
</body></html> |
309 |
|
|
_EOF_ |
310 |
|
|
} |
311 |
|
|
|
312 |
|
|
# [ データ処理関連汎用サブ ] |
313 |
|
|
# |
314 |
|
|
|
315 |
|
|
sub divide_log { |
316 |
|
|
local($data) = $_[0]; |
317 |
|
|
chop($data); |
318 |
|
|
return split(/<#>/,$data); |
319 |
|
|
} |
320 |
|
|
sub divide_data { |
321 |
|
|
return split(/<>/,$_[0]); |
322 |
|
|
} |
323 |
|
|
sub search_no2data { |
324 |
|
|
local($no,@datas) = @_; |
325 |
|
|
local($data); |
326 |
|
|
foreach $data (@datas) { |
327 |
|
|
if ($no == (÷_data($data))[0]) { return $data; } |
328 |
|
|
} |
329 |
|
|
return 0; |
330 |
|
|
} |
331 |
|
|
|
332 |
|
|
# [ 文字コード関連 ] |
333 |
|
|
# |
334 |
|
|
|
335 |
|
|
sub check_code { |
336 |
|
|
if (!(-r $jcode)) { &error(1,"jcode.pl がありません"); } |
337 |
|
|
require $jcode; |
338 |
|
|
local($text) = ord(substr("中澤",0,1)); |
339 |
|
|
if ($text == 0xc3) { $mojicode = "euc"; $charset_code = "EUC-JP"; } |
340 |
|
|
elsif ($text == 0x92) { $mojicode = "sjis";$charset_code = "Shift_JIS"; } |
341 |
|
|
else { &error(1,"サポートしてない文字コードです"); } |
342 |
|
|
} |
343 |
|
|
sub change_code { |
344 |
|
|
local($text)=$_[0]; |
345 |
|
|
&jcode'convert(*text,$mojicode); |
346 |
|
|
if ($mojicode eq 'sjis') { &jcode'h2z_sjis(*text); } |
347 |
|
|
if ($mojicode eq 'euc') { &jcode'h2z_euc(*text); } |
348 |
|
|
$text =~ s/</</g; |
349 |
|
|
$text =~ s/>/>/g; |
350 |
|
|
return $text; |
351 |
|
|
} |
352 |
|
|
|
353 |
|
|
# [ 自動リンク処理(独自方式 v1.9 LE)] |
354 |
|
|
# |
355 |
|
|
|
356 |
|
|
sub auto_link { |
357 |
|
|
local($text) = $_[0]; |
358 |
|
|
&jcode'convert(*text,'euc'); |
359 |
|
|
$text =~ s/(http:\/\/[\w\.\~\-\/\?\&\+\=\:\@\%]+)/<A HREF=\"$1\">$1<\/A>/ig; |
360 |
|
|
$text =~ s/(ftp:\/\/[\w\.\~\-\/]+)/<A HREF=\"$1\">$1<\/A>/ig; |
361 |
|
|
$text =~ s/([\w\.\-]+)\@([\w\.\-]+)/<A HREF=\"mailto\:$1\@$2\">$1\@$2<\/A>/ig; |
362 |
|
|
&jcode'convert(*text,$mojicode); |
363 |
|
|
return $text; |
364 |
|
|
} |
365 |
|
|
|
366 |
|
|
# [ 記録ファイルの処理 ] |
367 |
|
|
# |
368 |
|
|
|
369 |
|
|
sub write_file { |
370 |
|
|
my($count,$this_nj,@lines) = @_; |
371 |
|
|
|
372 |
|
|
#プロセスID からテンポラリファイル名を生成 |
373 |
|
|
$pros = $$; |
374 |
|
|
$pros = time unless $pros; |
375 |
|
|
$tmp_file = "$ID$pros.tmp"; |
376 |
|
|
|
377 |
|
|
#他のテンポラリファイルを検索 |
378 |
|
|
opendir(DIR,$log_dir) or &error('システムエラー','作業ディレクトリのオープンに失敗しました。管理者が何かを忘れている可能性があります。'); |
379 |
|
|
@list = readdir(DIR); |
380 |
|
|
closedir(DIR); |
381 |
|
|
unless (@list) { &error('システムエラー','作業ディレクトリが完全に空です。'); } |
382 |
|
|
@lists = grep(/$ID.*\.tmp/,@list); |
383 |
|
|
|
384 |
|
|
#テンポラリファイルがある場合 |
385 |
|
|
my($retry_counter) = $retry; |
386 |
|
|
while (@lists) { |
387 |
|
|
if (--$retry_counter <= 0) { |
388 |
|
|
#しびれを切らした |
389 |
|
|
foreach (@lists) { |
390 |
|
|
#テンポラリファイルを抹殺 |
391 |
|
|
unlink("$log_dir$_") if (-e "$log_dir$_"); |
392 |
|
|
} |
393 |
|
|
&error('ビジー','ただ今混雑しています。時間をおいて再度実行してください。'); |
394 |
|
|
} |
395 |
|
|
sleep(1); |
396 |
|
|
opendir(DIR,"$log_dir"); |
397 |
|
|
@list = readdir(DIR); |
398 |
|
|
closedir(DIR); |
399 |
|
|
@lists = grep(/$ID.*\.tmp/,@list); |
400 |
|
|
} |
401 |
|
|
|
402 |
|
|
#テンポラリファイルに書き込む |
403 |
|
|
open(WRITE,">$log_dir$tmp_file") or &error('書き込みエラー','記録ファイルの書き込みが出来ません。管理者に連絡してください。'); |
404 |
|
|
print WRITE "$count\n"; |
405 |
|
|
print WRITE "$this_nj\n"; |
406 |
|
|
print WRITE @lines; |
407 |
|
|
close(WRITE); |
408 |
|
|
|
409 |
|
|
#もう一度他のテンポラリファイルを検索 |
410 |
|
|
opendir(DIR,$log_dir); |
411 |
|
|
@list = readdir(DIR); |
412 |
|
|
closedir(DIR); |
413 |
|
|
@lists = grep(/$ID.*\.tmp/,@list); |
414 |
|
|
@lists = grep(!/$tmp_file/,@lists);#自分自身は除外 |
415 |
|
|
if (@lists) { |
416 |
|
|
#他で書き込み中であれば書き込みを中止して終了 |
417 |
|
|
unlink("$log_dir$tmp_file") if (-e "$log_dir$tmp_file"); |
418 |
|
|
&error('書き込みの競合','同時に複数の書き込みが行われようとしたため、処理を中止しました。すこし時間をおいてから、再度ご利用下さい。'); |
419 |
|
|
} |
420 |
|
|
|
421 |
|
|
rename("$log_dir$tmp_file",$logfile) or &error('書き込みの競合','書き込みに失敗しました。再度実行してください。'); |
422 |
|
|
chmod 0666, $logfile; |
423 |
|
|
} |
424 |
|
|
|
425 |
|
|
# [ エラー処理 ] |
426 |
|
|
# |
427 |
|
|
|
428 |
|
|
sub error { |
429 |
|
|
($err,$err_msg) = @_; |
430 |
|
|
if ($err) { |
431 |
|
|
print "Content-type: text/html; charset=$charset_code\n\n"; |
432 |
|
|
print '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"><html lang="ja"><body>'; |
433 |
|
|
} |
434 |
|
|
print<<"_EOF_"; |
435 |
|
|
<p>エラー:$err_msg</p> |
436 |
|
|
</body></html> |
437 |
|
|
_EOF_ |
438 |
|
|
exit; |
439 |
|
|
} |
440 |
|
|
|
441 |
|
|
sub read_all{ |
442 |
|
|
open(LOG,$logfile) or &error('読み込みエラー','ログの読み込みが出来ません。管理者に連絡してください。'); |
443 |
|
|
$count = <LOG>; |
444 |
|
|
chop($count); |
445 |
|
|
$last_nj = <LOG>; |
446 |
|
|
chop($last_nj); |
447 |
|
|
@logs = <LOG>; |
448 |
|
|
close(LOG); |
449 |
|
|
} |