Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1)

Side by Side Diff: third_party/zlib/contrib/minizip/unzip.c

Issue 8806004: Update zlib to 1.2.5. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: '' Created 9 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « third_party/zlib/contrib/minizip/unzip.h ('k') | third_party/zlib/contrib/minizip/zip.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* unzip.c -- IO for uncompress .zip files using zlib 1 /* unzip.c -- IO for uncompress .zip files using zlib
2 Version 1.01e, February 12th, 2005 2 Version 1.1, February 14h, 2010
3 part of the MiniZip project - ( http://www.winimage.com/zLibDll/minizip.html )
3 4
4 Copyright (C) 1998-2005 Gilles Vollant 5 Copyright (C) 1998-2010 Gilles Vollant (minizip) ( http://www.winimage. com/zLibDll/minizip.html )
5 6
6 Read unzip.h for more info 7 Modifications of Unzip for Zip64
7 */ 8 Copyright (C) 2007-2008 Even Rouault
8 9
9 /* Decryption code comes from crypt.c by Info-ZIP but has been greatly reduced i n terms of 10 Modifications for Zip64 support on both zip and unzip
10 compatibility with older software. The following is from the original crypt.c. C ode 11 Copyright (C) 2009-2010 Mathias Svensson ( http://result42.com )
11 woven in by Terry Thorsen 1/2003. 12
12 */ 13 For more info read MiniZip_info.txt
13 /* 14
15
16 ------------------------------------------------------------------------------ ------
17 Decryption code comes from crypt.c by Info-ZIP but has been greatly reduced in terms of
18 compatibility with older software. The following is from the original crypt.c.
19 Code woven in by Terry Thorsen 1/2003.
20
14 Copyright (c) 1990-2000 Info-ZIP. All rights reserved. 21 Copyright (c) 1990-2000 Info-ZIP. All rights reserved.
15 22
16 See the accompanying file LICENSE, version 2000-Apr-09 or later 23 See the accompanying file LICENSE, version 2000-Apr-09 or later
17 (the contents of which are also included in zip.h) for terms of use. 24 (the contents of which are also included in zip.h) for terms of use.
18 If, for some reason, all these files are missing, the Info-ZIP license 25 If, for some reason, all these files are missing, the Info-ZIP license
19 also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html 26 also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html
20 */ 27
21 /* 28 crypt.c (full version) by Info-ZIP. Last revised: [see crypt.h]
22 crypt.c (full version) by Info-ZIP. Last revised: [see crypt.h]
23 29
24 The encryption/decryption parts of this source code (as opposed to the 30 The encryption/decryption parts of this source code (as opposed to the
25 non-echoing password parts) were originally written in Europe. The 31 non-echoing password parts) were originally written in Europe. The
26 whole source package can be freely distributed, including from the USA. 32 whole source package can be freely distributed, including from the USA.
27 (Prior to January 2000, re-export from the US was a violation of US law.) 33 (Prior to January 2000, re-export from the US was a violation of US law.)
28 */
29 34
30 /* 35 This encryption code is a direct transcription of the algorithm from
31 This encryption code is a direct transcription of the algorithm from
32 Roger Schlafly, described by Phil Katz in the file appnote.txt. This 36 Roger Schlafly, described by Phil Katz in the file appnote.txt. This
33 file (appnote.txt) is distributed with the PKZIP program (even in the 37 file (appnote.txt) is distributed with the PKZIP program (even in the
34 version without encryption capabilities). 38 version without encryption capabilities).
35 */ 39
40 ------------------------------------------------------------------------ ------------
41
42 Changes in unzip.c
43
44 2007-2008 - Even Rouault - Addition of cpl_unzGetCurrentFileZStreamPos
45 2007-2008 - Even Rouault - Decoration of symbol names unz* -> cpl_unz*
46 2007-2008 - Even Rouault - Remove old C style function prototypes
47 2007-2008 - Even Rouault - Add unzip support for ZIP64
48
49 Copyright (C) 2007-2008 Even Rouault
50
51
52 Oct-2009 - Mathias Svensson - Removed cpl_* from symbol names (Even Roua ult added them but since this is now moved to a new project (minizip64) I rename d them again).
53 Oct-2009 - Mathias Svensson - Fixed problem if uncompressed size was > 4G and compressed size was <4G
54 should only read the compressed/uncompressed siz e from the Zip64 format if
55 the size from normal header was 0xFFFFFFFF
56 Oct-2009 - Mathias Svensson - Applied some bug fixes from paches recived from Gilles Vollant
57 Oct-2009 - Mathias Svensson - Applied support to unzip files with compre ssion mathod BZIP2 (bzip2 lib is required)
58 Patch created by Daniel Borca
59
60 Jan-2010 - back to unzip and minizip 1.0 name scheme, with compatibility layer
61
62 Copyright (C) 1998 - 2010 Gilles Vollant, Even Rouault, Mathias Svensson
63
64 */
36 65
37 66
38 #include <stdio.h> 67 #include <stdio.h>
39 #include <stdlib.h> 68 #include <stdlib.h>
40 #include <string.h> 69 #include <string.h>
70
71 #ifndef NOUNCRYPT
72 #define NOUNCRYPT
73 #endif
74
41 #if defined(USE_SYSTEM_ZLIB) 75 #if defined(USE_SYSTEM_ZLIB)
42 #include <zlib.h> 76 #include <zlib.h>
43 #else 77 #else
44 #include "third_party/zlib/zlib.h" 78 #include "third_party/zlib/zlib.h"
45 #endif 79 #endif
46 #include "unzip.h" 80 #include "unzip.h"
47 81
48 #ifdef STDC 82 #ifdef STDC
49 # include <stddef.h> 83 # include <stddef.h>
50 # include <string.h> 84 # include <string.h>
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
82 # define ALLOC(size) (malloc(size)) 116 # define ALLOC(size) (malloc(size))
83 #endif 117 #endif
84 #ifndef TRYFREE 118 #ifndef TRYFREE
85 # define TRYFREE(p) {if (p) free(p);} 119 # define TRYFREE(p) {if (p) free(p);}
86 #endif 120 #endif
87 121
88 #define SIZECENTRALDIRITEM (0x2e) 122 #define SIZECENTRALDIRITEM (0x2e)
89 #define SIZEZIPLOCALHEADER (0x1e) 123 #define SIZEZIPLOCALHEADER (0x1e)
90 124
91 125
92
93
94 const char unz_copyright[] = 126 const char unz_copyright[] =
95 " unzip 1.01 Copyright 1998-2004 Gilles Vollant - http://www.winimage.com/zLi bDll"; 127 " unzip 1.01 Copyright 1998-2004 Gilles Vollant - http://www.winimage.com/zLi bDll";
96 128
97 /* unz_file_info_interntal contain internal info about a file in zipfile*/ 129 /* unz_file_info_interntal contain internal info about a file in zipfile*/
98 typedef struct unz_file_info_internal_s 130 typedef struct unz_file_info64_internal_s
99 { 131 {
100 uLong offset_curfile;/* relative offset of local header 4 bytes */ 132 ZPOS64_T offset_curfile;/* relative offset of local header 8 bytes */
101 } unz_file_info_internal; 133 } unz_file_info64_internal;
102 134
103 135
104 /* file_in_zip_read_info_s contain internal information about a file in zipfile, 136 /* file_in_zip_read_info_s contain internal information about a file in zipfile,
105 when reading and decompress it */ 137 when reading and decompress it */
106 typedef struct 138 typedef struct
107 { 139 {
108 char *read_buffer; /* internal buffer for compressed data */ 140 char *read_buffer; /* internal buffer for compressed data */
109 z_stream stream; /* zLib stream structure for inflate */ 141 z_stream stream; /* zLib stream structure for inflate */
110 142
111 uLong pos_in_zipfile; /* position in byte on the zipfile, for fseek*/ 143 #ifdef HAVE_BZIP2
144 bz_stream bstream; /* bzLib stream structure for bziped */
145 #endif
146
147 ZPOS64_T pos_in_zipfile; /* position in byte on the zipfile, for fseek */
112 uLong stream_initialised; /* flag set if stream structure is initialised*/ 148 uLong stream_initialised; /* flag set if stream structure is initialised*/
113 149
114 uLong offset_local_extrafield;/* offset of the local extra field */ 150 ZPOS64_T offset_local_extrafield;/* offset of the local extra field */
115 uInt size_local_extrafield;/* size of the local extra field */ 151 uInt size_local_extrafield;/* size of the local extra field */
116 uLong pos_local_extrafield; /* position in the local extra field in read*/ 152 ZPOS64_T pos_local_extrafield; /* position in the local extra field in rea d*/
153 ZPOS64_T total_out_64;
117 154
118 uLong crc32; /* crc32 of all data uncompressed */ 155 uLong crc32; /* crc32 of all data uncompressed */
119 uLong crc32_wait; /* crc32 we must obtain after decompress all */ 156 uLong crc32_wait; /* crc32 we must obtain after decompress all */
120 uLong rest_read_compressed; /* number of byte to be decompressed */ 157 ZPOS64_T rest_read_compressed; /* number of byte to be decompressed */
121 uLong rest_read_uncompressed;/*number of byte to be obtained after decomp*/ 158 ZPOS64_T rest_read_uncompressed;/*number of byte to be obtained after decomp */
122 zlib_filefunc_def z_filefunc; 159 zlib_filefunc64_32_def z_filefunc;
123 voidpf filestream; /* io structore of the zipfile */ 160 voidpf filestream; /* io structore of the zipfile */
124 uLong compression_method; /* compression method (0==store) */ 161 uLong compression_method; /* compression method (0==store) */
125 uLong byte_before_the_zipfile;/* byte before the zipfile, (>0 for sfx)*/ 162 ZPOS64_T byte_before_the_zipfile;/* byte before the zipfile, (>0 for sfx)*/
126 int raw; 163 int raw;
127 } file_in_zip_read_info_s; 164 } file_in_zip64_read_info_s;
128 165
129 166
130 /* unz_s contain internal information about the zipfile 167 /* unz64_s contain internal information about the zipfile
131 */ 168 */
132 typedef struct 169 typedef struct
133 { 170 {
134 zlib_filefunc_def z_filefunc; 171 zlib_filefunc64_32_def z_filefunc;
172 int is64bitOpenFunction;
135 voidpf filestream; /* io structore of the zipfile */ 173 voidpf filestream; /* io structore of the zipfile */
136 unz_global_info gi; /* public global information */ 174 unz_global_info64 gi; /* public global information */
137 uLong byte_before_the_zipfile;/* byte before the zipfile, (>0 for sfx)*/ 175 ZPOS64_T byte_before_the_zipfile;/* byte before the zipfile, (>0 for sfx)*/
138 uLong num_file; /* number of the current file in the zipfile*/ 176 ZPOS64_T num_file; /* number of the current file in the zipfile* /
139 uLong pos_in_central_dir; /* pos of the current file in the central dir*/ 177 ZPOS64_T pos_in_central_dir; /* pos of the current file in the central dir */
140 uLong current_file_ok; /* flag about the usability of the current file* / 178 ZPOS64_T current_file_ok; /* flag about the usability of the current fi le*/
141 uLong central_pos; /* position of the beginning of the central dir* / 179 ZPOS64_T central_pos; /* position of the beginning of the central d ir*/
142 180
143 uLong size_central_dir; /* size of the central directory */ 181 ZPOS64_T size_central_dir; /* size of the central directory */
144 uLong offset_central_dir; /* offset of start of central directory with 182 ZPOS64_T offset_central_dir; /* offset of start of central directory with
145 respect to the starting disk number */ 183 respect to the starting disk number */
146 184
147 unz_file_info cur_file_info; /* public info about the current file in zip*/ 185 unz_file_info64 cur_file_info; /* public info about the current file in zip* /
148 unz_file_info_internal cur_file_info_internal; /* private info about it*/ 186 unz_file_info64_internal cur_file_info_internal; /* private info about it*/
149 file_in_zip_read_info_s* pfile_in_zip_read; /* structure about the current 187 file_in_zip64_read_info_s* pfile_in_zip_read; /* structure about the current
150 file if we are decompressing it */ 188 file if we are decompressing it */
151 int encrypted; 189 int encrypted;
190
191 int isZip64;
192
152 # ifndef NOUNCRYPT 193 # ifndef NOUNCRYPT
153 unsigned long keys[3]; /* keys defining the pseudo-random sequence */ 194 unsigned long keys[3]; /* keys defining the pseudo-random sequence */
154 const unsigned long* pcrc_32_tab; 195 const unsigned long* pcrc_32_tab;
155 # endif 196 # endif
156 } unz_s; 197 } unz64_s;
157 198
158 199
159 #ifndef NOUNCRYPT 200 #ifndef NOUNCRYPT
160 #include "crypt.h" 201 #include "crypt.h"
161 #endif 202 #endif
162 203
163 /* =========================================================================== 204 /* ===========================================================================
164 Read a byte from a gz_stream; update next_in and avail_in. Return EOF 205 Read a byte from a gz_stream; update next_in and avail_in. Return EOF
165 for end of file. 206 for end of file.
166 IN assertion: the stream s has been sucessfully opened for reading. 207 IN assertion: the stream s has been sucessfully opened for reading.
167 */ 208 */
168 209
169 210
170 local int unzlocal_getByte OF(( 211 local int unz64local_getByte OF((
171 const zlib_filefunc_def* pzlib_filefunc_def, 212 const zlib_filefunc64_32_def* pzlib_filefunc_def,
172 voidpf filestream, 213 voidpf filestream,
173 int *pi)); 214 int *pi));
174 215
175 local int unzlocal_getByte(pzlib_filefunc_def,filestream,pi) 216 local int unz64local_getByte(const zlib_filefunc64_32_def* pzlib_filefunc_def, v oidpf filestream, int *pi)
176 const zlib_filefunc_def* pzlib_filefunc_def;
177 voidpf filestream;
178 int *pi;
179 { 217 {
180 unsigned char c; 218 unsigned char c;
181 int err = (int)ZREAD(*pzlib_filefunc_def,filestream,&c,1); 219 int err = (int)ZREAD64(*pzlib_filefunc_def,filestream,&c,1);
182 if (err==1) 220 if (err==1)
183 { 221 {
184 *pi = (int)c; 222 *pi = (int)c;
185 return UNZ_OK; 223 return UNZ_OK;
186 } 224 }
187 else 225 else
188 { 226 {
189 if (ZERROR(*pzlib_filefunc_def,filestream)) 227 if (ZERROR64(*pzlib_filefunc_def,filestream))
190 return UNZ_ERRNO; 228 return UNZ_ERRNO;
191 else 229 else
192 return UNZ_EOF; 230 return UNZ_EOF;
193 } 231 }
194 } 232 }
195 233
196 234
197 /* =========================================================================== 235 /* ===========================================================================
198 Reads a long in LSB order from the given gz_stream. Sets 236 Reads a long in LSB order from the given gz_stream. Sets
199 */ 237 */
200 local int unzlocal_getShort OF(( 238 local int unz64local_getShort OF((
201 const zlib_filefunc_def* pzlib_filefunc_def, 239 const zlib_filefunc64_32_def* pzlib_filefunc_def,
202 voidpf filestream, 240 voidpf filestream,
203 uLong *pX)); 241 uLong *pX));
204 242
205 local int unzlocal_getShort (pzlib_filefunc_def,filestream,pX) 243 local int unz64local_getShort (const zlib_filefunc64_32_def* pzlib_filefunc_def,
206 const zlib_filefunc_def* pzlib_filefunc_def; 244 voidpf filestream,
207 voidpf filestream; 245 uLong *pX)
208 uLong *pX;
209 { 246 {
210 uLong x ; 247 uLong x ;
211 int i; 248 int i = 0;
212 int err; 249 int err;
213 250
214 err = unzlocal_getByte(pzlib_filefunc_def,filestream,&i); 251 err = unz64local_getByte(pzlib_filefunc_def,filestream,&i);
215 x = (uLong)i; 252 x = (uLong)i;
216 253
217 if (err==UNZ_OK) 254 if (err==UNZ_OK)
218 err = unzlocal_getByte(pzlib_filefunc_def,filestream,&i); 255 err = unz64local_getByte(pzlib_filefunc_def,filestream,&i);
219 x += ((uLong)i)<<8; 256 x |= ((uLong)i)<<8;
220 257
221 if (err==UNZ_OK) 258 if (err==UNZ_OK)
222 *pX = x; 259 *pX = x;
223 else 260 else
224 *pX = 0; 261 *pX = 0;
225 return err; 262 return err;
226 } 263 }
227 264
228 local int unzlocal_getLong OF(( 265 local int unz64local_getLong OF((
229 const zlib_filefunc_def* pzlib_filefunc_def, 266 const zlib_filefunc64_32_def* pzlib_filefunc_def,
230 voidpf filestream, 267 voidpf filestream,
231 uLong *pX)); 268 uLong *pX));
232 269
233 local int unzlocal_getLong (pzlib_filefunc_def,filestream,pX) 270 local int unz64local_getLong (const zlib_filefunc64_32_def* pzlib_filefunc_def,
234 const zlib_filefunc_def* pzlib_filefunc_def; 271 voidpf filestream,
235 voidpf filestream; 272 uLong *pX)
236 uLong *pX;
237 { 273 {
238 uLong x ; 274 uLong x ;
239 int i; 275 int i = 0;
240 int err; 276 int err;
241 277
242 err = unzlocal_getByte(pzlib_filefunc_def,filestream,&i); 278 err = unz64local_getByte(pzlib_filefunc_def,filestream,&i);
243 x = (uLong)i; 279 x = (uLong)i;
244 280
245 if (err==UNZ_OK) 281 if (err==UNZ_OK)
246 err = unzlocal_getByte(pzlib_filefunc_def,filestream,&i); 282 err = unz64local_getByte(pzlib_filefunc_def,filestream,&i);
247 x += ((uLong)i)<<8; 283 x |= ((uLong)i)<<8;
248 284
249 if (err==UNZ_OK) 285 if (err==UNZ_OK)
250 err = unzlocal_getByte(pzlib_filefunc_def,filestream,&i); 286 err = unz64local_getByte(pzlib_filefunc_def,filestream,&i);
251 x += ((uLong)i)<<16; 287 x |= ((uLong)i)<<16;
252 288
253 if (err==UNZ_OK) 289 if (err==UNZ_OK)
254 err = unzlocal_getByte(pzlib_filefunc_def,filestream,&i); 290 err = unz64local_getByte(pzlib_filefunc_def,filestream,&i);
255 x += ((uLong)i)<<24; 291 x += ((uLong)i)<<24;
256 292
257 if (err==UNZ_OK) 293 if (err==UNZ_OK)
258 *pX = x; 294 *pX = x;
259 else 295 else
260 *pX = 0; 296 *pX = 0;
261 return err; 297 return err;
262 } 298 }
263 299
300 local int unz64local_getLong64 OF((
301 const zlib_filefunc64_32_def* pzlib_filefunc_def,
302 voidpf filestream,
303 ZPOS64_T *pX));
304
305
306 local int unz64local_getLong64 (const zlib_filefunc64_32_def* pzlib_filefunc_def ,
307 voidpf filestream,
308 ZPOS64_T *pX)
309 {
310 ZPOS64_T x ;
311 int i = 0;
312 int err;
313
314 err = unz64local_getByte(pzlib_filefunc_def,filestream,&i);
315 x = (ZPOS64_T)i;
316
317 if (err==UNZ_OK)
318 err = unz64local_getByte(pzlib_filefunc_def,filestream,&i);
319 x |= ((ZPOS64_T)i)<<8;
320
321 if (err==UNZ_OK)
322 err = unz64local_getByte(pzlib_filefunc_def,filestream,&i);
323 x |= ((ZPOS64_T)i)<<16;
324
325 if (err==UNZ_OK)
326 err = unz64local_getByte(pzlib_filefunc_def,filestream,&i);
327 x |= ((ZPOS64_T)i)<<24;
328
329 if (err==UNZ_OK)
330 err = unz64local_getByte(pzlib_filefunc_def,filestream,&i);
331 x |= ((ZPOS64_T)i)<<32;
332
333 if (err==UNZ_OK)
334 err = unz64local_getByte(pzlib_filefunc_def,filestream,&i);
335 x |= ((ZPOS64_T)i)<<40;
336
337 if (err==UNZ_OK)
338 err = unz64local_getByte(pzlib_filefunc_def,filestream,&i);
339 x |= ((ZPOS64_T)i)<<48;
340
341 if (err==UNZ_OK)
342 err = unz64local_getByte(pzlib_filefunc_def,filestream,&i);
343 x |= ((ZPOS64_T)i)<<56;
344
345 if (err==UNZ_OK)
346 *pX = x;
347 else
348 *pX = 0;
349 return err;
350 }
264 351
265 /* My own strcmpi / strcasecmp */ 352 /* My own strcmpi / strcasecmp */
266 local int strcmpcasenosensitive_internal (fileName1,fileName2) 353 local int strcmpcasenosensitive_internal (const char* fileName1, const char* fil eName2)
267 const char* fileName1;
268 const char* fileName2;
269 { 354 {
270 for (;;) 355 for (;;)
271 { 356 {
272 char c1=*(fileName1++); 357 char c1=*(fileName1++);
273 char c2=*(fileName2++); 358 char c2=*(fileName2++);
274 if ((c1>='a') && (c1<='z')) 359 if ((c1>='a') && (c1<='z'))
275 c1 -= 0x20; 360 c1 -= 0x20;
276 if ((c2>='a') && (c2<='z')) 361 if ((c2>='a') && (c2<='z'))
277 c2 -= 0x20; 362 c2 -= 0x20;
278 if (c1=='\0') 363 if (c1=='\0')
(...skipping 20 matching lines...) Expand all
299 384
300 /* 385 /*
301 Compare two filename (fileName1,fileName2). 386 Compare two filename (fileName1,fileName2).
302 If iCaseSenisivity = 1, comparision is case sensitivity (like strcmp) 387 If iCaseSenisivity = 1, comparision is case sensitivity (like strcmp)
303 If iCaseSenisivity = 2, comparision is not case sensitivity (like strcmpi 388 If iCaseSenisivity = 2, comparision is not case sensitivity (like strcmpi
304 or strcasecmp) 389 or strcasecmp)
305 If iCaseSenisivity = 0, case sensitivity is defaut of your operating system 390 If iCaseSenisivity = 0, case sensitivity is defaut of your operating system
306 (like 1 on Unix, 2 on Windows) 391 (like 1 on Unix, 2 on Windows)
307 392
308 */ 393 */
309 extern int ZEXPORT unzStringFileNameCompare (fileName1,fileName2,iCaseSensitivit y) 394 extern int ZEXPORT unzStringFileNameCompare (const char* fileName1,
310 const char* fileName1; 395 const char* fileName2,
311 const char* fileName2; 396 int iCaseSensitivity)
312 int iCaseSensitivity; 397
313 { 398 {
314 if (iCaseSensitivity==0) 399 if (iCaseSensitivity==0)
315 iCaseSensitivity=CASESENSITIVITYDEFAULTVALUE; 400 iCaseSensitivity=CASESENSITIVITYDEFAULTVALUE;
316 401
317 if (iCaseSensitivity==1) 402 if (iCaseSensitivity==1)
318 return strcmp(fileName1,fileName2); 403 return strcmp(fileName1,fileName2);
319 404
320 return STRCMPCASENOSENTIVEFUNCTION(fileName1,fileName2); 405 return STRCMPCASENOSENTIVEFUNCTION(fileName1,fileName2);
321 } 406 }
322 407
323 #ifndef BUFREADCOMMENT 408 #ifndef BUFREADCOMMENT
324 #define BUFREADCOMMENT (0x400) 409 #define BUFREADCOMMENT (0x400)
325 #endif 410 #endif
326 411
327 /* 412 /*
328 Locate the Central directory of a zipfile (at the end, just before 413 Locate the Central directory of a zipfile (at the end, just before
329 the global comment) 414 the global comment)
330 */ 415 */
331 local uLong unzlocal_SearchCentralDir OF(( 416 local ZPOS64_T unz64local_SearchCentralDir OF((const zlib_filefunc64_32_def* pzl ib_filefunc_def, voidpf filestream));
332 const zlib_filefunc_def* pzlib_filefunc_def, 417 local ZPOS64_T unz64local_SearchCentralDir(const zlib_filefunc64_32_def* pzlib_f ilefunc_def, voidpf filestream)
333 voidpf filestream));
334
335 local uLong unzlocal_SearchCentralDir(pzlib_filefunc_def,filestream)
336 const zlib_filefunc_def* pzlib_filefunc_def;
337 voidpf filestream;
338 { 418 {
339 unsigned char* buf; 419 unsigned char* buf;
340 uLong uSizeFile; 420 ZPOS64_T uSizeFile;
341 uLong uBackRead; 421 ZPOS64_T uBackRead;
342 uLong uMaxBack=0xffff; /* maximum size of global comment */ 422 ZPOS64_T uMaxBack=0xffff; /* maximum size of global comment */
343 uLong uPosFound=0; 423 ZPOS64_T uPosFound=0;
344 424
345 if (ZSEEK(*pzlib_filefunc_def,filestream,0,ZLIB_FILEFUNC_SEEK_END) != 0) 425 if (ZSEEK64(*pzlib_filefunc_def,filestream,0,ZLIB_FILEFUNC_SEEK_END) != 0)
346 return 0; 426 return 0;
347 427
348 428
349 uSizeFile = ZTELL(*pzlib_filefunc_def,filestream); 429 uSizeFile = ZTELL64(*pzlib_filefunc_def,filestream);
350 430
351 if (uMaxBack>uSizeFile) 431 if (uMaxBack>uSizeFile)
352 uMaxBack = uSizeFile; 432 uMaxBack = uSizeFile;
353 433
354 buf = (unsigned char*)ALLOC(BUFREADCOMMENT+4); 434 buf = (unsigned char*)ALLOC(BUFREADCOMMENT+4);
355 if (buf==NULL) 435 if (buf==NULL)
356 return 0; 436 return 0;
357 437
358 uBackRead = 4; 438 uBackRead = 4;
359 while (uBackRead<uMaxBack) 439 while (uBackRead<uMaxBack)
360 { 440 {
361 uLong uReadSize,uReadPos ; 441 uLong uReadSize;
442 ZPOS64_T uReadPos ;
362 int i; 443 int i;
363 if (uBackRead+BUFREADCOMMENT>uMaxBack) 444 if (uBackRead+BUFREADCOMMENT>uMaxBack)
364 uBackRead = uMaxBack; 445 uBackRead = uMaxBack;
365 else 446 else
366 uBackRead+=BUFREADCOMMENT; 447 uBackRead+=BUFREADCOMMENT;
367 uReadPos = uSizeFile-uBackRead ; 448 uReadPos = uSizeFile-uBackRead ;
368 449
369 uReadSize = ((BUFREADCOMMENT+4) < (uSizeFile-uReadPos)) ? 450 uReadSize = ((BUFREADCOMMENT+4) < (uSizeFile-uReadPos)) ?
370 (BUFREADCOMMENT+4) : (uSizeFile-uReadPos); 451 (BUFREADCOMMENT+4) : (uLong)(uSizeFile-uReadPos);
371 if (ZSEEK(*pzlib_filefunc_def,filestream,uReadPos,ZLIB_FILEFUNC_SEEK_SET )!=0) 452 if (ZSEEK64(*pzlib_filefunc_def,filestream,uReadPos,ZLIB_FILEFUNC_SEEK_S ET)!=0)
372 break; 453 break;
373 454
374 if (ZREAD(*pzlib_filefunc_def,filestream,buf,uReadSize)!=uReadSize) 455 if (ZREAD64(*pzlib_filefunc_def,filestream,buf,uReadSize)!=uReadSize)
375 break; 456 break;
376 457
377 for (i=(int)uReadSize-3; (i--)>0;) 458 for (i=(int)uReadSize-3; (i--)>0;)
378 if (((*(buf+i))==0x50) && ((*(buf+i+1))==0x4b) && 459 if (((*(buf+i))==0x50) && ((*(buf+i+1))==0x4b) &&
379 ((*(buf+i+2))==0x05) && ((*(buf+i+3))==0x06)) 460 ((*(buf+i+2))==0x05) && ((*(buf+i+3))==0x06))
380 { 461 {
381 uPosFound = uReadPos+i; 462 uPosFound = uReadPos+i;
382 break; 463 break;
383 } 464 }
384 465
385 if (uPosFound!=0) 466 if (uPosFound!=0)
386 break; 467 break;
387 } 468 }
388 TRYFREE(buf); 469 TRYFREE(buf);
389 return uPosFound; 470 return uPosFound;
390 } 471 }
391 472
473
474 /*
475 Locate the Central directory 64 of a zipfile (at the end, just before
476 the global comment)
477 */
478 local ZPOS64_T unz64local_SearchCentralDir64 OF((
479 const zlib_filefunc64_32_def* pzlib_filefunc_def,
480 voidpf filestream));
481
482 local ZPOS64_T unz64local_SearchCentralDir64(const zlib_filefunc64_32_def* pzlib _filefunc_def,
483 voidpf filestream)
484 {
485 unsigned char* buf;
486 ZPOS64_T uSizeFile;
487 ZPOS64_T uBackRead;
488 ZPOS64_T uMaxBack=0xffff; /* maximum size of global comment */
489 ZPOS64_T uPosFound=0;
490 uLong uL;
491 ZPOS64_T relativeOffset;
492
493 if (ZSEEK64(*pzlib_filefunc_def,filestream,0,ZLIB_FILEFUNC_SEEK_END) != 0)
494 return 0;
495
496
497 uSizeFile = ZTELL64(*pzlib_filefunc_def,filestream);
498
499 if (uMaxBack>uSizeFile)
500 uMaxBack = uSizeFile;
501
502 buf = (unsigned char*)ALLOC(BUFREADCOMMENT+4);
503 if (buf==NULL)
504 return 0;
505
506 uBackRead = 4;
507 while (uBackRead<uMaxBack)
508 {
509 uLong uReadSize;
510 ZPOS64_T uReadPos;
511 int i;
512 if (uBackRead+BUFREADCOMMENT>uMaxBack)
513 uBackRead = uMaxBack;
514 else
515 uBackRead+=BUFREADCOMMENT;
516 uReadPos = uSizeFile-uBackRead ;
517
518 uReadSize = ((BUFREADCOMMENT+4) < (uSizeFile-uReadPos)) ?
519 (BUFREADCOMMENT+4) : (uLong)(uSizeFile-uReadPos);
520 if (ZSEEK64(*pzlib_filefunc_def,filestream,uReadPos,ZLIB_FILEFUNC_SEEK_S ET)!=0)
521 break;
522
523 if (ZREAD64(*pzlib_filefunc_def,filestream,buf,uReadSize)!=uReadSize)
524 break;
525
526 for (i=(int)uReadSize-3; (i--)>0;)
527 if (((*(buf+i))==0x50) && ((*(buf+i+1))==0x4b) &&
528 ((*(buf+i+2))==0x06) && ((*(buf+i+3))==0x07))
529 {
530 uPosFound = uReadPos+i;
531 break;
532 }
533
534 if (uPosFound!=0)
535 break;
536 }
537 TRYFREE(buf);
538 if (uPosFound == 0)
539 return 0;
540
541 /* Zip64 end of central directory locator */
542 if (ZSEEK64(*pzlib_filefunc_def,filestream, uPosFound,ZLIB_FILEFUNC_SEEK_SET )!=0)
543 return 0;
544
545 /* the signature, already checked */
546 if (unz64local_getLong(pzlib_filefunc_def,filestream,&uL)!=UNZ_OK)
547 return 0;
548
549 /* number of the disk with the start of the zip64 end of central directory */
550 if (unz64local_getLong(pzlib_filefunc_def,filestream,&uL)!=UNZ_OK)
551 return 0;
552 if (uL != 0)
553 return 0;
554
555 /* relative offset of the zip64 end of central directory record */
556 if (unz64local_getLong64(pzlib_filefunc_def,filestream,&relativeOffset)!=UNZ _OK)
557 return 0;
558
559 /* total number of disks */
560 if (unz64local_getLong(pzlib_filefunc_def,filestream,&uL)!=UNZ_OK)
561 return 0;
562 if (uL != 1)
563 return 0;
564
565 /* Goto end of central directory record */
566 if (ZSEEK64(*pzlib_filefunc_def,filestream, relativeOffset,ZLIB_FILEFUNC_SEE K_SET)!=0)
567 return 0;
568
569 /* the signature */
570 if (unz64local_getLong(pzlib_filefunc_def,filestream,&uL)!=UNZ_OK)
571 return 0;
572
573 if (uL != 0x06064b50)
574 return 0;
575
576 return relativeOffset;
577 }
578
392 /* 579 /*
393 Open a Zip file. path contain the full pathname (by example, 580 Open a Zip file. path contain the full pathname (by example,
394 on a Windows NT computer "c:\\test\\zlib114.zip" or on an Unix computer 581 on a Windows NT computer "c:\\test\\zlib114.zip" or on an Unix computer
395 "zlib/zlib114.zip". 582 "zlib/zlib114.zip".
396 If the zipfile cannot be opened (file doesn't exist or in not valid), the 583 If the zipfile cannot be opened (file doesn't exist or in not valid), the
397 return value is NULL. 584 return value is NULL.
398 Else, the return value is a unzFile Handle, usable with other function 585 Else, the return value is a unzFile Handle, usable with other function
399 of this unzip package. 586 of this unzip package.
400 */ 587 */
401 extern unzFile ZEXPORT unzOpen2 (path, pzlib_filefunc_def) 588 local unzFile unzOpenInternal (const void *path,
402 const char *path; 589 zlib_filefunc64_32_def* pzlib_filefunc64_32_def,
403 zlib_filefunc_def* pzlib_filefunc_def; 590 int is64bitOpenFunction)
404 { 591 {
405 unz_s us; 592 unz64_s us;
406 unz_s *s; 593 unz64_s *s;
407 uLong central_pos,uL; 594 ZPOS64_T central_pos;
595 uLong uL;
408 596
409 uLong number_disk; /* number of the current dist, used for 597 uLong number_disk; /* number of the current dist, used for
410 spaning ZIP, unsupported, always 0*/ 598 spaning ZIP, unsupported, always 0*/
411 uLong number_disk_with_CD; /* number the the disk with central dir, used 599 uLong number_disk_with_CD; /* number the the disk with central dir, used
412 for spaning ZIP, unsupported, always 0*/ 600 for spaning ZIP, unsupported, always 0*/
413 uLong number_entry_CD; /* total number of entries in 601 ZPOS64_T number_entry_CD; /* total number of entries in
414 the central dir 602 the central dir
415 (same than number_entry on nospan) */ 603 (same than number_entry on nospan) */
416 604
417 int err=UNZ_OK; 605 int err=UNZ_OK;
418 606
419 if (unz_copyright[0]!=' ') 607 if (unz_copyright[0]!=' ')
420 return NULL; 608 return NULL;
421 609
422 if (pzlib_filefunc_def==NULL) 610 us.z_filefunc.zseek32_file = NULL;
423 fill_fopen_filefunc(&us.z_filefunc); 611 us.z_filefunc.ztell32_file = NULL;
612 if (pzlib_filefunc64_32_def==NULL)
613 fill_fopen64_filefunc(&us.z_filefunc.zfile_func64);
424 else 614 else
425 us.z_filefunc = *pzlib_filefunc_def; 615 us.z_filefunc = *pzlib_filefunc64_32_def;
616 us.is64bitOpenFunction = is64bitOpenFunction;
426 617
427 us.filestream= (*(us.z_filefunc.zopen_file))(us.z_filefunc.opaque, 618
619
620 us.filestream = ZOPEN64(us.z_filefunc,
428 path, 621 path,
429 ZLIB_FILEFUNC_MODE_READ | 622 ZLIB_FILEFUNC_MODE_READ |
430 ZLIB_FILEFUNC_MODE_EXISTING); 623 ZLIB_FILEFUNC_MODE_EXISTING);
431 if (us.filestream==NULL) 624 if (us.filestream==NULL)
432 return NULL; 625 return NULL;
433 626
434 central_pos = unzlocal_SearchCentralDir(&us.z_filefunc,us.filestream); 627 central_pos = unz64local_SearchCentralDir64(&us.z_filefunc,us.filestream);
435 if (central_pos==0) 628 if (central_pos)
436 err=UNZ_ERRNO; 629 {
630 uLong uS;
631 ZPOS64_T uL64;
437 632
438 if (ZSEEK(us.z_filefunc, us.filestream, 633 us.isZip64 = 1;
634
635 if (ZSEEK64(us.z_filefunc, us.filestream,
439 central_pos,ZLIB_FILEFUNC_SEEK_SET)!=0) 636 central_pos,ZLIB_FILEFUNC_SEEK_SET)!=0)
440 err=UNZ_ERRNO; 637 err=UNZ_ERRNO;
441 638
442 /* the signature, already checked */ 639 /* the signature, already checked */
443 if (unzlocal_getLong(&us.z_filefunc, us.filestream,&uL)!=UNZ_OK) 640 if (unz64local_getLong(&us.z_filefunc, us.filestream,&uL)!=UNZ_OK)
444 err=UNZ_ERRNO; 641 err=UNZ_ERRNO;
445 642
446 /* number of this disk */ 643 /* size of zip64 end of central directory record */
447 if (unzlocal_getShort(&us.z_filefunc, us.filestream,&number_disk)!=UNZ_OK) 644 if (unz64local_getLong64(&us.z_filefunc, us.filestream,&uL64)!=UNZ_OK)
448 err=UNZ_ERRNO; 645 err=UNZ_ERRNO;
449 646
450 /* number of the disk with the start of the central directory */ 647 /* version made by */
451 if (unzlocal_getShort(&us.z_filefunc, us.filestream,&number_disk_with_CD)!=U NZ_OK) 648 if (unz64local_getShort(&us.z_filefunc, us.filestream,&uS)!=UNZ_OK)
452 err=UNZ_ERRNO; 649 err=UNZ_ERRNO;
453 650
454 /* total number of entries in the central dir on this disk */ 651 /* version needed to extract */
455 if (unzlocal_getShort(&us.z_filefunc, us.filestream,&us.gi.number_entry)!=UN Z_OK) 652 if (unz64local_getShort(&us.z_filefunc, us.filestream,&uS)!=UNZ_OK)
456 err=UNZ_ERRNO; 653 err=UNZ_ERRNO;
457 654
458 /* total number of entries in the central dir */ 655 /* number of this disk */
459 if (unzlocal_getShort(&us.z_filefunc, us.filestream,&number_entry_CD)!=UNZ_O K) 656 if (unz64local_getLong(&us.z_filefunc, us.filestream,&number_disk)!=UNZ_ OK)
460 err=UNZ_ERRNO; 657 err=UNZ_ERRNO;
461 658
462 if ((number_entry_CD!=us.gi.number_entry) || 659 /* number of the disk with the start of the central directory */
463 (number_disk_with_CD!=0) || 660 if (unz64local_getLong(&us.z_filefunc, us.filestream,&number_disk_with_C D)!=UNZ_OK)
464 (number_disk!=0)) 661 err=UNZ_ERRNO;
465 err=UNZ_BADZIPFILE;
466 662
467 /* size of the central directory */ 663 /* total number of entries in the central directory on this disk */
468 if (unzlocal_getLong(&us.z_filefunc, us.filestream,&us.size_central_dir)!=UN Z_OK) 664 if (unz64local_getLong64(&us.z_filefunc, us.filestream,&us.gi.number_ent ry)!=UNZ_OK)
469 err=UNZ_ERRNO; 665 err=UNZ_ERRNO;
470 666
471 /* offset of start of central directory with respect to the 667 /* total number of entries in the central directory */
668 if (unz64local_getLong64(&us.z_filefunc, us.filestream,&number_entry_CD) !=UNZ_OK)
669 err=UNZ_ERRNO;
670
671 if ((number_entry_CD!=us.gi.number_entry) ||
672 (number_disk_with_CD!=0) ||
673 (number_disk!=0))
674 err=UNZ_BADZIPFILE;
675
676 /* size of the central directory */
677 if (unz64local_getLong64(&us.z_filefunc, us.filestream,&us.size_central_ dir)!=UNZ_OK)
678 err=UNZ_ERRNO;
679
680 /* offset of start of central directory with respect to the
472 starting disk number */ 681 starting disk number */
473 if (unzlocal_getLong(&us.z_filefunc, us.filestream,&us.offset_central_dir)!= UNZ_OK) 682 if (unz64local_getLong64(&us.z_filefunc, us.filestream,&us.offset_centra l_dir)!=UNZ_OK)
474 err=UNZ_ERRNO; 683 err=UNZ_ERRNO;
475 684
476 /* zipfile comment length */ 685 us.gi.size_comment = 0;
477 if (unzlocal_getShort(&us.z_filefunc, us.filestream,&us.gi.size_comment)!=UN Z_OK) 686 }
478 err=UNZ_ERRNO; 687 else
688 {
689 central_pos = unz64local_SearchCentralDir(&us.z_filefunc,us.filestream);
690 if (central_pos==0)
691 err=UNZ_ERRNO;
692
693 us.isZip64 = 0;
694
695 if (ZSEEK64(us.z_filefunc, us.filestream,
696 central_pos,ZLIB_FILEFUNC_SEEK_SET)!=0)
697 err=UNZ_ERRNO;
698
699 /* the signature, already checked */
700 if (unz64local_getLong(&us.z_filefunc, us.filestream,&uL)!=UNZ_OK)
701 err=UNZ_ERRNO;
702
703 /* number of this disk */
704 if (unz64local_getShort(&us.z_filefunc, us.filestream,&number_disk)!=UNZ _OK)
705 err=UNZ_ERRNO;
706
707 /* number of the disk with the start of the central directory */
708 if (unz64local_getShort(&us.z_filefunc, us.filestream,&number_disk_with_ CD)!=UNZ_OK)
709 err=UNZ_ERRNO;
710
711 /* total number of entries in the central dir on this disk */
712 if (unz64local_getShort(&us.z_filefunc, us.filestream,&uL)!=UNZ_OK)
713 err=UNZ_ERRNO;
714 us.gi.number_entry = uL;
715
716 /* total number of entries in the central dir */
717 if (unz64local_getShort(&us.z_filefunc, us.filestream,&uL)!=UNZ_OK)
718 err=UNZ_ERRNO;
719 number_entry_CD = uL;
720
721 if ((number_entry_CD!=us.gi.number_entry) ||
722 (number_disk_with_CD!=0) ||
723 (number_disk!=0))
724 err=UNZ_BADZIPFILE;
725
726 /* size of the central directory */
727 if (unz64local_getLong(&us.z_filefunc, us.filestream,&uL)!=UNZ_OK)
728 err=UNZ_ERRNO;
729 us.size_central_dir = uL;
730
731 /* offset of start of central directory with respect to the
732 starting disk number */
733 if (unz64local_getLong(&us.z_filefunc, us.filestream,&uL)!=UNZ_OK)
734 err=UNZ_ERRNO;
735 us.offset_central_dir = uL;
736
737 /* zipfile comment length */
738 if (unz64local_getShort(&us.z_filefunc, us.filestream,&us.gi.size_commen t)!=UNZ_OK)
739 err=UNZ_ERRNO;
740 }
479 741
480 if ((central_pos<us.offset_central_dir+us.size_central_dir) && 742 if ((central_pos<us.offset_central_dir+us.size_central_dir) &&
481 (err==UNZ_OK)) 743 (err==UNZ_OK))
482 err=UNZ_BADZIPFILE; 744 err=UNZ_BADZIPFILE;
483 745
484 if (err!=UNZ_OK) 746 if (err!=UNZ_OK)
485 { 747 {
486 ZCLOSE(us.z_filefunc, us.filestream); 748 ZCLOSE64(us.z_filefunc, us.filestream);
487 return NULL; 749 return NULL;
488 } 750 }
489 751
490 us.byte_before_the_zipfile = central_pos - 752 us.byte_before_the_zipfile = central_pos -
491 (us.offset_central_dir+us.size_central_dir); 753 (us.offset_central_dir+us.size_central_dir);
492 us.central_pos = central_pos; 754 us.central_pos = central_pos;
493 us.pfile_in_zip_read = NULL; 755 us.pfile_in_zip_read = NULL;
494 us.encrypted = 0; 756 us.encrypted = 0;
495 757
496 758
497 s=(unz_s*)ALLOC(sizeof(unz_s)); 759 s=(unz64_s*)ALLOC(sizeof(unz64_s));
498 *s=us; 760 if( s != NULL)
499 unzGoToFirstFile((unzFile)s); 761 {
762 *s=us;
763 unzGoToFirstFile((unzFile)s);
764 }
500 return (unzFile)s; 765 return (unzFile)s;
501 } 766 }
502 767
503 768
504 extern unzFile ZEXPORT unzOpen (path) 769 extern unzFile ZEXPORT unzOpen2 (const char *path,
505 const char *path; 770 zlib_filefunc_def* pzlib_filefunc32_def)
506 { 771 {
507 return unzOpen2(path, NULL); 772 if (pzlib_filefunc32_def != NULL)
773 {
774 zlib_filefunc64_32_def zlib_filefunc64_32_def_fill;
775 fill_zlib_filefunc64_32_def_from_filefunc32(&zlib_filefunc64_32_def_fill ,pzlib_filefunc32_def);
776 return unzOpenInternal(path, &zlib_filefunc64_32_def_fill, 0);
777 }
778 else
779 return unzOpenInternal(path, NULL, 0);
780 }
781
782 extern unzFile ZEXPORT unzOpen2_64 (const void *path,
783 zlib_filefunc64_def* pzlib_filefunc_def)
784 {
785 if (pzlib_filefunc_def != NULL)
786 {
787 zlib_filefunc64_32_def zlib_filefunc64_32_def_fill;
788 zlib_filefunc64_32_def_fill.zfile_func64 = *pzlib_filefunc_def;
789 zlib_filefunc64_32_def_fill.ztell32_file = NULL;
790 zlib_filefunc64_32_def_fill.zseek32_file = NULL;
791 return unzOpenInternal(path, &zlib_filefunc64_32_def_fill, 1);
792 }
793 else
794 return unzOpenInternal(path, NULL, 1);
795 }
796
797 extern unzFile ZEXPORT unzOpen (const char *path)
798 {
799 return unzOpenInternal(path, NULL, 0);
800 }
801
802 extern unzFile ZEXPORT unzOpen64 (const void *path)
803 {
804 return unzOpenInternal(path, NULL, 1);
508 } 805 }
509 806
510 /* 807 /*
511 Close a ZipFile opened with unzipOpen. 808 Close a ZipFile opened with unzipOpen.
512 If there is files inside the .Zip opened with unzipOpenCurrentFile (see later) , 809 If there is files inside the .Zip opened with unzipOpenCurrentFile (see later) ,
513 these files MUST be closed with unzipCloseCurrentFile before call unzipClose . 810 these files MUST be closed with unzipCloseCurrentFile before call unzipClose .
514 return UNZ_OK if there is no problem. */ 811 return UNZ_OK if there is no problem. */
515 extern int ZEXPORT unzClose (file) 812 extern int ZEXPORT unzClose (unzFile file)
516 unzFile file;
517 { 813 {
518 unz_s* s; 814 unz64_s* s;
519 if (file==NULL) 815 if (file==NULL)
520 return UNZ_PARAMERROR; 816 return UNZ_PARAMERROR;
521 s=(unz_s*)file; 817 s=(unz64_s*)file;
522 818
523 if (s->pfile_in_zip_read!=NULL) 819 if (s->pfile_in_zip_read!=NULL)
524 unzCloseCurrentFile(file); 820 unzCloseCurrentFile(file);
525 821
526 ZCLOSE(s->z_filefunc, s->filestream); 822 ZCLOSE64(s->z_filefunc, s->filestream);
527 TRYFREE(s); 823 TRYFREE(s);
528 return UNZ_OK; 824 return UNZ_OK;
529 } 825 }
530 826
531 827
532 /* 828 /*
533 Write info about the ZipFile in the *pglobal_info structure. 829 Write info about the ZipFile in the *pglobal_info structure.
534 No preparation of the structure is needed 830 No preparation of the structure is needed
535 return UNZ_OK if there is no problem. */ 831 return UNZ_OK if there is no problem. */
536 extern int ZEXPORT unzGetGlobalInfo (file,pglobal_info) 832 extern int ZEXPORT unzGetGlobalInfo64 (unzFile file, unz_global_info64* pglobal_ info)
537 unzFile file;
538 unz_global_info *pglobal_info;
539 { 833 {
540 unz_s* s; 834 unz64_s* s;
541 if (file==NULL) 835 if (file==NULL)
542 return UNZ_PARAMERROR; 836 return UNZ_PARAMERROR;
543 s=(unz_s*)file; 837 s=(unz64_s*)file;
544 *pglobal_info=s->gi; 838 *pglobal_info=s->gi;
545 return UNZ_OK; 839 return UNZ_OK;
546 } 840 }
547 841
548 842 extern int ZEXPORT unzGetGlobalInfo (unzFile file, unz_global_info* pglobal_info 32)
843 {
844 unz64_s* s;
845 if (file==NULL)
846 return UNZ_PARAMERROR;
847 s=(unz64_s*)file;
848 /* to do : check if number_entry is not truncated */
849 pglobal_info32->number_entry = (uLong)s->gi.number_entry;
850 pglobal_info32->size_comment = s->gi.size_comment;
851 return UNZ_OK;
852 }
549 /* 853 /*
550 Translate date/time from Dos format to tm_unz (readable more easilty) 854 Translate date/time from Dos format to tm_unz (readable more easilty)
551 */ 855 */
552 local void unzlocal_DosDateToTmuDate (ulDosDate, ptm) 856 local void unz64local_DosDateToTmuDate (ZPOS64_T ulDosDate, tm_unz* ptm)
553 uLong ulDosDate;
554 tm_unz* ptm;
555 { 857 {
556 uLong uDate; 858 ZPOS64_T uDate;
557 uDate = (uLong)(ulDosDate>>16); 859 uDate = (ZPOS64_T)(ulDosDate>>16);
558 ptm->tm_mday = (uInt)(uDate&0x1f) ; 860 ptm->tm_mday = (uInt)(uDate&0x1f) ;
559 ptm->tm_mon = (uInt)((((uDate)&0x1E0)/0x20)-1) ; 861 ptm->tm_mon = (uInt)((((uDate)&0x1E0)/0x20)-1) ;
560 ptm->tm_year = (uInt)(((uDate&0x0FE00)/0x0200)+1980) ; 862 ptm->tm_year = (uInt)(((uDate&0x0FE00)/0x0200)+1980) ;
561 863
562 ptm->tm_hour = (uInt) ((ulDosDate &0xF800)/0x800); 864 ptm->tm_hour = (uInt) ((ulDosDate &0xF800)/0x800);
563 ptm->tm_min = (uInt) ((ulDosDate&0x7E0)/0x20) ; 865 ptm->tm_min = (uInt) ((ulDosDate&0x7E0)/0x20) ;
564 ptm->tm_sec = (uInt) (2*(ulDosDate&0x1f)) ; 866 ptm->tm_sec = (uInt) (2*(ulDosDate&0x1f)) ;
565 } 867 }
566 868
567 /* 869 /*
568 Get Info about the current file in the zipfile, with internal only info 870 Get Info about the current file in the zipfile, with internal only info
569 */ 871 */
570 local int unzlocal_GetCurrentFileInfoInternal OF((unzFile file, 872 local int unz64local_GetCurrentFileInfoInternal OF((unzFile file,
571 unz_file_info *pfile_info, 873 unz_file_info64 *pfile_info,
572 unz_file_info_internal 874 unz_file_info64_internal
573 *pfile_info_internal, 875 *pfile_info_internal,
574 char *szFileName, 876 char *szFileName,
575 uLong fileNameBufferSize, 877 uLong fileNameBufferSize,
576 void *extraField, 878 void *extraField,
577 uLong extraFieldBufferSize, 879 uLong extraFieldBufferSize,
578 char *szComment, 880 char *szComment,
579 uLong commentBufferSize)); 881 uLong commentBufferSize));
580 882
581 local int unzlocal_GetCurrentFileInfoInternal (file, 883 local int unz64local_GetCurrentFileInfoInternal (unzFile file,
582 pfile_info, 884 unz_file_info64 *pfile_info,
583 pfile_info_internal, 885 unz_file_info64_internal
584 szFileName, fileNameBufferSize, 886 *pfile_info_internal,
585 extraField, extraFieldBufferSize, 887 char *szFileName,
586 szComment, commentBufferSize) 888 uLong fileNameBufferSize,
587 unzFile file; 889 void *extraField,
588 unz_file_info *pfile_info; 890 uLong extraFieldBufferSize,
589 unz_file_info_internal *pfile_info_internal; 891 char *szComment,
590 char *szFileName; 892 uLong commentBufferSize)
591 uLong fileNameBufferSize;
592 void *extraField;
593 uLong extraFieldBufferSize;
594 char *szComment;
595 uLong commentBufferSize;
596 { 893 {
597 unz_s* s; 894 unz64_s* s;
598 unz_file_info file_info; 895 unz_file_info64 file_info;
599 unz_file_info_internal file_info_internal; 896 unz_file_info64_internal file_info_internal;
600 int err=UNZ_OK; 897 int err=UNZ_OK;
601 uLong uMagic; 898 uLong uMagic;
602 long lSeek=0; 899 long lSeek=0;
900 uLong uL;
603 901
604 if (file==NULL) 902 if (file==NULL)
605 return UNZ_PARAMERROR; 903 return UNZ_PARAMERROR;
606 s=(unz_s*)file; 904 s=(unz64_s*)file;
607 if (ZSEEK(s->z_filefunc, s->filestream, 905 if (ZSEEK64(s->z_filefunc, s->filestream,
608 s->pos_in_central_dir+s->byte_before_the_zipfile, 906 s->pos_in_central_dir+s->byte_before_the_zipfile,
609 ZLIB_FILEFUNC_SEEK_SET)!=0) 907 ZLIB_FILEFUNC_SEEK_SET)!=0)
610 err=UNZ_ERRNO; 908 err=UNZ_ERRNO;
611 909
612 910
613 /* we check the magic */ 911 /* we check the magic */
614 if (err==UNZ_OK) { 912 if (err==UNZ_OK)
615 if (unzlocal_getLong(&s->z_filefunc, s->filestream,&uMagic) != UNZ_OK) 913 {
914 if (unz64local_getLong(&s->z_filefunc, s->filestream,&uMagic) != UNZ_OK)
616 err=UNZ_ERRNO; 915 err=UNZ_ERRNO;
617 else if (uMagic!=0x02014b50) 916 else if (uMagic!=0x02014b50)
618 err=UNZ_BADZIPFILE; 917 err=UNZ_BADZIPFILE;
619 } 918 }
620 919
621 if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.version) != U NZ_OK) 920 if (unz64local_getShort(&s->z_filefunc, s->filestream,&file_info.version) != UNZ_OK)
622 err=UNZ_ERRNO; 921 err=UNZ_ERRNO;
623 922
624 if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.version_neede d) != UNZ_OK) 923 if (unz64local_getShort(&s->z_filefunc, s->filestream,&file_info.version_nee ded) != UNZ_OK)
625 err=UNZ_ERRNO; 924 err=UNZ_ERRNO;
626 925
627 if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.flag) != UNZ_ OK) 926 if (unz64local_getShort(&s->z_filefunc, s->filestream,&file_info.flag) != UN Z_OK)
628 err=UNZ_ERRNO; 927 err=UNZ_ERRNO;
629 928
630 if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.compression_m ethod) != UNZ_OK) 929 if (unz64local_getShort(&s->z_filefunc, s->filestream,&file_info.compression _method) != UNZ_OK)
631 err=UNZ_ERRNO; 930 err=UNZ_ERRNO;
632 931
633 if (unzlocal_getLong(&s->z_filefunc, s->filestream,&file_info.dosDate) != UN Z_OK) 932 if (unz64local_getLong(&s->z_filefunc, s->filestream,&file_info.dosDate) != UNZ_OK)
634 err=UNZ_ERRNO; 933 err=UNZ_ERRNO;
635 934
636 unzlocal_DosDateToTmuDate(file_info.dosDate,&file_info.tmu_date); 935 unz64local_DosDateToTmuDate(file_info.dosDate,&file_info.tmu_date);
637 936
638 if (unzlocal_getLong(&s->z_filefunc, s->filestream,&file_info.crc) != UNZ_OK ) 937 if (unz64local_getLong(&s->z_filefunc, s->filestream,&file_info.crc) != UNZ_ OK)
639 err=UNZ_ERRNO; 938 err=UNZ_ERRNO;
640 939
641 if (unzlocal_getLong(&s->z_filefunc, s->filestream,&file_info.compressed_siz e) != UNZ_OK) 940 if (unz64local_getLong(&s->z_filefunc, s->filestream,&uL) != UNZ_OK)
941 err=UNZ_ERRNO;
942 file_info.compressed_size = uL;
943
944 if (unz64local_getLong(&s->z_filefunc, s->filestream,&uL) != UNZ_OK)
945 err=UNZ_ERRNO;
946 file_info.uncompressed_size = uL;
947
948 if (unz64local_getShort(&s->z_filefunc, s->filestream,&file_info.size_filena me) != UNZ_OK)
642 err=UNZ_ERRNO; 949 err=UNZ_ERRNO;
643 950
644 if (unzlocal_getLong(&s->z_filefunc, s->filestream,&file_info.uncompressed_s ize) != UNZ_OK) 951 if (unz64local_getShort(&s->z_filefunc, s->filestream,&file_info.size_file_e xtra) != UNZ_OK)
645 err=UNZ_ERRNO; 952 err=UNZ_ERRNO;
646 953
647 if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.size_filename ) != UNZ_OK) 954 if (unz64local_getShort(&s->z_filefunc, s->filestream,&file_info.size_file_c omment) != UNZ_OK)
648 err=UNZ_ERRNO; 955 err=UNZ_ERRNO;
649 956
650 if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.size_file_ext ra) != UNZ_OK) 957 if (unz64local_getShort(&s->z_filefunc, s->filestream,&file_info.disk_num_st art) != UNZ_OK)
651 err=UNZ_ERRNO; 958 err=UNZ_ERRNO;
652 959
653 if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.size_file_com ment) != UNZ_OK) 960 if (unz64local_getShort(&s->z_filefunc, s->filestream,&file_info.internal_fa ) != UNZ_OK)
654 err=UNZ_ERRNO; 961 err=UNZ_ERRNO;
655 962
656 if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.disk_num_star t) != UNZ_OK) 963 if (unz64local_getLong(&s->z_filefunc, s->filestream,&file_info.external_fa) != UNZ_OK)
657 err=UNZ_ERRNO; 964 err=UNZ_ERRNO;
658 965
659 if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.internal_fa) != UNZ_OK) 966 // relative offset of local header
967 if (unz64local_getLong(&s->z_filefunc, s->filestream,&uL) != UNZ_OK)
660 err=UNZ_ERRNO; 968 err=UNZ_ERRNO;
661 969 file_info_internal.offset_curfile = uL;
662 if (unzlocal_getLong(&s->z_filefunc, s->filestream,&file_info.external_fa) ! = UNZ_OK)
663 err=UNZ_ERRNO;
664
665 if (unzlocal_getLong(&s->z_filefunc, s->filestream,&file_info_internal.offse t_curfile) != UNZ_OK)
666 err=UNZ_ERRNO;
667 970
668 lSeek+=file_info.size_filename; 971 lSeek+=file_info.size_filename;
669 if ((err==UNZ_OK) && (szFileName!=NULL)) 972 if ((err==UNZ_OK) && (szFileName!=NULL))
670 { 973 {
671 uLong uSizeRead ; 974 uLong uSizeRead ;
672 if (file_info.size_filename<fileNameBufferSize) 975 if (file_info.size_filename<fileNameBufferSize)
673 { 976 {
674 *(szFileName+file_info.size_filename)='\0'; 977 *(szFileName+file_info.size_filename)='\0';
675 uSizeRead = file_info.size_filename; 978 uSizeRead = file_info.size_filename;
676 } 979 }
677 else 980 else
678 uSizeRead = fileNameBufferSize; 981 uSizeRead = fileNameBufferSize;
679 982
680 if ((file_info.size_filename>0) && (fileNameBufferSize>0)) 983 if ((file_info.size_filename>0) && (fileNameBufferSize>0))
681 if (ZREAD(s->z_filefunc, s->filestream,szFileName,uSizeRead)!=uSizeR ead) 984 if (ZREAD64(s->z_filefunc, s->filestream,szFileName,uSizeRead)!=uSiz eRead)
682 err=UNZ_ERRNO; 985 err=UNZ_ERRNO;
683 lSeek -= uSizeRead; 986 lSeek -= uSizeRead;
684 } 987 }
685 988
686 989 // Read extrafield
687 if ((err==UNZ_OK) && (extraField!=NULL)) 990 if ((err==UNZ_OK) && (extraField!=NULL))
688 { 991 {
689 uLong uSizeRead ; 992 ZPOS64_T uSizeRead ;
690 if (file_info.size_file_extra<extraFieldBufferSize) 993 if (file_info.size_file_extra<extraFieldBufferSize)
691 uSizeRead = file_info.size_file_extra; 994 uSizeRead = file_info.size_file_extra;
692 else 995 else
693 uSizeRead = extraFieldBufferSize; 996 uSizeRead = extraFieldBufferSize;
694 997
695 if (lSeek!=0) { 998 if (lSeek!=0)
696 if (ZSEEK(s->z_filefunc, s->filestream,lSeek,ZLIB_FILEFUNC_SEEK_CUR) ==0) 999 {
1000 if (ZSEEK64(s->z_filefunc, s->filestream,lSeek,ZLIB_FILEFUNC_SEEK_CU R)==0)
697 lSeek=0; 1001 lSeek=0;
698 else 1002 else
699 err=UNZ_ERRNO; 1003 err=UNZ_ERRNO;
700 } 1004 }
1005
701 if ((file_info.size_file_extra>0) && (extraFieldBufferSize>0)) 1006 if ((file_info.size_file_extra>0) && (extraFieldBufferSize>0))
702 if (ZREAD(s->z_filefunc, s->filestream,extraField,uSizeRead)!=uSizeR ead) 1007 if (ZREAD64(s->z_filefunc, s->filestream,extraField,(uLong)uSizeRead )!=uSizeRead)
703 err=UNZ_ERRNO; 1008 err=UNZ_ERRNO;
704 lSeek += file_info.size_file_extra - uSizeRead; 1009
1010 lSeek += file_info.size_file_extra - (uLong)uSizeRead;
705 } 1011 }
706 else 1012 else
707 lSeek+=file_info.size_file_extra; 1013 lSeek += file_info.size_file_extra;
708 1014
709 1015
1016 if ((err==UNZ_OK) && (file_info.size_file_extra != 0))
1017 {
1018 uLong acc = 0;
1019
1020 // since lSeek now points to after the extra field we need to move back
1021 lSeek -= file_info.size_file_extra;
1022
1023 if (lSeek!=0)
1024 {
1025 if (ZSEEK64(s->z_filefunc, s->filestream,lSeek,ZLIB_FILEFUNC_SEEK_CU R)==0)
1026 lSeek=0;
1027 else
1028 err=UNZ_ERRNO;
1029 }
1030
1031 while(acc < file_info.size_file_extra)
1032 {
1033 uLong headerId;
1034 uLong dataSize;
1035
1036 if (unz64local_getShort(&s->z_filefunc, s->filestream,&headerId) != UNZ_OK)
1037 err=UNZ_ERRNO;
1038
1039 if (unz64local_getShort(&s->z_filefunc, s->filestream,&dataSize) != UNZ_OK)
1040 err=UNZ_ERRNO;
1041
1042 /* ZIP64 extra fields */
1043 if (headerId == 0x0001)
1044 {
1045 uLong uL;
1046
1047 if(file_info.unc ompressed_size == (ZPOS64_T)(unsigned long)-1)
1048 {
1049 if (unz6 4local_getLong64(&s->z_filefunc, s->filestream,&file_info.uncompressed_size) != UNZ_OK)
1050 err=UNZ_ERRNO;
1051 }
1052
1053 if(file_info.com pressed_size == (ZPOS64_T)(unsigned long)-1)
1054 {
1055 if (unz6 4local_getLong64(&s->z_filefunc, s->filestream,&file_info.compressed_size) != UN Z_OK)
1056 err=UNZ_ERRNO;
1057 }
1058
1059 if(file_info_int ernal.offset_curfile == (ZPOS64_T)(unsigned long)-1)
1060 {
1061 /* Relat ive Header offset */
1062 if (unz6 4local_getLong64(&s->z_filefunc, s->filestream,&file_info_internal.offset_curfil e) != UNZ_OK)
1063 err=UNZ_ERRNO;
1064 }
1065
1066 if(file_info.dis k_num_start == (unsigned long)-1)
1067 {
1068 /* Disk Start Number */
1069 if (unz6 4local_getLong(&s->z_filefunc, s->filestream,&uL) != UNZ_OK)
1070 err=UNZ_ERRNO;
1071 }
1072
1073 }
1074 else
1075 {
1076 if (ZSEEK64(s->z_filefunc, s->filestream,dataSize,ZLIB_FILEFUNC_ SEEK_CUR)!=0)
1077 err=UNZ_ERRNO;
1078 }
1079
1080 acc += 2 + 2 + dataSize;
1081 }
1082 }
1083
710 if ((err==UNZ_OK) && (szComment!=NULL)) 1084 if ((err==UNZ_OK) && (szComment!=NULL))
711 { 1085 {
712 uLong uSizeRead ; 1086 uLong uSizeRead ;
713 if (file_info.size_file_comment<commentBufferSize) 1087 if (file_info.size_file_comment<commentBufferSize)
714 { 1088 {
715 *(szComment+file_info.size_file_comment)='\0'; 1089 *(szComment+file_info.size_file_comment)='\0';
716 uSizeRead = file_info.size_file_comment; 1090 uSizeRead = file_info.size_file_comment;
717 } 1091 }
718 else 1092 else
719 uSizeRead = commentBufferSize; 1093 uSizeRead = commentBufferSize;
720 1094
721 if (lSeek!=0) { 1095 if (lSeek!=0)
722 if (ZSEEK(s->z_filefunc, s->filestream,lSeek,ZLIB_FILEFUNC_SEEK_CUR) ==0) 1096 {
1097 if (ZSEEK64(s->z_filefunc, s->filestream,lSeek,ZLIB_FILEFUNC_SEEK_CU R)==0)
723 lSeek=0; 1098 lSeek=0;
724 else 1099 else
725 err=UNZ_ERRNO; 1100 err=UNZ_ERRNO;
726 } 1101 }
1102
727 if ((file_info.size_file_comment>0) && (commentBufferSize>0)) 1103 if ((file_info.size_file_comment>0) && (commentBufferSize>0))
728 if (ZREAD(s->z_filefunc, s->filestream,szComment,uSizeRead)!=uSizeRe ad) 1104 if (ZREAD64(s->z_filefunc, s->filestream,szComment,uSizeRead)!=uSize Read)
729 err=UNZ_ERRNO; 1105 err=UNZ_ERRNO;
730 lSeek+=file_info.size_file_comment - uSizeRead; 1106 lSeek+=file_info.size_file_comment - uSizeRead;
731 } 1107 }
732 else 1108 else
733 lSeek+=file_info.size_file_comment; 1109 lSeek+=file_info.size_file_comment;
734 1110
1111
735 if ((err==UNZ_OK) && (pfile_info!=NULL)) 1112 if ((err==UNZ_OK) && (pfile_info!=NULL))
736 *pfile_info=file_info; 1113 *pfile_info=file_info;
737 1114
738 if ((err==UNZ_OK) && (pfile_info_internal!=NULL)) 1115 if ((err==UNZ_OK) && (pfile_info_internal!=NULL))
739 *pfile_info_internal=file_info_internal; 1116 *pfile_info_internal=file_info_internal;
740 1117
741 return err; 1118 return err;
742 } 1119 }
743 1120
744 1121
745 1122
746 /* 1123 /*
747 Write info about the ZipFile in the *pglobal_info structure. 1124 Write info about the ZipFile in the *pglobal_info structure.
748 No preparation of the structure is needed 1125 No preparation of the structure is needed
749 return UNZ_OK if there is no problem. 1126 return UNZ_OK if there is no problem.
750 */ 1127 */
751 extern int ZEXPORT unzGetCurrentFileInfo (file, 1128 extern int ZEXPORT unzGetCurrentFileInfo64 (unzFile file,
752 pfile_info, 1129 unz_file_info64 * pfile_info,
753 szFileName, fileNameBufferSize, 1130 char * szFileName, uLong fileNameBuffe rSize,
754 extraField, extraFieldBufferSize, 1131 void *extraField, uLong extraFieldBuff erSize,
755 szComment, commentBufferSize) 1132 char* szComment, uLong commentBufferS ize)
756 unzFile file;
757 unz_file_info *pfile_info;
758 char *szFileName;
759 uLong fileNameBufferSize;
760 void *extraField;
761 uLong extraFieldBufferSize;
762 char *szComment;
763 uLong commentBufferSize;
764 { 1133 {
765 return unzlocal_GetCurrentFileInfoInternal(file,pfile_info,NULL, 1134 return unz64local_GetCurrentFileInfoInternal(file,pfile_info,NULL,
766 szFileName,fileNameBufferSize, 1135 szFileName,fileNameBufferSize,
767 extraField,extraFieldBufferSize, 1136 extraField,extraFieldBufferSize,
768 szComment,commentBufferSize); 1137 szComment,commentBufferSize);
769 } 1138 }
770 1139
1140 extern int ZEXPORT unzGetCurrentFileInfo (unzFile file,
1141 unz_file_info * pfile_info,
1142 char * szFileName, uLong fileNameBuffe rSize,
1143 void *extraField, uLong extraFieldBuff erSize,
1144 char* szComment, uLong commentBufferS ize)
1145 {
1146 int err;
1147 unz_file_info64 file_info64;
1148 err = unz64local_GetCurrentFileInfoInternal(file,&file_info64,NULL,
1149 szFileName,fileNameBufferSize,
1150 extraField,extraFieldBufferSize,
1151 szComment,commentBufferSize);
1152 if (err==UNZ_OK)
1153 {
1154 pfile_info->version = file_info64.version;
1155 pfile_info->version_needed = file_info64.version_needed;
1156 pfile_info->flag = file_info64.flag;
1157 pfile_info->compression_method = file_info64.compression_method;
1158 pfile_info->dosDate = file_info64.dosDate;
1159 pfile_info->crc = file_info64.crc;
1160
1161 pfile_info->size_filename = file_info64.size_filename;
1162 pfile_info->size_file_extra = file_info64.size_file_extra;
1163 pfile_info->size_file_comment = file_info64.size_file_comment;
1164
1165 pfile_info->disk_num_start = file_info64.disk_num_start;
1166 pfile_info->internal_fa = file_info64.internal_fa;
1167 pfile_info->external_fa = file_info64.external_fa;
1168
1169 pfile_info->tmu_date = file_info64.tmu_date,
1170
1171
1172 pfile_info->compressed_size = (uLong)file_info64.compressed_size;
1173 pfile_info->uncompressed_size = (uLong)file_info64.uncompressed_size;
1174
1175 }
1176 return err;
1177 }
771 /* 1178 /*
772 Set the current file of the zipfile to the first file. 1179 Set the current file of the zipfile to the first file.
773 return UNZ_OK if there is no problem 1180 return UNZ_OK if there is no problem
774 */ 1181 */
775 extern int ZEXPORT unzGoToFirstFile (file) 1182 extern int ZEXPORT unzGoToFirstFile (unzFile file)
776 unzFile file;
777 { 1183 {
778 int err=UNZ_OK; 1184 int err=UNZ_OK;
779 unz_s* s; 1185 unz64_s* s;
780 if (file==NULL) 1186 if (file==NULL)
781 return UNZ_PARAMERROR; 1187 return UNZ_PARAMERROR;
782 s=(unz_s*)file; 1188 s=(unz64_s*)file;
783 s->pos_in_central_dir=s->offset_central_dir; 1189 s->pos_in_central_dir=s->offset_central_dir;
784 s->num_file=0; 1190 s->num_file=0;
785 err=unzlocal_GetCurrentFileInfoInternal(file,&s->cur_file_info, 1191 err=unz64local_GetCurrentFileInfoInternal(file,&s->cur_file_info,
786 &s->cur_file_info_internal, 1192 &s->cur_file_info_internal,
787 NULL,0,NULL,0,NULL,0); 1193 NULL,0,NULL,0,NULL,0);
788 s->current_file_ok = (err == UNZ_OK); 1194 s->current_file_ok = (err == UNZ_OK);
789 return err; 1195 return err;
790 } 1196 }
791 1197
792 /* 1198 /*
793 Set the current file of the zipfile to the next file. 1199 Set the current file of the zipfile to the next file.
794 return UNZ_OK if there is no problem 1200 return UNZ_OK if there is no problem
795 return UNZ_END_OF_LIST_OF_FILE if the actual file was the latest. 1201 return UNZ_END_OF_LIST_OF_FILE if the actual file was the latest.
796 */ 1202 */
797 extern int ZEXPORT unzGoToNextFile (file) 1203 extern int ZEXPORT unzGoToNextFile (unzFile file)
798 unzFile file;
799 { 1204 {
800 unz_s* s; 1205 unz64_s* s;
801 int err; 1206 int err;
802 1207
803 if (file==NULL) 1208 if (file==NULL)
804 return UNZ_PARAMERROR; 1209 return UNZ_PARAMERROR;
805 s=(unz_s*)file; 1210 s=(unz64_s*)file;
806 if (!s->current_file_ok) 1211 if (!s->current_file_ok)
807 return UNZ_END_OF_LIST_OF_FILE; 1212 return UNZ_END_OF_LIST_OF_FILE;
808 if (s->gi.number_entry != 0xffff) /* 2^16 files overflow hack */ 1213 if (s->gi.number_entry != 0xffff) /* 2^16 files overflow hack */
809 if (s->num_file+1==s->gi.number_entry) 1214 if (s->num_file+1==s->gi.number_entry)
810 return UNZ_END_OF_LIST_OF_FILE; 1215 return UNZ_END_OF_LIST_OF_FILE;
811 1216
812 s->pos_in_central_dir += SIZECENTRALDIRITEM + s->cur_file_info.size_filename + 1217 s->pos_in_central_dir += SIZECENTRALDIRITEM + s->cur_file_info.size_filename +
813 s->cur_file_info.size_file_extra + s->cur_file_info.size_file_commen t ; 1218 s->cur_file_info.size_file_extra + s->cur_file_info.size_file_commen t ;
814 s->num_file++; 1219 s->num_file++;
815 err = unzlocal_GetCurrentFileInfoInternal(file,&s->cur_file_info, 1220 err = unz64local_GetCurrentFileInfoInternal(file,&s->cur_file_info,
816 &s->cur_file_info_internal, 1221 &s->cur_file_info_internal,
817 NULL,0,NULL,0,NULL,0); 1222 NULL,0,NULL,0,NULL,0);
818 s->current_file_ok = (err == UNZ_OK); 1223 s->current_file_ok = (err == UNZ_OK);
819 return err; 1224 return err;
820 } 1225 }
821 1226
822 1227
823 /* 1228 /*
824 Try locate the file szFileName in the zipfile. 1229 Try locate the file szFileName in the zipfile.
825 For the iCaseSensitivity signification, see unzipStringFileNameCompare 1230 For the iCaseSensitivity signification, see unzipStringFileNameCompare
826 1231
827 return value : 1232 return value :
828 UNZ_OK if the file is found. It becomes the current file. 1233 UNZ_OK if the file is found. It becomes the current file.
829 UNZ_END_OF_LIST_OF_FILE if the file is not found 1234 UNZ_END_OF_LIST_OF_FILE if the file is not found
830 */ 1235 */
831 extern int ZEXPORT unzLocateFile (file, szFileName, iCaseSensitivity) 1236 extern int ZEXPORT unzLocateFile (unzFile file, const char *szFileName, int iCas eSensitivity)
832 unzFile file;
833 const char *szFileName;
834 int iCaseSensitivity;
835 { 1237 {
836 unz_s* s; 1238 unz64_s* s;
837 int err; 1239 int err;
838 1240
839 /* We remember the 'current' position in the file so that we can jump 1241 /* We remember the 'current' position in the file so that we can jump
840 * back there if we fail. 1242 * back there if we fail.
841 */ 1243 */
842 unz_file_info cur_file_infoSaved; 1244 unz_file_info64 cur_file_infoSaved;
843 unz_file_info_internal cur_file_info_internalSaved; 1245 unz_file_info64_internal cur_file_info_internalSaved;
844 uLong num_fileSaved; 1246 ZPOS64_T num_fileSaved;
845 uLong pos_in_central_dirSaved; 1247 ZPOS64_T pos_in_central_dirSaved;
846 1248
847 1249
848 if (file==NULL) 1250 if (file==NULL)
849 return UNZ_PARAMERROR; 1251 return UNZ_PARAMERROR;
850 1252
851 if (strlen(szFileName)>=UNZ_MAXFILENAMEINZIP) 1253 if (strlen(szFileName)>=UNZ_MAXFILENAMEINZIP)
852 return UNZ_PARAMERROR; 1254 return UNZ_PARAMERROR;
853 1255
854 s=(unz_s*)file; 1256 s=(unz64_s*)file;
855 if (!s->current_file_ok) 1257 if (!s->current_file_ok)
856 return UNZ_END_OF_LIST_OF_FILE; 1258 return UNZ_END_OF_LIST_OF_FILE;
857 1259
858 /* Save the current state */ 1260 /* Save the current state */
859 num_fileSaved = s->num_file; 1261 num_fileSaved = s->num_file;
860 pos_in_central_dirSaved = s->pos_in_central_dir; 1262 pos_in_central_dirSaved = s->pos_in_central_dir;
861 cur_file_infoSaved = s->cur_file_info; 1263 cur_file_infoSaved = s->cur_file_info;
862 cur_file_info_internalSaved = s->cur_file_info_internal; 1264 cur_file_info_internalSaved = s->cur_file_info_internal;
863 1265
864 err = unzGoToFirstFile(file); 1266 err = unzGoToFirstFile(file);
865 1267
866 while (err == UNZ_OK) 1268 while (err == UNZ_OK)
867 { 1269 {
868 char szCurrentFileName[UNZ_MAXFILENAMEINZIP+1]; 1270 char szCurrentFileName[UNZ_MAXFILENAMEINZIP+1];
869 err = unzGetCurrentFileInfo(file,NULL, 1271 err = unzGetCurrentFileInfo64(file,NULL,
870 szCurrentFileName,sizeof(szCurrentFileName)- 1, 1272 szCurrentFileName,sizeof(szCurrentFileName)- 1,
871 NULL,0,NULL,0); 1273 NULL,0,NULL,0);
872 if (err == UNZ_OK) 1274 if (err == UNZ_OK)
873 { 1275 {
874 if (unzStringFileNameCompare(szCurrentFileName, 1276 if (unzStringFileNameCompare(szCurrentFileName,
875 szFileName,iCaseSensitivity)==0) 1277 szFileName,iCaseSensitivity)==0)
876 return UNZ_OK; 1278 return UNZ_OK;
877 err = unzGoToNextFile(file); 1279 err = unzGoToNextFile(file);
878 } 1280 }
879 } 1281 }
(...skipping 15 matching lines...) Expand all
895 // I need random access 1297 // I need random access
896 // 1298 //
897 // Further optimization could be realized by adding an ability 1299 // Further optimization could be realized by adding an ability
898 // to cache the directory in memory. The goal being a single 1300 // to cache the directory in memory. The goal being a single
899 // comprehensive file read to put the file I need in a memory. 1301 // comprehensive file read to put the file I need in a memory.
900 */ 1302 */
901 1303
902 /* 1304 /*
903 typedef struct unz_file_pos_s 1305 typedef struct unz_file_pos_s
904 { 1306 {
905 uLong pos_in_zip_directory; // offset in file 1307 ZPOS64_T pos_in_zip_directory; // offset in file
906 uLong num_of_file; // # of file 1308 ZPOS64_T num_of_file; // # of file
907 } unz_file_pos; 1309 } unz_file_pos;
908 */ 1310 */
909 1311
910 extern int ZEXPORT unzGetFilePos(file, file_pos) 1312 extern int ZEXPORT unzGetFilePos64(unzFile file, unz64_file_pos* file_pos)
911 unzFile file;
912 unz_file_pos* file_pos;
913 { 1313 {
914 unz_s* s; 1314 unz64_s* s;
915 1315
916 if (file==NULL || file_pos==NULL) 1316 if (file==NULL || file_pos==NULL)
917 return UNZ_PARAMERROR; 1317 return UNZ_PARAMERROR;
918 s=(unz_s*)file; 1318 s=(unz64_s*)file;
919 if (!s->current_file_ok) 1319 if (!s->current_file_ok)
920 return UNZ_END_OF_LIST_OF_FILE; 1320 return UNZ_END_OF_LIST_OF_FILE;
921 1321
922 file_pos->pos_in_zip_directory = s->pos_in_central_dir; 1322 file_pos->pos_in_zip_directory = s->pos_in_central_dir;
923 file_pos->num_of_file = s->num_file; 1323 file_pos->num_of_file = s->num_file;
924 1324
925 return UNZ_OK; 1325 return UNZ_OK;
926 } 1326 }
927 1327
928 extern int ZEXPORT unzGoToFilePos(file, file_pos) 1328 extern int ZEXPORT unzGetFilePos(
929 unzFile file; 1329 unzFile file,
930 unz_file_pos* file_pos; 1330 unz_file_pos* file_pos)
931 { 1331 {
932 unz_s* s; 1332 unz64_file_pos file_pos64;
1333 int err = unzGetFilePos64(file,&file_pos64);
1334 if (err==UNZ_OK)
1335 {
1336 file_pos->pos_in_zip_directory = (uLong)file_pos64.pos_in_zip_directory;
1337 file_pos->num_of_file = (uLong)file_pos64.num_of_file;
1338 }
1339 return err;
1340 }
1341
1342 extern int ZEXPORT unzGoToFilePos64(unzFile file, const unz64_file_pos* file_pos )
1343 {
1344 unz64_s* s;
933 int err; 1345 int err;
934 1346
935 if (file==NULL || file_pos==NULL) 1347 if (file==NULL || file_pos==NULL)
936 return UNZ_PARAMERROR; 1348 return UNZ_PARAMERROR;
937 s=(unz_s*)file; 1349 s=(unz64_s*)file;
938 1350
939 /* jump to the right spot */ 1351 /* jump to the right spot */
940 s->pos_in_central_dir = file_pos->pos_in_zip_directory; 1352 s->pos_in_central_dir = file_pos->pos_in_zip_directory;
941 s->num_file = file_pos->num_of_file; 1353 s->num_file = file_pos->num_of_file;
942 1354
943 /* set the current file */ 1355 /* set the current file */
944 err = unzlocal_GetCurrentFileInfoInternal(file,&s->cur_file_info, 1356 err = unz64local_GetCurrentFileInfoInternal(file,&s->cur_file_info,
945 &s->cur_file_info_internal, 1357 &s->cur_file_info_internal,
946 NULL,0,NULL,0,NULL,0); 1358 NULL,0,NULL,0,NULL,0);
947 /* return results */ 1359 /* return results */
948 s->current_file_ok = (err == UNZ_OK); 1360 s->current_file_ok = (err == UNZ_OK);
949 return err; 1361 return err;
950 } 1362 }
951 1363
1364 extern int ZEXPORT unzGoToFilePos(
1365 unzFile file,
1366 unz_file_pos* file_pos)
1367 {
1368 unz64_file_pos file_pos64;
1369 if (file_pos == NULL)
1370 return UNZ_PARAMERROR;
1371
1372 file_pos64.pos_in_zip_directory = file_pos->pos_in_zip_directory;
1373 file_pos64.num_of_file = file_pos->num_of_file;
1374 return unzGoToFilePos64(file,&file_pos64);
1375 }
1376
952 /* 1377 /*
953 // Unzip Helper Functions - should be here? 1378 // Unzip Helper Functions - should be here?
954 /////////////////////////////////////////// 1379 ///////////////////////////////////////////
955 */ 1380 */
956 1381
957 /* 1382 /*
958 Read the local header of the current zipfile 1383 Read the local header of the current zipfile
959 Check the coherency of the local header and info in the end of central 1384 Check the coherency of the local header and info in the end of central
960 directory about this file 1385 directory about this file
961 store in *piSizeVar the size of extra info in local header 1386 store in *piSizeVar the size of extra info in local header
962 (filename and size of extra field data) 1387 (filename and size of extra field data)
963 */ 1388 */
964 local int unzlocal_CheckCurrentFileCoherencyHeader (s,piSizeVar, 1389 local int unz64local_CheckCurrentFileCoherencyHeader (unz64_s* s, uInt* piSizeVa r,
965 poffset_local_extrafield, 1390 ZPOS64_T * poffset_local_ext rafield,
966 psize_local_extrafield) 1391 uInt * psize_local_extrafie ld)
967 unz_s* s;
968 uInt* piSizeVar;
969 uLong *poffset_local_extrafield;
970 uInt *psize_local_extrafield;
971 { 1392 {
972 uLong uMagic,uData,uFlags; 1393 uLong uMagic,uData,uFlags;
973 uLong size_filename; 1394 uLong size_filename;
974 uLong size_extra_field; 1395 uLong size_extra_field;
975 int err=UNZ_OK; 1396 int err=UNZ_OK;
976 1397
977 *piSizeVar = 0; 1398 *piSizeVar = 0;
978 *poffset_local_extrafield = 0; 1399 *poffset_local_extrafield = 0;
979 *psize_local_extrafield = 0; 1400 *psize_local_extrafield = 0;
980 1401
981 if (ZSEEK(s->z_filefunc, s->filestream,s->cur_file_info_internal.offset_curf ile + 1402 if (ZSEEK64(s->z_filefunc, s->filestream,s->cur_file_info_internal.offset_cu rfile +
982 s->byte_before_the_zipfile,ZLIB_FILEFUNC_SEEK_SE T)!=0) 1403 s->byte_before_the_zipfile,ZLIB_FILEFUNC_SEEK_SE T)!=0)
983 return UNZ_ERRNO; 1404 return UNZ_ERRNO;
984 1405
985 1406
986 if (err==UNZ_OK) { 1407 if (err==UNZ_OK)
987 if (unzlocal_getLong(&s->z_filefunc, s->filestream,&uMagic) != UNZ_OK) 1408 {
1409 if (unz64local_getLong(&s->z_filefunc, s->filestream,&uMagic) != UNZ_OK)
988 err=UNZ_ERRNO; 1410 err=UNZ_ERRNO;
989 else if (uMagic!=0x04034b50) 1411 else if (uMagic!=0x04034b50)
990 err=UNZ_BADZIPFILE; 1412 err=UNZ_BADZIPFILE;
991 } 1413 }
992 1414
993 if (unzlocal_getShort(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) 1415 if (unz64local_getShort(&s->z_filefunc, s->filestream,&uData) != UNZ_OK)
994 err=UNZ_ERRNO; 1416 err=UNZ_ERRNO;
995 /* 1417 /*
996 else if ((err==UNZ_OK) && (uData!=s->cur_file_info.wVersion)) 1418 else if ((err==UNZ_OK) && (uData!=s->cur_file_info.wVersion))
997 err=UNZ_BADZIPFILE; 1419 err=UNZ_BADZIPFILE;
998 */ 1420 */
999 if (unzlocal_getShort(&s->z_filefunc, s->filestream,&uFlags) != UNZ_OK) 1421 if (unz64local_getShort(&s->z_filefunc, s->filestream,&uFlags) != UNZ_OK)
1000 err=UNZ_ERRNO; 1422 err=UNZ_ERRNO;
1001 1423
1002 if (unzlocal_getShort(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) 1424 if (unz64local_getShort(&s->z_filefunc, s->filestream,&uData) != UNZ_OK)
1003 err=UNZ_ERRNO; 1425 err=UNZ_ERRNO;
1004 else if ((err==UNZ_OK) && (uData!=s->cur_file_info.compression_method)) 1426 else if ((err==UNZ_OK) && (uData!=s->cur_file_info.compression_method))
1005 err=UNZ_BADZIPFILE; 1427 err=UNZ_BADZIPFILE;
1006 1428
1007 if ((err==UNZ_OK) && (s->cur_file_info.compression_method!=0) && 1429 if ((err==UNZ_OK) && (s->cur_file_info.compression_method!=0) &&
1430 /* #ifdef HAVE_BZIP2 */
1431 (s->cur_file_info.compression_method!=Z_BZIP2ED) &&
1432 /* #endif */
1008 (s->cur_file_info.compression_method!=Z_DEFLATED)) 1433 (s->cur_file_info.compression_method!=Z_DEFLATED))
1009 err=UNZ_BADZIPFILE; 1434 err=UNZ_BADZIPFILE;
1010 1435
1011 if (unzlocal_getLong(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) /* dat e/time */ 1436 if (unz64local_getLong(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) /* d ate/time */
1012 err=UNZ_ERRNO; 1437 err=UNZ_ERRNO;
1013 1438
1014 if (unzlocal_getLong(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) /* crc */ 1439 if (unz64local_getLong(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) /* c rc */
1015 err=UNZ_ERRNO; 1440 err=UNZ_ERRNO;
1016 else if ((err==UNZ_OK) && (uData!=s->cur_file_info.crc) && 1441 else if ((err==UNZ_OK) && (uData!=s->cur_file_info.crc) && ((uFlags & 8)==0) )
1017 ((uFlags & 8)==0))
1018 err=UNZ_BADZIPFILE; 1442 err=UNZ_BADZIPFILE;
1019 1443
1020 if (unzlocal_getLong(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) /* siz e compr */ 1444 if (unz64local_getLong(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) /* s ize compr */
1021 err=UNZ_ERRNO; 1445 err=UNZ_ERRNO;
1022 else if ((err==UNZ_OK) && (uData!=s->cur_file_info.compressed_size) && 1446 else if (uData != 0xFFFFFFFF && (err==UNZ_OK) && (uData!=s->cur_file_info.co mpressed_size) && ((uFlags & 8)==0))
1023 ((uFlags & 8)==0))
1024 err=UNZ_BADZIPFILE; 1447 err=UNZ_BADZIPFILE;
1025 1448
1026 if (unzlocal_getLong(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) /* siz e uncompr */ 1449 if (unz64local_getLong(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) /* s ize uncompr */
1027 err=UNZ_ERRNO; 1450 err=UNZ_ERRNO;
1028 else if ((err==UNZ_OK) && (uData!=s->cur_file_info.uncompressed_size) && 1451 else if (uData != 0xFFFFFFFF && (err==UNZ_OK) && (uData!=s->cur_file_info.un compressed_size) && ((uFlags & 8)==0))
1029 ((uFlags & 8)==0))
1030 err=UNZ_BADZIPFILE; 1452 err=UNZ_BADZIPFILE;
1031 1453
1032 1454 if (unz64local_getShort(&s->z_filefunc, s->filestream,&size_filename) != UNZ _OK)
1033 if (unzlocal_getShort(&s->z_filefunc, s->filestream,&size_filename) != UNZ_O K)
1034 err=UNZ_ERRNO; 1455 err=UNZ_ERRNO;
1035 else if ((err==UNZ_OK) && (size_filename!=s->cur_file_info.size_filename)) 1456 else if ((err==UNZ_OK) && (size_filename!=s->cur_file_info.size_filename))
1036 err=UNZ_BADZIPFILE; 1457 err=UNZ_BADZIPFILE;
1037 1458
1038 *piSizeVar += (uInt)size_filename; 1459 *piSizeVar += (uInt)size_filename;
1039 1460
1040 if (unzlocal_getShort(&s->z_filefunc, s->filestream,&size_extra_field) != UN Z_OK) 1461 if (unz64local_getShort(&s->z_filefunc, s->filestream,&size_extra_field) != UNZ_OK)
1041 err=UNZ_ERRNO; 1462 err=UNZ_ERRNO;
1042 *poffset_local_extrafield= s->cur_file_info_internal.offset_curfile + 1463 *poffset_local_extrafield= s->cur_file_info_internal.offset_curfile +
1043 SIZEZIPLOCALHEADER + size_filename; 1464 SIZEZIPLOCALHEADER + size_filename;
1044 *psize_local_extrafield = (uInt)size_extra_field; 1465 *psize_local_extrafield = (uInt)size_extra_field;
1045 1466
1046 *piSizeVar += (uInt)size_extra_field; 1467 *piSizeVar += (uInt)size_extra_field;
1047 1468
1048 return err; 1469 return err;
1049 } 1470 }
1050 1471
1051 /* 1472 /*
1052 Open for reading data the current file in the zipfile. 1473 Open for reading data the current file in the zipfile.
1053 If there is no error and the file is opened, the return value is UNZ_OK. 1474 If there is no error and the file is opened, the return value is UNZ_OK.
1054 */ 1475 */
1055 extern int ZEXPORT unzOpenCurrentFile3 (file, method, level, raw, password) 1476 extern int ZEXPORT unzOpenCurrentFile3 (unzFile file, int* method,
1056 unzFile file; 1477 int* level, int raw, const char* pas sword)
1057 int* method;
1058 int* level;
1059 int raw;
1060 const char* password;
1061 { 1478 {
1062 int err=UNZ_OK; 1479 int err=UNZ_OK;
1063 uInt iSizeVar; 1480 uInt iSizeVar;
1064 unz_s* s; 1481 unz64_s* s;
1065 file_in_zip_read_info_s* pfile_in_zip_read_info; 1482 file_in_zip64_read_info_s* pfile_in_zip_read_info;
1066 uLong offset_local_extrafield; /* offset of the local extra field */ 1483 ZPOS64_T offset_local_extrafield; /* offset of the local extra field */
1067 uInt size_local_extrafield; /* size of the local extra field */ 1484 uInt size_local_extrafield; /* size of the local extra field */
1068 # ifndef NOUNCRYPT 1485 # ifndef NOUNCRYPT
1069 char source[12]; 1486 char source[12];
1070 # else 1487 # else
1071 if (password != NULL) 1488 if (password != NULL)
1072 return UNZ_PARAMERROR; 1489 return UNZ_PARAMERROR;
1073 # endif 1490 # endif
1074 1491
1075 if (file==NULL) 1492 if (file==NULL)
1076 return UNZ_PARAMERROR; 1493 return UNZ_PARAMERROR;
1077 s=(unz_s*)file; 1494 s=(unz64_s*)file;
1078 if (!s->current_file_ok) 1495 if (!s->current_file_ok)
1079 return UNZ_PARAMERROR; 1496 return UNZ_PARAMERROR;
1080 1497
1081 if (s->pfile_in_zip_read != NULL) 1498 if (s->pfile_in_zip_read != NULL)
1082 unzCloseCurrentFile(file); 1499 unzCloseCurrentFile(file);
1083 1500
1084 if (unzlocal_CheckCurrentFileCoherencyHeader(s,&iSizeVar, 1501 if (unz64local_CheckCurrentFileCoherencyHeader(s,&iSizeVar, &offset_local_ex trafield,&size_local_extrafield)!=UNZ_OK)
1085 &offset_local_extrafield,&size_local_extrafield)!=UNZ_OK)
1086 return UNZ_BADZIPFILE; 1502 return UNZ_BADZIPFILE;
1087 1503
1088 pfile_in_zip_read_info = (file_in_zip_read_info_s*) 1504 pfile_in_zip_read_info = (file_in_zip64_read_info_s*)ALLOC(sizeof(file_in_zi p64_read_info_s));
1089 ALLOC(sizeof(file_in_zip_read_info_s));
1090 if (pfile_in_zip_read_info==NULL) 1505 if (pfile_in_zip_read_info==NULL)
1091 return UNZ_INTERNALERROR; 1506 return UNZ_INTERNALERROR;
1092 1507
1093 pfile_in_zip_read_info->read_buffer=(char*)ALLOC(UNZ_BUFSIZE); 1508 pfile_in_zip_read_info->read_buffer=(char*)ALLOC(UNZ_BUFSIZE);
1094 pfile_in_zip_read_info->offset_local_extrafield = offset_local_extrafield; 1509 pfile_in_zip_read_info->offset_local_extrafield = offset_local_extrafield;
1095 pfile_in_zip_read_info->size_local_extrafield = size_local_extrafield; 1510 pfile_in_zip_read_info->size_local_extrafield = size_local_extrafield;
1096 pfile_in_zip_read_info->pos_local_extrafield=0; 1511 pfile_in_zip_read_info->pos_local_extrafield=0;
1097 pfile_in_zip_read_info->raw=raw; 1512 pfile_in_zip_read_info->raw=raw;
1098 1513
1099 if (pfile_in_zip_read_info->read_buffer==NULL) 1514 if (pfile_in_zip_read_info->read_buffer==NULL)
(...skipping 12 matching lines...) Expand all
1112 *level = 6; 1527 *level = 6;
1113 switch (s->cur_file_info.flag & 0x06) 1528 switch (s->cur_file_info.flag & 0x06)
1114 { 1529 {
1115 case 6 : *level = 1; break; 1530 case 6 : *level = 1; break;
1116 case 4 : *level = 2; break; 1531 case 4 : *level = 2; break;
1117 case 2 : *level = 9; break; 1532 case 2 : *level = 9; break;
1118 } 1533 }
1119 } 1534 }
1120 1535
1121 if ((s->cur_file_info.compression_method!=0) && 1536 if ((s->cur_file_info.compression_method!=0) &&
1537 /* #ifdef HAVE_BZIP2 */
1538 (s->cur_file_info.compression_method!=Z_BZIP2ED) &&
1539 /* #endif */
1122 (s->cur_file_info.compression_method!=Z_DEFLATED)) 1540 (s->cur_file_info.compression_method!=Z_DEFLATED))
1541
1123 err=UNZ_BADZIPFILE; 1542 err=UNZ_BADZIPFILE;
1124 1543
1125 pfile_in_zip_read_info->crc32_wait=s->cur_file_info.crc; 1544 pfile_in_zip_read_info->crc32_wait=s->cur_file_info.crc;
1126 pfile_in_zip_read_info->crc32=0; 1545 pfile_in_zip_read_info->crc32=0;
1127 pfile_in_zip_read_info->compression_method = 1546 pfile_in_zip_read_info->total_out_64=0;
1128 s->cur_file_info.compression_method; 1547 pfile_in_zip_read_info->compression_method = s->cur_file_info.compression_me thod;
1129 pfile_in_zip_read_info->filestream=s->filestream; 1548 pfile_in_zip_read_info->filestream=s->filestream;
1130 pfile_in_zip_read_info->z_filefunc=s->z_filefunc; 1549 pfile_in_zip_read_info->z_filefunc=s->z_filefunc;
1131 pfile_in_zip_read_info->byte_before_the_zipfile=s->byte_before_the_zipfile; 1550 pfile_in_zip_read_info->byte_before_the_zipfile=s->byte_before_the_zipfile;
1132 1551
1133 pfile_in_zip_read_info->stream.total_out = 0; 1552 pfile_in_zip_read_info->stream.total_out = 0;
1134 1553
1135 if ((s->cur_file_info.compression_method==Z_DEFLATED) && 1554 if ((s->cur_file_info.compression_method==Z_BZIP2ED) && (!raw))
1136 (!raw))
1137 { 1555 {
1556 #ifdef HAVE_BZIP2
1557 pfile_in_zip_read_info->bstream.bzalloc = (void *(*) (void *, int, int))0;
1558 pfile_in_zip_read_info->bstream.bzfree = (free_func)0;
1559 pfile_in_zip_read_info->bstream.opaque = (voidpf)0;
1560 pfile_in_zip_read_info->bstream.state = (voidpf)0;
1561
1138 pfile_in_zip_read_info->stream.zalloc = (alloc_func)0; 1562 pfile_in_zip_read_info->stream.zalloc = (alloc_func)0;
1139 pfile_in_zip_read_info->stream.zfree = (free_func)0; 1563 pfile_in_zip_read_info->stream.zfree = (free_func)0;
1140 pfile_in_zip_read_info->stream.opaque = (voidpf)0; 1564 pfile_in_zip_read_info->stream.opaque = (voidpf)0;
1141 pfile_in_zip_read_info->stream.next_in = (voidpf)0; 1565 pfile_in_zip_read_info->stream.next_in = (voidpf)0;
1142 pfile_in_zip_read_info->stream.avail_in = 0; 1566 pfile_in_zip_read_info->stream.avail_in = 0;
1143 1567
1144 err=inflateInit2(&pfile_in_zip_read_info->stream, -MAX_WBITS); 1568 err=BZ2_bzDecompressInit(&pfile_in_zip_read_info->bstream, 0, 0);
1145 if (err == Z_OK) 1569 if (err == Z_OK)
1146 pfile_in_zip_read_info->stream_initialised=1; 1570 pfile_in_zip_read_info->stream_initialised=Z_BZIP2ED;
1147 else 1571 else
1148 { 1572 {
1149 TRYFREE(pfile_in_zip_read_info); 1573 TRYFREE(pfile_in_zip_read_info);
1574 return err;
1575 }
1576 #else
1577 pfile_in_zip_read_info->raw=1;
1578 #endif
1579 }
1580 else if ((s->cur_file_info.compression_method==Z_DEFLATED) && (!raw))
1581 {
1582 pfile_in_zip_read_info->stream.zalloc = (alloc_func)0;
1583 pfile_in_zip_read_info->stream.zfree = (free_func)0;
1584 pfile_in_zip_read_info->stream.opaque = (voidpf)0;
1585 pfile_in_zip_read_info->stream.next_in = 0;
1586 pfile_in_zip_read_info->stream.avail_in = 0;
1587
1588 err=inflateInit2(&pfile_in_zip_read_info->stream, -MAX_WBITS);
1589 if (err == Z_OK)
1590 pfile_in_zip_read_info->stream_initialised=Z_DEFLATED;
1591 else
1592 {
1593 TRYFREE(pfile_in_zip_read_info);
1150 return err; 1594 return err;
1151 } 1595 }
1152 /* windowBits is passed < 0 to tell that there is no zlib header. 1596 /* windowBits is passed < 0 to tell that there is no zlib header.
1153 * Note that in this case inflate *requires* an extra "dummy" byte 1597 * Note that in this case inflate *requires* an extra "dummy" byte
1154 * after the compressed stream in order to complete decompression and 1598 * after the compressed stream in order to complete decompression and
1155 * return Z_STREAM_END. 1599 * return Z_STREAM_END.
1156 * In unzip, i don't wait absolutely Z_STREAM_END because I known the 1600 * In unzip, i don't wait absolutely Z_STREAM_END because I known the
1157 * size of both compressed and uncompressed data 1601 * size of both compressed and uncompressed data
1158 */ 1602 */
1159 } 1603 }
1160 pfile_in_zip_read_info->rest_read_compressed = 1604 pfile_in_zip_read_info->rest_read_compressed =
1161 s->cur_file_info.compressed_size ; 1605 s->cur_file_info.compressed_size ;
1162 pfile_in_zip_read_info->rest_read_uncompressed = 1606 pfile_in_zip_read_info->rest_read_uncompressed =
1163 s->cur_file_info.uncompressed_size ; 1607 s->cur_file_info.uncompressed_size ;
1164 1608
1165 1609
1166 pfile_in_zip_read_info->pos_in_zipfile = 1610 pfile_in_zip_read_info->pos_in_zipfile =
1167 s->cur_file_info_internal.offset_curfile + SIZEZIPLOCALHEADER + 1611 s->cur_file_info_internal.offset_curfile + SIZEZIPLOCALHEADER +
1168 iSizeVar; 1612 iSizeVar;
1169 1613
1170 pfile_in_zip_read_info->stream.avail_in = (uInt)0; 1614 pfile_in_zip_read_info->stream.avail_in = (uInt)0;
1171 1615
1172 s->pfile_in_zip_read = pfile_in_zip_read_info; 1616 s->pfile_in_zip_read = pfile_in_zip_read_info;
1617 s->encrypted = 0;
1173 1618
1174 # ifndef NOUNCRYPT 1619 # ifndef NOUNCRYPT
1175 if (password != NULL) 1620 if (password != NULL)
1176 { 1621 {
1177 int i; 1622 int i;
1178 s->pcrc_32_tab = get_crc_table(); 1623 s->pcrc_32_tab = get_crc_table();
1179 init_keys(password,s->keys,s->pcrc_32_tab); 1624 init_keys(password,s->keys,s->pcrc_32_tab);
1180 if (ZSEEK(s->z_filefunc, s->filestream, 1625 if (ZSEEK64(s->z_filefunc, s->filestream,
1181 s->pfile_in_zip_read->pos_in_zipfile + 1626 s->pfile_in_zip_read->pos_in_zipfile +
1182 s->pfile_in_zip_read->byte_before_the_zipfile, 1627 s->pfile_in_zip_read->byte_before_the_zipfile,
1183 SEEK_SET)!=0) 1628 SEEK_SET)!=0)
1184 return UNZ_INTERNALERROR; 1629 return UNZ_INTERNALERROR;
1185 if(ZREAD(s->z_filefunc, s->filestream,source, 12)<12) 1630 if(ZREAD64(s->z_filefunc, s->filestream,source, 12)<12)
1186 return UNZ_INTERNALERROR; 1631 return UNZ_INTERNALERROR;
1187 1632
1188 for (i = 0; i<12; i++) 1633 for (i = 0; i<12; i++)
1189 zdecode(s->keys,s->pcrc_32_tab,source[i]); 1634 zdecode(s->keys,s->pcrc_32_tab,source[i]);
1190 1635
1191 s->pfile_in_zip_read->pos_in_zipfile+=12; 1636 s->pfile_in_zip_read->pos_in_zipfile+=12;
1192 s->encrypted=1; 1637 s->encrypted=1;
1193 } 1638 }
1194 # endif 1639 # endif
1195 1640
1196 1641
1197 return UNZ_OK; 1642 return UNZ_OK;
1198 } 1643 }
1199 1644
1200 extern int ZEXPORT unzOpenCurrentFile (file) 1645 extern int ZEXPORT unzOpenCurrentFile (unzFile file)
1201 unzFile file;
1202 { 1646 {
1203 return unzOpenCurrentFile3(file, NULL, NULL, 0, NULL); 1647 return unzOpenCurrentFile3(file, NULL, NULL, 0, NULL);
1204 } 1648 }
1205 1649
1206 extern int ZEXPORT unzOpenCurrentFilePassword (file, password) 1650 extern int ZEXPORT unzOpenCurrentFilePassword (unzFile file, const char* passwo rd)
1207 unzFile file;
1208 const char* password;
1209 { 1651 {
1210 return unzOpenCurrentFile3(file, NULL, NULL, 0, password); 1652 return unzOpenCurrentFile3(file, NULL, NULL, 0, password);
1211 } 1653 }
1212 1654
1213 extern int ZEXPORT unzOpenCurrentFile2 (file,method,level,raw) 1655 extern int ZEXPORT unzOpenCurrentFile2 (unzFile file, int* method, int* level, i nt raw)
1214 unzFile file;
1215 int* method;
1216 int* level;
1217 int raw;
1218 { 1656 {
1219 return unzOpenCurrentFile3(file, method, level, raw, NULL); 1657 return unzOpenCurrentFile3(file, method, level, raw, NULL);
1220 } 1658 }
1221 1659
1660 /** Addition for GDAL : START */
1661
1662 extern ZPOS64_T ZEXPORT unzGetCurrentFileZStreamPos64( unzFile file)
1663 {
1664 unz64_s* s;
1665 file_in_zip64_read_info_s* pfile_in_zip_read_info;
1666 s=(unz64_s*)file;
1667 if (file==NULL)
1668 return 0; //UNZ_PARAMERROR;
1669 pfile_in_zip_read_info=s->pfile_in_zip_read;
1670 if (pfile_in_zip_read_info==NULL)
1671 return 0; //UNZ_PARAMERROR;
1672 return pfile_in_zip_read_info->pos_in_zipfile +
1673 pfile_in_zip_read_info->byte_before_the_zipfile;
1674 }
1675
1676 /** Addition for GDAL : END */
1677
1222 /* 1678 /*
1223 Read bytes from the current file. 1679 Read bytes from the current file.
1224 buf contain buffer where data must be copied 1680 buf contain buffer where data must be copied
1225 len the size of buf. 1681 len the size of buf.
1226 1682
1227 return the number of byte copied if somes bytes are copied 1683 return the number of byte copied if somes bytes are copied
1228 return 0 if the end of file was reached 1684 return 0 if the end of file was reached
1229 return <0 with error code if there is an error 1685 return <0 with error code if there is an error
1230 (UNZ_ERRNO for IO error, or zLib error for uncompress error) 1686 (UNZ_ERRNO for IO error, or zLib error for uncompress error)
1231 */ 1687 */
1232 extern int ZEXPORT unzReadCurrentFile (file, buf, len) 1688 extern int ZEXPORT unzReadCurrentFile (unzFile file, voidp buf, unsigned len)
1233 unzFile file;
1234 voidp buf;
1235 unsigned len;
1236 { 1689 {
1237 int err=UNZ_OK; 1690 int err=UNZ_OK;
1238 uInt iRead = 0; 1691 uInt iRead = 0;
1239 unz_s* s; 1692 unz64_s* s;
1240 file_in_zip_read_info_s* pfile_in_zip_read_info; 1693 file_in_zip64_read_info_s* pfile_in_zip_read_info;
1241 if (file==NULL) 1694 if (file==NULL)
1242 return UNZ_PARAMERROR; 1695 return UNZ_PARAMERROR;
1243 s=(unz_s*)file; 1696 s=(unz64_s*)file;
1244 pfile_in_zip_read_info=s->pfile_in_zip_read; 1697 pfile_in_zip_read_info=s->pfile_in_zip_read;
1245 1698
1246 if (pfile_in_zip_read_info==NULL) 1699 if (pfile_in_zip_read_info==NULL)
1247 return UNZ_PARAMERROR; 1700 return UNZ_PARAMERROR;
1248 1701
1249 1702
1250 if ((pfile_in_zip_read_info->read_buffer == NULL)) 1703 if ((pfile_in_zip_read_info->read_buffer == NULL))
1251 return UNZ_END_OF_LIST_OF_FILE; 1704 return UNZ_END_OF_LIST_OF_FILE;
1252 if (len==0) 1705 if (len==0)
1253 return 0; 1706 return 0;
(...skipping 17 matching lines...) Expand all
1271 while (pfile_in_zip_read_info->stream.avail_out>0) 1724 while (pfile_in_zip_read_info->stream.avail_out>0)
1272 { 1725 {
1273 if ((pfile_in_zip_read_info->stream.avail_in==0) && 1726 if ((pfile_in_zip_read_info->stream.avail_in==0) &&
1274 (pfile_in_zip_read_info->rest_read_compressed>0)) 1727 (pfile_in_zip_read_info->rest_read_compressed>0))
1275 { 1728 {
1276 uInt uReadThis = UNZ_BUFSIZE; 1729 uInt uReadThis = UNZ_BUFSIZE;
1277 if (pfile_in_zip_read_info->rest_read_compressed<uReadThis) 1730 if (pfile_in_zip_read_info->rest_read_compressed<uReadThis)
1278 uReadThis = (uInt)pfile_in_zip_read_info->rest_read_compressed; 1731 uReadThis = (uInt)pfile_in_zip_read_info->rest_read_compressed;
1279 if (uReadThis == 0) 1732 if (uReadThis == 0)
1280 return UNZ_EOF; 1733 return UNZ_EOF;
1281 if (ZSEEK(pfile_in_zip_read_info->z_filefunc, 1734 if (ZSEEK64(pfile_in_zip_read_info->z_filefunc,
1282 pfile_in_zip_read_info->filestream, 1735 pfile_in_zip_read_info->filestream,
1283 pfile_in_zip_read_info->pos_in_zipfile + 1736 pfile_in_zip_read_info->pos_in_zipfile +
1284 pfile_in_zip_read_info->byte_before_the_zipfile, 1737 pfile_in_zip_read_info->byte_before_the_zipfile,
1285 ZLIB_FILEFUNC_SEEK_SET)!=0) 1738 ZLIB_FILEFUNC_SEEK_SET)!=0)
1286 return UNZ_ERRNO; 1739 return UNZ_ERRNO;
1287 if (ZREAD(pfile_in_zip_read_info->z_filefunc, 1740 if (ZREAD64(pfile_in_zip_read_info->z_filefunc,
1288 pfile_in_zip_read_info->filestream, 1741 pfile_in_zip_read_info->filestream,
1289 pfile_in_zip_read_info->read_buffer, 1742 pfile_in_zip_read_info->read_buffer,
1290 uReadThis)!=uReadThis) 1743 uReadThis)!=uReadThis)
1291 return UNZ_ERRNO; 1744 return UNZ_ERRNO;
1292 1745
1293 1746
1294 # ifndef NOUNCRYPT 1747 # ifndef NOUNCRYPT
1295 if(s->encrypted) 1748 if(s->encrypted)
1296 { 1749 {
1297 uInt i; 1750 uInt i;
(...skipping 25 matching lines...) Expand all
1323 if (pfile_in_zip_read_info->stream.avail_out < 1776 if (pfile_in_zip_read_info->stream.avail_out <
1324 pfile_in_zip_read_info->stream.avail_in) 1777 pfile_in_zip_read_info->stream.avail_in)
1325 uDoCopy = pfile_in_zip_read_info->stream.avail_out ; 1778 uDoCopy = pfile_in_zip_read_info->stream.avail_out ;
1326 else 1779 else
1327 uDoCopy = pfile_in_zip_read_info->stream.avail_in ; 1780 uDoCopy = pfile_in_zip_read_info->stream.avail_in ;
1328 1781
1329 for (i=0;i<uDoCopy;i++) 1782 for (i=0;i<uDoCopy;i++)
1330 *(pfile_in_zip_read_info->stream.next_out+i) = 1783 *(pfile_in_zip_read_info->stream.next_out+i) =
1331 *(pfile_in_zip_read_info->stream.next_in+i); 1784 *(pfile_in_zip_read_info->stream.next_in+i);
1332 1785
1786 pfile_in_zip_read_info->total_out_64 = pfile_in_zip_read_info->total _out_64 + uDoCopy;
1787
1333 pfile_in_zip_read_info->crc32 = crc32(pfile_in_zip_read_info->crc32, 1788 pfile_in_zip_read_info->crc32 = crc32(pfile_in_zip_read_info->crc32,
1334 pfile_in_zip_read_info->stream.next_out, 1789 pfile_in_zip_read_info->stream.next_out,
1335 uDoCopy); 1790 uDoCopy);
1336 pfile_in_zip_read_info->rest_read_uncompressed-=uDoCopy; 1791 pfile_in_zip_read_info->rest_read_uncompressed-=uDoCopy;
1337 pfile_in_zip_read_info->stream.avail_in -= uDoCopy; 1792 pfile_in_zip_read_info->stream.avail_in -= uDoCopy;
1338 pfile_in_zip_read_info->stream.avail_out -= uDoCopy; 1793 pfile_in_zip_read_info->stream.avail_out -= uDoCopy;
1339 pfile_in_zip_read_info->stream.next_out += uDoCopy; 1794 pfile_in_zip_read_info->stream.next_out += uDoCopy;
1340 pfile_in_zip_read_info->stream.next_in += uDoCopy; 1795 pfile_in_zip_read_info->stream.next_in += uDoCopy;
1341 pfile_in_zip_read_info->stream.total_out += uDoCopy; 1796 pfile_in_zip_read_info->stream.total_out += uDoCopy;
1342 iRead += uDoCopy; 1797 iRead += uDoCopy;
1343 } 1798 }
1344 else 1799 else if (pfile_in_zip_read_info->compression_method==Z_BZIP2ED)
1345 { 1800 {
1801 #ifdef HAVE_BZIP2
1346 uLong uTotalOutBefore,uTotalOutAfter; 1802 uLong uTotalOutBefore,uTotalOutAfter;
1347 const Bytef *bufBefore; 1803 const Bytef *bufBefore;
1348 uLong uOutThis; 1804 uLong uOutThis;
1805
1806 pfile_in_zip_read_info->bstream.next_in = (char*)pfile_in_zip _read_info->stream.next_in;
1807 pfile_in_zip_read_info->bstream.avail_in = pfile_in_zip_read_i nfo->stream.avail_in;
1808 pfile_in_zip_read_info->bstream.total_in_lo32 = pfile_in_zip_read_i nfo->stream.total_in;
1809 pfile_in_zip_read_info->bstream.total_in_hi32 = 0;
1810 pfile_in_zip_read_info->bstream.next_out = (char*)pfile_in_zip _read_info->stream.next_out;
1811 pfile_in_zip_read_info->bstream.avail_out = pfile_in_zip_read_i nfo->stream.avail_out;
1812 pfile_in_zip_read_info->bstream.total_out_lo32 = pfile_in_zip_read_i nfo->stream.total_out;
1813 pfile_in_zip_read_info->bstream.total_out_hi32 = 0;
1814
1815 uTotalOutBefore = pfile_in_zip_read_info->bstream.total_out_lo32;
1816 bufBefore = (const Bytef *)pfile_in_zip_read_info->bstream.next_out;
1817
1818 err=BZ2_bzDecompress(&pfile_in_zip_read_info->bstream);
1819
1820 uTotalOutAfter = pfile_in_zip_read_info->bstream.total_out_lo32;
1821 uOutThis = uTotalOutAfter-uTotalOutBefore;
1822
1823 pfile_in_zip_read_info->total_out_64 = pfile_in_zip_read_info->total _out_64 + uOutThis;
1824
1825 pfile_in_zip_read_info->crc32 = crc32(pfile_in_zip_read_info->crc32, bufBefore, (uInt)(uOutThis));
1826 pfile_in_zip_read_info->rest_read_uncompressed -= uOutThis;
1827 iRead += (uInt)(uTotalOutAfter - uTotalOutBefore);
1828
1829 pfile_in_zip_read_info->stream.next_in = (Bytef*)pfile_in_zip_read _info->bstream.next_in;
1830 pfile_in_zip_read_info->stream.avail_in = pfile_in_zip_read_info->b stream.avail_in;
1831 pfile_in_zip_read_info->stream.total_in = pfile_in_zip_read_info->b stream.total_in_lo32;
1832 pfile_in_zip_read_info->stream.next_out = (Bytef*)pfile_in_zip_read _info->bstream.next_out;
1833 pfile_in_zip_read_info->stream.avail_out = pfile_in_zip_read_info->b stream.avail_out;
1834 pfile_in_zip_read_info->stream.total_out = pfile_in_zip_read_info->b stream.total_out_lo32;
1835
1836 if (err==BZ_STREAM_END)
1837 return (iRead==0) ? UNZ_EOF : iRead;
1838 if (err!=BZ_OK)
1839 break;
1840 #endif
1841 } // end Z_BZIP2ED
1842 else
1843 {
1844 ZPOS64_T uTotalOutBefore,uTotalOutAfter;
1845 const Bytef *bufBefore;
1846 ZPOS64_T uOutThis;
1349 int flush=Z_SYNC_FLUSH; 1847 int flush=Z_SYNC_FLUSH;
1350 1848
1351 uTotalOutBefore = pfile_in_zip_read_info->stream.total_out; 1849 uTotalOutBefore = pfile_in_zip_read_info->stream.total_out;
1352 bufBefore = pfile_in_zip_read_info->stream.next_out; 1850 bufBefore = pfile_in_zip_read_info->stream.next_out;
1353 1851
1354 /* 1852 /*
1355 if ((pfile_in_zip_read_info->rest_read_uncompressed == 1853 if ((pfile_in_zip_read_info->rest_read_uncompressed ==
1356 pfile_in_zip_read_info->stream.avail_out) && 1854 pfile_in_zip_read_info->stream.avail_out) &&
1357 (pfile_in_zip_read_info->rest_read_compressed == 0)) 1855 (pfile_in_zip_read_info->rest_read_compressed == 0))
1358 flush = Z_FINISH; 1856 flush = Z_FINISH;
1359 */ 1857 */
1360 err=inflate(&pfile_in_zip_read_info->stream,flush); 1858 err=inflate(&pfile_in_zip_read_info->stream,flush);
1361 1859
1362 if ((err>=0) && (pfile_in_zip_read_info->stream.msg!=NULL)) 1860 if ((err>=0) && (pfile_in_zip_read_info->stream.msg!=NULL))
1363 err = Z_DATA_ERROR; 1861 err = Z_DATA_ERROR;
1364 1862
1365 uTotalOutAfter = pfile_in_zip_read_info->stream.total_out; 1863 uTotalOutAfter = pfile_in_zip_read_info->stream.total_out;
1366 uOutThis = uTotalOutAfter-uTotalOutBefore; 1864 uOutThis = uTotalOutAfter-uTotalOutBefore;
1367 1865
1866 pfile_in_zip_read_info->total_out_64 = pfile_in_zip_read_info->total _out_64 + uOutThis;
1867
1368 pfile_in_zip_read_info->crc32 = 1868 pfile_in_zip_read_info->crc32 =
1369 crc32(pfile_in_zip_read_info->crc32,bufBefore, 1869 crc32(pfile_in_zip_read_info->crc32,bufBefore,
1370 (uInt)(uOutThis)); 1870 (uInt)(uOutThis));
1371 1871
1372 pfile_in_zip_read_info->rest_read_uncompressed -= 1872 pfile_in_zip_read_info->rest_read_uncompressed -=
1373 uOutThis; 1873 uOutThis;
1374 1874
1375 iRead += (uInt)(uTotalOutAfter - uTotalOutBefore); 1875 iRead += (uInt)(uTotalOutAfter - uTotalOutBefore);
1376 1876
1377 if (err==Z_STREAM_END) 1877 if (err==Z_STREAM_END)
1378 return (iRead==0) ? UNZ_EOF : iRead; 1878 return (iRead==0) ? UNZ_EOF : iRead;
1379 if (err!=Z_OK) 1879 if (err!=Z_OK)
1380 break; 1880 break;
1381 } 1881 }
1382 } 1882 }
1383 1883
1384 if (err==Z_OK) 1884 if (err==Z_OK)
1385 return iRead; 1885 return iRead;
1386 return err; 1886 return err;
1387 } 1887 }
1388 1888
1389 1889
1390 /* 1890 /*
1391 Give the current position in uncompressed data 1891 Give the current position in uncompressed data
1392 */ 1892 */
1393 extern z_off_t ZEXPORT unztell (file) 1893 extern z_off_t ZEXPORT unztell (unzFile file)
1394 unzFile file;
1395 { 1894 {
1396 unz_s* s; 1895 unz64_s* s;
1397 file_in_zip_read_info_s* pfile_in_zip_read_info; 1896 file_in_zip64_read_info_s* pfile_in_zip_read_info;
1398 if (file==NULL) 1897 if (file==NULL)
1399 return UNZ_PARAMERROR; 1898 return UNZ_PARAMERROR;
1400 s=(unz_s*)file; 1899 s=(unz64_s*)file;
1401 pfile_in_zip_read_info=s->pfile_in_zip_read; 1900 pfile_in_zip_read_info=s->pfile_in_zip_read;
1402 1901
1403 if (pfile_in_zip_read_info==NULL) 1902 if (pfile_in_zip_read_info==NULL)
1404 return UNZ_PARAMERROR; 1903 return UNZ_PARAMERROR;
1405 1904
1406 return (z_off_t)pfile_in_zip_read_info->stream.total_out; 1905 return (z_off_t)pfile_in_zip_read_info->stream.total_out;
1407 } 1906 }
1408 1907
1908 extern ZPOS64_T ZEXPORT unztell64 (unzFile file)
1909 {
1910
1911 unz64_s* s;
1912 file_in_zip64_read_info_s* pfile_in_zip_read_info;
1913 if (file==NULL)
1914 return (ZPOS64_T)-1;
1915 s=(unz64_s*)file;
1916 pfile_in_zip_read_info=s->pfile_in_zip_read;
1917
1918 if (pfile_in_zip_read_info==NULL)
1919 return (ZPOS64_T)-1;
1920
1921 return pfile_in_zip_read_info->total_out_64;
1922 }
1923
1409 1924
1410 /* 1925 /*
1411 return 1 if the end of file was reached, 0 elsewhere 1926 return 1 if the end of file was reached, 0 elsewhere
1412 */ 1927 */
1413 extern int ZEXPORT unzeof (file) 1928 extern int ZEXPORT unzeof (unzFile file)
1414 unzFile file;
1415 { 1929 {
1416 unz_s* s; 1930 unz64_s* s;
1417 file_in_zip_read_info_s* pfile_in_zip_read_info; 1931 file_in_zip64_read_info_s* pfile_in_zip_read_info;
1418 if (file==NULL) 1932 if (file==NULL)
1419 return UNZ_PARAMERROR; 1933 return UNZ_PARAMERROR;
1420 s=(unz_s*)file; 1934 s=(unz64_s*)file;
1421 pfile_in_zip_read_info=s->pfile_in_zip_read; 1935 pfile_in_zip_read_info=s->pfile_in_zip_read;
1422 1936
1423 if (pfile_in_zip_read_info==NULL) 1937 if (pfile_in_zip_read_info==NULL)
1424 return UNZ_PARAMERROR; 1938 return UNZ_PARAMERROR;
1425 1939
1426 if (pfile_in_zip_read_info->rest_read_uncompressed == 0) 1940 if (pfile_in_zip_read_info->rest_read_uncompressed == 0)
1427 return 1; 1941 return 1;
1428 else 1942 else
1429 return 0; 1943 return 0;
1430 } 1944 }
1431 1945
1432 1946
1433 1947
1434 /* 1948 /*
1435 Read extra field from the current file (opened by unzOpenCurrentFile) 1949 Read extra field from the current file (opened by unzOpenCurrentFile)
1436 This is the local-header version of the extra field (sometimes, there is 1950 This is the local-header version of the extra field (sometimes, there is
1437 more info in the local-header version than in the central-header) 1951 more info in the local-header version than in the central-header)
1438 1952
1439 if buf==NULL, it return the size of the local extra field that can be read 1953 if buf==NULL, it return the size of the local extra field that can be read
1440 1954
1441 if buf!=NULL, len is the size of the buffer, the extra header is copied in 1955 if buf!=NULL, len is the size of the buffer, the extra header is copied in
1442 buf. 1956 buf.
1443 the return value is the number of bytes copied in buf, or (if <0) 1957 the return value is the number of bytes copied in buf, or (if <0)
1444 the error code 1958 the error code
1445 */ 1959 */
1446 extern int ZEXPORT unzGetLocalExtrafield (file,buf,len) 1960 extern int ZEXPORT unzGetLocalExtrafield (unzFile file, voidp buf, unsigned len)
1447 unzFile file;
1448 voidp buf;
1449 unsigned len;
1450 { 1961 {
1451 unz_s* s; 1962 unz64_s* s;
1452 file_in_zip_read_info_s* pfile_in_zip_read_info; 1963 file_in_zip64_read_info_s* pfile_in_zip_read_info;
1453 uInt read_now; 1964 uInt read_now;
1454 uLong size_to_read; 1965 ZPOS64_T size_to_read;
1455 1966
1456 if (file==NULL) 1967 if (file==NULL)
1457 return UNZ_PARAMERROR; 1968 return UNZ_PARAMERROR;
1458 s=(unz_s*)file; 1969 s=(unz64_s*)file;
1459 pfile_in_zip_read_info=s->pfile_in_zip_read; 1970 pfile_in_zip_read_info=s->pfile_in_zip_read;
1460 1971
1461 if (pfile_in_zip_read_info==NULL) 1972 if (pfile_in_zip_read_info==NULL)
1462 return UNZ_PARAMERROR; 1973 return UNZ_PARAMERROR;
1463 1974
1464 size_to_read = (pfile_in_zip_read_info->size_local_extrafield - 1975 size_to_read = (pfile_in_zip_read_info->size_local_extrafield -
1465 pfile_in_zip_read_info->pos_local_extrafield); 1976 pfile_in_zip_read_info->pos_local_extrafield);
1466 1977
1467 if (buf==NULL) 1978 if (buf==NULL)
1468 return (int)size_to_read; 1979 return (int)size_to_read;
1469 1980
1470 if (len>size_to_read) 1981 if (len>size_to_read)
1471 read_now = (uInt)size_to_read; 1982 read_now = (uInt)size_to_read;
1472 else 1983 else
1473 read_now = (uInt)len ; 1984 read_now = (uInt)len ;
1474 1985
1475 if (read_now==0) 1986 if (read_now==0)
1476 return 0; 1987 return 0;
1477 1988
1478 if (ZSEEK(pfile_in_zip_read_info->z_filefunc, 1989 if (ZSEEK64(pfile_in_zip_read_info->z_filefunc,
1479 pfile_in_zip_read_info->filestream, 1990 pfile_in_zip_read_info->filestream,
1480 pfile_in_zip_read_info->offset_local_extrafield + 1991 pfile_in_zip_read_info->offset_local_extrafield +
1481 pfile_in_zip_read_info->pos_local_extrafield, 1992 pfile_in_zip_read_info->pos_local_extrafield,
1482 ZLIB_FILEFUNC_SEEK_SET)!=0) 1993 ZLIB_FILEFUNC_SEEK_SET)!=0)
1483 return UNZ_ERRNO; 1994 return UNZ_ERRNO;
1484 1995
1485 if (ZREAD(pfile_in_zip_read_info->z_filefunc, 1996 if (ZREAD64(pfile_in_zip_read_info->z_filefunc,
1486 pfile_in_zip_read_info->filestream, 1997 pfile_in_zip_read_info->filestream,
1487 buf,read_now)!=read_now) 1998 buf,read_now)!=read_now)
1488 return UNZ_ERRNO; 1999 return UNZ_ERRNO;
1489 2000
1490 return (int)read_now; 2001 return (int)read_now;
1491 } 2002 }
1492 2003
1493 /* 2004 /*
1494 Close the file in zip opened with unzipOpenCurrentFile 2005 Close the file in zip opened with unzipOpenCurrentFile
1495 Return UNZ_CRCERROR if all the file was read but the CRC is not good 2006 Return UNZ_CRCERROR if all the file was read but the CRC is not good
1496 */ 2007 */
1497 extern int ZEXPORT unzCloseCurrentFile (file) 2008 extern int ZEXPORT unzCloseCurrentFile (unzFile file)
1498 unzFile file;
1499 { 2009 {
1500 int err=UNZ_OK; 2010 int err=UNZ_OK;
1501 2011
1502 unz_s* s; 2012 unz64_s* s;
1503 file_in_zip_read_info_s* pfile_in_zip_read_info; 2013 file_in_zip64_read_info_s* pfile_in_zip_read_info;
1504 if (file==NULL) 2014 if (file==NULL)
1505 return UNZ_PARAMERROR; 2015 return UNZ_PARAMERROR;
1506 s=(unz_s*)file; 2016 s=(unz64_s*)file;
1507 pfile_in_zip_read_info=s->pfile_in_zip_read; 2017 pfile_in_zip_read_info=s->pfile_in_zip_read;
1508 2018
1509 if (pfile_in_zip_read_info==NULL) 2019 if (pfile_in_zip_read_info==NULL)
1510 return UNZ_PARAMERROR; 2020 return UNZ_PARAMERROR;
1511 2021
1512 2022
1513 if ((pfile_in_zip_read_info->rest_read_uncompressed == 0) && 2023 if ((pfile_in_zip_read_info->rest_read_uncompressed == 0) &&
1514 (!pfile_in_zip_read_info->raw)) 2024 (!pfile_in_zip_read_info->raw))
1515 { 2025 {
1516 if (pfile_in_zip_read_info->crc32 != pfile_in_zip_read_info->crc32_wait) 2026 if (pfile_in_zip_read_info->crc32 != pfile_in_zip_read_info->crc32_wait)
1517 err=UNZ_CRCERROR; 2027 err=UNZ_CRCERROR;
1518 } 2028 }
1519 2029
1520 2030
1521 TRYFREE(pfile_in_zip_read_info->read_buffer); 2031 TRYFREE(pfile_in_zip_read_info->read_buffer);
1522 pfile_in_zip_read_info->read_buffer = NULL; 2032 pfile_in_zip_read_info->read_buffer = NULL;
1523 if (pfile_in_zip_read_info->stream_initialised) 2033 if (pfile_in_zip_read_info->stream_initialised == Z_DEFLATED)
1524 inflateEnd(&pfile_in_zip_read_info->stream); 2034 inflateEnd(&pfile_in_zip_read_info->stream);
2035 #ifdef HAVE_BZIP2
2036 else if (pfile_in_zip_read_info->stream_initialised == Z_BZIP2ED)
2037 BZ2_bzDecompressEnd(&pfile_in_zip_read_info->bstream);
2038 #endif
2039
1525 2040
1526 pfile_in_zip_read_info->stream_initialised = 0; 2041 pfile_in_zip_read_info->stream_initialised = 0;
1527 TRYFREE(pfile_in_zip_read_info); 2042 TRYFREE(pfile_in_zip_read_info);
1528 2043
1529 s->pfile_in_zip_read=NULL; 2044 s->pfile_in_zip_read=NULL;
1530 2045
1531 return err; 2046 return err;
1532 } 2047 }
1533 2048
1534 2049
1535 /* 2050 /*
1536 Get the global comment string of the ZipFile, in the szComment buffer. 2051 Get the global comment string of the ZipFile, in the szComment buffer.
1537 uSizeBuf is the size of the szComment buffer. 2052 uSizeBuf is the size of the szComment buffer.
1538 return the number of byte copied or an error code <0 2053 return the number of byte copied or an error code <0
1539 */ 2054 */
1540 extern int ZEXPORT unzGetGlobalComment (file, szComment, uSizeBuf) 2055 extern int ZEXPORT unzGetGlobalComment (unzFile file, char * szComment, uLong uS izeBuf)
1541 unzFile file;
1542 char *szComment;
1543 uLong uSizeBuf;
1544 { 2056 {
1545 //int err=UNZ_OK; 2057 unz64_s* s;
1546 unz_s* s;
1547 uLong uReadThis ; 2058 uLong uReadThis ;
1548 if (file==NULL) 2059 if (file==NULL)
1549 return UNZ_PARAMERROR; 2060 return (int)UNZ_PARAMERROR;
1550 s=(unz_s*)file; 2061 s=(unz64_s*)file;
1551 2062
1552 uReadThis = uSizeBuf; 2063 uReadThis = uSizeBuf;
1553 if (uReadThis>s->gi.size_comment) 2064 if (uReadThis>s->gi.size_comment)
1554 uReadThis = s->gi.size_comment; 2065 uReadThis = s->gi.size_comment;
1555 2066
1556 if (ZSEEK(s->z_filefunc,s->filestream,s->central_pos+22,ZLIB_FILEFUNC_SEEK_S ET)!=0) 2067 if (ZSEEK64(s->z_filefunc,s->filestream,s->central_pos+22,ZLIB_FILEFUNC_SEEK _SET)!=0)
1557 return UNZ_ERRNO; 2068 return UNZ_ERRNO;
1558 2069
1559 if (uReadThis>0) 2070 if (uReadThis>0)
1560 { 2071 {
1561 *szComment='\0'; 2072 *szComment='\0';
1562 if (ZREAD(s->z_filefunc,s->filestream,szComment,uReadThis)!=uReadThis) 2073 if (ZREAD64(s->z_filefunc,s->filestream,szComment,uReadThis)!=uReadThis)
1563 return UNZ_ERRNO; 2074 return UNZ_ERRNO;
1564 } 2075 }
1565 2076
1566 if ((szComment != NULL) && (uSizeBuf > s->gi.size_comment)) 2077 if ((szComment != NULL) && (uSizeBuf > s->gi.size_comment))
1567 *(szComment+s->gi.size_comment)='\0'; 2078 *(szComment+s->gi.size_comment)='\0';
1568 return (int)uReadThis; 2079 return (int)uReadThis;
1569 } 2080 }
1570 2081
1571 /* Additions by RX '2004 */ 2082 /* Additions by RX '2004 */
1572 extern uLong ZEXPORT unzGetOffset (file) 2083 extern ZPOS64_T ZEXPORT unzGetOffset64(unzFile file)
1573 unzFile file;
1574 { 2084 {
1575 unz_s* s; 2085 unz64_s* s;
1576 2086
1577 if (file==NULL) 2087 if (file==NULL)
1578 return UNZ_PARAMERROR; 2088 return 0; //UNZ_PARAMERROR;
1579 s=(unz_s*)file; 2089 s=(unz64_s*)file;
1580 if (!s->current_file_ok) 2090 if (!s->current_file_ok)
1581 return 0; 2091 return 0;
1582 if (s->gi.number_entry != 0 && s->gi.number_entry != 0xffff) 2092 if (s->gi.number_entry != 0 && s->gi.number_entry != 0xffff)
1583 if (s->num_file==s->gi.number_entry) 2093 if (s->num_file==s->gi.number_entry)
1584 return 0; 2094 return 0;
1585 return s->pos_in_central_dir; 2095 return s->pos_in_central_dir;
1586 } 2096 }
1587 2097
1588 extern int ZEXPORT unzSetOffset (file, pos) 2098 extern uLong ZEXPORT unzGetOffset (unzFile file)
1589 unzFile file;
1590 uLong pos;
1591 { 2099 {
1592 unz_s* s; 2100 ZPOS64_T offset64;
2101
2102 if (file==NULL)
2103 return 0; //UNZ_PARAMERROR;
2104 offset64 = unzGetOffset64(file);
2105 return (uLong)offset64;
2106 }
2107
2108 extern int ZEXPORT unzSetOffset64(unzFile file, ZPOS64_T pos)
2109 {
2110 unz64_s* s;
1593 int err; 2111 int err;
1594 2112
1595 if (file==NULL) 2113 if (file==NULL)
1596 return UNZ_PARAMERROR; 2114 return UNZ_PARAMERROR;
1597 s=(unz_s*)file; 2115 s=(unz64_s*)file;
1598 2116
1599 s->pos_in_central_dir = pos; 2117 s->pos_in_central_dir = pos;
1600 s->num_file = s->gi.number_entry; /* hack */ 2118 s->num_file = s->gi.number_entry; /* hack */
1601 err = unzlocal_GetCurrentFileInfoInternal(file,&s->cur_file_info, 2119 err = unz64local_GetCurrentFileInfoInternal(file,&s->cur_file_info,
1602 &s->cur_file_info_internal, 2120 &s->cur_file_info_internal,
1603 NULL,0,NULL,0,NULL,0); 2121 NULL,0,NULL,0,NULL,0);
1604 s->current_file_ok = (err == UNZ_OK); 2122 s->current_file_ok = (err == UNZ_OK);
1605 return err; 2123 return err;
1606 } 2124 }
2125
2126 extern int ZEXPORT unzSetOffset (unzFile file, uLong pos)
2127 {
2128 return unzSetOffset64(file,pos);
2129 }
OLDNEW
« no previous file with comments | « third_party/zlib/contrib/minizip/unzip.h ('k') | third_party/zlib/contrib/minizip/zip.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698