19e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project/* unzip.c -- IO for uncompress .zip files using zlib
2381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes   Version 1.1, February 14h, 2010
3381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes   part of the MiniZip project - ( http://www.winimage.com/zLibDll/minizip.html )
49e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
5381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes         Copyright (C) 1998-2010 Gilles Vollant (minizip) ( http://www.winimage.com/zLibDll/minizip.html )
69e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
7381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes         Modifications of Unzip for Zip64
8381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes         Copyright (C) 2007-2008 Even Rouault
9381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes
10381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes         Modifications for Zip64 support on both zip and unzip
11381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes         Copyright (C) 2009-2010 Mathias Svensson ( http://result42.com )
12381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes
13381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes         For more info read MiniZip_info.txt
14381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes
15381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes
16381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes  ------------------------------------------------------------------------------------
17381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes  Decryption code comes from crypt.c by Info-ZIP but has been greatly reduced in terms of
18381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes  compatibility with older software. The following is from the original crypt.c.
19381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes  Code woven in by Terry Thorsen 1/2003.
209e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
219e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  Copyright (c) 1990-2000 Info-ZIP.  All rights reserved.
229e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
239e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  See the accompanying file LICENSE, version 2000-Apr-09 or later
249e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  (the contents of which are also included in zip.h) for terms of use.
259e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  If, for some reason, all these files are missing, the Info-ZIP license
269e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  also may be found at:  ftp://ftp.info-zip.org/pub/infozip/license.html
27381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes
28381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        crypt.c (full version) by Info-ZIP.      Last revised:  [see crypt.h]
299e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
309e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  The encryption/decryption parts of this source code (as opposed to the
319e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  non-echoing password parts) were originally written in Europe.  The
329e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  whole source package can be freely distributed, including from the USA.
339e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  (Prior to January 2000, re-export from the US was a violation of US law.)
349e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
35381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        This encryption code is a direct transcription of the algorithm from
369e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  Roger Schlafly, described by Phil Katz in the file appnote.txt.  This
379e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  file (appnote.txt) is distributed with the PKZIP program (even in the
389e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  version without encryption capabilities).
39381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes
40381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        ------------------------------------------------------------------------------------
41381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes
42381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        Changes in unzip.c
43381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes
44381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        2007-2008 - Even Rouault - Addition of cpl_unzGetCurrentFileZStreamPos
45381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes  2007-2008 - Even Rouault - Decoration of symbol names unz* -> cpl_unz*
46381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes  2007-2008 - Even Rouault - Remove old C style function prototypes
47381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes  2007-2008 - Even Rouault - Add unzip support for ZIP64
48381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes
49381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        Copyright (C) 2007-2008 Even Rouault
50381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes
51381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes
52381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        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).
53381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes  Oct-2009 - Mathias Svensson - Fixed problem if uncompressed size was > 4G and compressed size was <4G
54381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes                                should only read the compressed/uncompressed size from the Zip64 format if
55381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes                                the size from normal header was 0xFFFFFFFF
56381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes  Oct-2009 - Mathias Svensson - Applied some bug fixes from paches recived from Gilles Vollant
57381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        Oct-2009 - Mathias Svensson - Applied support to unzip files with compression mathod BZIP2 (bzip2 lib is required)
58381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes                                Patch created by Daniel Borca
59381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes
60381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes  Jan-2010 - back to unzip and minizip 1.0 name scheme, with compatibility layer
61381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes
62381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes  Copyright (C) 1998 - 2010 Gilles Vollant, Even Rouault, Mathias Svensson
63381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes
64381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes*/
659e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
669e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
679e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#include <stdio.h>
689e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#include <stdlib.h>
699e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#include <string.h>
70381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes
71381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes#ifndef NOUNCRYPT
72381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        #define NOUNCRYPT
73381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes#endif
74381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes
759e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#include "zlib.h"
769e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#include "unzip.h"
779e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
789e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#ifdef STDC
799e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#  include <stddef.h>
809e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#  include <string.h>
819e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#  include <stdlib.h>
829e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#endif
839e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#ifdef NO_ERRNO_H
849e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    extern int errno;
859e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#else
869e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#   include <errno.h>
879e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#endif
889e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
899e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
909e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#ifndef local
919e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#  define local static
929e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#endif
939e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project/* compile with -Dlocal if your debugger can't find static symbols */
949e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
959e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
969e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#ifndef CASESENSITIVITYDEFAULT_NO
979e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#  if !defined(unix) && !defined(CASESENSITIVITYDEFAULT_YES)
989e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#    define CASESENSITIVITYDEFAULT_NO
999e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#  endif
1009e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#endif
1019e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1029e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1039e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#ifndef UNZ_BUFSIZE
1049e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#define UNZ_BUFSIZE (16384)
1059e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#endif
1069e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1079e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#ifndef UNZ_MAXFILENAMEINZIP
1089e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#define UNZ_MAXFILENAMEINZIP (256)
1099e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#endif
1109e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1119e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#ifndef ALLOC
1129e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project# define ALLOC(size) (malloc(size))
1139e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#endif
1149e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#ifndef TRYFREE
1159e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project# define TRYFREE(p) {if (p) free(p);}
1169e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#endif
1179e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1189e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#define SIZECENTRALDIRITEM (0x2e)
1199e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#define SIZEZIPLOCALHEADER (0x1e)
1209e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1219e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1229e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectconst char unz_copyright[] =
1239e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project   " unzip 1.01 Copyright 1998-2004 Gilles Vollant - http://www.winimage.com/zLibDll";
1249e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1259e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project/* unz_file_info_interntal contain internal info about a file in zipfile*/
126381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughestypedef struct unz_file_info64_internal_s
1279e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{
128381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    ZPOS64_T offset_curfile;/* relative offset of local header 8 bytes */
129381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes} unz_file_info64_internal;
1309e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1319e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1329e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project/* file_in_zip_read_info_s contain internal information about a file in zipfile,
1339e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    when reading and decompress it */
1349e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projecttypedef struct
1359e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{
1369e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    char  *read_buffer;         /* internal buffer for compressed data */
1379e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    z_stream stream;            /* zLib stream structure for inflate */
1389e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
139381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes#ifdef HAVE_BZIP2
140381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    bz_stream bstream;          /* bzLib stream structure for bziped */
141381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes#endif
142381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes
143381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    ZPOS64_T pos_in_zipfile;       /* position in byte on the zipfile, for fseek*/
1449e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    uLong stream_initialised;   /* flag set if stream structure is initialised*/
1459e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
146381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    ZPOS64_T offset_local_extrafield;/* offset of the local extra field */
1479e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    uInt  size_local_extrafield;/* size of the local extra field */
148381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    ZPOS64_T pos_local_extrafield;   /* position in the local extra field in read*/
149381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    ZPOS64_T total_out_64;
1509e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1519e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    uLong crc32;                /* crc32 of all data uncompressed */
1529e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    uLong crc32_wait;           /* crc32 we must obtain after decompress all */
153381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    ZPOS64_T rest_read_compressed; /* number of byte to be decompressed */
154381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    ZPOS64_T rest_read_uncompressed;/*number of byte to be obtained after decomp*/
155381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    zlib_filefunc64_32_def z_filefunc;
1569e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    voidpf filestream;        /* io structore of the zipfile */
1579e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    uLong compression_method;   /* compression method (0==store) */
158381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    ZPOS64_T byte_before_the_zipfile;/* byte before the zipfile, (>0 for sfx)*/
1599e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    int   raw;
160381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes} file_in_zip64_read_info_s;
1619e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1629e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
163381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes/* unz64_s contain internal information about the zipfile
1649e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project*/
1659e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projecttypedef struct
1669e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{
167381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    zlib_filefunc64_32_def z_filefunc;
168381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    int is64bitOpenFunction;
1699e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    voidpf filestream;        /* io structore of the zipfile */
170381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    unz_global_info64 gi;       /* public global information */
171381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    ZPOS64_T byte_before_the_zipfile;/* byte before the zipfile, (>0 for sfx)*/
172381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    ZPOS64_T num_file;             /* number of the current file in the zipfile*/
173381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    ZPOS64_T pos_in_central_dir;   /* pos of the current file in the central dir*/
174381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    ZPOS64_T current_file_ok;      /* flag about the usability of the current file*/
175381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    ZPOS64_T central_pos;          /* position of the beginning of the central dir*/
176381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes
177381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    ZPOS64_T size_central_dir;     /* size of the central directory  */
178381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    ZPOS64_T offset_central_dir;   /* offset of start of central directory with
1799e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                                   respect to the starting disk number */
1809e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
181381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    unz_file_info64 cur_file_info; /* public info about the current file in zip*/
182381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    unz_file_info64_internal cur_file_info_internal; /* private info about it*/
183381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    file_in_zip64_read_info_s* pfile_in_zip_read; /* structure about the current
1849e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                                        file if we are decompressing it */
1859e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    int encrypted;
186381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes
187381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    int isZip64;
188381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes
1899e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#    ifndef NOUNCRYPT
1909e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    unsigned long keys[3];     /* keys defining the pseudo-random sequence */
19104351a92ecc8429c999acbfc5dfe5aa8bee1d19dElliott Hughes    const z_crc_t* pcrc_32_tab;
1929e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#    endif
193381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes} unz64_s;
1949e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1959e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1969e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#ifndef NOUNCRYPT
1979e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#include "crypt.h"
1989e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#endif
1999e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2009e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project/* ===========================================================================
2019e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project     Read a byte from a gz_stream; update next_in and avail_in. Return EOF
2029e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project   for end of file.
2039e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project   IN assertion: the stream s has been sucessfully opened for reading.
2049e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project*/
2059e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2069e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
207381716e9396b55b1adb8235b020c37344f60ab07Elliott Hugheslocal int unz64local_getByte OF((
208381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    const zlib_filefunc64_32_def* pzlib_filefunc_def,
2099e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    voidpf filestream,
2109e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    int *pi));
2119e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
212381716e9396b55b1adb8235b020c37344f60ab07Elliott Hugheslocal int unz64local_getByte(const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, int *pi)
2139e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{
2149e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    unsigned char c;
215381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    int err = (int)ZREAD64(*pzlib_filefunc_def,filestream,&c,1);
2169e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    if (err==1)
2179e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    {
2189e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        *pi = (int)c;
2199e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        return UNZ_OK;
2209e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    }
2219e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    else
2229e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    {
223381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        if (ZERROR64(*pzlib_filefunc_def,filestream))
2249e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project            return UNZ_ERRNO;
2259e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        else
2269e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project            return UNZ_EOF;
2279e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    }
2289e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project}
2299e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2309e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2319e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project/* ===========================================================================
2329e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project   Reads a long in LSB order from the given gz_stream. Sets
2339e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project*/
234381716e9396b55b1adb8235b020c37344f60ab07Elliott Hugheslocal int unz64local_getShort OF((
235381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    const zlib_filefunc64_32_def* pzlib_filefunc_def,
2369e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    voidpf filestream,
2379e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    uLong *pX));
2389e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
239381716e9396b55b1adb8235b020c37344f60ab07Elliott Hugheslocal int unz64local_getShort (const zlib_filefunc64_32_def* pzlib_filefunc_def,
240381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes                             voidpf filestream,
241381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes                             uLong *pX)
2429e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{
2439e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    uLong x ;
244381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    int i = 0;
2459e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    int err;
2469e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
247381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    err = unz64local_getByte(pzlib_filefunc_def,filestream,&i);
2489e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    x = (uLong)i;
2499e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2509e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    if (err==UNZ_OK)
251381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        err = unz64local_getByte(pzlib_filefunc_def,filestream,&i);
252381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    x |= ((uLong)i)<<8;
2539e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2549e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    if (err==UNZ_OK)
2559e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        *pX = x;
2569e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    else
2579e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        *pX = 0;
2589e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    return err;
2599e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project}
2609e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
261381716e9396b55b1adb8235b020c37344f60ab07Elliott Hugheslocal int unz64local_getLong OF((
262381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    const zlib_filefunc64_32_def* pzlib_filefunc_def,
2639e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    voidpf filestream,
2649e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    uLong *pX));
2659e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
266381716e9396b55b1adb8235b020c37344f60ab07Elliott Hugheslocal int unz64local_getLong (const zlib_filefunc64_32_def* pzlib_filefunc_def,
267381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes                            voidpf filestream,
268381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes                            uLong *pX)
2699e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{
2709e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    uLong x ;
271381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    int i = 0;
2729e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    int err;
2739e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
274381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    err = unz64local_getByte(pzlib_filefunc_def,filestream,&i);
2759e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    x = (uLong)i;
2769e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2779e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    if (err==UNZ_OK)
278381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        err = unz64local_getByte(pzlib_filefunc_def,filestream,&i);
279381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    x |= ((uLong)i)<<8;
2809e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2819e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    if (err==UNZ_OK)
282381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        err = unz64local_getByte(pzlib_filefunc_def,filestream,&i);
283381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    x |= ((uLong)i)<<16;
2849e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2859e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    if (err==UNZ_OK)
286381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        err = unz64local_getByte(pzlib_filefunc_def,filestream,&i);
2879e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    x += ((uLong)i)<<24;
2889e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2899e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    if (err==UNZ_OK)
2909e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        *pX = x;
2919e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    else
2929e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        *pX = 0;
2939e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    return err;
2949e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project}
2959e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
296381716e9396b55b1adb8235b020c37344f60ab07Elliott Hugheslocal int unz64local_getLong64 OF((
297381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    const zlib_filefunc64_32_def* pzlib_filefunc_def,
298381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    voidpf filestream,
299381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    ZPOS64_T *pX));
300381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes
301381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes
302381716e9396b55b1adb8235b020c37344f60ab07Elliott Hugheslocal int unz64local_getLong64 (const zlib_filefunc64_32_def* pzlib_filefunc_def,
303381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes                            voidpf filestream,
304381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes                            ZPOS64_T *pX)
305381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes{
306381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    ZPOS64_T x ;
307381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    int i = 0;
308381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    int err;
309381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes
310381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    err = unz64local_getByte(pzlib_filefunc_def,filestream,&i);
311381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    x = (ZPOS64_T)i;
312381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes
313381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    if (err==UNZ_OK)
314381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        err = unz64local_getByte(pzlib_filefunc_def,filestream,&i);
315381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    x |= ((ZPOS64_T)i)<<8;
316381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes
317381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    if (err==UNZ_OK)
318381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        err = unz64local_getByte(pzlib_filefunc_def,filestream,&i);
319381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    x |= ((ZPOS64_T)i)<<16;
320381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes
321381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    if (err==UNZ_OK)
322381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        err = unz64local_getByte(pzlib_filefunc_def,filestream,&i);
323381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    x |= ((ZPOS64_T)i)<<24;
324381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes
325381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    if (err==UNZ_OK)
326381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        err = unz64local_getByte(pzlib_filefunc_def,filestream,&i);
327381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    x |= ((ZPOS64_T)i)<<32;
328381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes
329381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    if (err==UNZ_OK)
330381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        err = unz64local_getByte(pzlib_filefunc_def,filestream,&i);
331381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    x |= ((ZPOS64_T)i)<<40;
332381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes
333381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    if (err==UNZ_OK)
334381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        err = unz64local_getByte(pzlib_filefunc_def,filestream,&i);
335381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    x |= ((ZPOS64_T)i)<<48;
336381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes
337381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    if (err==UNZ_OK)
338381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        err = unz64local_getByte(pzlib_filefunc_def,filestream,&i);
339381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    x |= ((ZPOS64_T)i)<<56;
340381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes
341381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    if (err==UNZ_OK)
342381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        *pX = x;
343381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    else
344381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        *pX = 0;
345381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    return err;
346381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes}
3479e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
3489e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project/* My own strcmpi / strcasecmp */
349381716e9396b55b1adb8235b020c37344f60ab07Elliott Hugheslocal int strcmpcasenosensitive_internal (const char* fileName1, const char* fileName2)
3509e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{
3519e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    for (;;)
3529e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    {
3539e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        char c1=*(fileName1++);
3549e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        char c2=*(fileName2++);
3559e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        if ((c1>='a') && (c1<='z'))
3569e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project            c1 -= 0x20;
3579e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        if ((c2>='a') && (c2<='z'))
3589e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project            c2 -= 0x20;
3599e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        if (c1=='\0')
3609e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project            return ((c2=='\0') ? 0 : -1);
3619e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        if (c2=='\0')
3629e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project            return 1;
3639e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        if (c1<c2)
3649e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project            return -1;
3659e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        if (c1>c2)
3669e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project            return 1;
3679e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    }
3689e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project}
3699e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
3709e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
3719e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#ifdef  CASESENSITIVITYDEFAULT_NO
3729e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#define CASESENSITIVITYDEFAULTVALUE 2
3739e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#else
3749e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#define CASESENSITIVITYDEFAULTVALUE 1
3759e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#endif
3769e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
3779e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#ifndef STRCMPCASENOSENTIVEFUNCTION
3789e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#define STRCMPCASENOSENTIVEFUNCTION strcmpcasenosensitive_internal
3799e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#endif
3809e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
3819e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project/*
3829e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project   Compare two filename (fileName1,fileName2).
3839e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project   If iCaseSenisivity = 1, comparision is case sensitivity (like strcmp)
3849e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project   If iCaseSenisivity = 2, comparision is not case sensitivity (like strcmpi
3859e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                                                                or strcasecmp)
3869e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project   If iCaseSenisivity = 0, case sensitivity is defaut of your operating system
3879e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        (like 1 on Unix, 2 on Windows)
3889e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
3899e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project*/
390381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughesextern int ZEXPORT unzStringFileNameCompare (const char*  fileName1,
391381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes                                                 const char*  fileName2,
392381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes                                                 int iCaseSensitivity)
393381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes
3949e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{
3959e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    if (iCaseSensitivity==0)
3969e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        iCaseSensitivity=CASESENSITIVITYDEFAULTVALUE;
3979e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
3989e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    if (iCaseSensitivity==1)
3999e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        return strcmp(fileName1,fileName2);
4009e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
4019e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    return STRCMPCASENOSENTIVEFUNCTION(fileName1,fileName2);
4029e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project}
4039e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
4049e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#ifndef BUFREADCOMMENT
4059e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#define BUFREADCOMMENT (0x400)
4069e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#endif
4079e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
4089e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project/*
4099e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  Locate the Central directory of a zipfile (at the end, just before
4109e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    the global comment)
4119e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project*/
412381716e9396b55b1adb8235b020c37344f60ab07Elliott Hugheslocal ZPOS64_T unz64local_SearchCentralDir OF((const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream));
413381716e9396b55b1adb8235b020c37344f60ab07Elliott Hugheslocal ZPOS64_T unz64local_SearchCentralDir(const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream)
4149e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{
4159e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    unsigned char* buf;
416381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    ZPOS64_T uSizeFile;
417381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    ZPOS64_T uBackRead;
418381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    ZPOS64_T uMaxBack=0xffff; /* maximum size of global comment */
419381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    ZPOS64_T uPosFound=0;
4209e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
421381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    if (ZSEEK64(*pzlib_filefunc_def,filestream,0,ZLIB_FILEFUNC_SEEK_END) != 0)
4229e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        return 0;
4239e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
4249e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
425381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    uSizeFile = ZTELL64(*pzlib_filefunc_def,filestream);
4269e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
4279e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    if (uMaxBack>uSizeFile)
4289e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        uMaxBack = uSizeFile;
4299e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
4309e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    buf = (unsigned char*)ALLOC(BUFREADCOMMENT+4);
4319e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    if (buf==NULL)
4329e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        return 0;
4339e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
4349e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    uBackRead = 4;
4359e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    while (uBackRead<uMaxBack)
4369e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    {
437381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        uLong uReadSize;
438381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        ZPOS64_T uReadPos ;
4399e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        int i;
4409e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        if (uBackRead+BUFREADCOMMENT>uMaxBack)
4419e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project            uBackRead = uMaxBack;
4429e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        else
4439e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project            uBackRead+=BUFREADCOMMENT;
4449e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        uReadPos = uSizeFile-uBackRead ;
4459e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
4469e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        uReadSize = ((BUFREADCOMMENT+4) < (uSizeFile-uReadPos)) ?
447381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes                     (BUFREADCOMMENT+4) : (uLong)(uSizeFile-uReadPos);
448381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        if (ZSEEK64(*pzlib_filefunc_def,filestream,uReadPos,ZLIB_FILEFUNC_SEEK_SET)!=0)
4499e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project            break;
4509e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
451381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        if (ZREAD64(*pzlib_filefunc_def,filestream,buf,uReadSize)!=uReadSize)
4529e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project            break;
4539e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
4549e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        for (i=(int)uReadSize-3; (i--)>0;)
4559e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project            if (((*(buf+i))==0x50) && ((*(buf+i+1))==0x4b) &&
4569e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                ((*(buf+i+2))==0x05) && ((*(buf+i+3))==0x06))
4579e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project            {
4589e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                uPosFound = uReadPos+i;
4599e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                break;
4609e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project            }
4619e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
4629e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        if (uPosFound!=0)
4639e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project            break;
4649e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    }
4659e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    TRYFREE(buf);
4669e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    return uPosFound;
4679e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project}
4689e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
469381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes
470381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes/*
471381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes  Locate the Central directory 64 of a zipfile (at the end, just before
472381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    the global comment)
473381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes*/
474381716e9396b55b1adb8235b020c37344f60ab07Elliott Hugheslocal ZPOS64_T unz64local_SearchCentralDir64 OF((
475381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    const zlib_filefunc64_32_def* pzlib_filefunc_def,
476381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    voidpf filestream));
477381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes
478381716e9396b55b1adb8235b020c37344f60ab07Elliott Hugheslocal ZPOS64_T unz64local_SearchCentralDir64(const zlib_filefunc64_32_def* pzlib_filefunc_def,
479381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes                                      voidpf filestream)
480381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes{
481381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    unsigned char* buf;
482381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    ZPOS64_T uSizeFile;
483381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    ZPOS64_T uBackRead;
484381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    ZPOS64_T uMaxBack=0xffff; /* maximum size of global comment */
485381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    ZPOS64_T uPosFound=0;
486381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    uLong uL;
487381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes                ZPOS64_T relativeOffset;
488381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes
489381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    if (ZSEEK64(*pzlib_filefunc_def,filestream,0,ZLIB_FILEFUNC_SEEK_END) != 0)
490381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        return 0;
491381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes
492381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes
493381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    uSizeFile = ZTELL64(*pzlib_filefunc_def,filestream);
494381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes
495381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    if (uMaxBack>uSizeFile)
496381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        uMaxBack = uSizeFile;
497381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes
498381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    buf = (unsigned char*)ALLOC(BUFREADCOMMENT+4);
499381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    if (buf==NULL)
500381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        return 0;
501381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes
502381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    uBackRead = 4;
503381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    while (uBackRead<uMaxBack)
504381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    {
505381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        uLong uReadSize;
506381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        ZPOS64_T uReadPos;
507381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        int i;
508381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        if (uBackRead+BUFREADCOMMENT>uMaxBack)
509381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes            uBackRead = uMaxBack;
510381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        else
511381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes            uBackRead+=BUFREADCOMMENT;
512381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        uReadPos = uSizeFile-uBackRead ;
513381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes
514381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        uReadSize = ((BUFREADCOMMENT+4) < (uSizeFile-uReadPos)) ?
515381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes                     (BUFREADCOMMENT+4) : (uLong)(uSizeFile-uReadPos);
516381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        if (ZSEEK64(*pzlib_filefunc_def,filestream,uReadPos,ZLIB_FILEFUNC_SEEK_SET)!=0)
517381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes            break;
518381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes
519381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        if (ZREAD64(*pzlib_filefunc_def,filestream,buf,uReadSize)!=uReadSize)
520381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes            break;
521381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes
522381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        for (i=(int)uReadSize-3; (i--)>0;)
523381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes            if (((*(buf+i))==0x50) && ((*(buf+i+1))==0x4b) &&
524381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes                ((*(buf+i+2))==0x06) && ((*(buf+i+3))==0x07))
525381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes            {
526381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes                uPosFound = uReadPos+i;
527381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes                break;
528381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes            }
529381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes
530381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        if (uPosFound!=0)
531381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes            break;
532381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    }
533381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    TRYFREE(buf);
534381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    if (uPosFound == 0)
535381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        return 0;
536381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes
537381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    /* Zip64 end of central directory locator */
538381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    if (ZSEEK64(*pzlib_filefunc_def,filestream, uPosFound,ZLIB_FILEFUNC_SEEK_SET)!=0)
539381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        return 0;
540381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes
541381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    /* the signature, already checked */
542381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    if (unz64local_getLong(pzlib_filefunc_def,filestream,&uL)!=UNZ_OK)
543381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        return 0;
544381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes
545381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    /* number of the disk with the start of the zip64 end of  central directory */
546381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    if (unz64local_getLong(pzlib_filefunc_def,filestream,&uL)!=UNZ_OK)
547381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        return 0;
548381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    if (uL != 0)
549381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        return 0;
550381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes
551381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    /* relative offset of the zip64 end of central directory record */
552381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    if (unz64local_getLong64(pzlib_filefunc_def,filestream,&relativeOffset)!=UNZ_OK)
553381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        return 0;
554381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes
555381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    /* total number of disks */
556381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    if (unz64local_getLong(pzlib_filefunc_def,filestream,&uL)!=UNZ_OK)
557381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        return 0;
558381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    if (uL != 1)
559381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        return 0;
560381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes
561381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    /* Goto end of central directory record */
562381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    if (ZSEEK64(*pzlib_filefunc_def,filestream, relativeOffset,ZLIB_FILEFUNC_SEEK_SET)!=0)
563381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        return 0;
564381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes
565381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes     /* the signature */
566381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    if (unz64local_getLong(pzlib_filefunc_def,filestream,&uL)!=UNZ_OK)
567381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        return 0;
568381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes
569381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    if (uL != 0x06064b50)
570381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        return 0;
571381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes
572381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    return relativeOffset;
573381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes}
574381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes
5759e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project/*
5769e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  Open a Zip file. path contain the full pathname (by example,
5779e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project     on a Windows NT computer "c:\\test\\zlib114.zip" or on an Unix computer
5789e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project     "zlib/zlib114.zip".
5799e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project     If the zipfile cannot be opened (file doesn't exist or in not valid), the
5809e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project       return value is NULL.
5819e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project     Else, the return value is a unzFile Handle, usable with other function
5829e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project       of this unzip package.
5839e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project*/
584381716e9396b55b1adb8235b020c37344f60ab07Elliott Hugheslocal unzFile unzOpenInternal (const void *path,
585381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes                               zlib_filefunc64_32_def* pzlib_filefunc64_32_def,
586381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes                               int is64bitOpenFunction)
5879e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{
588381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    unz64_s us;
589381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    unz64_s *s;
590381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    ZPOS64_T central_pos;
591381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    uLong   uL;
5929e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
5939e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    uLong number_disk;          /* number of the current dist, used for
5949e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                                   spaning ZIP, unsupported, always 0*/
5959e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    uLong number_disk_with_CD;  /* number the the disk with central dir, used
5969e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                                   for spaning ZIP, unsupported, always 0*/
597381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    ZPOS64_T number_entry_CD;      /* total number of entries in
5989e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                                   the central dir
5999e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                                   (same than number_entry on nospan) */
6009e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
6019e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    int err=UNZ_OK;
6029e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
6039e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    if (unz_copyright[0]!=' ')
6049e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        return NULL;
6059e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
606381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    us.z_filefunc.zseek32_file = NULL;
607381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    us.z_filefunc.ztell32_file = NULL;
608381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    if (pzlib_filefunc64_32_def==NULL)
609381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        fill_fopen64_filefunc(&us.z_filefunc.zfile_func64);
6109e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    else
611381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        us.z_filefunc = *pzlib_filefunc64_32_def;
612381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    us.is64bitOpenFunction = is64bitOpenFunction;
6139e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
614381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes
615381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes
616381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    us.filestream = ZOPEN64(us.z_filefunc,
6179e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                                                 path,
6189e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                                                 ZLIB_FILEFUNC_MODE_READ |
6199e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                                                 ZLIB_FILEFUNC_MODE_EXISTING);
6209e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    if (us.filestream==NULL)
6219e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        return NULL;
6229e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
623381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    central_pos = unz64local_SearchCentralDir64(&us.z_filefunc,us.filestream);
624381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    if (central_pos)
625381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    {
626381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        uLong uS;
627381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        ZPOS64_T uL64;
628381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes
629381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        us.isZip64 = 1;
6309e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
631381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        if (ZSEEK64(us.z_filefunc, us.filestream,
6329e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                                      central_pos,ZLIB_FILEFUNC_SEEK_SET)!=0)
6339e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        err=UNZ_ERRNO;
6349e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
635381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        /* the signature, already checked */
636381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        if (unz64local_getLong(&us.z_filefunc, us.filestream,&uL)!=UNZ_OK)
637381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes            err=UNZ_ERRNO;
6389e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
639381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        /* size of zip64 end of central directory record */
640381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        if (unz64local_getLong64(&us.z_filefunc, us.filestream,&uL64)!=UNZ_OK)
641381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes            err=UNZ_ERRNO;
6429e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
643381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        /* version made by */
644381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        if (unz64local_getShort(&us.z_filefunc, us.filestream,&uS)!=UNZ_OK)
645381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes            err=UNZ_ERRNO;
6469e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
647381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        /* version needed to extract */
648381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        if (unz64local_getShort(&us.z_filefunc, us.filestream,&uS)!=UNZ_OK)
649381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes            err=UNZ_ERRNO;
6509e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
651381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        /* number of this disk */
652381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        if (unz64local_getLong(&us.z_filefunc, us.filestream,&number_disk)!=UNZ_OK)
653381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes            err=UNZ_ERRNO;
6549e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
655381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        /* number of the disk with the start of the central directory */
656381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        if (unz64local_getLong(&us.z_filefunc, us.filestream,&number_disk_with_CD)!=UNZ_OK)
657381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes            err=UNZ_ERRNO;
6589e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
659381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        /* total number of entries in the central directory on this disk */
660381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        if (unz64local_getLong64(&us.z_filefunc, us.filestream,&us.gi.number_entry)!=UNZ_OK)
661381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes            err=UNZ_ERRNO;
662381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes
663381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        /* total number of entries in the central directory */
664381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        if (unz64local_getLong64(&us.z_filefunc, us.filestream,&number_entry_CD)!=UNZ_OK)
665381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes            err=UNZ_ERRNO;
6669e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
667381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        if ((number_entry_CD!=us.gi.number_entry) ||
668381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes            (number_disk_with_CD!=0) ||
669381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes            (number_disk!=0))
670381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes            err=UNZ_BADZIPFILE;
671381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes
672381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        /* size of the central directory */
673381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        if (unz64local_getLong64(&us.z_filefunc, us.filestream,&us.size_central_dir)!=UNZ_OK)
674381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes            err=UNZ_ERRNO;
675381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes
676381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        /* offset of start of central directory with respect to the
6779e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project          starting disk number */
678381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        if (unz64local_getLong64(&us.z_filefunc, us.filestream,&us.offset_central_dir)!=UNZ_OK)
679381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes            err=UNZ_ERRNO;
6809e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
681381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        us.gi.size_comment = 0;
682381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    }
683381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    else
684381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    {
685381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        central_pos = unz64local_SearchCentralDir(&us.z_filefunc,us.filestream);
686381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        if (central_pos==0)
687381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes            err=UNZ_ERRNO;
688381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes
689381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        us.isZip64 = 0;
690381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes
691381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        if (ZSEEK64(us.z_filefunc, us.filestream,
692381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes                                        central_pos,ZLIB_FILEFUNC_SEEK_SET)!=0)
693381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes            err=UNZ_ERRNO;
694381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes
695381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        /* the signature, already checked */
696381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        if (unz64local_getLong(&us.z_filefunc, us.filestream,&uL)!=UNZ_OK)
697381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes            err=UNZ_ERRNO;
698381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes
699381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        /* number of this disk */
700381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        if (unz64local_getShort(&us.z_filefunc, us.filestream,&number_disk)!=UNZ_OK)
701381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes            err=UNZ_ERRNO;
702381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes
703381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        /* number of the disk with the start of the central directory */
704381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        if (unz64local_getShort(&us.z_filefunc, us.filestream,&number_disk_with_CD)!=UNZ_OK)
705381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes            err=UNZ_ERRNO;
706381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes
707381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        /* total number of entries in the central dir on this disk */
708381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        if (unz64local_getShort(&us.z_filefunc, us.filestream,&uL)!=UNZ_OK)
709381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes            err=UNZ_ERRNO;
710381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        us.gi.number_entry = uL;
711381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes
712381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        /* total number of entries in the central dir */
713381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        if (unz64local_getShort(&us.z_filefunc, us.filestream,&uL)!=UNZ_OK)
714381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes            err=UNZ_ERRNO;
715381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        number_entry_CD = uL;
716381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes
717381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        if ((number_entry_CD!=us.gi.number_entry) ||
718381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes            (number_disk_with_CD!=0) ||
719381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes            (number_disk!=0))
720381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes            err=UNZ_BADZIPFILE;
721381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes
722381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        /* size of the central directory */
723381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        if (unz64local_getLong(&us.z_filefunc, us.filestream,&uL)!=UNZ_OK)
724381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes            err=UNZ_ERRNO;
725381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        us.size_central_dir = uL;
726381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes
727381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        /* offset of start of central directory with respect to the
728381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes            starting disk number */
729381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        if (unz64local_getLong(&us.z_filefunc, us.filestream,&uL)!=UNZ_OK)
730381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes            err=UNZ_ERRNO;
731381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        us.offset_central_dir = uL;
732381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes
733381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        /* zipfile comment length */
734381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        if (unz64local_getShort(&us.z_filefunc, us.filestream,&us.gi.size_comment)!=UNZ_OK)
735381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes            err=UNZ_ERRNO;
736381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    }
7379e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
7389e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    if ((central_pos<us.offset_central_dir+us.size_central_dir) &&
7399e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        (err==UNZ_OK))
7409e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        err=UNZ_BADZIPFILE;
7419e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
7429e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    if (err!=UNZ_OK)
7439e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    {
744381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        ZCLOSE64(us.z_filefunc, us.filestream);
7459e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        return NULL;
7469e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    }
7479e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
7489e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    us.byte_before_the_zipfile = central_pos -
7499e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                            (us.offset_central_dir+us.size_central_dir);
7509e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    us.central_pos = central_pos;
7519e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    us.pfile_in_zip_read = NULL;
7529e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    us.encrypted = 0;
7539e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
7549e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
755381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    s=(unz64_s*)ALLOC(sizeof(unz64_s));
756381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    if( s != NULL)
757381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    {
758381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        *s=us;
759381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        unzGoToFirstFile((unzFile)s);
760381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    }
7619e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    return (unzFile)s;
7629e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project}
7639e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
7649e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
765381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughesextern unzFile ZEXPORT unzOpen2 (const char *path,
766381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes                                        zlib_filefunc_def* pzlib_filefunc32_def)
7679e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{
768381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    if (pzlib_filefunc32_def != NULL)
769381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    {
770381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        zlib_filefunc64_32_def zlib_filefunc64_32_def_fill;
771381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        fill_zlib_filefunc64_32_def_from_filefunc32(&zlib_filefunc64_32_def_fill,pzlib_filefunc32_def);
772381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        return unzOpenInternal(path, &zlib_filefunc64_32_def_fill, 0);
773381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    }
774381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    else
775381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        return unzOpenInternal(path, NULL, 0);
776381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes}
777381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes
778381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughesextern unzFile ZEXPORT unzOpen2_64 (const void *path,
779381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes                                     zlib_filefunc64_def* pzlib_filefunc_def)
780381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes{
781381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    if (pzlib_filefunc_def != NULL)
782381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    {
783381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        zlib_filefunc64_32_def zlib_filefunc64_32_def_fill;
784381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        zlib_filefunc64_32_def_fill.zfile_func64 = *pzlib_filefunc_def;
785381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        zlib_filefunc64_32_def_fill.ztell32_file = NULL;
786381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        zlib_filefunc64_32_def_fill.zseek32_file = NULL;
787381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        return unzOpenInternal(path, &zlib_filefunc64_32_def_fill, 1);
788381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    }
789381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    else
790381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        return unzOpenInternal(path, NULL, 1);
791381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes}
792381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes
793381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughesextern unzFile ZEXPORT unzOpen (const char *path)
794381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes{
795381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    return unzOpenInternal(path, NULL, 0);
796381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes}
797381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes
798381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughesextern unzFile ZEXPORT unzOpen64 (const void *path)
799381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes{
800381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    return unzOpenInternal(path, NULL, 1);
8019e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project}
8029e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
8039e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project/*
80404351a92ecc8429c999acbfc5dfe5aa8bee1d19dElliott Hughes  Close a ZipFile opened with unzOpen.
80504351a92ecc8429c999acbfc5dfe5aa8bee1d19dElliott Hughes  If there is files inside the .Zip opened with unzOpenCurrentFile (see later),
80604351a92ecc8429c999acbfc5dfe5aa8bee1d19dElliott Hughes    these files MUST be closed with unzCloseCurrentFile before call unzClose.
8079e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  return UNZ_OK if there is no problem. */
808381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughesextern int ZEXPORT unzClose (unzFile file)
8099e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{
810381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    unz64_s* s;
8119e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    if (file==NULL)
8129e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        return UNZ_PARAMERROR;
813381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    s=(unz64_s*)file;
8149e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
8159e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    if (s->pfile_in_zip_read!=NULL)
8169e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        unzCloseCurrentFile(file);
8179e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
818381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    ZCLOSE64(s->z_filefunc, s->filestream);
8199e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    TRYFREE(s);
8209e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    return UNZ_OK;
8219e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project}
8229e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
8239e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
8249e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project/*
8259e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  Write info about the ZipFile in the *pglobal_info structure.
8269e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  No preparation of the structure is needed
8279e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  return UNZ_OK if there is no problem. */
828381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughesextern int ZEXPORT unzGetGlobalInfo64 (unzFile file, unz_global_info64* pglobal_info)
8299e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{
830381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    unz64_s* s;
8319e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    if (file==NULL)
8329e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        return UNZ_PARAMERROR;
833381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    s=(unz64_s*)file;
8349e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    *pglobal_info=s->gi;
8359e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    return UNZ_OK;
8369e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project}
8379e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
838381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughesextern int ZEXPORT unzGetGlobalInfo (unzFile file, unz_global_info* pglobal_info32)
839381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes{
840381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    unz64_s* s;
841381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    if (file==NULL)
842381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        return UNZ_PARAMERROR;
843381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    s=(unz64_s*)file;
844381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    /* to do : check if number_entry is not truncated */
845381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    pglobal_info32->number_entry = (uLong)s->gi.number_entry;
846381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    pglobal_info32->size_comment = s->gi.size_comment;
847381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    return UNZ_OK;
848381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes}
8499e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project/*
8509e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project   Translate date/time from Dos format to tm_unz (readable more easilty)
8519e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project*/
852381716e9396b55b1adb8235b020c37344f60ab07Elliott Hugheslocal void unz64local_DosDateToTmuDate (ZPOS64_T ulDosDate, tm_unz* ptm)
8539e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{
854381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    ZPOS64_T uDate;
855381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    uDate = (ZPOS64_T)(ulDosDate>>16);
8569e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    ptm->tm_mday = (uInt)(uDate&0x1f) ;
8579e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    ptm->tm_mon =  (uInt)((((uDate)&0x1E0)/0x20)-1) ;
8589e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    ptm->tm_year = (uInt)(((uDate&0x0FE00)/0x0200)+1980) ;
8599e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
8609e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    ptm->tm_hour = (uInt) ((ulDosDate &0xF800)/0x800);
8619e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    ptm->tm_min =  (uInt) ((ulDosDate&0x7E0)/0x20) ;
8629e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    ptm->tm_sec =  (uInt) (2*(ulDosDate&0x1f)) ;
8639e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project}
8649e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
8659e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project/*
8669e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  Get Info about the current file in the zipfile, with internal only info
8679e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project*/
868381716e9396b55b1adb8235b020c37344f60ab07Elliott Hugheslocal int unz64local_GetCurrentFileInfoInternal OF((unzFile file,
869381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes                                                  unz_file_info64 *pfile_info,
870381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes                                                  unz_file_info64_internal
8719e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                                                  *pfile_info_internal,
8729e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                                                  char *szFileName,
8739e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                                                  uLong fileNameBufferSize,
8749e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                                                  void *extraField,
8759e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                                                  uLong extraFieldBufferSize,
8769e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                                                  char *szComment,
8779e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                                                  uLong commentBufferSize));
8789e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
879381716e9396b55b1adb8235b020c37344f60ab07Elliott Hugheslocal int unz64local_GetCurrentFileInfoInternal (unzFile file,
880381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes                                                  unz_file_info64 *pfile_info,
881381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes                                                  unz_file_info64_internal
882381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes                                                  *pfile_info_internal,
883381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes                                                  char *szFileName,
884381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes                                                  uLong fileNameBufferSize,
885381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes                                                  void *extraField,
886381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes                                                  uLong extraFieldBufferSize,
887381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes                                                  char *szComment,
888381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes                                                  uLong commentBufferSize)
8899e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{
890381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    unz64_s* s;
891381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    unz_file_info64 file_info;
892381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    unz_file_info64_internal file_info_internal;
8939e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    int err=UNZ_OK;
8949e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    uLong uMagic;
8959e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    long lSeek=0;
896381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    uLong uL;
8979e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
8989e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    if (file==NULL)
8999e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        return UNZ_PARAMERROR;
900381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    s=(unz64_s*)file;
901381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    if (ZSEEK64(s->z_filefunc, s->filestream,
9029e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project              s->pos_in_central_dir+s->byte_before_the_zipfile,
9039e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project              ZLIB_FILEFUNC_SEEK_SET)!=0)
9049e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        err=UNZ_ERRNO;
9059e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
9069e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
9079e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    /* we check the magic */
9089e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    if (err==UNZ_OK)
909381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    {
910381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        if (unz64local_getLong(&s->z_filefunc, s->filestream,&uMagic) != UNZ_OK)
9119e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project            err=UNZ_ERRNO;
9129e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        else if (uMagic!=0x02014b50)
9139e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project            err=UNZ_BADZIPFILE;
914381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    }
9159e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
916381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    if (unz64local_getShort(&s->z_filefunc, s->filestream,&file_info.version) != UNZ_OK)
9179e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        err=UNZ_ERRNO;
9189e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
919381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    if (unz64local_getShort(&s->z_filefunc, s->filestream,&file_info.version_needed) != UNZ_OK)
9209e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        err=UNZ_ERRNO;
9219e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
922381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    if (unz64local_getShort(&s->z_filefunc, s->filestream,&file_info.flag) != UNZ_OK)
9239e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        err=UNZ_ERRNO;
9249e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
925381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    if (unz64local_getShort(&s->z_filefunc, s->filestream,&file_info.compression_method) != UNZ_OK)
9269e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        err=UNZ_ERRNO;
9279e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
928381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    if (unz64local_getLong(&s->z_filefunc, s->filestream,&file_info.dosDate) != UNZ_OK)
9299e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        err=UNZ_ERRNO;
9309e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
931381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    unz64local_DosDateToTmuDate(file_info.dosDate,&file_info.tmu_date);
9329e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
933381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    if (unz64local_getLong(&s->z_filefunc, s->filestream,&file_info.crc) != UNZ_OK)
9349e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        err=UNZ_ERRNO;
9359e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
936381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    if (unz64local_getLong(&s->z_filefunc, s->filestream,&uL) != UNZ_OK)
9379e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        err=UNZ_ERRNO;
938381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    file_info.compressed_size = uL;
9399e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
940381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    if (unz64local_getLong(&s->z_filefunc, s->filestream,&uL) != UNZ_OK)
9419e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        err=UNZ_ERRNO;
942381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    file_info.uncompressed_size = uL;
9439e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
944381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    if (unz64local_getShort(&s->z_filefunc, s->filestream,&file_info.size_filename) != UNZ_OK)
9459e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        err=UNZ_ERRNO;
9469e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
947381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    if (unz64local_getShort(&s->z_filefunc, s->filestream,&file_info.size_file_extra) != UNZ_OK)
9489e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        err=UNZ_ERRNO;
9499e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
950381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    if (unz64local_getShort(&s->z_filefunc, s->filestream,&file_info.size_file_comment) != UNZ_OK)
9519e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        err=UNZ_ERRNO;
9529e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
953381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    if (unz64local_getShort(&s->z_filefunc, s->filestream,&file_info.disk_num_start) != UNZ_OK)
9549e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        err=UNZ_ERRNO;
9559e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
956381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    if (unz64local_getShort(&s->z_filefunc, s->filestream,&file_info.internal_fa) != UNZ_OK)
9579e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        err=UNZ_ERRNO;
9589e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
959381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    if (unz64local_getLong(&s->z_filefunc, s->filestream,&file_info.external_fa) != UNZ_OK)
9609e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        err=UNZ_ERRNO;
9619e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
962381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes                // relative offset of local header
963381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    if (unz64local_getLong(&s->z_filefunc, s->filestream,&uL) != UNZ_OK)
9649e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        err=UNZ_ERRNO;
965381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    file_info_internal.offset_curfile = uL;
9669e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
9679e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    lSeek+=file_info.size_filename;
9689e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    if ((err==UNZ_OK) && (szFileName!=NULL))
9699e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    {
9709e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        uLong uSizeRead ;
9719e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        if (file_info.size_filename<fileNameBufferSize)
9729e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        {
9739e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project            *(szFileName+file_info.size_filename)='\0';
9749e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project            uSizeRead = file_info.size_filename;
9759e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        }
9769e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        else
9779e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project            uSizeRead = fileNameBufferSize;
9789e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
9799e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        if ((file_info.size_filename>0) && (fileNameBufferSize>0))
980381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes            if (ZREAD64(s->z_filefunc, s->filestream,szFileName,uSizeRead)!=uSizeRead)
9819e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                err=UNZ_ERRNO;
9829e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        lSeek -= uSizeRead;
9839e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    }
9849e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
985381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    // Read extrafield
9869e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    if ((err==UNZ_OK) && (extraField!=NULL))
9879e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    {
988381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        ZPOS64_T uSizeRead ;
9899e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        if (file_info.size_file_extra<extraFieldBufferSize)
9909e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project            uSizeRead = file_info.size_file_extra;
9919e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        else
9929e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project            uSizeRead = extraFieldBufferSize;
9939e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
9949e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        if (lSeek!=0)
995381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        {
996381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes            if (ZSEEK64(s->z_filefunc, s->filestream,lSeek,ZLIB_FILEFUNC_SEEK_CUR)==0)
9979e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                lSeek=0;
9989e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project            else
9999e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                err=UNZ_ERRNO;
1000381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        }
1001381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes
10029e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        if ((file_info.size_file_extra>0) && (extraFieldBufferSize>0))
1003381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes            if (ZREAD64(s->z_filefunc, s->filestream,extraField,(uLong)uSizeRead)!=uSizeRead)
10049e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                err=UNZ_ERRNO;
1005381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes
1006381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        lSeek += file_info.size_file_extra - (uLong)uSizeRead;
10079e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    }
10089e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    else
1009381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        lSeek += file_info.size_file_extra;
1010381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes
1011381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes
1012381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    if ((err==UNZ_OK) && (file_info.size_file_extra != 0))
1013381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    {
1014381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes                                uLong acc = 0;
1015381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes
1016381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        // since lSeek now points to after the extra field we need to move back
1017381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        lSeek -= file_info.size_file_extra;
1018381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes
1019381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        if (lSeek!=0)
1020381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        {
1021381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes            if (ZSEEK64(s->z_filefunc, s->filestream,lSeek,ZLIB_FILEFUNC_SEEK_CUR)==0)
1022381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes                lSeek=0;
1023381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes            else
1024381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes                err=UNZ_ERRNO;
1025381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        }
10269e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1027381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        while(acc < file_info.size_file_extra)
1028381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        {
1029381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes            uLong headerId;
1030381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes                                                uLong dataSize;
1031381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes
1032381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes            if (unz64local_getShort(&s->z_filefunc, s->filestream,&headerId) != UNZ_OK)
1033381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes                err=UNZ_ERRNO;
1034381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes
1035381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes            if (unz64local_getShort(&s->z_filefunc, s->filestream,&dataSize) != UNZ_OK)
1036381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes                err=UNZ_ERRNO;
1037381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes
1038381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes            /* ZIP64 extra fields */
1039381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes            if (headerId == 0x0001)
1040381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes            {
1041381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes                                                        uLong uL;
1042381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes
1043ee9e11d0d4e3361533860bf04896abb86a291bfbElliott Hughes                                                                if(file_info.uncompressed_size == MAXU32)
1044381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes                                                                {
1045381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes                                                                        if (unz64local_getLong64(&s->z_filefunc, s->filestream,&file_info.uncompressed_size) != UNZ_OK)
1046381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes                                                                                        err=UNZ_ERRNO;
1047381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes                                                                }
1048381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes
1049ee9e11d0d4e3361533860bf04896abb86a291bfbElliott Hughes                                                                if(file_info.compressed_size == MAXU32)
1050381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes                                                                {
1051381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes                                                                        if (unz64local_getLong64(&s->z_filefunc, s->filestream,&file_info.compressed_size) != UNZ_OK)
1052381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes                                                                                  err=UNZ_ERRNO;
1053381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes                                                                }
1054381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes
1055ee9e11d0d4e3361533860bf04896abb86a291bfbElliott Hughes                                                                if(file_info_internal.offset_curfile == MAXU32)
1056381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes                                                                {
1057381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes                                                                        /* Relative Header offset */
1058381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes                                                                        if (unz64local_getLong64(&s->z_filefunc, s->filestream,&file_info_internal.offset_curfile) != UNZ_OK)
1059381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes                                                                                err=UNZ_ERRNO;
1060381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes                                                                }
1061381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes
1062ee9e11d0d4e3361533860bf04896abb86a291bfbElliott Hughes                                                                if(file_info.disk_num_start == MAXU32)
1063381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes                                                                {
1064381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes                                                                        /* Disk Start Number */
1065381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes                                                                        if (unz64local_getLong(&s->z_filefunc, s->filestream,&uL) != UNZ_OK)
1066381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes                                                                                err=UNZ_ERRNO;
1067381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes                                                                }
1068381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes
1069381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes            }
1070381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes            else
1071381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes            {
1072381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes                if (ZSEEK64(s->z_filefunc, s->filestream,dataSize,ZLIB_FILEFUNC_SEEK_CUR)!=0)
1073381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes                    err=UNZ_ERRNO;
1074381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes            }
1075381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes
1076381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes            acc += 2 + 2 + dataSize;
1077381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        }
1078381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    }
10799e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
10809e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    if ((err==UNZ_OK) && (szComment!=NULL))
10819e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    {
10829e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        uLong uSizeRead ;
10839e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        if (file_info.size_file_comment<commentBufferSize)
10849e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        {
10859e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project            *(szComment+file_info.size_file_comment)='\0';
10869e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project            uSizeRead = file_info.size_file_comment;
10879e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        }
10889e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        else
10899e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project            uSizeRead = commentBufferSize;
10909e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
10919e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        if (lSeek!=0)
1092381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        {
1093381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes            if (ZSEEK64(s->z_filefunc, s->filestream,lSeek,ZLIB_FILEFUNC_SEEK_CUR)==0)
10949e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                lSeek=0;
10959e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project            else
10969e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                err=UNZ_ERRNO;
1097381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        }
1098381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes
10999e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        if ((file_info.size_file_comment>0) && (commentBufferSize>0))
1100381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes            if (ZREAD64(s->z_filefunc, s->filestream,szComment,uSizeRead)!=uSizeRead)
11019e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                err=UNZ_ERRNO;
11029e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        lSeek+=file_info.size_file_comment - uSizeRead;
11039e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    }
11049e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    else
11059e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        lSeek+=file_info.size_file_comment;
11069e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1107381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes
11089e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    if ((err==UNZ_OK) && (pfile_info!=NULL))
11099e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        *pfile_info=file_info;
11109e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
11119e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    if ((err==UNZ_OK) && (pfile_info_internal!=NULL))
11129e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        *pfile_info_internal=file_info_internal;
11139e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
11149e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    return err;
11159e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project}
11169e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
11179e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
11189e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
11199e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project/*
11209e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  Write info about the ZipFile in the *pglobal_info structure.
11219e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  No preparation of the structure is needed
11229e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  return UNZ_OK if there is no problem.
11239e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project*/
1124381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughesextern int ZEXPORT unzGetCurrentFileInfo64 (unzFile file,
1125381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes                                          unz_file_info64 * pfile_info,
1126381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes                                          char * szFileName, uLong fileNameBufferSize,
1127381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes                                          void *extraField, uLong extraFieldBufferSize,
1128381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes                                          char* szComment,  uLong commentBufferSize)
11299e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{
1130381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    return unz64local_GetCurrentFileInfoInternal(file,pfile_info,NULL,
11319e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                                                szFileName,fileNameBufferSize,
11329e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                                                extraField,extraFieldBufferSize,
11339e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                                                szComment,commentBufferSize);
11349e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project}
11359e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1136381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughesextern int ZEXPORT unzGetCurrentFileInfo (unzFile file,
1137381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes                                          unz_file_info * pfile_info,
1138381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes                                          char * szFileName, uLong fileNameBufferSize,
1139381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes                                          void *extraField, uLong extraFieldBufferSize,
1140381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes                                          char* szComment,  uLong commentBufferSize)
1141381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes{
1142381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    int err;
1143381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    unz_file_info64 file_info64;
1144381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    err = unz64local_GetCurrentFileInfoInternal(file,&file_info64,NULL,
1145381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes                                                szFileName,fileNameBufferSize,
1146381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes                                                extraField,extraFieldBufferSize,
1147381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes                                                szComment,commentBufferSize);
1148ee9e11d0d4e3361533860bf04896abb86a291bfbElliott Hughes    if ((err==UNZ_OK) && (pfile_info != NULL))
1149381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    {
1150381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        pfile_info->version = file_info64.version;
1151381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        pfile_info->version_needed = file_info64.version_needed;
1152381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        pfile_info->flag = file_info64.flag;
1153381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        pfile_info->compression_method = file_info64.compression_method;
1154381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        pfile_info->dosDate = file_info64.dosDate;
1155381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        pfile_info->crc = file_info64.crc;
1156381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes
1157381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        pfile_info->size_filename = file_info64.size_filename;
1158381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        pfile_info->size_file_extra = file_info64.size_file_extra;
1159381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        pfile_info->size_file_comment = file_info64.size_file_comment;
1160381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes
1161381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        pfile_info->disk_num_start = file_info64.disk_num_start;
1162381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        pfile_info->internal_fa = file_info64.internal_fa;
1163381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        pfile_info->external_fa = file_info64.external_fa;
1164381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes
1165381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        pfile_info->tmu_date = file_info64.tmu_date,
1166381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes
1167381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes
1168381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        pfile_info->compressed_size = (uLong)file_info64.compressed_size;
1169381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        pfile_info->uncompressed_size = (uLong)file_info64.uncompressed_size;
1170381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes
1171381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    }
1172381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    return err;
1173381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes}
11749e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project/*
11759e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  Set the current file of the zipfile to the first file.
11769e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  return UNZ_OK if there is no problem
11779e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project*/
1178381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughesextern int ZEXPORT unzGoToFirstFile (unzFile file)
11799e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{
11809e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    int err=UNZ_OK;
1181381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    unz64_s* s;
11829e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    if (file==NULL)
11839e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        return UNZ_PARAMERROR;
1184381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    s=(unz64_s*)file;
11859e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    s->pos_in_central_dir=s->offset_central_dir;
11869e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    s->num_file=0;
1187381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    err=unz64local_GetCurrentFileInfoInternal(file,&s->cur_file_info,
11889e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                                             &s->cur_file_info_internal,
11899e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                                             NULL,0,NULL,0,NULL,0);
11909e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    s->current_file_ok = (err == UNZ_OK);
11919e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    return err;
11929e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project}
11939e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
11949e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project/*
11959e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  Set the current file of the zipfile to the next file.
11969e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  return UNZ_OK if there is no problem
11979e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  return UNZ_END_OF_LIST_OF_FILE if the actual file was the latest.
11989e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project*/
1199381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughesextern int ZEXPORT unzGoToNextFile (unzFile  file)
12009e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{
1201381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    unz64_s* s;
12029e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    int err;
12039e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
12049e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    if (file==NULL)
12059e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        return UNZ_PARAMERROR;
1206381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    s=(unz64_s*)file;
12079e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    if (!s->current_file_ok)
12089e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        return UNZ_END_OF_LIST_OF_FILE;
12099e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    if (s->gi.number_entry != 0xffff)    /* 2^16 files overflow hack */
12109e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project      if (s->num_file+1==s->gi.number_entry)
12119e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        return UNZ_END_OF_LIST_OF_FILE;
12129e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
12139e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    s->pos_in_central_dir += SIZECENTRALDIRITEM + s->cur_file_info.size_filename +
12149e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project            s->cur_file_info.size_file_extra + s->cur_file_info.size_file_comment ;
12159e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    s->num_file++;
1216381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    err = unz64local_GetCurrentFileInfoInternal(file,&s->cur_file_info,
12179e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                                               &s->cur_file_info_internal,
12189e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                                               NULL,0,NULL,0,NULL,0);
12199e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    s->current_file_ok = (err == UNZ_OK);
12209e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    return err;
12219e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project}
12229e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
12239e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
12249e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project/*
12259e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  Try locate the file szFileName in the zipfile.
122604351a92ecc8429c999acbfc5dfe5aa8bee1d19dElliott Hughes  For the iCaseSensitivity signification, see unzStringFileNameCompare
12279e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
12289e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  return value :
12299e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  UNZ_OK if the file is found. It becomes the current file.
12309e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  UNZ_END_OF_LIST_OF_FILE if the file is not found
12319e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project*/
1232381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughesextern int ZEXPORT unzLocateFile (unzFile file, const char *szFileName, int iCaseSensitivity)
12339e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{
1234381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    unz64_s* s;
12359e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    int err;
12369e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
12379e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    /* We remember the 'current' position in the file so that we can jump
12389e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project     * back there if we fail.
12399e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project     */
1240381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    unz_file_info64 cur_file_infoSaved;
1241381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    unz_file_info64_internal cur_file_info_internalSaved;
1242381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    ZPOS64_T num_fileSaved;
1243381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    ZPOS64_T pos_in_central_dirSaved;
12449e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
12459e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
12469e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    if (file==NULL)
12479e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        return UNZ_PARAMERROR;
12489e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
12499e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    if (strlen(szFileName)>=UNZ_MAXFILENAMEINZIP)
12509e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        return UNZ_PARAMERROR;
12519e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1252381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    s=(unz64_s*)file;
12539e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    if (!s->current_file_ok)
12549e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        return UNZ_END_OF_LIST_OF_FILE;
12559e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
12569e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    /* Save the current state */
12579e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    num_fileSaved = s->num_file;
12589e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    pos_in_central_dirSaved = s->pos_in_central_dir;
12599e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    cur_file_infoSaved = s->cur_file_info;
12609e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    cur_file_info_internalSaved = s->cur_file_info_internal;
12619e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
12629e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    err = unzGoToFirstFile(file);
12639e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
12649e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    while (err == UNZ_OK)
12659e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    {
12669e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        char szCurrentFileName[UNZ_MAXFILENAMEINZIP+1];
1267381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        err = unzGetCurrentFileInfo64(file,NULL,
12689e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                                    szCurrentFileName,sizeof(szCurrentFileName)-1,
12699e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                                    NULL,0,NULL,0);
12709e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        if (err == UNZ_OK)
12719e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        {
12729e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project            if (unzStringFileNameCompare(szCurrentFileName,
12739e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                                            szFileName,iCaseSensitivity)==0)
12749e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                return UNZ_OK;
12759e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project            err = unzGoToNextFile(file);
12769e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        }
12779e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    }
12789e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
12799e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    /* We failed, so restore the state of the 'current file' to where we
12809e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project     * were.
12819e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project     */
12829e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    s->num_file = num_fileSaved ;
12839e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    s->pos_in_central_dir = pos_in_central_dirSaved ;
12849e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    s->cur_file_info = cur_file_infoSaved;
12859e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    s->cur_file_info_internal = cur_file_info_internalSaved;
12869e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    return err;
12879e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project}
12889e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
12899e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
12909e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project/*
12919e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project///////////////////////////////////////////
12929e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project// Contributed by Ryan Haksi (mailto://cryogen@infoserve.net)
12939e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project// I need random access
12949e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project//
12959e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project// Further optimization could be realized by adding an ability
12969e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project// to cache the directory in memory. The goal being a single
12979e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project// comprehensive file read to put the file I need in a memory.
12989e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project*/
12999e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
13009e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project/*
13019e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projecttypedef struct unz_file_pos_s
13029e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{
1303381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    ZPOS64_T pos_in_zip_directory;   // offset in file
1304381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    ZPOS64_T num_of_file;            // # of file
13059e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project} unz_file_pos;
13069e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project*/
13079e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1308381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughesextern int ZEXPORT unzGetFilePos64(unzFile file, unz64_file_pos*  file_pos)
13099e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{
1310381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    unz64_s* s;
13119e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
13129e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    if (file==NULL || file_pos==NULL)
13139e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        return UNZ_PARAMERROR;
1314381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    s=(unz64_s*)file;
13159e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    if (!s->current_file_ok)
13169e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        return UNZ_END_OF_LIST_OF_FILE;
13179e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
13189e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    file_pos->pos_in_zip_directory  = s->pos_in_central_dir;
13199e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    file_pos->num_of_file           = s->num_file;
13209e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
13219e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    return UNZ_OK;
13229e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project}
13239e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1324381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughesextern int ZEXPORT unzGetFilePos(
1325381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    unzFile file,
1326381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    unz_file_pos* file_pos)
1327381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes{
1328381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    unz64_file_pos file_pos64;
1329381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    int err = unzGetFilePos64(file,&file_pos64);
1330381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    if (err==UNZ_OK)
1331381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    {
1332381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        file_pos->pos_in_zip_directory = (uLong)file_pos64.pos_in_zip_directory;
1333381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        file_pos->num_of_file = (uLong)file_pos64.num_of_file;
1334381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    }
1335381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    return err;
1336381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes}
1337381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes
1338381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughesextern int ZEXPORT unzGoToFilePos64(unzFile file, const unz64_file_pos* file_pos)
13399e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{
1340381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    unz64_s* s;
13419e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    int err;
13429e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
13439e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    if (file==NULL || file_pos==NULL)
13449e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        return UNZ_PARAMERROR;
1345381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    s=(unz64_s*)file;
13469e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
13479e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    /* jump to the right spot */
13489e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    s->pos_in_central_dir = file_pos->pos_in_zip_directory;
13499e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    s->num_file           = file_pos->num_of_file;
13509e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
13519e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    /* set the current file */
1352381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    err = unz64local_GetCurrentFileInfoInternal(file,&s->cur_file_info,
13539e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                                               &s->cur_file_info_internal,
13549e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                                               NULL,0,NULL,0,NULL,0);
13559e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    /* return results */
13569e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    s->current_file_ok = (err == UNZ_OK);
13579e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    return err;
13589e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project}
13599e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1360381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughesextern int ZEXPORT unzGoToFilePos(
1361381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    unzFile file,
1362381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    unz_file_pos* file_pos)
1363381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes{
1364381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    unz64_file_pos file_pos64;
1365381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    if (file_pos == NULL)
1366381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        return UNZ_PARAMERROR;
1367381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes
1368381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    file_pos64.pos_in_zip_directory = file_pos->pos_in_zip_directory;
1369381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    file_pos64.num_of_file = file_pos->num_of_file;
1370381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    return unzGoToFilePos64(file,&file_pos64);
1371381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes}
1372381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes
13739e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project/*
13749e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project// Unzip Helper Functions - should be here?
13759e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project///////////////////////////////////////////
13769e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project*/
13779e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
13789e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project/*
13799e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  Read the local header of the current zipfile
13809e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  Check the coherency of the local header and info in the end of central
13819e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        directory about this file
13829e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  store in *piSizeVar the size of extra info in local header
13839e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        (filename and size of extra field data)
13849e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project*/
1385381716e9396b55b1adb8235b020c37344f60ab07Elliott Hugheslocal int unz64local_CheckCurrentFileCoherencyHeader (unz64_s* s, uInt* piSizeVar,
1386381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes                                                    ZPOS64_T * poffset_local_extrafield,
1387381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes                                                    uInt  * psize_local_extrafield)
13889e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{
13899e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    uLong uMagic,uData,uFlags;
13909e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    uLong size_filename;
13919e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    uLong size_extra_field;
13929e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    int err=UNZ_OK;
13939e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
13949e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    *piSizeVar = 0;
13959e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    *poffset_local_extrafield = 0;
13969e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    *psize_local_extrafield = 0;
13979e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1398381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    if (ZSEEK64(s->z_filefunc, s->filestream,s->cur_file_info_internal.offset_curfile +
13999e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                                s->byte_before_the_zipfile,ZLIB_FILEFUNC_SEEK_SET)!=0)
14009e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        return UNZ_ERRNO;
14019e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
14029e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
14039e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    if (err==UNZ_OK)
1404381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    {
1405381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        if (unz64local_getLong(&s->z_filefunc, s->filestream,&uMagic) != UNZ_OK)
14069e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project            err=UNZ_ERRNO;
14079e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        else if (uMagic!=0x04034b50)
14089e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project            err=UNZ_BADZIPFILE;
1409381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    }
14109e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1411381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    if (unz64local_getShort(&s->z_filefunc, s->filestream,&uData) != UNZ_OK)
14129e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        err=UNZ_ERRNO;
14139e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project/*
14149e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    else if ((err==UNZ_OK) && (uData!=s->cur_file_info.wVersion))
14159e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        err=UNZ_BADZIPFILE;
14169e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project*/
1417381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    if (unz64local_getShort(&s->z_filefunc, s->filestream,&uFlags) != UNZ_OK)
14189e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        err=UNZ_ERRNO;
14199e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1420381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    if (unz64local_getShort(&s->z_filefunc, s->filestream,&uData) != UNZ_OK)
14219e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        err=UNZ_ERRNO;
14229e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    else if ((err==UNZ_OK) && (uData!=s->cur_file_info.compression_method))
14239e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        err=UNZ_BADZIPFILE;
14249e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
14259e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    if ((err==UNZ_OK) && (s->cur_file_info.compression_method!=0) &&
1426381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes/* #ifdef HAVE_BZIP2 */
1427381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes                         (s->cur_file_info.compression_method!=Z_BZIP2ED) &&
1428381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes/* #endif */
14299e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                         (s->cur_file_info.compression_method!=Z_DEFLATED))
14309e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        err=UNZ_BADZIPFILE;
14319e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1432381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    if (unz64local_getLong(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) /* date/time */
14339e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        err=UNZ_ERRNO;
14349e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1435381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    if (unz64local_getLong(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) /* crc */
14369e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        err=UNZ_ERRNO;
1437381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    else if ((err==UNZ_OK) && (uData!=s->cur_file_info.crc) && ((uFlags & 8)==0))
14389e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        err=UNZ_BADZIPFILE;
14399e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1440381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    if (unz64local_getLong(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) /* size compr */
14419e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        err=UNZ_ERRNO;
1442381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    else if (uData != 0xFFFFFFFF && (err==UNZ_OK) && (uData!=s->cur_file_info.compressed_size) && ((uFlags & 8)==0))
14439e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        err=UNZ_BADZIPFILE;
14449e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1445381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    if (unz64local_getLong(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) /* size uncompr */
14469e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        err=UNZ_ERRNO;
1447381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    else if (uData != 0xFFFFFFFF && (err==UNZ_OK) && (uData!=s->cur_file_info.uncompressed_size) && ((uFlags & 8)==0))
14489e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        err=UNZ_BADZIPFILE;
14499e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1450381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    if (unz64local_getShort(&s->z_filefunc, s->filestream,&size_filename) != UNZ_OK)
14519e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        err=UNZ_ERRNO;
14529e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    else if ((err==UNZ_OK) && (size_filename!=s->cur_file_info.size_filename))
14539e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        err=UNZ_BADZIPFILE;
14549e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
14559e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    *piSizeVar += (uInt)size_filename;
14569e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1457381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    if (unz64local_getShort(&s->z_filefunc, s->filestream,&size_extra_field) != UNZ_OK)
14589e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        err=UNZ_ERRNO;
14599e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    *poffset_local_extrafield= s->cur_file_info_internal.offset_curfile +
14609e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                                    SIZEZIPLOCALHEADER + size_filename;
14619e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    *psize_local_extrafield = (uInt)size_extra_field;
14629e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
14639e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    *piSizeVar += (uInt)size_extra_field;
14649e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
14659e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    return err;
14669e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project}
14679e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
14689e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project/*
14699e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  Open for reading data the current file in the zipfile.
14709e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  If there is no error and the file is opened, the return value is UNZ_OK.
14719e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project*/
1472381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughesextern int ZEXPORT unzOpenCurrentFile3 (unzFile file, int* method,
1473381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes                                            int* level, int raw, const char* password)
14749e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{
14759e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    int err=UNZ_OK;
14769e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    uInt iSizeVar;
1477381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    unz64_s* s;
1478381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    file_in_zip64_read_info_s* pfile_in_zip_read_info;
1479381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    ZPOS64_T offset_local_extrafield;  /* offset of the local extra field */
14809e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    uInt  size_local_extrafield;    /* size of the local extra field */
14819e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#    ifndef NOUNCRYPT
14829e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    char source[12];
14839e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#    else
14849e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    if (password != NULL)
14859e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        return UNZ_PARAMERROR;
14869e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#    endif
14879e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
14889e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    if (file==NULL)
14899e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        return UNZ_PARAMERROR;
1490381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    s=(unz64_s*)file;
14919e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    if (!s->current_file_ok)
14929e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        return UNZ_PARAMERROR;
14939e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
14949e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    if (s->pfile_in_zip_read != NULL)
14959e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        unzCloseCurrentFile(file);
14969e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1497381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    if (unz64local_CheckCurrentFileCoherencyHeader(s,&iSizeVar, &offset_local_extrafield,&size_local_extrafield)!=UNZ_OK)
14989e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        return UNZ_BADZIPFILE;
14999e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1500381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    pfile_in_zip_read_info = (file_in_zip64_read_info_s*)ALLOC(sizeof(file_in_zip64_read_info_s));
15019e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    if (pfile_in_zip_read_info==NULL)
15029e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        return UNZ_INTERNALERROR;
15039e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
15049e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    pfile_in_zip_read_info->read_buffer=(char*)ALLOC(UNZ_BUFSIZE);
15059e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    pfile_in_zip_read_info->offset_local_extrafield = offset_local_extrafield;
15069e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    pfile_in_zip_read_info->size_local_extrafield = size_local_extrafield;
15079e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    pfile_in_zip_read_info->pos_local_extrafield=0;
15089e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    pfile_in_zip_read_info->raw=raw;
15099e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
15109e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    if (pfile_in_zip_read_info->read_buffer==NULL)
15119e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    {
15129e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        TRYFREE(pfile_in_zip_read_info);
15139e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        return UNZ_INTERNALERROR;
15149e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    }
15159e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
15169e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    pfile_in_zip_read_info->stream_initialised=0;
15179e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
15189e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    if (method!=NULL)
15199e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        *method = (int)s->cur_file_info.compression_method;
15209e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
15219e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    if (level!=NULL)
15229e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    {
15239e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        *level = 6;
15249e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        switch (s->cur_file_info.flag & 0x06)
15259e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        {
15269e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project          case 6 : *level = 1; break;
15279e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project          case 4 : *level = 2; break;
15289e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project          case 2 : *level = 9; break;
15299e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        }
15309e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    }
15319e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
15329e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    if ((s->cur_file_info.compression_method!=0) &&
1533381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes/* #ifdef HAVE_BZIP2 */
1534381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        (s->cur_file_info.compression_method!=Z_BZIP2ED) &&
1535381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes/* #endif */
15369e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        (s->cur_file_info.compression_method!=Z_DEFLATED))
1537381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes
15389e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        err=UNZ_BADZIPFILE;
15399e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
15409e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    pfile_in_zip_read_info->crc32_wait=s->cur_file_info.crc;
15419e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    pfile_in_zip_read_info->crc32=0;
1542381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    pfile_in_zip_read_info->total_out_64=0;
1543381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    pfile_in_zip_read_info->compression_method = s->cur_file_info.compression_method;
15449e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    pfile_in_zip_read_info->filestream=s->filestream;
15459e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    pfile_in_zip_read_info->z_filefunc=s->z_filefunc;
15469e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    pfile_in_zip_read_info->byte_before_the_zipfile=s->byte_before_the_zipfile;
15479e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
15489e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    pfile_in_zip_read_info->stream.total_out = 0;
15499e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1550381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    if ((s->cur_file_info.compression_method==Z_BZIP2ED) && (!raw))
15519e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    {
1552381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes#ifdef HAVE_BZIP2
1553381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes      pfile_in_zip_read_info->bstream.bzalloc = (void *(*) (void *, int, int))0;
1554381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes      pfile_in_zip_read_info->bstream.bzfree = (free_func)0;
1555381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes      pfile_in_zip_read_info->bstream.opaque = (voidpf)0;
1556381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes      pfile_in_zip_read_info->bstream.state = (voidpf)0;
1557381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes
15589e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project      pfile_in_zip_read_info->stream.zalloc = (alloc_func)0;
15599e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project      pfile_in_zip_read_info->stream.zfree = (free_func)0;
15609e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project      pfile_in_zip_read_info->stream.opaque = (voidpf)0;
15619e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project      pfile_in_zip_read_info->stream.next_in = (voidpf)0;
15629e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project      pfile_in_zip_read_info->stream.avail_in = 0;
15639e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1564381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes      err=BZ2_bzDecompressInit(&pfile_in_zip_read_info->bstream, 0, 0);
1565381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes      if (err == Z_OK)
1566381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        pfile_in_zip_read_info->stream_initialised=Z_BZIP2ED;
1567381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes      else
1568381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes      {
1569381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        TRYFREE(pfile_in_zip_read_info);
1570381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        return err;
1571381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes      }
1572381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes#else
1573381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes      pfile_in_zip_read_info->raw=1;
1574381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes#endif
1575381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    }
1576381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    else if ((s->cur_file_info.compression_method==Z_DEFLATED) && (!raw))
1577381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    {
1578381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes      pfile_in_zip_read_info->stream.zalloc = (alloc_func)0;
1579381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes      pfile_in_zip_read_info->stream.zfree = (free_func)0;
1580381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes      pfile_in_zip_read_info->stream.opaque = (voidpf)0;
1581381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes      pfile_in_zip_read_info->stream.next_in = 0;
1582381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes      pfile_in_zip_read_info->stream.avail_in = 0;
1583381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes
15849e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project      err=inflateInit2(&pfile_in_zip_read_info->stream, -MAX_WBITS);
15859e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project      if (err == Z_OK)
1586381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        pfile_in_zip_read_info->stream_initialised=Z_DEFLATED;
15879e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project      else
15889e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project      {
15899e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        TRYFREE(pfile_in_zip_read_info);
15909e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        return err;
15919e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project      }
15929e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        /* windowBits is passed < 0 to tell that there is no zlib header.
15939e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project         * Note that in this case inflate *requires* an extra "dummy" byte
15949e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project         * after the compressed stream in order to complete decompression and
15959e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project         * return Z_STREAM_END.
15969e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project         * In unzip, i don't wait absolutely Z_STREAM_END because I known the
15979e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project         * size of both compressed and uncompressed data
15989e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project         */
15999e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    }
16009e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    pfile_in_zip_read_info->rest_read_compressed =
16019e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project            s->cur_file_info.compressed_size ;
16029e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    pfile_in_zip_read_info->rest_read_uncompressed =
16039e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project            s->cur_file_info.uncompressed_size ;
16049e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
16059e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
16069e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    pfile_in_zip_read_info->pos_in_zipfile =
16079e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project            s->cur_file_info_internal.offset_curfile + SIZEZIPLOCALHEADER +
16089e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project              iSizeVar;
16099e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
16109e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    pfile_in_zip_read_info->stream.avail_in = (uInt)0;
16119e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
16129e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    s->pfile_in_zip_read = pfile_in_zip_read_info;
1613381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes                s->encrypted = 0;
16149e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
16159e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#    ifndef NOUNCRYPT
16169e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    if (password != NULL)
16179e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    {
16189e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        int i;
16199e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        s->pcrc_32_tab = get_crc_table();
16209e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        init_keys(password,s->keys,s->pcrc_32_tab);
1621381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        if (ZSEEK64(s->z_filefunc, s->filestream,
16229e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                  s->pfile_in_zip_read->pos_in_zipfile +
16239e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                     s->pfile_in_zip_read->byte_before_the_zipfile,
16249e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                  SEEK_SET)!=0)
16259e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project            return UNZ_INTERNALERROR;
1626381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        if(ZREAD64(s->z_filefunc, s->filestream,source, 12)<12)
16279e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project            return UNZ_INTERNALERROR;
16289e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
16299e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        for (i = 0; i<12; i++)
16309e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project            zdecode(s->keys,s->pcrc_32_tab,source[i]);
16319e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
16329e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        s->pfile_in_zip_read->pos_in_zipfile+=12;
16339e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        s->encrypted=1;
16349e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    }
16359e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#    endif
16369e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
16379e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
16389e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    return UNZ_OK;
16399e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project}
16409e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1641381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughesextern int ZEXPORT unzOpenCurrentFile (unzFile file)
16429e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{
16439e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    return unzOpenCurrentFile3(file, NULL, NULL, 0, NULL);
16449e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project}
16459e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1646381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughesextern int ZEXPORT unzOpenCurrentFilePassword (unzFile file, const char*  password)
16479e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{
16489e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    return unzOpenCurrentFile3(file, NULL, NULL, 0, password);
16499e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project}
16509e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1651381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughesextern int ZEXPORT unzOpenCurrentFile2 (unzFile file, int* method, int* level, int raw)
16529e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{
16539e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    return unzOpenCurrentFile3(file, method, level, raw, NULL);
16549e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project}
16559e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1656381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes/** Addition for GDAL : START */
1657381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes
1658381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughesextern ZPOS64_T ZEXPORT unzGetCurrentFileZStreamPos64( unzFile file)
1659381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes{
1660381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    unz64_s* s;
1661381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    file_in_zip64_read_info_s* pfile_in_zip_read_info;
1662381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    s=(unz64_s*)file;
1663381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    if (file==NULL)
1664381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        return 0; //UNZ_PARAMERROR;
1665381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    pfile_in_zip_read_info=s->pfile_in_zip_read;
1666381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    if (pfile_in_zip_read_info==NULL)
1667381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        return 0; //UNZ_PARAMERROR;
1668381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    return pfile_in_zip_read_info->pos_in_zipfile +
1669381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes                         pfile_in_zip_read_info->byte_before_the_zipfile;
1670381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes}
1671381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes
1672381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes/** Addition for GDAL : END */
1673381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes
16749e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project/*
16759e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  Read bytes from the current file.
16769e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  buf contain buffer where data must be copied
16779e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  len the size of buf.
16789e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
16799e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  return the number of byte copied if somes bytes are copied
16809e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  return 0 if the end of file was reached
16819e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  return <0 with error code if there is an error
16829e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    (UNZ_ERRNO for IO error, or zLib error for uncompress error)
16839e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project*/
1684381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughesextern int ZEXPORT unzReadCurrentFile  (unzFile file, voidp buf, unsigned len)
16859e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{
16869e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    int err=UNZ_OK;
16879e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    uInt iRead = 0;
1688381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    unz64_s* s;
1689381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    file_in_zip64_read_info_s* pfile_in_zip_read_info;
16909e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    if (file==NULL)
16919e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        return UNZ_PARAMERROR;
1692381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    s=(unz64_s*)file;
16939e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    pfile_in_zip_read_info=s->pfile_in_zip_read;
16949e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
16959e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    if (pfile_in_zip_read_info==NULL)
16969e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        return UNZ_PARAMERROR;
16979e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
16989e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1699ee9e11d0d4e3361533860bf04896abb86a291bfbElliott Hughes    if (pfile_in_zip_read_info->read_buffer == NULL)
17009e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        return UNZ_END_OF_LIST_OF_FILE;
17019e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    if (len==0)
17029e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        return 0;
17039e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
17049e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    pfile_in_zip_read_info->stream.next_out = (Bytef*)buf;
17059e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
17069e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    pfile_in_zip_read_info->stream.avail_out = (uInt)len;
17079e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
17089e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    if ((len>pfile_in_zip_read_info->rest_read_uncompressed) &&
17099e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        (!(pfile_in_zip_read_info->raw)))
17109e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        pfile_in_zip_read_info->stream.avail_out =
17119e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project            (uInt)pfile_in_zip_read_info->rest_read_uncompressed;
17129e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
17139e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    if ((len>pfile_in_zip_read_info->rest_read_compressed+
17149e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project           pfile_in_zip_read_info->stream.avail_in) &&
17159e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project         (pfile_in_zip_read_info->raw))
17169e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        pfile_in_zip_read_info->stream.avail_out =
17179e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project            (uInt)pfile_in_zip_read_info->rest_read_compressed+
17189e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project            pfile_in_zip_read_info->stream.avail_in;
17199e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
17209e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    while (pfile_in_zip_read_info->stream.avail_out>0)
17219e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    {
17229e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        if ((pfile_in_zip_read_info->stream.avail_in==0) &&
17239e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project            (pfile_in_zip_read_info->rest_read_compressed>0))
17249e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        {
17259e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project            uInt uReadThis = UNZ_BUFSIZE;
17269e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project            if (pfile_in_zip_read_info->rest_read_compressed<uReadThis)
17279e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                uReadThis = (uInt)pfile_in_zip_read_info->rest_read_compressed;
17289e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project            if (uReadThis == 0)
17299e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                return UNZ_EOF;
1730381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes            if (ZSEEK64(pfile_in_zip_read_info->z_filefunc,
17319e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                      pfile_in_zip_read_info->filestream,
17329e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                      pfile_in_zip_read_info->pos_in_zipfile +
17339e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                         pfile_in_zip_read_info->byte_before_the_zipfile,
17349e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                         ZLIB_FILEFUNC_SEEK_SET)!=0)
17359e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                return UNZ_ERRNO;
1736381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes            if (ZREAD64(pfile_in_zip_read_info->z_filefunc,
17379e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                      pfile_in_zip_read_info->filestream,
17389e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                      pfile_in_zip_read_info->read_buffer,
17399e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                      uReadThis)!=uReadThis)
17409e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                return UNZ_ERRNO;
17419e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
17429e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
17439e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#            ifndef NOUNCRYPT
17449e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project            if(s->encrypted)
17459e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project            {
17469e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                uInt i;
17479e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                for(i=0;i<uReadThis;i++)
17489e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                  pfile_in_zip_read_info->read_buffer[i] =
17499e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                      zdecode(s->keys,s->pcrc_32_tab,
17509e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                              pfile_in_zip_read_info->read_buffer[i]);
17519e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project            }
17529e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#            endif
17539e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
17549e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
17559e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project            pfile_in_zip_read_info->pos_in_zipfile += uReadThis;
17569e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
17579e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project            pfile_in_zip_read_info->rest_read_compressed-=uReadThis;
17589e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
17599e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project            pfile_in_zip_read_info->stream.next_in =
17609e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                (Bytef*)pfile_in_zip_read_info->read_buffer;
17619e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project            pfile_in_zip_read_info->stream.avail_in = (uInt)uReadThis;
17629e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        }
17639e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
17649e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        if ((pfile_in_zip_read_info->compression_method==0) || (pfile_in_zip_read_info->raw))
17659e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        {
17669e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project            uInt uDoCopy,i ;
17679e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
17689e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project            if ((pfile_in_zip_read_info->stream.avail_in == 0) &&
17699e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                (pfile_in_zip_read_info->rest_read_compressed == 0))
17709e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                return (iRead==0) ? UNZ_EOF : iRead;
17719e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
17729e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project            if (pfile_in_zip_read_info->stream.avail_out <
17739e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                            pfile_in_zip_read_info->stream.avail_in)
17749e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                uDoCopy = pfile_in_zip_read_info->stream.avail_out ;
17759e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project            else
17769e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                uDoCopy = pfile_in_zip_read_info->stream.avail_in ;
17779e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
17789e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project            for (i=0;i<uDoCopy;i++)
17799e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                *(pfile_in_zip_read_info->stream.next_out+i) =
17809e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                        *(pfile_in_zip_read_info->stream.next_in+i);
17819e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1782381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes            pfile_in_zip_read_info->total_out_64 = pfile_in_zip_read_info->total_out_64 + uDoCopy;
1783381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes
17849e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project            pfile_in_zip_read_info->crc32 = crc32(pfile_in_zip_read_info->crc32,
17859e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                                pfile_in_zip_read_info->stream.next_out,
17869e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                                uDoCopy);
17879e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project            pfile_in_zip_read_info->rest_read_uncompressed-=uDoCopy;
17889e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project            pfile_in_zip_read_info->stream.avail_in -= uDoCopy;
17899e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project            pfile_in_zip_read_info->stream.avail_out -= uDoCopy;
17909e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project            pfile_in_zip_read_info->stream.next_out += uDoCopy;
17919e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project            pfile_in_zip_read_info->stream.next_in += uDoCopy;
17929e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project            pfile_in_zip_read_info->stream.total_out += uDoCopy;
17939e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project            iRead += uDoCopy;
17949e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        }
1795381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        else if (pfile_in_zip_read_info->compression_method==Z_BZIP2ED)
17969e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        {
1797381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes#ifdef HAVE_BZIP2
17989e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project            uLong uTotalOutBefore,uTotalOutAfter;
17999e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project            const Bytef *bufBefore;
18009e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project            uLong uOutThis;
1801381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes
1802381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes            pfile_in_zip_read_info->bstream.next_in        = (char*)pfile_in_zip_read_info->stream.next_in;
1803381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes            pfile_in_zip_read_info->bstream.avail_in       = pfile_in_zip_read_info->stream.avail_in;
1804381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes            pfile_in_zip_read_info->bstream.total_in_lo32  = pfile_in_zip_read_info->stream.total_in;
1805381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes            pfile_in_zip_read_info->bstream.total_in_hi32  = 0;
1806381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes            pfile_in_zip_read_info->bstream.next_out       = (char*)pfile_in_zip_read_info->stream.next_out;
1807381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes            pfile_in_zip_read_info->bstream.avail_out      = pfile_in_zip_read_info->stream.avail_out;
1808381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes            pfile_in_zip_read_info->bstream.total_out_lo32 = pfile_in_zip_read_info->stream.total_out;
1809381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes            pfile_in_zip_read_info->bstream.total_out_hi32 = 0;
1810381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes
1811381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes            uTotalOutBefore = pfile_in_zip_read_info->bstream.total_out_lo32;
1812381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes            bufBefore = (const Bytef *)pfile_in_zip_read_info->bstream.next_out;
1813381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes
1814381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes            err=BZ2_bzDecompress(&pfile_in_zip_read_info->bstream);
1815381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes
1816381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes            uTotalOutAfter = pfile_in_zip_read_info->bstream.total_out_lo32;
1817381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes            uOutThis = uTotalOutAfter-uTotalOutBefore;
1818381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes
1819381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes            pfile_in_zip_read_info->total_out_64 = pfile_in_zip_read_info->total_out_64 + uOutThis;
1820381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes
1821381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes            pfile_in_zip_read_info->crc32 = crc32(pfile_in_zip_read_info->crc32,bufBefore, (uInt)(uOutThis));
1822381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes            pfile_in_zip_read_info->rest_read_uncompressed -= uOutThis;
1823381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes            iRead += (uInt)(uTotalOutAfter - uTotalOutBefore);
1824381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes
1825381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes            pfile_in_zip_read_info->stream.next_in   = (Bytef*)pfile_in_zip_read_info->bstream.next_in;
1826381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes            pfile_in_zip_read_info->stream.avail_in  = pfile_in_zip_read_info->bstream.avail_in;
1827381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes            pfile_in_zip_read_info->stream.total_in  = pfile_in_zip_read_info->bstream.total_in_lo32;
1828381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes            pfile_in_zip_read_info->stream.next_out  = (Bytef*)pfile_in_zip_read_info->bstream.next_out;
1829381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes            pfile_in_zip_read_info->stream.avail_out = pfile_in_zip_read_info->bstream.avail_out;
1830381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes            pfile_in_zip_read_info->stream.total_out = pfile_in_zip_read_info->bstream.total_out_lo32;
1831381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes
1832381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes            if (err==BZ_STREAM_END)
1833381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes              return (iRead==0) ? UNZ_EOF : iRead;
1834381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes            if (err!=BZ_OK)
1835381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes              break;
1836381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes#endif
1837381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        } // end Z_BZIP2ED
1838381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        else
1839381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        {
1840381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes            ZPOS64_T uTotalOutBefore,uTotalOutAfter;
1841381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes            const Bytef *bufBefore;
1842381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes            ZPOS64_T uOutThis;
18439e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project            int flush=Z_SYNC_FLUSH;
18449e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
18459e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project            uTotalOutBefore = pfile_in_zip_read_info->stream.total_out;
18469e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project            bufBefore = pfile_in_zip_read_info->stream.next_out;
18479e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
18489e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project            /*
18499e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project            if ((pfile_in_zip_read_info->rest_read_uncompressed ==
18509e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                     pfile_in_zip_read_info->stream.avail_out) &&
18519e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                (pfile_in_zip_read_info->rest_read_compressed == 0))
18529e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                flush = Z_FINISH;
18539e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project            */
18549e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project            err=inflate(&pfile_in_zip_read_info->stream,flush);
18559e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
18569e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project            if ((err>=0) && (pfile_in_zip_read_info->stream.msg!=NULL))
18579e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project              err = Z_DATA_ERROR;
18589e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
18599e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project            uTotalOutAfter = pfile_in_zip_read_info->stream.total_out;
18609e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project            uOutThis = uTotalOutAfter-uTotalOutBefore;
18619e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1862381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes            pfile_in_zip_read_info->total_out_64 = pfile_in_zip_read_info->total_out_64 + uOutThis;
1863381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes
18649e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project            pfile_in_zip_read_info->crc32 =
18659e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                crc32(pfile_in_zip_read_info->crc32,bufBefore,
18669e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                        (uInt)(uOutThis));
18679e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
18689e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project            pfile_in_zip_read_info->rest_read_uncompressed -=
18699e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                uOutThis;
18709e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
18719e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project            iRead += (uInt)(uTotalOutAfter - uTotalOutBefore);
18729e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
18739e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project            if (err==Z_STREAM_END)
18749e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                return (iRead==0) ? UNZ_EOF : iRead;
18759e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project            if (err!=Z_OK)
18769e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                break;
18779e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        }
18789e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    }
18799e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
18809e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    if (err==Z_OK)
18819e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        return iRead;
18829e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    return err;
18839e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project}
18849e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
18859e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
18869e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project/*
18879e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  Give the current position in uncompressed data
18889e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project*/
1889381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughesextern z_off_t ZEXPORT unztell (unzFile file)
18909e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{
1891381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    unz64_s* s;
1892381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    file_in_zip64_read_info_s* pfile_in_zip_read_info;
18939e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    if (file==NULL)
18949e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        return UNZ_PARAMERROR;
1895381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    s=(unz64_s*)file;
18969e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    pfile_in_zip_read_info=s->pfile_in_zip_read;
18979e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
18989e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    if (pfile_in_zip_read_info==NULL)
18999e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        return UNZ_PARAMERROR;
19009e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
19019e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    return (z_off_t)pfile_in_zip_read_info->stream.total_out;
19029e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project}
19039e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1904381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughesextern ZPOS64_T ZEXPORT unztell64 (unzFile file)
1905381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes{
1906381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes
1907381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    unz64_s* s;
1908381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    file_in_zip64_read_info_s* pfile_in_zip_read_info;
1909381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    if (file==NULL)
1910381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        return (ZPOS64_T)-1;
1911381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    s=(unz64_s*)file;
1912381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    pfile_in_zip_read_info=s->pfile_in_zip_read;
1913381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes
1914381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    if (pfile_in_zip_read_info==NULL)
1915381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        return (ZPOS64_T)-1;
1916381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes
1917381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    return pfile_in_zip_read_info->total_out_64;
1918381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes}
1919381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes
19209e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
19219e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project/*
19229e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  return 1 if the end of file was reached, 0 elsewhere
19239e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project*/
1924381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughesextern int ZEXPORT unzeof (unzFile file)
19259e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{
1926381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    unz64_s* s;
1927381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    file_in_zip64_read_info_s* pfile_in_zip_read_info;
19289e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    if (file==NULL)
19299e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        return UNZ_PARAMERROR;
1930381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    s=(unz64_s*)file;
19319e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    pfile_in_zip_read_info=s->pfile_in_zip_read;
19329e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
19339e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    if (pfile_in_zip_read_info==NULL)
19349e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        return UNZ_PARAMERROR;
19359e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
19369e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    if (pfile_in_zip_read_info->rest_read_uncompressed == 0)
19379e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        return 1;
19389e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    else
19399e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        return 0;
19409e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project}
19419e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
19429e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
19439e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
19449e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project/*
1945381716e9396b55b1adb8235b020c37344f60ab07Elliott HughesRead extra field from the current file (opened by unzOpenCurrentFile)
1946381716e9396b55b1adb8235b020c37344f60ab07Elliott HughesThis is the local-header version of the extra field (sometimes, there is
1947381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughesmore info in the local-header version than in the central-header)
19489e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
19499e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  if buf==NULL, it return the size of the local extra field that can be read
19509e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
19519e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  if buf!=NULL, len is the size of the buffer, the extra header is copied in
19529e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    buf.
19539e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  the return value is the number of bytes copied in buf, or (if <0)
19549e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    the error code
19559e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project*/
1956381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughesextern int ZEXPORT unzGetLocalExtrafield (unzFile file, voidp buf, unsigned len)
19579e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{
1958381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    unz64_s* s;
1959381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    file_in_zip64_read_info_s* pfile_in_zip_read_info;
19609e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    uInt read_now;
1961381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    ZPOS64_T size_to_read;
19629e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
19639e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    if (file==NULL)
19649e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        return UNZ_PARAMERROR;
1965381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    s=(unz64_s*)file;
19669e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    pfile_in_zip_read_info=s->pfile_in_zip_read;
19679e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
19689e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    if (pfile_in_zip_read_info==NULL)
19699e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        return UNZ_PARAMERROR;
19709e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
19719e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    size_to_read = (pfile_in_zip_read_info->size_local_extrafield -
19729e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                pfile_in_zip_read_info->pos_local_extrafield);
19739e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
19749e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    if (buf==NULL)
19759e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        return (int)size_to_read;
19769e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
19779e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    if (len>size_to_read)
19789e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        read_now = (uInt)size_to_read;
19799e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    else
19809e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        read_now = (uInt)len ;
19819e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
19829e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    if (read_now==0)
19839e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        return 0;
19849e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1985381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    if (ZSEEK64(pfile_in_zip_read_info->z_filefunc,
19869e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project              pfile_in_zip_read_info->filestream,
19879e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project              pfile_in_zip_read_info->offset_local_extrafield +
19889e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project              pfile_in_zip_read_info->pos_local_extrafield,
19899e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project              ZLIB_FILEFUNC_SEEK_SET)!=0)
19909e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        return UNZ_ERRNO;
19919e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1992381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    if (ZREAD64(pfile_in_zip_read_info->z_filefunc,
19939e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project              pfile_in_zip_read_info->filestream,
19949e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project              buf,read_now)!=read_now)
19959e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        return UNZ_ERRNO;
19969e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
19979e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    return (int)read_now;
19989e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project}
19999e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
20009e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project/*
200104351a92ecc8429c999acbfc5dfe5aa8bee1d19dElliott Hughes  Close the file in zip opened with unzOpenCurrentFile
20029e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  Return UNZ_CRCERROR if all the file was read but the CRC is not good
20039e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project*/
2004381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughesextern int ZEXPORT unzCloseCurrentFile (unzFile file)
20059e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{
20069e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    int err=UNZ_OK;
20079e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2008381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    unz64_s* s;
2009381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    file_in_zip64_read_info_s* pfile_in_zip_read_info;
20109e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    if (file==NULL)
20119e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        return UNZ_PARAMERROR;
2012381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    s=(unz64_s*)file;
20139e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    pfile_in_zip_read_info=s->pfile_in_zip_read;
20149e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
20159e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    if (pfile_in_zip_read_info==NULL)
20169e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        return UNZ_PARAMERROR;
20179e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
20189e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
20199e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    if ((pfile_in_zip_read_info->rest_read_uncompressed == 0) &&
20209e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        (!pfile_in_zip_read_info->raw))
20219e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    {
20229e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        if (pfile_in_zip_read_info->crc32 != pfile_in_zip_read_info->crc32_wait)
20239e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project            err=UNZ_CRCERROR;
20249e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    }
20259e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
20269e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
20279e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    TRYFREE(pfile_in_zip_read_info->read_buffer);
20289e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    pfile_in_zip_read_info->read_buffer = NULL;
2029381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    if (pfile_in_zip_read_info->stream_initialised == Z_DEFLATED)
20309e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        inflateEnd(&pfile_in_zip_read_info->stream);
2031381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes#ifdef HAVE_BZIP2
2032381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    else if (pfile_in_zip_read_info->stream_initialised == Z_BZIP2ED)
2033381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        BZ2_bzDecompressEnd(&pfile_in_zip_read_info->bstream);
2034381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes#endif
2035381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes
20369e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
20379e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    pfile_in_zip_read_info->stream_initialised = 0;
20389e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    TRYFREE(pfile_in_zip_read_info);
20399e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
20409e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    s->pfile_in_zip_read=NULL;
20419e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
20429e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    return err;
20439e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project}
20449e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
20459e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
20469e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project/*
20479e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  Get the global comment string of the ZipFile, in the szComment buffer.
20489e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  uSizeBuf is the size of the szComment buffer.
20499e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  return the number of byte copied or an error code <0
20509e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project*/
2051381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughesextern int ZEXPORT unzGetGlobalComment (unzFile file, char * szComment, uLong uSizeBuf)
20529e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{
2053381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    unz64_s* s;
20549e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    uLong uReadThis ;
20559e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    if (file==NULL)
2056381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        return (int)UNZ_PARAMERROR;
2057381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    s=(unz64_s*)file;
20589e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
20599e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    uReadThis = uSizeBuf;
20609e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    if (uReadThis>s->gi.size_comment)
20619e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        uReadThis = s->gi.size_comment;
20629e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2063381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    if (ZSEEK64(s->z_filefunc,s->filestream,s->central_pos+22,ZLIB_FILEFUNC_SEEK_SET)!=0)
20649e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        return UNZ_ERRNO;
20659e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
20669e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    if (uReadThis>0)
20679e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    {
20689e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project      *szComment='\0';
2069381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes      if (ZREAD64(s->z_filefunc,s->filestream,szComment,uReadThis)!=uReadThis)
20709e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        return UNZ_ERRNO;
20719e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    }
20729e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
20739e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    if ((szComment != NULL) && (uSizeBuf > s->gi.size_comment))
20749e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        *(szComment+s->gi.size_comment)='\0';
20759e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    return (int)uReadThis;
20769e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project}
20779e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
20789e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project/* Additions by RX '2004 */
2079381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughesextern ZPOS64_T ZEXPORT unzGetOffset64(unzFile file)
20809e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{
2081381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    unz64_s* s;
20829e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
20839e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    if (file==NULL)
2084381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes          return 0; //UNZ_PARAMERROR;
2085381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    s=(unz64_s*)file;
20869e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    if (!s->current_file_ok)
20879e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project      return 0;
20889e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    if (s->gi.number_entry != 0 && s->gi.number_entry != 0xffff)
20899e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project      if (s->num_file==s->gi.number_entry)
20909e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project         return 0;
20919e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    return s->pos_in_central_dir;
20929e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project}
20939e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2094381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughesextern uLong ZEXPORT unzGetOffset (unzFile file)
2095381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes{
2096381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    ZPOS64_T offset64;
2097381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes
2098381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    if (file==NULL)
2099381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes          return 0; //UNZ_PARAMERROR;
2100381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    offset64 = unzGetOffset64(file);
2101381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    return (uLong)offset64;
2102381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes}
2103381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes
2104381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughesextern int ZEXPORT unzSetOffset64(unzFile file, ZPOS64_T pos)
21059e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{
2106381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    unz64_s* s;
21079e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    int err;
21089e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
21099e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    if (file==NULL)
21109e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        return UNZ_PARAMERROR;
2111381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    s=(unz64_s*)file;
21129e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
21139e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    s->pos_in_central_dir = pos;
21149e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    s->num_file = s->gi.number_entry;      /* hack */
2115381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    err = unz64local_GetCurrentFileInfoInternal(file,&s->cur_file_info,
21169e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                                              &s->cur_file_info_internal,
21179e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                                              NULL,0,NULL,0,NULL,0);
21189e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    s->current_file_ok = (err == UNZ_OK);
21199e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    return err;
21209e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project}
2121381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes
2122381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughesextern int ZEXPORT unzSetOffset (unzFile file, uLong pos)
2123381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes{
2124381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    return unzSetOffset64(file,pos);
2125381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes}
2126