Home | History | Annotate | Download | only in minizip
      1 /* ioapi.h -- IO base function header for compress/uncompress .zip
      2    part of the MiniZip project - ( http://www.winimage.com/zLibDll/minizip.html )
      3 
      4          Copyright (C) 1998-2010 Gilles Vollant (minizip) ( http://www.winimage.com/zLibDll/minizip.html )
      5 
      6          Modifications for Zip64 support
      7          Copyright (C) 2009-2010 Mathias Svensson ( http://result42.com )
      8 
      9          For more info read MiniZip_info.txt
     10 
     11 */
     12 
     13 #if (defined(_WIN32))
     14         #define _CRT_SECURE_NO_WARNINGS
     15 #endif
     16 
     17 #include "ioapi.h"
     18 
     19 voidpf call_zopen64 (const zlib_filefunc64_32_def* pfilefunc,const void*filename,int mode)
     20 {
     21     if (pfilefunc->zfile_func64.zopen64_file != NULL)
     22         return (*(pfilefunc->zfile_func64.zopen64_file)) (pfilefunc->zfile_func64.opaque,filename,mode);
     23     else
     24     {
     25         return (*(pfilefunc->zopen32_file))(pfilefunc->zfile_func64.opaque,(const char*)filename,mode);
     26     }
     27 }
     28 
     29 long call_zseek64 (const zlib_filefunc64_32_def* pfilefunc,voidpf filestream, ZPOS64_T offset, int origin)
     30 {
     31     if (pfilefunc->zfile_func64.zseek64_file != NULL)
     32         return (*(pfilefunc->zfile_func64.zseek64_file)) (pfilefunc->zfile_func64.opaque,filestream,offset,origin);
     33     else
     34     {
     35         uLong offsetTruncated = (uLong)offset;
     36         if (offsetTruncated != offset)
     37             return -1;
     38         else
     39             return (*(pfilefunc->zseek32_file))(pfilefunc->zfile_func64.opaque,filestream,offsetTruncated,origin);
     40     }
     41 }
     42 
     43 ZPOS64_T call_ztell64 (const zlib_filefunc64_32_def* pfilefunc,voidpf filestream)
     44 {
     45     if (pfilefunc->zfile_func64.zseek64_file != NULL)
     46         return (*(pfilefunc->zfile_func64.ztell64_file)) (pfilefunc->zfile_func64.opaque,filestream);
     47     else
     48     {
     49         uLong tell_uLong = (*(pfilefunc->ztell32_file))(pfilefunc->zfile_func64.opaque,filestream);
     50         if ((tell_uLong) == ((uLong)-1))
     51             return (ZPOS64_T)-1;
     52         else
     53             return tell_uLong;
     54     }
     55 }
     56 
     57 void fill_zlib_filefunc64_32_def_from_filefunc32(zlib_filefunc64_32_def* p_filefunc64_32,const zlib_filefunc_def* p_filefunc32)
     58 {
     59     p_filefunc64_32->zfile_func64.zopen64_file = NULL;
     60     p_filefunc64_32->zopen32_file = p_filefunc32->zopen_file;
     61     p_filefunc64_32->zfile_func64.zerror_file = p_filefunc32->zerror_file;
     62     p_filefunc64_32->zfile_func64.zread_file = p_filefunc32->zread_file;
     63     p_filefunc64_32->zfile_func64.zwrite_file = p_filefunc32->zwrite_file;
     64     p_filefunc64_32->zfile_func64.ztell64_file = NULL;
     65     p_filefunc64_32->zfile_func64.zseek64_file = NULL;
     66     p_filefunc64_32->zfile_func64.zclose_file = p_filefunc32->zclose_file;
     67     p_filefunc64_32->zfile_func64.zerror_file = p_filefunc32->zerror_file;
     68     p_filefunc64_32->zfile_func64.opaque = p_filefunc32->opaque;
     69     p_filefunc64_32->zseek32_file = p_filefunc32->zseek_file;
     70     p_filefunc64_32->ztell32_file = p_filefunc32->ztell_file;
     71 }
     72 
     73 
     74 
     75 static voidpf  ZCALLBACK fopen_file_func OF((voidpf opaque, const char* filename, int mode));
     76 static uLong   ZCALLBACK fread_file_func OF((voidpf opaque, voidpf stream, void* buf, uLong size));
     77 static uLong   ZCALLBACK fwrite_file_func OF((voidpf opaque, voidpf stream, const void* buf,uLong size));
     78 static ZPOS64_T ZCALLBACK ftell64_file_func OF((voidpf opaque, voidpf stream));
     79 static long    ZCALLBACK fseek64_file_func OF((voidpf opaque, voidpf stream, ZPOS64_T offset, int origin));
     80 static int     ZCALLBACK fclose_file_func OF((voidpf opaque, voidpf stream));
     81 static int     ZCALLBACK ferror_file_func OF((voidpf opaque, voidpf stream));
     82 
     83 static voidpf ZCALLBACK fopen_file_func (voidpf opaque, const char* filename, int mode)
     84 {
     85     FILE* file = NULL;
     86     const char* mode_fopen = NULL;
     87     if ((mode & ZLIB_FILEFUNC_MODE_READWRITEFILTER)==ZLIB_FILEFUNC_MODE_READ)
     88         mode_fopen = "rb";
     89     else
     90     if (mode & ZLIB_FILEFUNC_MODE_EXISTING)
     91         mode_fopen = "r+b";
     92     else
     93     if (mode & ZLIB_FILEFUNC_MODE_CREATE)
     94         mode_fopen = "wb";
     95 
     96     if ((filename!=NULL) && (mode_fopen != NULL))
     97         file = fopen(filename, mode_fopen);
     98     return file;
     99 }
    100 
    101 static voidpf ZCALLBACK fopen64_file_func (voidpf opaque, const void* filename, int mode)
    102 {
    103     FILE* file = NULL;
    104     const char* mode_fopen = NULL;
    105     if ((mode & ZLIB_FILEFUNC_MODE_READWRITEFILTER)==ZLIB_FILEFUNC_MODE_READ)
    106         mode_fopen = "rb";
    107     else
    108     if (mode & ZLIB_FILEFUNC_MODE_EXISTING)
    109         mode_fopen = "r+b";
    110     else
    111     if (mode & ZLIB_FILEFUNC_MODE_CREATE)
    112         mode_fopen = "wb";
    113 
    114     if ((filename!=NULL) && (mode_fopen != NULL))
    115         file = fopen64((const char*)filename, mode_fopen);
    116     return file;
    117 }
    118 
    119 
    120 static uLong ZCALLBACK fread_file_func (voidpf opaque, voidpf stream, void* buf, uLong size)
    121 {
    122     uLong ret;
    123     ret = (uLong)fread(buf, 1, (size_t)size, (FILE *)stream);
    124     return ret;
    125 }
    126 
    127 static uLong ZCALLBACK fwrite_file_func (voidpf opaque, voidpf stream, const void* buf, uLong size)
    128 {
    129     uLong ret;
    130     ret = (uLong)fwrite(buf, 1, (size_t)size, (FILE *)stream);
    131     return ret;
    132 }
    133 
    134 static long ZCALLBACK ftell_file_func (voidpf opaque, voidpf stream)
    135 {
    136     long ret;
    137     ret = ftell((FILE *)stream);
    138     return ret;
    139 }
    140 
    141 
    142 static ZPOS64_T ZCALLBACK ftell64_file_func (voidpf opaque, voidpf stream)
    143 {
    144     ZPOS64_T ret;
    145     ret = ftello64((FILE *)stream);
    146     return ret;
    147 }
    148 
    149 static long ZCALLBACK fseek_file_func (voidpf  opaque, voidpf stream, uLong offset, int origin)
    150 {
    151     int fseek_origin=0;
    152     long ret;
    153     switch (origin)
    154     {
    155     case ZLIB_FILEFUNC_SEEK_CUR :
    156         fseek_origin = SEEK_CUR;
    157         break;
    158     case ZLIB_FILEFUNC_SEEK_END :
    159         fseek_origin = SEEK_END;
    160         break;
    161     case ZLIB_FILEFUNC_SEEK_SET :
    162         fseek_origin = SEEK_SET;
    163         break;
    164     default: return -1;
    165     }
    166     ret = 0;
    167     if (fseek((FILE *)stream, offset, fseek_origin) != 0)
    168         ret = -1;
    169     return ret;
    170 }
    171 
    172 static long ZCALLBACK fseek64_file_func (voidpf  opaque, voidpf stream, ZPOS64_T offset, int origin)
    173 {
    174     int fseek_origin=0;
    175     long ret;
    176     switch (origin)
    177     {
    178     case ZLIB_FILEFUNC_SEEK_CUR :
    179         fseek_origin = SEEK_CUR;
    180         break;
    181     case ZLIB_FILEFUNC_SEEK_END :
    182         fseek_origin = SEEK_END;
    183         break;
    184     case ZLIB_FILEFUNC_SEEK_SET :
    185         fseek_origin = SEEK_SET;
    186         break;
    187     default: return -1;
    188     }
    189     ret = 0;
    190 
    191     if(fseeko64((FILE *)stream, offset, fseek_origin) != 0)
    192                         ret = -1;
    193 
    194     return ret;
    195 }
    196 
    197 
    198 static int ZCALLBACK fclose_file_func (voidpf opaque, voidpf stream)
    199 {
    200     int ret;
    201     ret = fclose((FILE *)stream);
    202     return ret;
    203 }
    204 
    205 static int ZCALLBACK ferror_file_func (voidpf opaque, voidpf stream)
    206 {
    207     int ret;
    208     ret = ferror((FILE *)stream);
    209     return ret;
    210 }
    211 
    212 void fill_fopen_filefunc (pzlib_filefunc_def)
    213   zlib_filefunc_def* pzlib_filefunc_def;
    214 {
    215     pzlib_filefunc_def->zopen_file = fopen_file_func;
    216     pzlib_filefunc_def->zread_file = fread_file_func;
    217     pzlib_filefunc_def->zwrite_file = fwrite_file_func;
    218     pzlib_filefunc_def->ztell_file = ftell_file_func;
    219     pzlib_filefunc_def->zseek_file = fseek_file_func;
    220     pzlib_filefunc_def->zclose_file = fclose_file_func;
    221     pzlib_filefunc_def->zerror_file = ferror_file_func;
    222     pzlib_filefunc_def->opaque = NULL;
    223 }
    224 
    225 void fill_fopen64_filefunc (zlib_filefunc64_def*  pzlib_filefunc_def)
    226 {
    227     pzlib_filefunc_def->zopen64_file = fopen64_file_func;
    228     pzlib_filefunc_def->zread_file = fread_file_func;
    229     pzlib_filefunc_def->zwrite_file = fwrite_file_func;
    230     pzlib_filefunc_def->ztell64_file = ftell64_file_func;
    231     pzlib_filefunc_def->zseek64_file = fseek64_file_func;
    232     pzlib_filefunc_def->zclose_file = fclose_file_func;
    233     pzlib_filefunc_def->zerror_file = ferror_file_func;
    234     pzlib_filefunc_def->opaque = NULL;
    235 }
    236