[Lha-users] Re: LHa for UNIXにおいて解凍時にディレクトリの日付を復元するパッチ

Back to archive index

Akihiro Iriyama iri****@bekko*****
2003年 12月 16日 (火) 23:54:53 JST


入山です。

CVS使ってみました。

>> 様子を見て commit しようかと思います。
>
>と思ったのですが忘れるかも知れないのでもう commit してしまい
>ました(^^;。

私の名前を入れるほどの事してないですよ。
アイデア提供だし…コードは新井さんの書き直したものの方が良いものになっ
てますしね。
# メモリ食いすぎるコードでしたね。

私がWindowsで利用しているExpLzhなるシェアウェアで実現している機能を追
加してみました。
・書庫ファイルの日付を、書庫内の最新の日付を持つファイルに合わせる。
ディレクトリとSYMLINKは対象から外しています。
この機能はオプションで有効/無効の指定が出来たほうが良いと思います。
私は常に有効にしたいところです。。

それと、一つwarnningが気になったので、"ULL"を追加してみました。
header.c: In function `wintime_to_unix_stamp':directory to DIR first.
header.c:427: warning: integer constant is too large for "long" type.
定数のunsigned long long 代入部(日付です。)
"ULL"ってGCC固有の定義じゃないか確認願います。
(自宅にはWin2000+gccしかないので…)

# 英語苦手です。(苦笑)

Index: src/header.c
===================================================================
RCS file: /cvsroot/lha/lha/src/header.c,v
retrieving revision 1.81
diff -u -p -r1.81 header.c
--- src/header.c	21 Jul 2003 08:30:00 -0000	1.81
+++ src/header.c	16 Dec 2003 14:29:14 -0000
@@ -424,7 +424,7 @@ wintime_to_unix_stamp()
 {
 #if HAVE_UINT64_T
     uint64_t t;
-    uint64_t epoch = 0x019db1ded53e8000; /* 1970-01-01 00:00:00 (UTC) */
+    uint64_t epoch = 0x019db1ded53e8000ULL; /* 1970-01-01 00:00:00 (UTC) */
 
     t = (unsigned long)get_longword();
     t |= (uint64_t)(unsigned long)get_longword() << 32;
@@ -1594,6 +1594,14 @@ write_header(fp, hdr)
 
     if (fwrite(data, header_size, 1, fp) == 0)
         fatal_error("Cannot write to temporary file");
+
+    /* regist modtime */
+    if (archive_file_modtime < hdr->unix_last_modified_stamp) {
+        if (((hdr->unix_mode & UNIX_FILE_DIRECTORY) != UNIX_FILE_DIRECTORY) ||
+                ((hdr->unix_mode & UNIX_FILE_SYMLINK) != UNIX_FILE_SYMLINK)) {
+            archive_file_modtime    = hdr->unix_last_modified_stamp;
+        }
+    }
 }
 
 #if MULTIBYTE_FILENAME
Index: src/lha.h
===================================================================
RCS file: /cvsroot/lha/lha/src/lha.h,v
retrieving revision 1.48
diff -u -p -r1.48 lha.h
--- src/lha.h	27 Jul 2003 08:37:33 -0000	1.48
+++ src/lha.h	16 Dec 2003 14:29:14 -0000
@@ -336,6 +336,7 @@ EXTERN char     *reading_filename, *writ
 
 EXTERN int      archive_file_mode;
 EXTERN int      archive_file_gid;
+EXTERN int	archive_file_modtime;	/* 2003.12.14 */
 
 EXTERN int      noconvertcase; /* 2000.10.6 */
 
Index: src/lhadd.c
===================================================================
RCS file: /cvsroot/lha/lha/src/lhadd.c,v
retrieving revision 1.38
diff -u -p -r1.38 lhadd.c
--- src/lhadd.c	27 Jul 2003 08:37:33 -0000	1.38
+++ src/lhadd.c	16 Dec 2003 14:29:14 -0000
@@ -560,6 +560,13 @@ cmd_add()
 
             temporary_to_new_archive_file(new_archive_size);
         }
+
+	/* set time stamp for archive file at most newer archive entry */
+        if (nafp != stdout) {
+            struct utimbuf utimebuf;
+            utimebuf.actime = utimebuf.modtime = archive_file_modtime;
+            utime(new_archive_name, &utimebuf);
+        }
     }
 
     /* set new archive file mode/group */
--
Akihiro Iriyama
mailto:iri****@bekko*****



Lha-users メーリングリストの案内
Back to archive index