Koji Arai
JCA02****@nifty*****
2003年 12月 13日 (土) 08:19:24 JST
新井です。 In message "[Lha-users] LHa for UNIXにおいて解凍時にディレクトリの日付を復元するパッチ" on 13 Dec 2003 02:07:44 +0900, Akihiro Iriyama <iri****@bekko*****> wrote: > 表題のとおり、先にBBSにて投稿したディレクトリ日付情報復元処理につい > てパッチを送付します。 ありがとうございます。 > 圧縮アルゴリズムについては不勉強のため詳しくないのですが… 私も詳しくないです(^^; > UNIXのtarでファイルを展開すると圧縮前のディレクトリの日付が復元される > のですが、LHaはWindows版もUNIX版も解凍した日付になってしまいます。 あっほんとですね。GNU の tar だからですかね? > 変更対象ファイルは、「lhext.c」のみです。 > > 気に入らないところ > (1) 復元リストを単純に逆順で利用しているところ > >文字列長などでソートしないと、親ディレクトリを回復してか > ら子ディレクトリを回復することにより親ディレクトリの日付 > 情報が解凍した時点になる可能性がないとはいえない。 実際は現在の LHa for UNIX ではアーカイブをファイル名順でソー トするので問題はないかも知れませんね(この挙動は将来変更しよ うと思ってますけど)。 無論、他の lha で圧縮したアーカイブを復元する場合にも考慮す る必要があるので無視できませんね。 > (2) オプション情報などを無視している > >自分の利用方法では問題ないので、無条件… > ※"-lhd-"を元にディレクトリを作成する関数を呼び出すときに > 登録してるので、復元しないオプションを指定した場合、及 > びディレクトリ情報がなければ、実行されない(と思っている)か > ら実害はないと思います。 ちょっと考えてみます。 > (3) 関数名、変数名、構造体名などが完全独自 > LHaの命名規則などがわからないのでとりあえず… 入山さんのコードを元に修正してみました。命名を好みに(古い人 間の命名則に^^;)して linked list を使うようにしてます。 様子を見て commit しようかと思います。 Index: src/lhext.c =================================================================== RCS file: /cvsroot/lha/lha/src/lhext.c,v retrieving revision 1.30 diff -u -r1.30 lhext.c --- src/lhext.c 12 Jul 2003 19:12:47 -0000 1.30 +++ src/lhext.c 12 Dec 2003 23:03:21 -0000 @@ -25,6 +25,9 @@ NULL }; +static void add_dirinfo(char* name, LzHeader* hdr); +static void adjust_dirinfo(); + /* ------------------------------------------------------------------------ */ static boolean inquire_extract(name) @@ -406,6 +409,8 @@ } else { /* make directory */ if (!output_to_stdout && !make_parent_path(name)) return read_size; + /* save directory information */ + add_dirinfo(name, hdr); } } } @@ -468,5 +473,53 @@ /* close archive file */ fclose(afp); + /* adjust directory information */ + adjust_dirinfo(); + return; +} + +/* + * restore directory information (time stamp). + * added by A.Iriyama 2003.12.12 + */ + +typedef struct lhdDirectoryInfo_t { + struct lhdDirectoryInfo_t *next; + LzHeader hdr; +} LzHeaderList; + +static LzHeaderList *dirinfo; + +static void add_dirinfo(char *name, LzHeader *hdr) +{ + LzHeaderList *p; + + if (memcmp(hdr->method, LZHDIRS_METHOD, 5) != 0) + return; + + p = xmalloc(sizeof(LzHeaderList)); + + memcpy(&p->hdr, hdr, sizeof(LzHeader)); + strncpy(p->hdr.name, name, sizeof(p->hdr.name)); + p->hdr.name[sizeof(p->hdr.name)-1] = 0; + + { + LzHeaderList *tmp = dirinfo; + dirinfo = p; + dirinfo->next = tmp; + } +} + +static void adjust_dirinfo() +{ + while (dirinfo) { + adjust_info(dirinfo->hdr.name, &dirinfo->hdr); + + { + LzHeaderList *tmp = dirinfo; + dirinfo = dirinfo->next; + free(tmp); + } + } } -- 新井康司 (Koji Arai)