xref: /aosp_15_r20/external/zlib/contrib/minizip/unzip.c (revision 86ee64e75fa5f8bce2c8c356138035642429cd05)
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