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