Avoids unzLocateFile(), since we already did all the searching ourselves.
authorRyan C. Gordon <icculus@icculus.org>
Sat, 28 Jul 2001 13:08:14 +0000
changeset 55 986740ba58ab
parent 54 2756e7c8125f
child 56 6a04b6c1db0e
Avoids unzLocateFile(), since we already did all the searching ourselves.
archivers/zip.c
--- a/archivers/zip.c	Sat Jul 28 13:07:10 2001 +0000
+++ b/archivers/zip.c	Sat Jul 28 13:08:14 2001 +0000
@@ -516,12 +516,6 @@
 } /* ZIP_exists_symcheck */
 
 
-static int ZIP_exists_nofollow(DirHandle *h, const char *name)
-{
-    return(ZIP_exists_symcheck(h, name, 0));
-} /* ZIP_exists_nofollow */
-
-
 static int ZIP_exists(DirHandle *h, const char *name)
 {
     int retval = ZIP_exists_symcheck(h, name, SYMLINK_RECURSE_COUNT);
@@ -560,7 +554,7 @@
 
 static int ZIP_isSymLink(DirHandle *h, const char *name)
 {
-    int retval = ZIP_exists_nofollow(h, name);
+    int retval = ZIP_exists_symcheck(h, name, 0);
     if (retval == -1)
         return(0);
 
@@ -574,15 +568,30 @@
     FileHandle *retval = NULL;
     ZIPinfo *zi = ((ZIPinfo *) (h->opaque));
     ZIPfileinfo *finfo = NULL;
+    int pos = ZIP_exists_symcheck(h, filename, SYMLINK_RECURSE_COUNT);
     unzFile f;
 
-    BAIL_IF_MACRO(!ZIP_exists(h, filename), ERR_NO_SUCH_FILE, NULL);
+    BAIL_IF_MACRO(pos == -1, ERR_NO_SUCH_FILE, NULL);
 
     f = unzOpen(zi->archiveName);
     BAIL_IF_MACRO(f == NULL, ERR_IO_ERROR, NULL);
 
-    if ( (unzLocateFile(f, filename, 2) != UNZ_OK) ||
-         (unzOpenCurrentFile(f) != UNZ_OK) ||
+    if (unzGoToFirstFile(f) != UNZ_OK)
+    {
+        unzClose(f);
+        BAIL_IF_MACRO(1, ERR_IO_ERROR, NULL);
+    } /* if */
+
+    for (; pos > 0; pos--)
+    {
+        if (unzGoToNextFile(f) != UNZ_OK)
+        {
+            unzClose(f);
+            BAIL_IF_MACRO(1, ERR_IO_ERROR, NULL);
+        } /* if */
+    } /* for */
+
+    if ( (unzOpenCurrentFile(f) != UNZ_OK) ||
          ( (finfo = (ZIPfileinfo *) malloc(sizeof (ZIPfileinfo))) == NULL ) )
     {
         unzClose(f);