From 3c9351c0adc55f651b99116daeed2a0c8b8e833c 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 70bd0112..167474bb 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 7de9752f..91eb41e5 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 e2b6922c..5a3e28b2 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 6bca8db1..8abb57db 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 c4ef24cc..e1edce67 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 e209aa60..a1f5ec54 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 badaf228..bb60f553 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 73f7d363..b7d10680 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 47f9a3af..50881b2c 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,