|
| Name | Size | D/L |
|---|---|---|
| 190.8 KB | 817 |
autoconfiscated for LHa for UNIX version 1.14i Wed, Oct 16 2002 by Koji A... (more)
autoconfiscated for LHa for UNIX version 1.14i
Wed, Oct 16 2002 by Koji Arai
このファイルは LHa for UNIX version 1.14i を autoconf、automake 化した
(autoconfiscate と言うそうです。Jargon 参照)ときのメモです。
LHa for UNIX に関しては岡本継男さんのページ
を参照してください。
・マクロの置き換え
オリジナルの LHa for UNIX 1.14i で使われていたマクロは autoconf 標準
のマクロ名に置き換えられました。(IFNAMES ファイルに詳細が書かれてい
ます)
IFNAMESファイルは、
マクロ名 定義のあるファイル... コメント
という構成になっています。このファイルはautoconfと一緒に配布される
ifnamesコマンドの出力を元にしました。
IFNAMESファイルの# で始まっている行は該当のマクロが置き換えられたり、
configure コマンドのコマンドオプションで指定されるようになったことを
示します。そのままの行はautoconfで判断する必要がないかまたは私が判断
できないため、そのまま放置したことを示します。
・-lh6-, -lh7- メソッドのアーカイブ作成
オリジナルの LHa for UNIX 1.14i では、SUPPORT_LH7 の定義をせずにコン
パイルした場合、-lh6- および -lh7- メソッドのアーカイブを作成できま
せんでした。このことは別に構わないのですが SUPPORT_LH7 を定義すると
デフォルトで -lh7- メソッドのアーカイブ作成を強制されてしまいます。
そこで、もう少し柔軟に lha 利用者がこれらを選択できるよう
SUPPORT_LH7 は常に定義するようにし、デフォルトで作成されるアーカイブ
のメソッド指定を configure オプションの --with-default-method=[567]
で指定できるようにしました。
このオプションの省略値は -lh5- です。つまりデフォルトでは -lh5- アー
カイブを作成します。(そして、上で述べた通り、lhaの o6 または o7 オプ
ションによりいつでも-lh6-、-lh7- アーカイブを作成でき、configure オ
プションによりデフォルトの挙動を変更することができます)
・アーカイブ中の漢字ファイル名
オリジナルの LHa for UNIX 1.14i はアーカイブに格納するファイル名の漢
字コードに関して無頓着です。コンパイル時に MULTIBYTE_CHAR を定義した
ときでもアーカイブ中の Shift JIS ファイル名を EUC にすることもなく、
EUC コードのまま(正確にはシステムの漢字コードのまま)アーカイブに格納
したりします。
autoconf 版では、configure オプション --enable-multibyte-filename に
より漢字ファイル名が使用でき、アーカイブに格納されるファイル名の漢字
コードを SJIS 固定として扱います。
--enable-multibyte-filename の引数(システムのファイル名の漢字コード
指定)は、以下の通りです。
--enable-multibyte-filename=sjis
システムの漢字コードを SJIS として扱います。
--enable-multibyte-filename=euc
システムの漢字コードを EUC として扱います。
--enable-multibyte-filename=utf8
システムの漢字コードを UTF-8 として扱います。
今のところ Mac OS X でだけこのオプションをサポートします。
--enable-multibyte-filename=auto (または yes または引数なし)
システムの漢字コードを自動で判別します。自動といっても現状は、
Cygwin, MinGW, HP-UX の場合に SJIS、Mac OS X の場合 UTF-8、
それ以外を EUC とみなすだけです。
--enable-multibyte-filename=no
--disable-multibyte-filename
ファイル名のマルチバイトサポートを無効にします。
デフォルトは、auto です。
将来的には lha のコマンドラインオプションや環境変数によりアーカイブ、
システムの各漢字コードを指定できるようにするかもしれませんが、今のと
ころ実装はしていません。
Mac OS X 用の utf8 <-> sjis 変換は、2002/6 に坂井浩人さんに作成して
いただきました。ありがとうございます。
・標準入力からの展開ファイルの指定
オリジナルの LHa for UNIX 1.14i は、
echo foo.txt | lha x foo.lzh
find bar -name '*.[ch]' | lha c bar.lzh
とすると、foo.lzh から foo.txt だけを展開したり、bar ディレクトリ配
下のファイルを bar.lzh に格納したりできます。つまり、標準入力から、
圧縮/展開ファイルを指定できる機能なのですが、いまいち使い道がないわ
りに邪魔な機能です(圧縮の例は、cpio 同様まあ使えるけど、このためのオ
プションを新設するのが良いと考えています)
tty からの利用しか想定してないと思われますが、おそらく daemon から
lha を実行する場合などで意図しない動作をするでしょう。そういうわけで
勝手ながらこの機能は削除しました。以下のような事ができない Windows
環境では意味のある機能だったかもしれませんが
lha x bar.lzh `echo foo.txt`
残念ながら MinGW で isatty() がうまく動作しませんでしたから Windows
では使えないのでした。
オリジナルの仕様を復活させたい場合は、lharc.c の 360行目付近の #if 0
を #if 1 にしてください。
・拡張ヘッダ(ユーザ名/グループ名)のサポート
ユーザ名、グループ名の拡張ヘッダ(0x52, 0x53)を作成できるようにしまし
た(デフォルトはoff)。詳細は header.doc.euc を参照してください。展開
と一覧表示のときにヘッダにこの情報があれば ID に優先してこの情報が利
用されます。作成は configure オプション --enable-user-name-header を
指定して build した場合に有効になります。
・バックアップファイル作成の抑止
オリジナル LHa for UNIX 1.14i では、アーカイブにファイルを追加したと
きやアーカイブからファイルを削除したときに、元のアーカイブを .bak と
いう拡張子で保存します。この挙動は煩わしく感じたので autoconf 版では
バックアップファイルを作成しないようにしました。この autoconf 版パッ
チが信用できないような人は configure オプション --enable-backup-archive
を指定して build してください(ぜひそうするべきです:p)。オリジナルと
同じ挙動になります。
・header.c の書き換え
header.c の主要部分は作り変えられました。上記に示した変更に加えて
オリジナル LHa for UNIX 1.14i から以下の不具合が修正されました。
o level 2 header のバグ
total header size (アーカイブヘッダの先頭 2 byte) が 256 以上
であるアーカイブを正しく読むことができませんでした。また、total
header size がちょうど 256 になるような不正なアーカイブを作成し
ていました。LHA のヘッダ仕様ではヘッダ先頭が 0 であればアーカイ
ブの終端とみなすため total header size を 256 の倍数にできません。
(256 などは little-endian で 0x00 0x01 となるため、先頭が 0 にな
ります。)
読み込み時にヘッダの CRC check を行うようにしました。
o level 1 header のバグ
ファイル名に対して拡張ヘッダを使用することがないため、230 バイト
を越えるファイル名(ディレクトリを含まない)をアーカイブに書くとアー
カイブヘッダのサイズ制限を越えた不正なアーカイブが作成されていま
した。
o level 0 header のバグ
長いパス名(ディレクトリも含む)に対してアーカイブヘッダのサイズ制
限を越えた不正なアーカイブが作成されていました(実際には、オリジ
ナルは level 0 header にディレクトリの情報を一切書かないのでこの
制限はやはりファイル名長だけが対象になります)。autoconf 版では制
限を越えたパス名は warning メッセージを出力し、パス名の後ろをを
切り詰めます。(level 0 header は使用するべきではありません)
空の(ディレクトリ名情報のない) -lhd- ヘッダが作成されていました。
$ mkdir foo
$ lha c0 foo.lzh foo
$ lha v foo.lzh
PERMSSN UID GID PACKED SIZE RATIO METHOD CRC STAMP NAME
---------- ----------- ------- ------- ------ ---------- ------------ -------------
drwxrwxr-x 1000/1000 0 0 ****** -lhd- 0000 Jul 29 00:18
---------- ----------- ------- ------- ------ ---------- ------------ -------------
Total 1 file 0 0 ****** Jul 29 00:18
なお、level 0 header で -lhd- method は使えないという説がある
http://kuwa.omosiro.com/x68k/KGARC/ARC/LHAHED15.ZIP
のですが、吉崎栄泰氏のオリジナル LHA (DOS/Windows版) (ver 2.55,
2.67) などは -lhd- method を level 0 header で作成します。
o g オプションを付けたときの level 0, 1, 2 header
g オプションは、アーカイブ作成のとき UNIX 固有の情報をアーカイブ
に作成するのを抑止すると man にはあるのですが、実際にはディレク
トリ情報まで抑止されていました。
$ mkdir foo
$ touch foo/bar
$ lha cg1 foo.lzh foo
$ lha foo.lzh
PERMSSN UID GID SIZE RATIO STAMP NAME
---------- ----------- ------- ------ ------------ --------------------
[generic] 0 ****** Jul 29 00:02 bar
---------- ----------- ------- ------ ------------ --------------------
Total 1 file 0 ****** Jul 29 00:02
autoconf 版では上記は foo/bar になります。(オリジナルはわざとそ
うしていたのかもしれませんが、そうする理由はないと判断しました)
g オプションで -lhd- の作成が抑止されるのは同じです。
なお、g オプションとヘッダレベルの指定を同時に行うときは上記のよ
うに g オプションを先に指定する必要があります。lha c1g など g オ
プションを後に指定すると level 0 header が作成されます(このオリ
ジナル仕様はちょっとわかりにくいです)。
・level 3 header
世の中には、level 3 header というものが存在するようですが、まだ仕様
としてfix されてないようなので*読み込みのみ*サポートしました。追加の
拡張ヘッダは未対応です。(特に対応すべきヘッダが見当たらなかった)
largefile 対応する場合は、この level 3 header をサポートした方が良さ
そうです。
・ヘッダのダンプ
まったくのおまけ機能としてヘッダのダンプ機能を追加しました。これは完
全にデバッグ用です。
lha vvv foo.lzh
とすると、アーカイブの内容一覧にまざってダンプが出力されます。
・ヘッダレベル
アーカイブを作成するときのデフォルトのヘッダレベルを 2 にしました。
(オリジナルの LHa for UNIX 1.14i ではレベル 1 がデフォルト)
・拡張ヘッダ
拡張ヘッダ Windows timestamp (0x41) を解釈するようにしました。(level
1 header のみ)。level 2 以上では、基本ヘッダに time_t の情報があるの
で、拡張ヘッダの方は無視します。
level 1 header のアーカイブに対して、Windows timestamp 拡張ヘッダ
を出力する LHA アーカイバが存在するかどうかは未確認です。あまり、
役に立たない修正だった気がしますがせっかく作ったので残してます:-)
on 2002-11-19, re-packed. (change the permission of the install-sh, and so on)
on 2002-11-19, re-packed. (change the permission of the install-sh, and so on)