#! /usr/local/bin/perl require "./cgi-lib.pl"; read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); ($s,$m,$h,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time); $datestr = sprintf("%02d/%02d/%02d %d:%02d:%02d", $year,$mon+1,$mday,$h,$m,$s ); $count_file = "./count"; $lock_file ="./lock/count.lock"; $targetfile = "data.txt"; $erasefile="./erase.txt"; #■■■■■■■■■■ 画像保持枚数の設定 ■■■■■■■■■■ #画像の保持枚数(デフォルトは50枚) #この値を変更する場合は、必ず、picture.cgiのソース中の対応する部分も変更して下さい。 $lgnumber=300; #■■■■■■■■■■ ロック機構 ■■■■■■■■■■ #ロック機構の方法(0:symlink関数(標準) 1:open関数 2:なし) $lock_mode=0; #■■■■■■■■■■ ファイルロック処理 ■■■■■■■■■■ sub process_lock { local($wait) = 10; while ( !symlink(".",$lock_file) ) { &CgiDie ("lock error!") if --$wait <= 0; sleep (6); } } #■■■■■■■■■■ ファイルロック処理2 ■■■■■■■■■■ sub process_lock2 { local($flag) = 0; foreach (1 .. 5) { if (-e $lock_file) { sleep(1); } else { open(LOCK,">$lock_file") || &CgiDie("lock busy"); close(LOCK); $flag = 1; last; } } if ($flag == 0) { &CgiDie("lock busy") } } #■■■■■■■■■■ ファイルロック解除処理 ■■■■■■■■■■ sub process_unlock { unlink ($lock_file); } #■■■■■■■■■■ メイン処理 ■■■■■■■■■■ # ロック処理 if ($lock_mode == 0) { &process_lock; } elsif ($lock_mode == 1) { &process_lock2; } open (LOG, ">>log"); $p = index( $buffer, "\r"); if( $p < 0 ) { $size = length($buffer); print "Content-type: text/plain\n\n"; print "error $size\n"; print LOG "$datestr getpic error: $ENV{'REMOTE_HOST'}-$ENV{'REMOTE_ADDR'}-$ENV{'HTTP_USER_AGENT'}\n"; }else{ if (open(FILE,"<$count_file")) { $access = ; close(FILE); if (open(FILE,">$count_file")) { $access++; print FILE $access; close(FILE); } } if($access>$lgnumber) { open(DATA,"$targetfile") or &CgiDie("現在、ログファイルが読み込めなくなっています。","しばらくして、もう一度送信してください。"); @lines=; close(DATA); foreach $line (@lines) { ($pic,$name,$mail,$http,$body,$date,$ip,$host,$title)=split("\t",$line); $pic =~ s/[^0-9]//gs; if ($pic ne $access-$lgnumber){ push(@new,$line); } } open(DATA,">$targetfile") or &CgiDie("現在、ログファイルが書き込めなくなっています。","しばらくして、もう一度送信してください。"); print DATA @new; close(DATA); } $access = $access % $lgnumber; $filename = $access.".png"; open(ER,"$erasefile") or &CgiDie("現在、ログファイルが読み込めなくなっています。","しばらくして、もう一度送信してください。"); @ers=; close(ER); foreach $er (@ers) { $ern=$er; $ern =~ s/[^0-9]//gs; if ($ern ne $access){ push(@ernew,$er); } } open(ER,">$erasefile") or &CgiDie("現在、ログファイルが書き込めなくなっています。","しばらくして、もう一度送信してください。"); print ER @ernew; close(ER); $ad=$ENV{'REMOTE_ADDR'}; $ad=~ s/[^0-9\.]//gs; open (GOTPIC, ">$filename"); print GOTPIC substr( $buffer, $p + 2 ); close GOTPIC; print "Content-type: text/plain\n\n"; print LOG "$datestr getpic $filename: $ENV{'REMOTE_HOST'}:::$ENV{'REMOTE_ADDR'}:::$ENV{'HTTP_USER_AGENT'}\n"; } close LOG; &process_unlock; print "Content-type: text/plain\n\n"; print "ok";