Namazu-users-ja(旧)


[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: File::Magicでの挙動



臼田@自宅です。

野首さんが正確に書いてくださいましたが、せっかく書きかけたので、、

Tadamasa Teranishi wrote:
> > Macバイナリは
> > ・ヘッダ+データフォーク+リソースフォークでできている
> 記憶が確かじゃないですが、確かコメントとかも含まれていたような
> 気がします。
 ・ヘッダ+データフォーク+リソースフォーク+コメントが
正しいですね。

> ただし、
> > ・ヘッダ部は128byte
> > ということのようなので、
> > 
> > ヘッダ部128byteを切り取って
> > 他のフィルタに渡してしまうフィルタを作ればよいだけのように思えます。
> 
> のように 先頭のヘッダ部分(128byte) カットすれば、実用上問題ない
> かもしれません。が、データフォークの長さ、リソースフォークの長さが
> ヘッダに書かれていますので、データフォークだけ切り出すように書くのも
> そう難しくないと思います。
データフォークの長さを読み取って
$$contref = substr($$contref,128,LENGTH);
の一行で終わりといった感じでしょうか?
おそらく外部プログラムは不要ですね。

> あと、gzip.pl の呼び出しと、その後のフィルタの呼び出しの仕組みを
> 理解していないのですが、gzip.pl で処理した結果を見て、次のフィルタ
> が起動するようになっているのでしょうか?
> (そうじゃないと、どの形式のデータが gzip 圧縮されているのかはわかり
> ませんよね。そうかそうか。)
gzip.pl等では何が圧縮されていたのかは全く調べていないようですね

filter内で
sub recursive() { return 1;}
としておくことで
展開処理後のデータを持ってもう一度Mediatypeの推測まで戻ります。
これによりgzip.pl等では展開処理しかしていないのに、本来使用し
たいfilterに処理を渡すことができています。
mknmzの
sub load_document($$$$\%)
を見るとわかります。

> > 問題はMacバイナリの識別ですね。
> > Macバイナリからヘッダを除去するだけのフィルタモジュールを作るとすれば
> > File-MMagicを修正しなくても
> > MacBinaryIIIの場合は識別できる文字列が入っているようなので
> > $magic->addMagicEntry('102      string  mBIN    application/macbinary');
> > とフィルタ内に書くだけでよさそう(mimetypeの定義は議論がありそう)
> 
> $magic->addMagicEntry() は複数指定ってできないんでしたっけ?

複数指定はできました。filter/ooo.plで2回呼び出しています。

ただ、私が試してみた範囲では複数指定するとor扱いになってしまい
and扱いにする方法がわかりませんでした。

MMagic.pmの中では複数行をand型で指定しているデータもあるので
方法があるようにも思うのですが、調べていません。
これは、ぜひ知りたいです。

> MacBinaryI, II が現存するのかという話もあるので、MacBinaryIII だけ
> でよかったりしませんかね。
> この辺りの事情は分かりませんが、すでに I, II は全滅しているのでは
> ないかと思ったりします。
Macで作成したファイルを扱ったことがないので、テスト用のファイルも
用意できません。filterを作成するようでしたらお任せします。

先のWebページでは
OSXのcocoaアプリからはデータフォークだけになっているとも書かれていた
ので、MacBinaryIIIも歴史上のファイルになってしまうのかもしれません。

臼田幸生