|
#!/usr/local/bin/perl5 ################################################# # 初期設定 # ################################################# # # gifcatへのパス《デフォルトは同一ディレクトリ》 # $gifcat= './' ; # # datファイルへのパス《デフォルトは同一ディレクトリ》 # $dat_path= './' ; # # GIFファイルへのパス《gifディレクトリ以下》 # $gif_path= 'gif/' ; |
| #!/usr/local/bin/perl5 |
|
# # gifcatへのパス《デフォルトは同一ディレクトリ》 # $gifcat= './' ; # # datファイルへのパス《デフォルトは同一ディレクトリ》 # $dat_path= './' ; # # GIFファイルへのパス《gifディレクトリ以下》 # $gif_path= 'gif/' ; |
|
# Query復元処理 %query = &decode; # datファイル名 $file_name = $query{key}.'.dat' ; # 表示するカウンタの桁数 $keta = $query{keta}; # データファイルのフルパス $dat_file = $dat_path.$file_name; # 新規キーの作成 unless(-e $dat_file){ open( FH, ">$dat_file") || &error_exist ; print FH 0 ; close(FH) ; chmod(0666,$dat_file) ; } # ロック開始 $lf = &lock || &error_exist ; # 現在のデータファイルの読込み open( FH, "<$dat_file") || &error_exist ; $data = <FH> ; close(FH); # データファイルの足し込み chomp $data; $data++; # 更新データの出力 open( FH, ">$dat_file") || &error_exist ; print FH $data; close(FH); # ロック解除 &unlock($lf); # GIFデータ出力処理 &put_gif($data, $keta); exit; |
|
# Query復元処理 %query = &decode; |
|
# 新規キーの作成 unless(-e $dat_file){ open( FH, ">$dat_file") || &error_exist ; print FH 0 ; close(FH) ; chmod(0666,$dat_file) ; } |
|
# ロック開始 $lf = &lock || &error_exist ; #ロック期間の始まり(^o^)//""" # 現在のデータファイルの読込み open( FH, "<$dat_file") || &error_exist ; $data = <FH> ; close(FH); # データファイルの足し込み chomp $data; $data++; # 更新データの出力 open( FH, ">$dat_file") || &error_exist ; print FH $data; close(FH); # ロック解除 &unlock($lf); #ロック期間の終了(^o^)//""" |
| &put_gif($data, $keta); |
|
sub decode { if($ENV{REQUEST_METHOD} eq 'GET' ){ $str_query = $ENV{QUERY_STRING}; } else { read(STDIN,$str_query,$ENV{CONTENT_LENGTH}); } foreach ( split('&', $str_query ) ){ my ($name, $value) = split('=',$_,2); $value =~ s/\+/ /g; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg; $name =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg; # タグの除去 $value =~ s/<//g; $value =~ s/>//g; $tmp{$name} = $value; } # 省略時デフォルトで"index"を使用する。 $tmp{key} = $tmp{key} || 'index' ; # 桁数は1〜10まで unless($tmp{keta} >= 1 && $tmp{keta} <= 10){ $tmp{keta} = 6 ; } return %tmp; } |
|
# タグの除去 $value =~ s/<//g; $value =~ s/>//g; |
|
# 省略時デフォルトで"index"を使用する。 $tmp{key} = $tmp{key} || 'index' ; |
|
# 桁数は1〜10まで unless($tmp{keta} >= 1 && $tmp{keta} <= 10){ $tmp{keta} = 6 ; } |
|
sub lock{ my %lf=(lockdir => './lockdir/', timeout => 15, trytime => 10 ); $lf{fname} = shift || 'lockfile' ; $lf{source} = $lf{lockdir} . $lf{fname}; for ( my $i = 0; $i < $lf{trytime}; $i++ , sleep 1 ) { if( rename( $lf{source}, $lf{lockname} = $lf{source}.time )){ return \%lf ; } } my @flist = glob($lf{lockdir}.'*' ) ; foreach ( @flist ) { if ( /^$lf{fname}(\d+)/ ){ if ( time - $1 > $lf{timeout} and rename ( $lf{lockdir} . $_ , $lf{lockname} = $lf{source} . Time ) ){ return \%lf } last; } } undef; } |
|
sub unlock{ rename ( $_[0]->{lockname}, $_[0]->{source} ); } |
|
sub put_gif { # gifcatの読込み require $gifcat.'gifcat.pl'; my($cnt,$keta) = @_; my @cnt = reverse(split(//,$cnt)); my @gif = (); for(0..$keta -1 ){ unshift @gif , $gif_path .( $cnt[$_] || 0 ).'.gif'; } binmode(STDOUT); print "Content-type: image/gif\n\n"; print &gifcat'gifcat(@gif); } |
| my @cnt = reverse(split(//,$cnt)); |
|
for(0..$keta -1 ){ unshift @gif , $gif_path .( $cnt[$_] || 0 ).'.gif'; } |
| binmode(STDOUT); |
|
"Content-type: image/gif\n\n"; print &gifcat'gifcat(@gif); |
|
sub error_exist { # エラー用GIF(0)の定義 @err_gif = ('47','49','46','38', '39','61','0F','00', 《GIFのバイナリ16進、以下略》); binmode(STDOUT); print "Content-type: image/gif\n\n"; foreach (@err_gif) { $data = pack('C*',hex($_)); print $data; } exit; } |
|
public_html 《トップディレクトリ》 ┃ ┣ index.htm ー呼出し元HTML− ┃ ┗ ( counter ) ┃ ┣ counter.cgi [755] ┣ gifcat.pl ┃ ┣ ( lockdir ) −ロック用ディレクトリ− ┃ ┃ ┃ ┗ lockfile −ロックファイル− ┃ ┗ ( gif ) −GIF保存用ディレクトリ− ┃ ┣ 0.gif −表示されるGIFファイル− 〜〜 〜〜 ┃ ┗ 9.gif |