[Namazu-devel-ja 831] Re: File::MMagic::checktype_data

Yukio USUDA m6694ha392t @ asahi-net.or.jp
2006年 1月 7日 (土) 03:28:49 JST


臼田です

NOKUBI Takatsugu wrote:

> At Thu, 05 Jan 2006 23:45:20 +0900,
> Yukio USUDA wrote:
> > CR-LF 問題については CPAN の ReportBUG を見ると mod_perl での動作問題が
> > 絡んでいるようなのでテスト環境を作って修正案を改めて考えなおすことにします。
> 
>   CR-LFパッチで削られている箇所がやっていることと、mod_perlでの問題で
> 報告されたことを思い出して来ました。
> 
>   mod_perl環境下では、インスタンス変数が異なる実体を指していることがあ
> るので、わざわざ$fh->tell()のようなことをやっています。
> 
mod_perl 1.xx のドキュメントでは __DATA__ は使用できないと書かれていますが
mod_perl 2.xx ではその記述がなくなっている(作成者も違う?)など
http://search.cpan.org/~gozer/mod_perl-1.29/lib/Apache/Registry.pm
http://search.cpan.org/~pgollucci/mod_perl-2.0.2/docs/api/ModPerl/Registry.pod

既に問題は解決しているのかもしれませんが、削って影響がでるのもまずいですし、
問題を確認する再現テストも難しそうなのでこの部分は触らないことにします。

>   binmodeを指定したのは別の人からの報告だったのですが、これはWindowsが
> らみでmagic entryがちゃんと読めない、というものでした。
>   magic entryさえちゃんと読めればよいので、binmodeの指定には拘る必要は
> なさそうです。

binmode 時に tell() を使うのはよくないようなので
magic データ読み込み時は binmode をやめ、
MS-Win32 でのトラブルを避けるため改行コードは逐次変更するという
ことにします。
LF 、CR-LF のどちらにしても Linux, MS-Win32 両者で問題がないようです。
下記のスクリプトで tests/data/ja 内のファイルの判定結果の比較をしています。

use strict;
use File::MMagic;
use File::Find;
my $fm = File::MMagic->new();
my @targets;
find(sub{ push @targets, $File::Find::name}, './');
foreach my $file (@targets) {
    my $mtypefm = undef;
    $mtypefm = $fm->checktype_filename($file);
    print "$file: $mtypefm\n";
};


下記のような修正になります。

$ diff -ub MMagic.pm.125 MMagic.pm
--- MMagic.pm.125       2005-08-28 03:14:10.000000000 +0900
+++ MMagic.pm   2006-01-07 03:01:19.707250000 +0900
@@ -351,7 +351,6 @@
     $self->{magic} = [];
     if (! @_) {
        my $fh = *File::MMagic::DATA{IO};
-       binmode($fh);
        bless $fh, 'FileHandle' if ref $fh ne 'FileHandle';
        my $dataLoc;
        # code block to localise the no strict;, contribute by Simon Matthews
@@ -368,7 +367,6 @@
        my $filename = shift;
        my $fh = new FileHandle;
        if ($fh->open("< $filename")) {
-           binmode($fh);
            &readMagicHandle($self, $fh);
        } else {
            warn __PACKAGE__ . " couldn't load specified file $filename";
@@ -1086,6 +1084,7 @@
        if ($line =~ /^\#/ || $line =~ /^\s*$/) {
            last if $magicFH->eof();
            $line = <$magicFH>;
+            $line =~ s/\x0d\x0a|\x0d/\x0a/;
            $$MF[2]++;
            next;
        }
@@ -1131,6 +1130,7 @@
            # read the next line
            last if $magicFH->eof();
            $line = <$magicFH>;
+            $line =~ s/\x0d\x0a|\x0d/\x0a/;
            $$MF[2]++;
        }
     }

臼田幸生




Namazu-devel-ja メーリングリストの案内