Toggle Menu

LHa for UNIX with Autoconf


当プロジェクトでは LHa for UNIX のメンテナンスを行っています。

警告 ver. 1.14i-ac20050924p1 には脆弱性が存在します。GitHub リポジトリにある最新のソースコードをご利用ください。


オリジナルからの変更点

Autoconf 版 LHa for UNIX は、LHa for UNIX ver1.14i を元に改変されました。主な変更点を下記に挙げます。

-lh6-, -lh7- メソッドのアーカイブ作成

オリジナルの LHa for UNIX 1.14i では、SUPPORT_LH7 の定義をせずにコンパイルした場合、-lh6- および -lh7- メソッドのアーカイブを作成できませんでした。このことは別に構わないのですが SUPPORT_LH7 を定義するとデフォルトで -lh7- メソッドのアーカイブ作成を強制されてしまいます。そこで、もう少し柔軟に lha 利用者がこれらを選択できるよう SUPPORT_LH7 は常に定義するようにし、デフォルトで作成されるアーカイブのメソッド指定を configure オプションの --with-default-method=[567] で指定できるようにしました。

アーカイブ中の漢字ファイル名

オリジナルの LHa for UNIX 1.14i はアーカイブに格納するファイル名の漢字コードに関して無頓着です。コンパイル時に MULTIBYTE_CHAR を定義したときでもアーカイブ中の Shift JIS ファイル名を EUC にすることもなく、EUC コードのまま(正確にはシステムの漢字コードのまま)アーカイブに格納したりします。

autoconf 版では、configure オプション --enable-multibyte-filename により漢字ファイル名が使用でき、アーカイブに格納されるファイル名の漢字コードを SJIS 固定として扱います。

標準入力からの展開ファイルの指定

オリジナルの 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 を実行する場合などで意図しない動作をするでしょう。そういうわけで勝手ながらこの機能は削除しました。

拡張ヘッダ(ユーザ名/グループ名)のサポート

ユーザ名、グループ名の拡張ヘッダ(0x52, 0x53)を作成できるようにしました(デフォルトはoff)。展開と一覧表示のときにヘッダにこの情報があれば ID に優先してこの情報が利用されます。

バックアップファイル作成の抑止

オリジナル LHa for UNIX 1.14i では、アーカイブにファイルを追加したときやアーカイブからファイルを削除したときに、元のアーカイブを .bak という拡張子で保存します。この挙動は煩わしく感じたので autoconf 版ではバックアップファイルを作成しないようにしました。

header.c の書き換え

header.c は作り変えられました。上記に示した変更に加えてオリジナル LHa for UNIX 1.14i から以下の不具合が修正されました。

level 2 header のバグ

total header size (アーカイブヘッダの先頭 2 byte) が 256 以上であるアーカイブを正しく読むことができませんでした。また、total header size がちょうど 256 になるような不正なアーカイブを作成していました。

読み込み時にヘッダの CRC check を行うようにしました。

level 1 header のバグ

ファイル名に対して拡張ヘッダを使用することがないため、230 バイトを越えるファイル名(ディレクトリを含まない)をアーカイブに書くとアーカイブヘッダのサイズ制限を越えた不正なアーカイブが作成されていました。

level 0 header のバグ

長いパス名(ディレクトリも含む)に対してアーカイブヘッダのサイズ制限を越えた不正なアーカイブが作成されていました。autoconf 版では制限を越えたパス名は warning メッセージを出力し、パス名の後ろを切り詰めます。

空の(ディレクトリ名情報のない) -lhd- ヘッダが作成されていました。

g オプションを付けたときの level 0, 1, 2 header

g オプションは、アーカイブ作成のとき UNIX 固有の情報をアーカイブに作成するのを抑止すると man にはあるのですが、実際にはディレクトリ情報まで抑止されていました。

level 3 header

世の中には、level 3 header というものが存在するようですが、まだ仕様としてfix されてないようなので*読み込みのみ*サポートしました。追加の拡張ヘッダは未対応です。

ヘッダのダンプ

まったくのおまけ機能としてヘッダのダンプ機能を追加しました。これは完全にデバッグ用です。

lha vvv foo.lzh

とすると、アーカイブの内容一覧にまざってダンプが出力されます。

デフォルトヘッダレベル

アーカイブを作成するときのデフォルトのヘッダレベルを 2 にしました。(オリジナルの LHa for UNIX 1.14i ではレベル 1 がデフォルト)

拡張ヘッダ

拡張ヘッダ Windows timestamp (0x41) を解釈するようにしました。(level 1 header のみ)。level 2 以上では、基本ヘッダに time_t の情報があるので、拡張ヘッダの方は無視します。

-x オプション

圧縮対象のファイルから除外されるパターンを指定する -x オプションを追加しました。

Cygwin での解凍

MS-DOS タイプなど permission の情報を持たないアーカイブを Cygwin で解凍する場合は、0777 & ~umask で展開するようにしました。これは、.exe や .dll に実行属性を付けるためです。

large files 対応

システムが対応していれば、2G over な large file を扱うことができます。

なお、正規の LHA では、level 0, 1, 2 ヘッダの仕様上 4G 未満のファイルしか書庫に格納できません。しかし、UNLHA32.DLL などは、拡張ヘッダ(0x42)により、4G over なファイルも扱えるようになっています。autoconf 版では、今のところ展開のときのみこの拡張ヘッダを参照して、4G overファイルをサポートします。

MacBinary つきアーカイブのサポート

MacLHAで「MacBinary」チェックボックスをONにして作成したアーカイブに格納されているファイルは、MacBinary エンコードされています。解凍時に -b オプションを指定すると、解凍後に MacBinary デコードを行い、データフォークのみを取り出します(リソースフォークは無視されます)。また、普通のアーカイブに対して b オプションを指定して解凍した場合は通常の解凍処理が行われます。

この機能を利用するには applefile ライブラリが必要です。applefile ライブラリは下記より入手できます。

http://sourceforge.net/projects/applefile/