xref: /netbsd-src/external/gpl3/binutils/dist/zlib/contrib/minizip/ioapi.c (revision 4f645668ed707e1f969c546666f8c8e45e6f8888)
19573673dSchristos /* ioapi.h -- IO base function header for compress/uncompress .zip
29573673dSchristos    part of the MiniZip project - ( http://www.winimage.com/zLibDll/minizip.html )
39573673dSchristos 
49573673dSchristos          Copyright (C) 1998-2010 Gilles Vollant (minizip) ( http://www.winimage.com/zLibDll/minizip.html )
59573673dSchristos 
69573673dSchristos          Modifications for Zip64 support
79573673dSchristos          Copyright (C) 2009-2010 Mathias Svensson ( http://result42.com )
89573673dSchristos 
99573673dSchristos          For more info read MiniZip_info.txt
109573673dSchristos 
119573673dSchristos */
129573673dSchristos 
139573673dSchristos #if defined(_WIN32) && (!(defined(_CRT_SECURE_NO_WARNINGS)))
149573673dSchristos         #define _CRT_SECURE_NO_WARNINGS
159573673dSchristos #endif
169573673dSchristos 
179573673dSchristos #if defined(__APPLE__) || defined(IOAPI_NO_64)
189573673dSchristos // In darwin and perhaps other BSD variants off_t is a 64 bit value, hence no need for specific 64 bit functions
199573673dSchristos #define FOPEN_FUNC(filename, mode) fopen(filename, mode)
209573673dSchristos #define FTELLO_FUNC(stream) ftello(stream)
219573673dSchristos #define FSEEKO_FUNC(stream, offset, origin) fseeko(stream, offset, origin)
229573673dSchristos #else
239573673dSchristos #define FOPEN_FUNC(filename, mode) fopen64(filename, mode)
249573673dSchristos #define FTELLO_FUNC(stream) ftello64(stream)
259573673dSchristos #define FSEEKO_FUNC(stream, offset, origin) fseeko64(stream, offset, origin)
269573673dSchristos #endif
279573673dSchristos 
289573673dSchristos 
299573673dSchristos #include "ioapi.h"
309573673dSchristos 
call_zopen64(const zlib_filefunc64_32_def * pfilefunc,const void * filename,int mode)319573673dSchristos voidpf call_zopen64 (const zlib_filefunc64_32_def* pfilefunc,const void*filename,int mode)
329573673dSchristos {
339573673dSchristos     if (pfilefunc->zfile_func64.zopen64_file != NULL)
349573673dSchristos         return (*(pfilefunc->zfile_func64.zopen64_file)) (pfilefunc->zfile_func64.opaque,filename,mode);
359573673dSchristos     else
369573673dSchristos     {
379573673dSchristos         return (*(pfilefunc->zopen32_file))(pfilefunc->zfile_func64.opaque,(const char*)filename,mode);
389573673dSchristos     }
399573673dSchristos }
409573673dSchristos 
call_zseek64(const zlib_filefunc64_32_def * pfilefunc,voidpf filestream,ZPOS64_T offset,int origin)419573673dSchristos long call_zseek64 (const zlib_filefunc64_32_def* pfilefunc,voidpf filestream, ZPOS64_T offset, int origin)
429573673dSchristos {
439573673dSchristos     if (pfilefunc->zfile_func64.zseek64_file != NULL)
449573673dSchristos         return (*(pfilefunc->zfile_func64.zseek64_file)) (pfilefunc->zfile_func64.opaque,filestream,offset,origin);
459573673dSchristos     else
469573673dSchristos     {
479573673dSchristos         uLong offsetTruncated = (uLong)offset;
489573673dSchristos         if (offsetTruncated != offset)
499573673dSchristos             return -1;
509573673dSchristos         else
519573673dSchristos             return (*(pfilefunc->zseek32_file))(pfilefunc->zfile_func64.opaque,filestream,offsetTruncated,origin);
529573673dSchristos     }
539573673dSchristos }
549573673dSchristos 
call_ztell64(const zlib_filefunc64_32_def * pfilefunc,voidpf filestream)559573673dSchristos ZPOS64_T call_ztell64 (const zlib_filefunc64_32_def* pfilefunc,voidpf filestream)
569573673dSchristos {
579573673dSchristos     if (pfilefunc->zfile_func64.zseek64_file != NULL)
589573673dSchristos         return (*(pfilefunc->zfile_func64.ztell64_file)) (pfilefunc->zfile_func64.opaque,filestream);
599573673dSchristos     else
609573673dSchristos     {
61*4f645668Schristos         uLong tell_uLong = (uLong)(*(pfilefunc->ztell32_file))(pfilefunc->zfile_func64.opaque,filestream);
629573673dSchristos         if ((tell_uLong) == MAXU32)
639573673dSchristos             return (ZPOS64_T)-1;
649573673dSchristos         else
659573673dSchristos             return tell_uLong;
669573673dSchristos     }
679573673dSchristos }
689573673dSchristos 
fill_zlib_filefunc64_32_def_from_filefunc32(zlib_filefunc64_32_def * p_filefunc64_32,const zlib_filefunc_def * p_filefunc32)699573673dSchristos void fill_zlib_filefunc64_32_def_from_filefunc32(zlib_filefunc64_32_def* p_filefunc64_32,const zlib_filefunc_def* p_filefunc32)
709573673dSchristos {
719573673dSchristos     p_filefunc64_32->zfile_func64.zopen64_file = NULL;
729573673dSchristos     p_filefunc64_32->zopen32_file = p_filefunc32->zopen_file;
739573673dSchristos     p_filefunc64_32->zfile_func64.zerror_file = p_filefunc32->zerror_file;
749573673dSchristos     p_filefunc64_32->zfile_func64.zread_file = p_filefunc32->zread_file;
759573673dSchristos     p_filefunc64_32->zfile_func64.zwrite_file = p_filefunc32->zwrite_file;
769573673dSchristos     p_filefunc64_32->zfile_func64.ztell64_file = NULL;
779573673dSchristos     p_filefunc64_32->zfile_func64.zseek64_file = NULL;
789573673dSchristos     p_filefunc64_32->zfile_func64.zclose_file = p_filefunc32->zclose_file;
799573673dSchristos     p_filefunc64_32->zfile_func64.zerror_file = p_filefunc32->zerror_file;
809573673dSchristos     p_filefunc64_32->zfile_func64.opaque = p_filefunc32->opaque;
819573673dSchristos     p_filefunc64_32->zseek32_file = p_filefunc32->zseek_file;
829573673dSchristos     p_filefunc64_32->ztell32_file = p_filefunc32->ztell_file;
839573673dSchristos }
849573673dSchristos 
859573673dSchristos 
869573673dSchristos 
879573673dSchristos static voidpf  ZCALLBACK fopen_file_func OF((voidpf opaque, const char* filename, int mode));
889573673dSchristos static uLong   ZCALLBACK fread_file_func OF((voidpf opaque, voidpf stream, void* buf, uLong size));
899573673dSchristos static uLong   ZCALLBACK fwrite_file_func OF((voidpf opaque, voidpf stream, const void* buf,uLong size));
909573673dSchristos static ZPOS64_T ZCALLBACK ftell64_file_func OF((voidpf opaque, voidpf stream));
919573673dSchristos static long    ZCALLBACK fseek64_file_func OF((voidpf opaque, voidpf stream, ZPOS64_T offset, int origin));
929573673dSchristos static int     ZCALLBACK fclose_file_func OF((voidpf opaque, voidpf stream));
939573673dSchristos static int     ZCALLBACK ferror_file_func OF((voidpf opaque, voidpf stream));
949573673dSchristos 
fopen_file_func(voidpf opaque,const char * filename,int mode)959573673dSchristos static voidpf ZCALLBACK fopen_file_func (voidpf opaque, const char* filename, int mode)
969573673dSchristos {
97*4f645668Schristos     (void)opaque;
989573673dSchristos     FILE* file = NULL;
999573673dSchristos     const char* mode_fopen = NULL;
1009573673dSchristos     if ((mode & ZLIB_FILEFUNC_MODE_READWRITEFILTER)==ZLIB_FILEFUNC_MODE_READ)
1019573673dSchristos         mode_fopen = "rb";
1029573673dSchristos     else
1039573673dSchristos     if (mode & ZLIB_FILEFUNC_MODE_EXISTING)
1049573673dSchristos         mode_fopen = "r+b";
1059573673dSchristos     else
1069573673dSchristos     if (mode & ZLIB_FILEFUNC_MODE_CREATE)
1079573673dSchristos         mode_fopen = "wb";
1089573673dSchristos 
1099573673dSchristos     if ((filename!=NULL) && (mode_fopen != NULL))
1109573673dSchristos         file = fopen(filename, mode_fopen);
1119573673dSchristos     return file;
1129573673dSchristos }
1139573673dSchristos 
fopen64_file_func(voidpf opaque,const void * filename,int mode)1149573673dSchristos static voidpf ZCALLBACK fopen64_file_func (voidpf opaque, const void* filename, int mode)
1159573673dSchristos {
116*4f645668Schristos     (void)opaque;
1179573673dSchristos     FILE* file = NULL;
1189573673dSchristos     const char* mode_fopen = NULL;
1199573673dSchristos     if ((mode & ZLIB_FILEFUNC_MODE_READWRITEFILTER)==ZLIB_FILEFUNC_MODE_READ)
1209573673dSchristos         mode_fopen = "rb";
1219573673dSchristos     else
1229573673dSchristos     if (mode & ZLIB_FILEFUNC_MODE_EXISTING)
1239573673dSchristos         mode_fopen = "r+b";
1249573673dSchristos     else
1259573673dSchristos     if (mode & ZLIB_FILEFUNC_MODE_CREATE)
1269573673dSchristos         mode_fopen = "wb";
1279573673dSchristos 
1289573673dSchristos     if ((filename!=NULL) && (mode_fopen != NULL))
1299573673dSchristos         file = FOPEN_FUNC((const char*)filename, mode_fopen);
1309573673dSchristos     return file;
1319573673dSchristos }
1329573673dSchristos 
1339573673dSchristos 
fread_file_func(voidpf opaque,voidpf stream,void * buf,uLong size)1349573673dSchristos static uLong ZCALLBACK fread_file_func (voidpf opaque, voidpf stream, void* buf, uLong size)
1359573673dSchristos {
136*4f645668Schristos     (void)opaque;
1379573673dSchristos     uLong ret;
1389573673dSchristos     ret = (uLong)fread(buf, 1, (size_t)size, (FILE *)stream);
1399573673dSchristos     return ret;
1409573673dSchristos }
1419573673dSchristos 
fwrite_file_func(voidpf opaque,voidpf stream,const void * buf,uLong size)1429573673dSchristos static uLong ZCALLBACK fwrite_file_func (voidpf opaque, voidpf stream, const void* buf, uLong size)
1439573673dSchristos {
144*4f645668Schristos     (void)opaque;
1459573673dSchristos     uLong ret;
1469573673dSchristos     ret = (uLong)fwrite(buf, 1, (size_t)size, (FILE *)stream);
1479573673dSchristos     return ret;
1489573673dSchristos }
1499573673dSchristos 
ftell_file_func(voidpf opaque,voidpf stream)1509573673dSchristos static long ZCALLBACK ftell_file_func (voidpf opaque, voidpf stream)
1519573673dSchristos {
152*4f645668Schristos     (void)opaque;
1539573673dSchristos     long ret;
1549573673dSchristos     ret = ftell((FILE *)stream);
1559573673dSchristos     return ret;
1569573673dSchristos }
1579573673dSchristos 
1589573673dSchristos 
ftell64_file_func(voidpf opaque,voidpf stream)1599573673dSchristos static ZPOS64_T ZCALLBACK ftell64_file_func (voidpf opaque, voidpf stream)
1609573673dSchristos {
161*4f645668Schristos     (void)opaque;
1629573673dSchristos     ZPOS64_T ret;
163*4f645668Schristos     ret = (ZPOS64_T)FTELLO_FUNC((FILE *)stream);
1649573673dSchristos     return ret;
1659573673dSchristos }
1669573673dSchristos 
fseek_file_func(voidpf opaque,voidpf stream,uLong offset,int origin)1679573673dSchristos static long ZCALLBACK fseek_file_func (voidpf  opaque, voidpf stream, uLong offset, int origin)
1689573673dSchristos {
169*4f645668Schristos     (void)opaque;
1709573673dSchristos     int fseek_origin=0;
1719573673dSchristos     long ret;
1729573673dSchristos     switch (origin)
1739573673dSchristos     {
1749573673dSchristos     case ZLIB_FILEFUNC_SEEK_CUR :
1759573673dSchristos         fseek_origin = SEEK_CUR;
1769573673dSchristos         break;
1779573673dSchristos     case ZLIB_FILEFUNC_SEEK_END :
1789573673dSchristos         fseek_origin = SEEK_END;
1799573673dSchristos         break;
1809573673dSchristos     case ZLIB_FILEFUNC_SEEK_SET :
1819573673dSchristos         fseek_origin = SEEK_SET;
1829573673dSchristos         break;
1839573673dSchristos     default: return -1;
1849573673dSchristos     }
1859573673dSchristos     ret = 0;
186*4f645668Schristos     if (fseek((FILE *)stream, (long)offset, fseek_origin) != 0)
1879573673dSchristos         ret = -1;
1889573673dSchristos     return ret;
1899573673dSchristos }
1909573673dSchristos 
fseek64_file_func(voidpf opaque,voidpf stream,ZPOS64_T offset,int origin)1919573673dSchristos static long ZCALLBACK fseek64_file_func (voidpf  opaque, voidpf stream, ZPOS64_T offset, int origin)
1929573673dSchristos {
193*4f645668Schristos     (void)opaque;
1949573673dSchristos     int fseek_origin=0;
1959573673dSchristos     long ret;
1969573673dSchristos     switch (origin)
1979573673dSchristos     {
1989573673dSchristos     case ZLIB_FILEFUNC_SEEK_CUR :
1999573673dSchristos         fseek_origin = SEEK_CUR;
2009573673dSchristos         break;
2019573673dSchristos     case ZLIB_FILEFUNC_SEEK_END :
2029573673dSchristos         fseek_origin = SEEK_END;
2039573673dSchristos         break;
2049573673dSchristos     case ZLIB_FILEFUNC_SEEK_SET :
2059573673dSchristos         fseek_origin = SEEK_SET;
2069573673dSchristos         break;
2079573673dSchristos     default: return -1;
2089573673dSchristos     }
2099573673dSchristos     ret = 0;
2109573673dSchristos 
211*4f645668Schristos     if(FSEEKO_FUNC((FILE *)stream, (long)offset, fseek_origin) != 0)
2129573673dSchristos                         ret = -1;
2139573673dSchristos 
2149573673dSchristos     return ret;
2159573673dSchristos }
2169573673dSchristos 
2179573673dSchristos 
fclose_file_func(voidpf opaque,voidpf stream)2189573673dSchristos static int ZCALLBACK fclose_file_func (voidpf opaque, voidpf stream)
2199573673dSchristos {
220*4f645668Schristos     (void)opaque;
2219573673dSchristos     int ret;
2229573673dSchristos     ret = fclose((FILE *)stream);
2239573673dSchristos     return ret;
2249573673dSchristos }
2259573673dSchristos 
ferror_file_func(voidpf opaque,voidpf stream)2269573673dSchristos static int ZCALLBACK ferror_file_func (voidpf opaque, voidpf stream)
2279573673dSchristos {
228*4f645668Schristos     (void)opaque;
2299573673dSchristos     int ret;
2309573673dSchristos     ret = ferror((FILE *)stream);
2319573673dSchristos     return ret;
2329573673dSchristos }
2339573673dSchristos 
fill_fopen_filefunc(pzlib_filefunc_def)2349573673dSchristos void fill_fopen_filefunc (pzlib_filefunc_def)
2359573673dSchristos   zlib_filefunc_def* pzlib_filefunc_def;
2369573673dSchristos {
2379573673dSchristos     pzlib_filefunc_def->zopen_file = fopen_file_func;
2389573673dSchristos     pzlib_filefunc_def->zread_file = fread_file_func;
2399573673dSchristos     pzlib_filefunc_def->zwrite_file = fwrite_file_func;
2409573673dSchristos     pzlib_filefunc_def->ztell_file = ftell_file_func;
2419573673dSchristos     pzlib_filefunc_def->zseek_file = fseek_file_func;
2429573673dSchristos     pzlib_filefunc_def->zclose_file = fclose_file_func;
2439573673dSchristos     pzlib_filefunc_def->zerror_file = ferror_file_func;
2449573673dSchristos     pzlib_filefunc_def->opaque = NULL;
2459573673dSchristos }
2469573673dSchristos 
fill_fopen64_filefunc(zlib_filefunc64_def * pzlib_filefunc_def)2479573673dSchristos void fill_fopen64_filefunc (zlib_filefunc64_def*  pzlib_filefunc_def)
2489573673dSchristos {
2499573673dSchristos     pzlib_filefunc_def->zopen64_file = fopen64_file_func;
2509573673dSchristos     pzlib_filefunc_def->zread_file = fread_file_func;
2519573673dSchristos     pzlib_filefunc_def->zwrite_file = fwrite_file_func;
2529573673dSchristos     pzlib_filefunc_def->ztell64_file = ftell64_file_func;
2539573673dSchristos     pzlib_filefunc_def->zseek64_file = fseek64_file_func;
2549573673dSchristos     pzlib_filefunc_def->zclose_file = fclose_file_func;
2559573673dSchristos     pzlib_filefunc_def->zerror_file = ferror_file_func;
2569573673dSchristos     pzlib_filefunc_def->opaque = NULL;
2579573673dSchristos }
258