This lets you preserve the PHYSFS_Io in case of error during archive opening.
@@ -78,7 +78,7 @@ static void *GRP_openArchive(PHYSFS_Io *io, const char *name, int forWriting)
if (!grpLoadEntries(io, count, unpkarc))
{
- UNPK_closeArchive(unpkarc);
+ UNPK_abandonArchive(unpkarc);
return NULL;
} /* if */
@@ -77,7 +77,7 @@ static void *HOG_openArchive(PHYSFS_Io *io, const char *name, int forWriting)
if (!hogLoadEntries(io, unpkarc))
@@ -315,7 +315,7 @@ static void *ISO9660_openArchive(PHYSFS_Io *io, const char *filename, int forWri
if (!iso9660LoadEntries(io, joliet, "", rootpos, rootpos + len, unpkarc))
@@ -72,7 +72,7 @@ static void *MVL_openArchive(PHYSFS_Io *io, const char *name, int forWriting)
if (!mvlLoadEntries(io, count, unpkarc))
@@ -88,7 +88,7 @@ static void *QPAK_openArchive(PHYSFS_Io *io, const char *name, int forWriting)
if (!qpakLoadEntries(io, count, unpkarc))
@@ -98,7 +98,7 @@ static void *SLB_openArchive(PHYSFS_Io *io, const char *name, int forWriting)
if (!slbLoadEntries(io, count, unpkarc))
@@ -51,6 +51,15 @@ void UNPK_closeArchive(void *opaque)
} /* UNPK_closeArchive */
+void UNPK_abandonArchive(void *opaque)
+{
+ UNPKinfo *info = ((UNPKinfo *) opaque);
+ if (info)
+ {
+ info->io = NULL;
+ UNPK_closeArchive(info);
+ } /* if */
+} /* UNPK_abandonArchive */
static PHYSFS_sint64 UNPK_read(PHYSFS_Io *io, void *buffer, PHYSFS_uint64 len)
@@ -97,7 +97,7 @@ static void *WAD_openArchive(PHYSFS_Io *io, const char *name, int forWriting)
if (!wadLoadEntries(io, count, unpkarc))
@@ -342,6 +342,7 @@ int __PHYSFS_readAll(PHYSFS_Io *io, void *buf, const PHYSFS_uint64 len);
/* These are shared between some archivers. */
+void UNPK_abandonArchive(void *opaque);
void UNPK_closeArchive(void *opaque);
void *UNPK_openArchive(PHYSFS_Io *io);
void *UNPK_addEntry(void *opaque, char *name, const int isdir,