unpacked: let archivers specify create and modified times, hook up to iso9660.
authorRyan C. Gordon <icculus@icculus.org>
Fri, 21 Jul 2017 22:01:51 -0400
changeset 1498 5977294d8e4b
parent 1497 b9d771d6805f
child 1499 e34a89c3affd
unpacked: let archivers specify create and modified times, hook up to iso9660.
src/archiver_grp.c
src/archiver_hog.c
src/archiver_iso9660.c
src/archiver_mvl.c
src/archiver_qpak.c
src/archiver_slb.c
src/archiver_unpacked.c
src/archiver_wad.c
src/physfs_internal.h
--- a/src/archiver_grp.c	Fri Jul 21 19:01:41 2017 -0400
+++ b/src/archiver_grp.c	Fri Jul 21 22:01:51 2017 -0400
@@ -47,7 +47,7 @@
             *ptr = '\0';  /* trim extra spaces. */
 
         size = PHYSFS_swapULE32(size);
-        BAIL_IF_ERRPASS(!UNPK_addEntry(arc, name, 0, location, size), 0);
+        BAIL_IF_ERRPASS(!UNPK_addEntry(arc, name, 0, -1, -1, location, size), 0);
 
         location += size;
     } /* for */
--- a/src/archiver_hog.c	Fri Jul 21 19:01:41 2017 -0400
+++ b/src/archiver_hog.c	Fri Jul 21 22:01:51 2017 -0400
@@ -50,7 +50,7 @@
         pos += 13 + 4;
 
         size = PHYSFS_swapULE32(size);
-        BAIL_IF_ERRPASS(!UNPK_addEntry(unpkarc, name, 0, pos, size), 0);
+        BAIL_IF_ERRPASS(!UNPK_addEntry(unpkarc, name, 0, -1, -1, pos, size), 0);
         pos += size;
 
         /* skip over entry */
--- a/src/archiver_iso9660.c	Fri Jul 21 19:01:41 2017 -0400
+++ b/src/archiver_iso9660.c	Fri Jul 21 22:01:51 2017 -0400
@@ -30,6 +30,8 @@
 
 #if PHYSFS_SUPPORTS_ISO9660
 
+#include <time.h>
+
 /* ISO9660 often stores values in both big and little endian formats: little
    first, followed by big. While technically there might be different values
    in each, we just always use the littleendian ones and swap ourselves. The
@@ -42,8 +44,9 @@
 
 static int iso9660AddEntry(PHYSFS_Io *io, const int joliet, const int isdir,
                            const char *base, PHYSFS_uint8 *fname,
-                           const int fnamelen, const PHYSFS_uint64 pos,
-                           const PHYSFS_uint64 len, void *unpkarc)
+                           const int fnamelen, const PHYSFS_sint64 timestamp,
+                           const PHYSFS_uint64 pos, const PHYSFS_uint64 len,
+                           void *unpkarc)
 {
     char *fullpath;
     char *fnamecpy;
@@ -101,7 +104,8 @@
         } /* if */
     } /* else */
 
-    entry = UNPK_addEntry(unpkarc, fullpath, isdir, pos, len);
+    entry = UNPK_addEntry(unpkarc, fullpath, isdir,
+                          timestamp, timestamp, pos, len);
 
     if ((entry) && (isdir))
     {
@@ -130,6 +134,8 @@
         PHYSFS_uint8 flags;
         PHYSFS_uint8 fnamelen;
         PHYSFS_uint8 fname[256];
+        PHYSFS_sint64 timestamp;
+        struct tm t;
         int isdir;
         int multiextent;
 
@@ -177,13 +183,20 @@
         BAIL_IF_ERRPASS(!__PHYSFS_readAll(io, &fnamelen, 1), 0);
         BAIL_IF_ERRPASS(!__PHYSFS_readAll(io, fname, fnamelen), 0);
 
-        /* !!! FIXME: we lost timestamps here. Add support into the unpacked
-           !!! FIXME:  archiver, parse them out here (and parse them out of
-           !!! FIXME:  extended attributes too?). */
+        t.tm_sec = second;
+        t.tm_min = minute;
+        t.tm_hour = hour;
+        t.tm_mday = day;
+        t.tm_mon = month - 1;
+        t.tm_year = year;
+        t.tm_wday = 0;
+        t.tm_yday = 0;
+        t.tm_isdst = -1;
+        timestamp = (PHYSFS_sint64) mktime(&t);
 
         extent += extattrlen;  /* skip extended attribute record. */
         if (!iso9660AddEntry(io, joliet, isdir, base, fname, fnamelen,
-                             extent * 2048, datalen, unpkarc))
+                             timestamp, extent * 2048, datalen, unpkarc))
         {
             return 0;
         } /* if */
--- a/src/archiver_mvl.c	Fri Jul 21 19:01:41 2017 -0400
+++ b/src/archiver_mvl.c	Fri Jul 21 22:01:51 2017 -0400
@@ -45,7 +45,7 @@
         BAIL_IF_ERRPASS(!__PHYSFS_readAll(io, &size, 4), 0);
         name[12] = '\0';  /* just in case. */
         size = PHYSFS_swapULE32(size);
-        BAIL_IF_ERRPASS(!UNPK_addEntry(arc, name, 0, location, size), 0);
+        BAIL_IF_ERRPASS(!UNPK_addEntry(arc, name, 0,  -1, -1, location, size), 0);
         location += size;
     } /* for */
 
--- a/src/archiver_qpak.c	Fri Jul 21 19:01:41 2017 -0400
+++ b/src/archiver_qpak.c	Fri Jul 21 22:01:51 2017 -0400
@@ -49,7 +49,7 @@
         BAIL_IF_ERRPASS(!__PHYSFS_readAll(io, &size, 4), 0);
         size = PHYSFS_swapULE32(size);
         location = PHYSFS_swapULE32(location);
-        BAIL_IF_ERRPASS(!UNPK_addEntry(arc, name, 0, location, size), 0);
+        BAIL_IF_ERRPASS(!UNPK_addEntry(arc, name, 0,  -1, -1, location, size), 0);
     } /* for */
 
     return 1;
--- a/src/archiver_slb.c	Fri Jul 21 19:01:41 2017 -0400
+++ b/src/archiver_slb.c	Fri Jul 21 22:01:51 2017 -0400
@@ -52,7 +52,7 @@
         BAIL_IF_ERRPASS(!__PHYSFS_readAll(io, &size, 4), 0);
         size = PHYSFS_swapULE32(size);
 
-        BAIL_IF_ERRPASS(!UNPK_addEntry(arc, name, 0, location, size), 0);
+        BAIL_IF_ERRPASS(!UNPK_addEntry(arc, name, 0,  -1, -1, location, size), 0);
     } /* for */
 
     return 1;
--- a/src/archiver_unpacked.c	Fri Jul 21 19:01:41 2017 -0400
+++ b/src/archiver_unpacked.c	Fri Jul 21 22:01:51 2017 -0400
@@ -27,6 +27,8 @@
     __PHYSFS_DirTreeEntry tree;
     PHYSFS_uint64 startPos;
     PHYSFS_uint64 size;
+    PHYSFS_sint64 ctime;
+    PHYSFS_sint64 mtime;
 } UNPKentry;
 
 typedef struct
@@ -255,8 +257,8 @@
         stat->filesize = entry->size;
     } /* else */
 
-    stat->modtime = -1;
-    stat->createtime = -1;
+    stat->modtime = entry->mtime;
+    stat->createtime = entry->ctime;
     stat->accesstime = -1;
     stat->readonly = 1;
 
@@ -265,6 +267,7 @@
 
 
 void *UNPK_addEntry(void *opaque, char *name, const int isdir,
+                    const PHYSFS_sint64 ctime, const PHYSFS_sint64 mtime,
                     const PHYSFS_uint64 pos, const PHYSFS_uint64 len)
 {
     UNPKinfo *info = (UNPKinfo *) opaque;
@@ -275,6 +278,8 @@
 
     entry->startPos = isdir ? 0 : pos;
     entry->size = isdir ? 0 : len;
+    entry->ctime = ctime;
+    entry->mtime = mtime;
 
     return entry;
 } /* UNPK_addEntry */
--- a/src/archiver_wad.c	Fri Jul 21 19:01:41 2017 -0400
+++ b/src/archiver_wad.c	Fri Jul 21 22:01:51 2017 -0400
@@ -63,7 +63,7 @@
         name[8] = '\0'; /* name might not be null-terminated in file. */
         size = PHYSFS_swapULE32(size);
         location = PHYSFS_swapULE32(location);
-        BAIL_IF_ERRPASS(!UNPK_addEntry(arc, name, 0, location, size), 0);
+        BAIL_IF_ERRPASS(!UNPK_addEntry(arc, name, 0,  -1, -1, location, size), 0);
     } /* for */
 
     return 1;
--- a/src/physfs_internal.h	Fri Jul 21 19:01:41 2017 -0400
+++ b/src/physfs_internal.h	Fri Jul 21 22:01:51 2017 -0400
@@ -346,6 +346,7 @@
 void UNPK_closeArchive(void *opaque);
 void *UNPK_openArchive(PHYSFS_Io *io);
 void *UNPK_addEntry(void *opaque, char *name, const int isdir,
+                    const PHYSFS_sint64 ctime, const PHYSFS_sint64 mtime,
                     const PHYSFS_uint64 pos, const PHYSFS_uint64 len);
 PHYSFS_Io *UNPK_openRead(void *opaque, const char *name);
 PHYSFS_Io *UNPK_openWrite(void *opaque, const char *name);