From 0520967437a8ca271b1d839af261256db4b2c7cb Mon Sep 17 00:00:00 2001 From: "Ryan C. Gordon" Date: Fri, 21 Jul 2017 19:01:41 -0400 Subject: [PATCH] unpacked: let archivers "abandon" the archive instead of closing it. This lets you preserve the PHYSFS_Io in case of error during archive opening. --- src/archiver_grp.c | 2 +- src/archiver_hog.c | 2 +- src/archiver_iso9660.c | 2 +- src/archiver_mvl.c | 2 +- src/archiver_qpak.c | 2 +- src/archiver_slb.c | 2 +- src/archiver_unpacked.c | 9 +++++++++ src/archiver_wad.c | 2 +- src/physfs_internal.h | 1 + 9 files changed, 17 insertions(+), 7 deletions(-) diff --git a/src/archiver_grp.c b/src/archiver_grp.c index 70bd011..167474b 100644 --- a/src/archiver_grp.c +++ b/src/archiver_grp.c @@ -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 */ diff --git a/src/archiver_hog.c b/src/archiver_hog.c index 7de9752..91eb41e 100644 --- a/src/archiver_hog.c +++ b/src/archiver_hog.c @@ -77,7 +77,7 @@ static void *HOG_openArchive(PHYSFS_Io *io, const char *name, int forWriting) if (!hogLoadEntries(io, unpkarc)) { - UNPK_closeArchive(unpkarc); + UNPK_abandonArchive(unpkarc); return NULL; } /* if */ diff --git a/src/archiver_iso9660.c b/src/archiver_iso9660.c index e2b6922..5a3e28b 100644 --- a/src/archiver_iso9660.c +++ b/src/archiver_iso9660.c @@ -315,7 +315,7 @@ static void *ISO9660_openArchive(PHYSFS_Io *io, const char *filename, int forWri if (!iso9660LoadEntries(io, joliet, "", rootpos, rootpos + len, unpkarc)) { - UNPK_closeArchive(unpkarc); + UNPK_abandonArchive(unpkarc); return NULL; } /* if */ diff --git a/src/archiver_mvl.c b/src/archiver_mvl.c index 6bca8db..8abb57d 100644 --- a/src/archiver_mvl.c +++ b/src/archiver_mvl.c @@ -72,7 +72,7 @@ static void *MVL_openArchive(PHYSFS_Io *io, const char *name, int forWriting) if (!mvlLoadEntries(io, count, unpkarc)) { - UNPK_closeArchive(unpkarc); + UNPK_abandonArchive(unpkarc); return NULL; } /* if */ diff --git a/src/archiver_qpak.c b/src/archiver_qpak.c index c4ef24c..e1edce6 100644 --- a/src/archiver_qpak.c +++ b/src/archiver_qpak.c @@ -88,7 +88,7 @@ static void *QPAK_openArchive(PHYSFS_Io *io, const char *name, int forWriting) if (!qpakLoadEntries(io, count, unpkarc)) { - UNPK_closeArchive(unpkarc); + UNPK_abandonArchive(unpkarc); return NULL; } /* if */ diff --git a/src/archiver_slb.c b/src/archiver_slb.c index e209aa6..a1f5ec5 100644 --- a/src/archiver_slb.c +++ b/src/archiver_slb.c @@ -98,7 +98,7 @@ static void *SLB_openArchive(PHYSFS_Io *io, const char *name, int forWriting) if (!slbLoadEntries(io, count, unpkarc)) { - UNPK_closeArchive(unpkarc); + UNPK_abandonArchive(unpkarc); return NULL; } /* if */ diff --git a/src/archiver_unpacked.c b/src/archiver_unpacked.c index badaf22..bb60f55 100644 --- a/src/archiver_unpacked.c +++ b/src/archiver_unpacked.c @@ -51,6 +51,15 @@ void UNPK_closeArchive(void *opaque) } /* if */ } /* 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) { diff --git a/src/archiver_wad.c b/src/archiver_wad.c index 73f7d36..b7d1068 100644 --- a/src/archiver_wad.c +++ b/src/archiver_wad.c @@ -97,7 +97,7 @@ static void *WAD_openArchive(PHYSFS_Io *io, const char *name, int forWriting) if (!wadLoadEntries(io, count, unpkarc)) { - UNPK_closeArchive(unpkarc); + UNPK_abandonArchive(unpkarc); return NULL; } /* if */ diff --git a/src/physfs_internal.h b/src/physfs_internal.h index 47f9a3a..50881b2 100644 --- a/src/physfs_internal.h +++ b/src/physfs_internal.h @@ -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,