|
1
|
/* ioapi.h -- IO base function header for compress/uncompress .zip |
|
2
|
part of the MiniZip project - ( https://www.winimage.com/zLibDll/minizip.html ) |
|
3
|
|
|
4
|
Copyright (C) 1998-2026 Gilles Vollant (minizip) ( https://www.winimage.com/zLibDll/minizip.html ) |
|
5
|
|
|
6
|
Modifications for Zip64 support |
|
7
|
Copyright (C) 2009-2010 Mathias Svensson ( https://result42.com ) |
|
8
|
|
|
9
|
For more info read MiniZip_info.txt |
|
10
|
|
|
11
|
Changes |
|
12
|
|
|
13
|
Oct-2009 - Defined ZPOS64_T to fpos_t on windows and u_int64_t on linux. (might need to find a better why for this) |
|
14
|
Oct-2009 - Change to fseeko64, ftello64 and fopen64 so large files would work on linux. |
|
15
|
More if/def section may be needed to support other platforms |
|
16
|
Oct-2009 - Defined fxxxx64 calls to normal fopen/ftell/fseek so they would compile on windows. |
|
17
|
(but you should use iowin32.c for windows instead) |
|
18
|
|
|
19
|
*/ |
|
20
|
|
|
21
|
#ifndef ZLIBIOAPI64_H |
|
22
|
#define ZLIBIOAPI64_H |
|
23
|
|
|
24
|
#if (!defined(_WIN32)) && (!defined(WIN32)) && (!defined(__APPLE__)) && (!(defined(__ANDROID_API__) || __ANDROID_API__ >= 24)) |
|
25
|
|
|
26
|
/* Linux needs this to support file operation on files larger then 4+GB */ |
|
27
|
/* But might need better if/def to select just the platforms that needs them.*/ |
|
28
|
|
|
29
|
#ifndef __USE_FILE_OFFSET64 |
|
30
|
#define __USE_FILE_OFFSET64 |
|
31
|
#endif |
|
32
|
#ifndef __USE_LARGEFILE64 |
|
33
|
#define __USE_LARGEFILE64 |
|
34
|
#endif |
|
35
|
#ifndef _LARGEFILE64_SOURCE |
|
36
|
#define _LARGEFILE64_SOURCE |
|
37
|
#endif |
|
38
|
#ifndef _FILE_OFFSET_BIT |
|
39
|
#define _FILE_OFFSET_BIT 64 |
|
40
|
#endif |
|
41
|
|
|
42
|
#endif |
|
43
|
|
|
44
|
#include <stdio.h> |
|
45
|
#include <stdlib.h> |
|
46
|
#include "zlib.h" |
|
47
|
|
|
48
|
#if defined(USE_FILE32API) |
|
49
|
#define fopen64 fopen |
|
50
|
#define ftello64 ftell |
|
51
|
#define fseeko64 fseek |
|
52
|
#else |
|
53
|
#if defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__NetBSD__) || defined(__HAIKU__) || defined(MINIZIP_FOPEN_NO_64) |
|
54
|
#define fopen64 fopen |
|
55
|
#define ftello64 ftello |
|
56
|
#define fseeko64 fseeko |
|
57
|
#endif |
|
58
|
#ifdef _MSC_VER |
|
59
|
#define fopen64 fopen |
|
60
|
#if (_MSC_VER >= 1400) && (!(defined(NO_MSCVER_FILE64_FUNC))) |
|
61
|
#define ftello64 _ftelli64 |
|
62
|
#define fseeko64 _fseeki64 |
|
63
|
#else // old MSC |
|
64
|
#define ftello64 ftell |
|
65
|
#define fseeko64 fseek |
|
66
|
#endif |
|
67
|
#endif |
|
68
|
#endif |
|
69
|
|
|
70
|
#ifdef HAVE_MINIZIP64_CONF_H |
|
71
|
#include "mz64conf.h" |
|
72
|
#endif |
|
73
|
|
|
74
|
#include "ints.h" |
|
75
|
typedef ui64_t ZPOS64_T; |
|
76
|
|
|
77
|
/* Maximum unsigned 32-bit value used as placeholder for zip64 */ |
|
78
|
#ifndef MAXU32 |
|
79
|
#define MAXU32 (0xffffffff) |
|
80
|
#endif |
|
81
|
|
|
82
|
#ifdef __cplusplus |
|
83
|
extern "C" { |
|
84
|
#endif |
|
85
|
|
|
86
|
|
|
87
|
#define ZLIB_FILEFUNC_SEEK_CUR (1) |
|
88
|
#define ZLIB_FILEFUNC_SEEK_END (2) |
|
89
|
#define ZLIB_FILEFUNC_SEEK_SET (0) |
|
90
|
|
|
91
|
#define ZLIB_FILEFUNC_MODE_READ (1) |
|
92
|
#define ZLIB_FILEFUNC_MODE_WRITE (2) |
|
93
|
#define ZLIB_FILEFUNC_MODE_READWRITEFILTER (3) |
|
94
|
|
|
95
|
#define ZLIB_FILEFUNC_MODE_EXISTING (4) |
|
96
|
#define ZLIB_FILEFUNC_MODE_CREATE (8) |
|
97
|
|
|
98
|
|
|
99
|
#ifndef ZCALLBACK |
|
100
|
#if (defined(WIN32) || defined(_WIN32) || defined (WINDOWS) || defined (_WINDOWS)) && defined(CALLBACK) && defined (USEWINDOWS_CALLBACK) |
|
101
|
#define ZCALLBACK CALLBACK |
|
102
|
#else |
|
103
|
#define ZCALLBACK |
|
104
|
#endif |
|
105
|
#endif |
|
106
|
|
|
107
|
|
|
108
|
|
|
109
|
|
|
110
|
typedef voidpf (ZCALLBACK *open_file_func) (voidpf opaque, const char* filename, int mode); |
|
111
|
typedef uLong (ZCALLBACK *read_file_func) (voidpf opaque, voidpf stream, void* buf, uLong size); |
|
112
|
typedef uLong (ZCALLBACK *write_file_func) (voidpf opaque, voidpf stream, const void* buf, uLong size); |
|
113
|
typedef int (ZCALLBACK *close_file_func) (voidpf opaque, voidpf stream); |
|
114
|
typedef int (ZCALLBACK *testerror_file_func) (voidpf opaque, voidpf stream); |
|
115
|
|
|
116
|
typedef long (ZCALLBACK *tell_file_func) (voidpf opaque, voidpf stream); |
|
117
|
typedef long (ZCALLBACK *seek_file_func) (voidpf opaque, voidpf stream, uLong offset, int origin); |
|
118
|
|
|
119
|
|
|
120
|
/* here is the "old" 32 bits structure */ |
|
121
|
typedef struct zlib_filefunc_def_s |
|
122
|
{ |
|
123
|
open_file_func zopen_file; |
|
124
|
read_file_func zread_file; |
|
125
|
write_file_func zwrite_file; |
|
126
|
tell_file_func ztell_file; |
|
127
|
seek_file_func zseek_file; |
|
128
|
close_file_func zclose_file; |
|
129
|
testerror_file_func zerror_file; |
|
130
|
voidpf opaque; |
|
131
|
} zlib_filefunc_def; |
|
132
|
|
|
133
|
typedef ZPOS64_T (ZCALLBACK *tell64_file_func) (voidpf opaque, voidpf stream); |
|
134
|
typedef long (ZCALLBACK *seek64_file_func) (voidpf opaque, voidpf stream, ZPOS64_T offset, int origin); |
|
135
|
typedef voidpf (ZCALLBACK *open64_file_func) (voidpf opaque, const void* filename, int mode); |
|
136
|
|
|
137
|
typedef struct zlib_filefunc64_def_s |
|
138
|
{ |
|
139
|
open64_file_func zopen64_file; |
|
140
|
read_file_func zread_file; |
|
141
|
write_file_func zwrite_file; |
|
142
|
tell64_file_func ztell64_file; |
|
143
|
seek64_file_func zseek64_file; |
|
144
|
close_file_func zclose_file; |
|
145
|
testerror_file_func zerror_file; |
|
146
|
voidpf opaque; |
|
147
|
} zlib_filefunc64_def; |
|
148
|
|
|
149
|
void fill_fopen64_filefunc(zlib_filefunc64_def* pzlib_filefunc_def); |
|
150
|
void fill_fopen_filefunc(zlib_filefunc_def* pzlib_filefunc_def); |
|
151
|
|
|
152
|
/* now internal definition, only for zip.c and unzip.h */ |
|
153
|
typedef struct zlib_filefunc64_32_def_s |
|
154
|
{ |
|
155
|
zlib_filefunc64_def zfile_func64; |
|
156
|
open_file_func zopen32_file; |
|
157
|
tell_file_func ztell32_file; |
|
158
|
seek_file_func zseek32_file; |
|
159
|
} zlib_filefunc64_32_def; |
|
160
|
|
|
161
|
|
|
162
|
#define ZREAD64(filefunc,filestream,buf,size) ((*((filefunc).zfile_func64.zread_file)) ((filefunc).zfile_func64.opaque,filestream,buf,size)) |
|
163
|
#define ZWRITE64(filefunc,filestream,buf,size) ((*((filefunc).zfile_func64.zwrite_file)) ((filefunc).zfile_func64.opaque,filestream,buf,size)) |
|
164
|
/*#define ZTELL64(filefunc,filestream) ((*((filefunc).ztell64_file)) ((filefunc).opaque,filestream)) */ |
|
165
|
/*#define ZSEEK64(filefunc,filestream,pos,mode) ((*((filefunc).zseek64_file)) ((filefunc).opaque,filestream,pos,mode)) */ |
|
166
|
#define ZCLOSE64(filefunc,filestream) ((*((filefunc).zfile_func64.zclose_file)) ((filefunc).zfile_func64.opaque,filestream)) |
|
167
|
#define ZERROR64(filefunc,filestream) ((*((filefunc).zfile_func64.zerror_file)) ((filefunc).zfile_func64.opaque,filestream)) |
|
168
|
|
|
169
|
voidpf call_zopen64(const zlib_filefunc64_32_def* pfilefunc,const void*filename,int mode); |
|
170
|
long call_zseek64(const zlib_filefunc64_32_def* pfilefunc,voidpf filestream, ZPOS64_T offset, int origin); |
|
171
|
ZPOS64_T call_ztell64(const zlib_filefunc64_32_def* pfilefunc,voidpf filestream); |
|
172
|
|
|
173
|
void fill_zlib_filefunc64_32_def_from_filefunc32(zlib_filefunc64_32_def* p_filefunc64_32,const zlib_filefunc_def* p_filefunc32); |
|
174
|
|
|
175
|
#define ZOPEN64(filefunc,filename,mode) (call_zopen64((&(filefunc)),(filename),(mode))) |
|
176
|
#define ZTELL64(filefunc,filestream) (call_ztell64((&(filefunc)),(filestream))) |
|
177
|
#define ZSEEK64(filefunc,filestream,pos,mode) (call_zseek64((&(filefunc)),(filestream),(pos),(mode))) |
|
178
|
|
|
179
|
#ifdef __cplusplus |
|
180
|
} |
|
181
|
#endif |
|
182
|
|
|
183
|
#endif |
|
184
|
|