1
0
Ryan C. Gordon 23 жил өмнө
parent
commit
2fab3d9da4
1 өөрчлөгдсөн 24 нэмэгдсэн , 13 устгасан
  1. 24 13
      archivers/zip.c

+ 24 - 13
archivers/zip.c

@@ -94,6 +94,10 @@ typedef struct
 /* ...and others... */
 
 
+#define UNIX_FILETYPE_MASK    0170000
+#define UNIX_FILETYPE_SYMLINK 0120000
+
+
 #define MAXZIPENTRYSIZE 256  /* !!! FIXME: get rid of this. */
 
 
@@ -617,15 +621,25 @@ static int version_does_symlinks(PHYSFS_uint32 version)
     int retval = 0;
     PHYSFS_uint8 hosttype = (PHYSFS_uint8) ((version >> 8) & 0xFF);
 
-    /*
-     * These are the platforms that can build an archive with symlinks,
-     *  according to the Info-ZIP project.
-     */
     switch (hosttype)
     {
-        case 3:   /* Unix  */
-        case 16:  /* BeOS  */
-        case 5:   /* Atari */
+            /*
+             * These are the platforms that can NOT build an archive with
+             *  symlinks, according to the Info-ZIP project.
+             */
+        case 0:  /* FS_FAT_  */
+        case 1:  /* AMIGA_   */
+        case 2:  /* VMS_     */
+        case 4:  /* VM_CSM_  */
+        case 6:  /* FS_HPFS_ */
+        case 11: /* FS_NTFS_ */
+        case 14: /* FS_VFAT_ */
+        case 13: /* ACORN_   */
+        case 15: /* MVS_     */
+        case 18: /* THEOS_   */
+            break;  /* do nothing. */
+
+        default:  /* assume the rest to be unix-like. */
             retval = 1;
             break;
     } /* switch */
@@ -636,15 +650,12 @@ static int version_does_symlinks(PHYSFS_uint32 version)
 
 static int entry_is_symlink(ZIPentry *entry, PHYSFS_uint32 extern_attr)
 {
+    PHYSFS_uint16 xattr = ((extern_attr >> 16) & 0xFFFF);
+
     return (
               (version_does_symlinks(entry->version)) &&
               (entry->uncompressed_size > 0) &&
-
-            #if 0 /* !!! FIXME ... this check is incorrect for some files! */
-              (extern_attr & 0x0120000)  /* symlink flag. */
-            #else
-              0  /* always fail for now. Symlinks will just be small files. */
-            #endif
+              ((xattr & UNIX_FILETYPE_MASK) == UNIX_FILETYPE_SYMLINK)
            );
 } /* entry_is_symlink */