15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* unzip.c -- IO for uncompress .zip files using zlib 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Version 1.1, February 14h, 2010 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) part of the MiniZip project - ( http://www.winimage.com/zLibDll/minizip.html ) 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Copyright (C) 1998-2010 Gilles Vollant (minizip) ( http://www.winimage.com/zLibDll/minizip.html ) 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Modifications of Unzip for Zip64 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Copyright (C) 2007-2008 Even Rouault 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Modifications for Zip64 support on both zip and unzip 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Copyright (C) 2009-2010 Mathias Svensson ( http://result42.com ) 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) For more info read MiniZip_info.txt 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ------------------------------------------------------------------------------------ 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Decryption code comes from crypt.c by Info-ZIP but has been greatly reduced in terms of 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) compatibility with older software. The following is from the original crypt.c. 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Code woven in by Terry Thorsen 1/2003. 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Copyright (c) 1990-2000 Info-ZIP. All rights reserved. 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) See the accompanying file LICENSE, version 2000-Apr-09 or later 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (the contents of which are also included in zip.h) for terms of use. 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) If, for some reason, all these files are missing, the Info-ZIP license 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) crypt.c (full version) by Info-ZIP. Last revised: [see crypt.h] 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) The encryption/decryption parts of this source code (as opposed to the 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) non-echoing password parts) were originally written in Europe. The 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) whole source package can be freely distributed, including from the USA. 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (Prior to January 2000, re-export from the US was a violation of US law.) 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) This encryption code is a direct transcription of the algorithm from 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Roger Schlafly, described by Phil Katz in the file appnote.txt. This 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) file (appnote.txt) is distributed with the PKZIP program (even in the 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) version without encryption capabilities). 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ------------------------------------------------------------------------------------ 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Changes in unzip.c 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2007-2008 - Even Rouault - Addition of cpl_unzGetCurrentFileZStreamPos 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2007-2008 - Even Rouault - Decoration of symbol names unz* -> cpl_unz* 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2007-2008 - Even Rouault - Remove old C style function prototypes 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2007-2008 - Even Rouault - Add unzip support for ZIP64 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Copyright (C) 2007-2008 Even Rouault 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 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). 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Oct-2009 - Mathias Svensson - Fixed problem if uncompressed size was > 4G and compressed size was <4G 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) should only read the compressed/uncompressed size from the Zip64 format if 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) the size from normal header was 0xFFFFFFFF 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Oct-2009 - Mathias Svensson - Applied some bug fixes from paches recived from Gilles Vollant 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Oct-2009 - Mathias Svensson - Applied support to unzip files with compression mathod BZIP2 (bzip2 lib is required) 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Patch created by Daniel Borca 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Jan-2010 - back to unzip and minizip 1.0 name scheme, with compatibility layer 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Copyright (C) 1998 - 2010 Gilles Vollant, Even Rouault, Mathias Svensson 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <stdio.h> 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <stdlib.h> 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string.h> 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef NOUNCRYPT 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) #define NOUNCRYPT 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "third_party/zlib/zlib.h" 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "unzip.h" 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef STDC 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# include <stddef.h> 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# include <string.h> 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# include <stdlib.h> 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef NO_ERRNO_H 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extern int errno; 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# include <errno.h> 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef local 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define local static 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* compile with -Dlocal if your debugger can't find static symbols */ 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef CASESENSITIVITYDEFAULT_NO 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# if !defined(unix) && !defined(CASESENSITIVITYDEFAULT_YES) 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define CASESENSITIVITYDEFAULT_NO 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# endif 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef UNZ_BUFSIZE 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define UNZ_BUFSIZE (16384) 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef UNZ_MAXFILENAMEINZIP 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define UNZ_MAXFILENAMEINZIP (256) 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef ALLOC 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define ALLOC(size) (malloc(size)) 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef TRYFREE 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define TRYFREE(p) {if (p) free(p);} 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define SIZECENTRALDIRITEM (0x2e) 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define SIZEZIPLOCALHEADER (0x1e) 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char unz_copyright[] = 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " unzip 1.01 Copyright 1998-2004 Gilles Vollant - http://www.winimage.com/zLibDll"; 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* unz_file_info_interntal contain internal info about a file in zipfile*/ 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef struct unz_file_info64_internal_s 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ZPOS64_T offset_curfile;/* relative offset of local header 8 bytes */ 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} unz_file_info64_internal; 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* file_in_zip_read_info_s contain internal information about a file in zipfile, 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) when reading and decompress it */ 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef struct 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char *read_buffer; /* internal buffer for compressed data */ 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) z_stream stream; /* zLib stream structure for inflate */ 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef HAVE_BZIP2 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bz_stream bstream; /* bzLib stream structure for bziped */ 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ZPOS64_T pos_in_zipfile; /* position in byte on the zipfile, for fseek*/ 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uLong stream_initialised; /* flag set if stream structure is initialised*/ 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ZPOS64_T offset_local_extrafield;/* offset of the local extra field */ 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uInt size_local_extrafield;/* size of the local extra field */ 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ZPOS64_T pos_local_extrafield; /* position in the local extra field in read*/ 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ZPOS64_T total_out_64; 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uLong crc32; /* crc32 of all data uncompressed */ 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uLong crc32_wait; /* crc32 we must obtain after decompress all */ 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ZPOS64_T rest_read_compressed; /* number of byte to be decompressed */ 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ZPOS64_T rest_read_uncompressed;/*number of byte to be obtained after decomp*/ 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zlib_filefunc64_32_def z_filefunc; 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) voidpf filestream; /* io structore of the zipfile */ 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uLong compression_method; /* compression method (0==store) */ 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ZPOS64_T byte_before_the_zipfile;/* byte before the zipfile, (>0 for sfx)*/ 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int raw; 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} file_in_zip64_read_info_s; 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* unz64_s contain internal information about the zipfile 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef struct 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zlib_filefunc64_32_def z_filefunc; 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int is64bitOpenFunction; 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) voidpf filestream; /* io structore of the zipfile */ 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unz_global_info64 gi; /* public global information */ 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ZPOS64_T byte_before_the_zipfile;/* byte before the zipfile, (>0 for sfx)*/ 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ZPOS64_T num_file; /* number of the current file in the zipfile*/ 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ZPOS64_T pos_in_central_dir; /* pos of the current file in the central dir*/ 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ZPOS64_T current_file_ok; /* flag about the usability of the current file*/ 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ZPOS64_T central_pos; /* position of the beginning of the central dir*/ 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ZPOS64_T size_central_dir; /* size of the central directory */ 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ZPOS64_T offset_central_dir; /* offset of start of central directory with 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) respect to the starting disk number */ 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unz_file_info64 cur_file_info; /* public info about the current file in zip*/ 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unz_file_info64_internal cur_file_info_internal; /* private info about it*/ 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) file_in_zip64_read_info_s* pfile_in_zip_read; /* structure about the current 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) file if we are decompressing it */ 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int encrypted; 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int isZip64; 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# ifndef NOUNCRYPT 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned long keys[3]; /* keys defining the pseudo-random sequence */ 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const unsigned long* pcrc_32_tab; 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# endif 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} unz64_s; 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef NOUNCRYPT 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "crypt.h" 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* =========================================================================== 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Read a byte from a gz_stream; update next_in and avail_in. Return EOF 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for end of file. 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IN assertion: the stream s has been sucessfully opened for reading. 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)local int unz64local_getByte OF(( 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const zlib_filefunc64_32_def* pzlib_filefunc_def, 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) voidpf filestream, 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int *pi)); 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)local int unz64local_getByte(const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, int *pi) 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned char c; 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int err = (int)ZREAD64(*pzlib_filefunc_def,filestream,&c,1); 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (err==1) 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *pi = (int)c; 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return UNZ_OK; 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ZERROR64(*pzlib_filefunc_def,filestream)) 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return UNZ_ERRNO; 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return UNZ_EOF; 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* =========================================================================== 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Reads a long in LSB order from the given gz_stream. Sets 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)local int unz64local_getShort OF(( 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const zlib_filefunc64_32_def* pzlib_filefunc_def, 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) voidpf filestream, 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uLong *pX)); 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)local int unz64local_getShort (const zlib_filefunc64_32_def* pzlib_filefunc_def, 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) voidpf filestream, 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uLong *pX) 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uLong x ; 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i = 0; 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int err; 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) err = unz64local_getByte(pzlib_filefunc_def,filestream,&i); 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) x = (uLong)i; 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (err==UNZ_OK) 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) err = unz64local_getByte(pzlib_filefunc_def,filestream,&i); 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) x |= ((uLong)i)<<8; 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (err==UNZ_OK) 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *pX = x; 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *pX = 0; 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return err; 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)local int unz64local_getLong OF(( 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const zlib_filefunc64_32_def* pzlib_filefunc_def, 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) voidpf filestream, 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uLong *pX)); 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)local int unz64local_getLong (const zlib_filefunc64_32_def* pzlib_filefunc_def, 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) voidpf filestream, 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uLong *pX) 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uLong x ; 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i = 0; 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int err; 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) err = unz64local_getByte(pzlib_filefunc_def,filestream,&i); 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) x = (uLong)i; 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (err==UNZ_OK) 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) err = unz64local_getByte(pzlib_filefunc_def,filestream,&i); 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) x |= ((uLong)i)<<8; 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (err==UNZ_OK) 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) err = unz64local_getByte(pzlib_filefunc_def,filestream,&i); 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) x |= ((uLong)i)<<16; 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (err==UNZ_OK) 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) err = unz64local_getByte(pzlib_filefunc_def,filestream,&i); 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) x += ((uLong)i)<<24; 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (err==UNZ_OK) 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *pX = x; 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *pX = 0; 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return err; 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)local int unz64local_getLong64 OF(( 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const zlib_filefunc64_32_def* pzlib_filefunc_def, 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) voidpf filestream, 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ZPOS64_T *pX)); 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)local int unz64local_getLong64 (const zlib_filefunc64_32_def* pzlib_filefunc_def, 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) voidpf filestream, 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ZPOS64_T *pX) 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ZPOS64_T x ; 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i = 0; 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int err; 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) err = unz64local_getByte(pzlib_filefunc_def,filestream,&i); 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) x = (ZPOS64_T)i; 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (err==UNZ_OK) 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) err = unz64local_getByte(pzlib_filefunc_def,filestream,&i); 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) x |= ((ZPOS64_T)i)<<8; 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (err==UNZ_OK) 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) err = unz64local_getByte(pzlib_filefunc_def,filestream,&i); 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) x |= ((ZPOS64_T)i)<<16; 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (err==UNZ_OK) 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) err = unz64local_getByte(pzlib_filefunc_def,filestream,&i); 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) x |= ((ZPOS64_T)i)<<24; 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (err==UNZ_OK) 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) err = unz64local_getByte(pzlib_filefunc_def,filestream,&i); 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) x |= ((ZPOS64_T)i)<<32; 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (err==UNZ_OK) 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) err = unz64local_getByte(pzlib_filefunc_def,filestream,&i); 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) x |= ((ZPOS64_T)i)<<40; 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (err==UNZ_OK) 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) err = unz64local_getByte(pzlib_filefunc_def,filestream,&i); 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) x |= ((ZPOS64_T)i)<<48; 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (err==UNZ_OK) 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) err = unz64local_getByte(pzlib_filefunc_def,filestream,&i); 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) x |= ((ZPOS64_T)i)<<56; 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (err==UNZ_OK) 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *pX = x; 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *pX = 0; 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return err; 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* My own strcmpi / strcasecmp */ 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)local int strcmpcasenosensitive_internal (const char* fileName1, const char* fileName2) 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (;;) 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char c1=*(fileName1++); 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char c2=*(fileName2++); 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((c1>='a') && (c1<='z')) 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) c1 -= 0x20; 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((c2>='a') && (c2<='z')) 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) c2 -= 0x20; 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (c1=='\0') 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ((c2=='\0') ? 0 : -1); 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (c2=='\0') 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 1; 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (c1<c2) 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return -1; 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (c1>c2) 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 1; 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef CASESENSITIVITYDEFAULT_NO 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CASESENSITIVITYDEFAULTVALUE 2 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CASESENSITIVITYDEFAULTVALUE 1 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef STRCMPCASENOSENTIVEFUNCTION 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define STRCMPCASENOSENTIVEFUNCTION strcmpcasenosensitive_internal 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Compare two filename (fileName1,fileName2). 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) If iCaseSenisivity = 1, comparision is case sensitivity (like strcmp) 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) If iCaseSenisivity = 2, comparision is not case sensitivity (like strcmpi 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) or strcasecmp) 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) If iCaseSenisivity = 0, case sensitivity is defaut of your operating system 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (like 1 on Unix, 2 on Windows) 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)extern int ZEXPORT unzStringFileNameCompare (const char* fileName1, 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* fileName2, 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int iCaseSensitivity) 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (iCaseSensitivity==0) 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) iCaseSensitivity=CASESENSITIVITYDEFAULTVALUE; 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (iCaseSensitivity==1) 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return strcmp(fileName1,fileName2); 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return STRCMPCASENOSENTIVEFUNCTION(fileName1,fileName2); 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef BUFREADCOMMENT 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define BUFREADCOMMENT (0x400) 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Locate the Central directory of a zipfile (at the end, just before 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) the global comment) 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)local ZPOS64_T unz64local_SearchCentralDir OF((const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream)); 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)local ZPOS64_T unz64local_SearchCentralDir(const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream) 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned char* buf; 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ZPOS64_T uSizeFile; 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ZPOS64_T uBackRead; 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ZPOS64_T uMaxBack=0xffff; /* maximum size of global comment */ 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ZPOS64_T uPosFound=0; 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ZSEEK64(*pzlib_filefunc_def,filestream,0,ZLIB_FILEFUNC_SEEK_END) != 0) 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uSizeFile = ZTELL64(*pzlib_filefunc_def,filestream); 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (uMaxBack>uSizeFile) 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uMaxBack = uSizeFile; 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) buf = (unsigned char*)ALLOC(BUFREADCOMMENT+4); 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (buf==NULL) 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uBackRead = 4; 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (uBackRead<uMaxBack) 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uLong uReadSize; 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ZPOS64_T uReadPos ; 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i; 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (uBackRead+BUFREADCOMMENT>uMaxBack) 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uBackRead = uMaxBack; 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uBackRead+=BUFREADCOMMENT; 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uReadPos = uSizeFile-uBackRead ; 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uReadSize = ((BUFREADCOMMENT+4) < (uSizeFile-uReadPos)) ? 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (BUFREADCOMMENT+4) : (uLong)(uSizeFile-uReadPos); 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ZSEEK64(*pzlib_filefunc_def,filestream,uReadPos,ZLIB_FILEFUNC_SEEK_SET)!=0) 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ZREAD64(*pzlib_filefunc_def,filestream,buf,uReadSize)!=uReadSize) 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (i=(int)uReadSize-3; (i--)>0;) 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (((*(buf+i))==0x50) && ((*(buf+i+1))==0x4b) && 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ((*(buf+i+2))==0x05) && ((*(buf+i+3))==0x06)) 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uPosFound = uReadPos+i; 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (uPosFound!=0) 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TRYFREE(buf); 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return uPosFound; 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Locate the Central directory 64 of a zipfile (at the end, just before 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) the global comment) 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)local ZPOS64_T unz64local_SearchCentralDir64 OF(( 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const zlib_filefunc64_32_def* pzlib_filefunc_def, 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) voidpf filestream)); 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)local ZPOS64_T unz64local_SearchCentralDir64(const zlib_filefunc64_32_def* pzlib_filefunc_def, 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) voidpf filestream) 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned char* buf; 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ZPOS64_T uSizeFile; 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ZPOS64_T uBackRead; 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ZPOS64_T uMaxBack=0xffff; /* maximum size of global comment */ 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ZPOS64_T uPosFound=0; 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uLong uL; 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ZPOS64_T relativeOffset; 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ZSEEK64(*pzlib_filefunc_def,filestream,0,ZLIB_FILEFUNC_SEEK_END) != 0) 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uSizeFile = ZTELL64(*pzlib_filefunc_def,filestream); 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (uMaxBack>uSizeFile) 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uMaxBack = uSizeFile; 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) buf = (unsigned char*)ALLOC(BUFREADCOMMENT+4); 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (buf==NULL) 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uBackRead = 4; 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (uBackRead<uMaxBack) 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uLong uReadSize; 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ZPOS64_T uReadPos; 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i; 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (uBackRead+BUFREADCOMMENT>uMaxBack) 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uBackRead = uMaxBack; 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uBackRead+=BUFREADCOMMENT; 5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uReadPos = uSizeFile-uBackRead ; 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uReadSize = ((BUFREADCOMMENT+4) < (uSizeFile-uReadPos)) ? 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (BUFREADCOMMENT+4) : (uLong)(uSizeFile-uReadPos); 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ZSEEK64(*pzlib_filefunc_def,filestream,uReadPos,ZLIB_FILEFUNC_SEEK_SET)!=0) 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ZREAD64(*pzlib_filefunc_def,filestream,buf,uReadSize)!=uReadSize) 5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (i=(int)uReadSize-3; (i--)>0;) 5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (((*(buf+i))==0x50) && ((*(buf+i+1))==0x4b) && 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ((*(buf+i+2))==0x06) && ((*(buf+i+3))==0x07)) 5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uPosFound = uReadPos+i; 5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (uPosFound!=0) 5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TRYFREE(buf); 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (uPosFound == 0) 5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; 5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Zip64 end of central directory locator */ 5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ZSEEK64(*pzlib_filefunc_def,filestream, uPosFound,ZLIB_FILEFUNC_SEEK_SET)!=0) 5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; 5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* the signature, already checked */ 5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (unz64local_getLong(pzlib_filefunc_def,filestream,&uL)!=UNZ_OK) 5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; 5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* number of the disk with the start of the zip64 end of central directory */ 5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (unz64local_getLong(pzlib_filefunc_def,filestream,&uL)!=UNZ_OK) 5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; 5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (uL != 0) 5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; 5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* relative offset of the zip64 end of central directory record */ 5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (unz64local_getLong64(pzlib_filefunc_def,filestream,&relativeOffset)!=UNZ_OK) 5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; 5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* total number of disks */ 5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (unz64local_getLong(pzlib_filefunc_def,filestream,&uL)!=UNZ_OK) 5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; 5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (uL != 1) 5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; 5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Goto end of central directory record */ 5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ZSEEK64(*pzlib_filefunc_def,filestream, relativeOffset,ZLIB_FILEFUNC_SEEK_SET)!=0) 5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; 5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* the signature */ 5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (unz64local_getLong(pzlib_filefunc_def,filestream,&uL)!=UNZ_OK) 5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; 5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (uL != 0x06064b50) 5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; 5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return relativeOffset; 5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Open a Zip file. path contain the full pathname (by example, 5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) on a Windows NT computer "c:\\test\\zlib114.zip" or on an Unix computer 5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "zlib/zlib114.zip". 5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) If the zipfile cannot be opened (file doesn't exist or in not valid), the 5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return value is NULL. 5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Else, the return value is a unzFile Handle, usable with other function 5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) of this unzip package. 5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)local unzFile unzOpenInternal (const void *path, 5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zlib_filefunc64_32_def* pzlib_filefunc64_32_def, 5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int is64bitOpenFunction) 5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unz64_s us; 5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unz64_s *s; 5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ZPOS64_T central_pos; 5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uLong uL; 5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uLong number_disk; /* number of the current dist, used for 5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) spaning ZIP, unsupported, always 0*/ 5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uLong number_disk_with_CD; /* number the the disk with central dir, used 5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for spaning ZIP, unsupported, always 0*/ 5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ZPOS64_T number_entry_CD; /* total number of entries in 5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) the central dir 5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (same than number_entry on nospan) */ 6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int err=UNZ_OK; 6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (unz_copyright[0]!=' ') 6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) us.z_filefunc.zseek32_file = NULL; 6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) us.z_filefunc.ztell32_file = NULL; 6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (pzlib_filefunc64_32_def==NULL) 6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fill_fopen64_filefunc(&us.z_filefunc.zfile_func64); 6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) us.z_filefunc = *pzlib_filefunc64_32_def; 6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) us.is64bitOpenFunction = is64bitOpenFunction; 6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) us.filestream = ZOPEN64(us.z_filefunc, 6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) path, 6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ZLIB_FILEFUNC_MODE_READ | 6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ZLIB_FILEFUNC_MODE_EXISTING); 6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (us.filestream==NULL) 6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) central_pos = unz64local_SearchCentralDir64(&us.z_filefunc,us.filestream); 6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (central_pos) 6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uLong uS; 6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ZPOS64_T uL64; 6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) us.isZip64 = 1; 6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ZSEEK64(us.z_filefunc, us.filestream, 6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) central_pos,ZLIB_FILEFUNC_SEEK_SET)!=0) 6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) err=UNZ_ERRNO; 6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* the signature, already checked */ 6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (unz64local_getLong(&us.z_filefunc, us.filestream,&uL)!=UNZ_OK) 6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) err=UNZ_ERRNO; 6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* size of zip64 end of central directory record */ 6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (unz64local_getLong64(&us.z_filefunc, us.filestream,&uL64)!=UNZ_OK) 6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) err=UNZ_ERRNO; 6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* version made by */ 6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (unz64local_getShort(&us.z_filefunc, us.filestream,&uS)!=UNZ_OK) 6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) err=UNZ_ERRNO; 6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* version needed to extract */ 6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (unz64local_getShort(&us.z_filefunc, us.filestream,&uS)!=UNZ_OK) 6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) err=UNZ_ERRNO; 6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* number of this disk */ 6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (unz64local_getLong(&us.z_filefunc, us.filestream,&number_disk)!=UNZ_OK) 6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) err=UNZ_ERRNO; 6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* number of the disk with the start of the central directory */ 6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (unz64local_getLong(&us.z_filefunc, us.filestream,&number_disk_with_CD)!=UNZ_OK) 6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) err=UNZ_ERRNO; 6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* total number of entries in the central directory on this disk */ 6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (unz64local_getLong64(&us.z_filefunc, us.filestream,&us.gi.number_entry)!=UNZ_OK) 6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) err=UNZ_ERRNO; 6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* total number of entries in the central directory */ 6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (unz64local_getLong64(&us.z_filefunc, us.filestream,&number_entry_CD)!=UNZ_OK) 6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) err=UNZ_ERRNO; 6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((number_entry_CD!=us.gi.number_entry) || 6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (number_disk_with_CD!=0) || 6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (number_disk!=0)) 6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) err=UNZ_BADZIPFILE; 6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* size of the central directory */ 6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (unz64local_getLong64(&us.z_filefunc, us.filestream,&us.size_central_dir)!=UNZ_OK) 6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) err=UNZ_ERRNO; 6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* offset of start of central directory with respect to the 6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) starting disk number */ 6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (unz64local_getLong64(&us.z_filefunc, us.filestream,&us.offset_central_dir)!=UNZ_OK) 6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) err=UNZ_ERRNO; 6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) us.gi.size_comment = 0; 6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) central_pos = unz64local_SearchCentralDir(&us.z_filefunc,us.filestream); 6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (central_pos==0) 6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) err=UNZ_ERRNO; 6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) us.isZip64 = 0; 6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ZSEEK64(us.z_filefunc, us.filestream, 6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) central_pos,ZLIB_FILEFUNC_SEEK_SET)!=0) 6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) err=UNZ_ERRNO; 6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* the signature, already checked */ 6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (unz64local_getLong(&us.z_filefunc, us.filestream,&uL)!=UNZ_OK) 6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) err=UNZ_ERRNO; 6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* number of this disk */ 7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (unz64local_getShort(&us.z_filefunc, us.filestream,&number_disk)!=UNZ_OK) 7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) err=UNZ_ERRNO; 7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* number of the disk with the start of the central directory */ 7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (unz64local_getShort(&us.z_filefunc, us.filestream,&number_disk_with_CD)!=UNZ_OK) 7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) err=UNZ_ERRNO; 7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* total number of entries in the central dir on this disk */ 7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (unz64local_getShort(&us.z_filefunc, us.filestream,&uL)!=UNZ_OK) 7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) err=UNZ_ERRNO; 7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) us.gi.number_entry = uL; 7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* total number of entries in the central dir */ 7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (unz64local_getShort(&us.z_filefunc, us.filestream,&uL)!=UNZ_OK) 7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) err=UNZ_ERRNO; 7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) number_entry_CD = uL; 7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((number_entry_CD!=us.gi.number_entry) || 7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (number_disk_with_CD!=0) || 7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (number_disk!=0)) 7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) err=UNZ_BADZIPFILE; 7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* size of the central directory */ 7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (unz64local_getLong(&us.z_filefunc, us.filestream,&uL)!=UNZ_OK) 7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) err=UNZ_ERRNO; 7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) us.size_central_dir = uL; 7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* offset of start of central directory with respect to the 7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) starting disk number */ 7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (unz64local_getLong(&us.z_filefunc, us.filestream,&uL)!=UNZ_OK) 7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) err=UNZ_ERRNO; 7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) us.offset_central_dir = uL; 7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* zipfile comment length */ 7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (unz64local_getShort(&us.z_filefunc, us.filestream,&us.gi.size_comment)!=UNZ_OK) 7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) err=UNZ_ERRNO; 7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((central_pos<us.offset_central_dir+us.size_central_dir) && 7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (err==UNZ_OK)) 7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) err=UNZ_BADZIPFILE; 7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (err!=UNZ_OK) 7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ZCLOSE64(us.z_filefunc, us.filestream); 7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) us.byte_before_the_zipfile = central_pos - 7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (us.offset_central_dir+us.size_central_dir); 7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) us.central_pos = central_pos; 7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) us.pfile_in_zip_read = NULL; 7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) us.encrypted = 0; 7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) s=(unz64_s*)ALLOC(sizeof(unz64_s)); 7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( s != NULL) 7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *s=us; 7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unzGoToFirstFile((unzFile)s); 7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (unzFile)s; 7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)extern unzFile ZEXPORT unzOpen2 (const char *path, 7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zlib_filefunc_def* pzlib_filefunc32_def) 7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (pzlib_filefunc32_def != NULL) 7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zlib_filefunc64_32_def zlib_filefunc64_32_def_fill; 7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fill_zlib_filefunc64_32_def_from_filefunc32(&zlib_filefunc64_32_def_fill,pzlib_filefunc32_def); 7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return unzOpenInternal(path, &zlib_filefunc64_32_def_fill, 0); 7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return unzOpenInternal(path, NULL, 0); 7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)extern unzFile ZEXPORT unzOpen2_64 (const void *path, 7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zlib_filefunc64_def* pzlib_filefunc_def) 7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (pzlib_filefunc_def != NULL) 7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zlib_filefunc64_32_def zlib_filefunc64_32_def_fill; 7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zlib_filefunc64_32_def_fill.zfile_func64 = *pzlib_filefunc_def; 7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zlib_filefunc64_32_def_fill.ztell32_file = NULL; 7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zlib_filefunc64_32_def_fill.zseek32_file = NULL; 7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return unzOpenInternal(path, &zlib_filefunc64_32_def_fill, 1); 7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return unzOpenInternal(path, NULL, 1); 7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)extern unzFile ZEXPORT unzOpen (const char *path) 7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return unzOpenInternal(path, NULL, 0); 7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)extern unzFile ZEXPORT unzOpen64 (const void *path) 7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return unzOpenInternal(path, NULL, 1); 8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Close a ZipFile opened with unzipOpen. 8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) If there is files inside the .Zip opened with unzipOpenCurrentFile (see later), 8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) these files MUST be closed with unzipCloseCurrentFile before call unzipClose. 8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return UNZ_OK if there is no problem. */ 8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)extern int ZEXPORT unzClose (unzFile file) 8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unz64_s* s; 8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (file==NULL) 8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return UNZ_PARAMERROR; 8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) s=(unz64_s*)file; 8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (s->pfile_in_zip_read!=NULL) 8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unzCloseCurrentFile(file); 8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ZCLOSE64(s->z_filefunc, s->filestream); 8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TRYFREE(s); 8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return UNZ_OK; 8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Write info about the ZipFile in the *pglobal_info structure. 8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) No preparation of the structure is needed 8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return UNZ_OK if there is no problem. */ 8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)extern int ZEXPORT unzGetGlobalInfo64 (unzFile file, unz_global_info64* pglobal_info) 8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unz64_s* s; 8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (file==NULL) 8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return UNZ_PARAMERROR; 8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) s=(unz64_s*)file; 8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *pglobal_info=s->gi; 8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return UNZ_OK; 8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)extern int ZEXPORT unzGetGlobalInfo (unzFile file, unz_global_info* pglobal_info32) 8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unz64_s* s; 8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (file==NULL) 8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return UNZ_PARAMERROR; 8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) s=(unz64_s*)file; 8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* to do : check if number_entry is not truncated */ 8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pglobal_info32->number_entry = (uLong)s->gi.number_entry; 8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pglobal_info32->size_comment = s->gi.size_comment; 8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return UNZ_OK; 8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Translate date/time from Dos format to tm_unz (readable more easilty) 8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)local void unz64local_DosDateToTmuDate (ZPOS64_T ulDosDate, tm_unz* ptm) 8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ZPOS64_T uDate; 8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uDate = (ZPOS64_T)(ulDosDate>>16); 8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ptm->tm_mday = (uInt)(uDate&0x1f) ; 8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ptm->tm_mon = (uInt)((((uDate)&0x1E0)/0x20)-1) ; 8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ptm->tm_year = (uInt)(((uDate&0x0FE00)/0x0200)+1980) ; 8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ptm->tm_hour = (uInt) ((ulDosDate &0xF800)/0x800); 8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ptm->tm_min = (uInt) ((ulDosDate&0x7E0)/0x20) ; 8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ptm->tm_sec = (uInt) (2*(ulDosDate&0x1f)) ; 8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Get Info about the current file in the zipfile, with internal only info 8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)local int unz64local_GetCurrentFileInfoInternal OF((unzFile file, 8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unz_file_info64 *pfile_info, 8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unz_file_info64_internal 8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *pfile_info_internal, 8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char *szFileName, 8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uLong fileNameBufferSize, 8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void *extraField, 8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uLong extraFieldBufferSize, 8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char *szComment, 8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uLong commentBufferSize)); 8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)local int unz64local_GetCurrentFileInfoInternal (unzFile file, 8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unz_file_info64 *pfile_info, 8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unz_file_info64_internal 8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *pfile_info_internal, 8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char *szFileName, 8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uLong fileNameBufferSize, 8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void *extraField, 8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uLong extraFieldBufferSize, 8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char *szComment, 8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uLong commentBufferSize) 8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unz64_s* s; 8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unz_file_info64 file_info; 8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unz_file_info64_internal file_info_internal; 8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int err=UNZ_OK; 8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uLong uMagic; 8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) long lSeek=0; 8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uLong uL; 8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (file==NULL) 8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return UNZ_PARAMERROR; 9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) s=(unz64_s*)file; 9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ZSEEK64(s->z_filefunc, s->filestream, 9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) s->pos_in_central_dir+s->byte_before_the_zipfile, 9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ZLIB_FILEFUNC_SEEK_SET)!=0) 9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) err=UNZ_ERRNO; 9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* we check the magic */ 9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (err==UNZ_OK) 9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (unz64local_getLong(&s->z_filefunc, s->filestream,&uMagic) != UNZ_OK) 9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) err=UNZ_ERRNO; 9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (uMagic!=0x02014b50) 9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) err=UNZ_BADZIPFILE; 9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (unz64local_getShort(&s->z_filefunc, s->filestream,&file_info.version) != UNZ_OK) 9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) err=UNZ_ERRNO; 9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (unz64local_getShort(&s->z_filefunc, s->filestream,&file_info.version_needed) != UNZ_OK) 9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) err=UNZ_ERRNO; 9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (unz64local_getShort(&s->z_filefunc, s->filestream,&file_info.flag) != UNZ_OK) 9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) err=UNZ_ERRNO; 9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (unz64local_getShort(&s->z_filefunc, s->filestream,&file_info.compression_method) != UNZ_OK) 9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) err=UNZ_ERRNO; 9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (unz64local_getLong(&s->z_filefunc, s->filestream,&file_info.dosDate) != UNZ_OK) 9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) err=UNZ_ERRNO; 9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unz64local_DosDateToTmuDate(file_info.dosDate,&file_info.tmu_date); 9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (unz64local_getLong(&s->z_filefunc, s->filestream,&file_info.crc) != UNZ_OK) 9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) err=UNZ_ERRNO; 9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (unz64local_getLong(&s->z_filefunc, s->filestream,&uL) != UNZ_OK) 9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) err=UNZ_ERRNO; 9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) file_info.compressed_size = uL; 9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (unz64local_getLong(&s->z_filefunc, s->filestream,&uL) != UNZ_OK) 9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) err=UNZ_ERRNO; 9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) file_info.uncompressed_size = uL; 9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (unz64local_getShort(&s->z_filefunc, s->filestream,&file_info.size_filename) != UNZ_OK) 9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) err=UNZ_ERRNO; 9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (unz64local_getShort(&s->z_filefunc, s->filestream,&file_info.size_file_extra) != UNZ_OK) 9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) err=UNZ_ERRNO; 9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (unz64local_getShort(&s->z_filefunc, s->filestream,&file_info.size_file_comment) != UNZ_OK) 9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) err=UNZ_ERRNO; 9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (unz64local_getShort(&s->z_filefunc, s->filestream,&file_info.disk_num_start) != UNZ_OK) 9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) err=UNZ_ERRNO; 9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (unz64local_getShort(&s->z_filefunc, s->filestream,&file_info.internal_fa) != UNZ_OK) 9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) err=UNZ_ERRNO; 9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (unz64local_getLong(&s->z_filefunc, s->filestream,&file_info.external_fa) != UNZ_OK) 9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) err=UNZ_ERRNO; 9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // relative offset of local header 9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (unz64local_getLong(&s->z_filefunc, s->filestream,&uL) != UNZ_OK) 9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) err=UNZ_ERRNO; 9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) file_info_internal.offset_curfile = uL; 9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lSeek+=file_info.size_filename; 9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((err==UNZ_OK) && (szFileName!=NULL)) 9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uLong uSizeRead ; 9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (file_info.size_filename<fileNameBufferSize) 9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *(szFileName+file_info.size_filename)='\0'; 9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uSizeRead = file_info.size_filename; 9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uSizeRead = fileNameBufferSize; 9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((file_info.size_filename>0) && (fileNameBufferSize>0)) 9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ZREAD64(s->z_filefunc, s->filestream,szFileName,uSizeRead)!=uSizeRead) 9815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) err=UNZ_ERRNO; 9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lSeek -= uSizeRead; 9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Read extrafield 9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((err==UNZ_OK) && (extraField!=NULL)) 9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ZPOS64_T uSizeRead ; 9895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (file_info.size_file_extra<extraFieldBufferSize) 9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uSizeRead = file_info.size_file_extra; 9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uSizeRead = extraFieldBufferSize; 9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (lSeek!=0) 9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ZSEEK64(s->z_filefunc, s->filestream,lSeek,ZLIB_FILEFUNC_SEEK_CUR)==0) 9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lSeek=0; 9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) err=UNZ_ERRNO; 10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((file_info.size_file_extra>0) && (extraFieldBufferSize>0)) 10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ZREAD64(s->z_filefunc, s->filestream,extraField,(uLong)uSizeRead)!=uSizeRead) 10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) err=UNZ_ERRNO; 10055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lSeek += file_info.size_file_extra - (uLong)uSizeRead; 10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lSeek += file_info.size_file_extra; 10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((err==UNZ_OK) && (file_info.size_file_extra != 0)) 10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uLong acc = 0; 10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // since lSeek now points to after the extra field we need to move back 10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lSeek -= file_info.size_file_extra; 10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (lSeek!=0) 10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 10215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ZSEEK64(s->z_filefunc, s->filestream,lSeek,ZLIB_FILEFUNC_SEEK_CUR)==0) 10225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lSeek=0; 10235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) err=UNZ_ERRNO; 10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while(acc < file_info.size_file_extra) 10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uLong headerId; 10305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uLong dataSize; 10315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (unz64local_getShort(&s->z_filefunc, s->filestream,&headerId) != UNZ_OK) 10335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) err=UNZ_ERRNO; 10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (unz64local_getShort(&s->z_filefunc, s->filestream,&dataSize) != UNZ_OK) 10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) err=UNZ_ERRNO; 10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* ZIP64 extra fields */ 10395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (headerId == 0x0001) 10405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 10415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uLong uL; 10425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if(file_info.uncompressed_size == (ZPOS64_T)(unsigned long)-1) 10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 10455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (unz64local_getLong64(&s->z_filefunc, s->filestream,&file_info.uncompressed_size) != UNZ_OK) 10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) err=UNZ_ERRNO; 10475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if(file_info.compressed_size == (ZPOS64_T)(unsigned long)-1) 10505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 10515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (unz64local_getLong64(&s->z_filefunc, s->filestream,&file_info.compressed_size) != UNZ_OK) 10525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) err=UNZ_ERRNO; 10535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if(file_info_internal.offset_curfile == (ZPOS64_T)(unsigned long)-1) 10565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 10575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Relative Header offset */ 10585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (unz64local_getLong64(&s->z_filefunc, s->filestream,&file_info_internal.offset_curfile) != UNZ_OK) 10595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) err=UNZ_ERRNO; 10605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if(file_info.disk_num_start == (unsigned long)-1) 10635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 10645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Disk Start Number */ 10655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (unz64local_getLong(&s->z_filefunc, s->filestream,&uL) != UNZ_OK) 10665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) err=UNZ_ERRNO; 10675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 10715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 10725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ZSEEK64(s->z_filefunc, s->filestream,dataSize,ZLIB_FILEFUNC_SEEK_CUR)!=0) 10735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) err=UNZ_ERRNO; 10745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) acc += 2 + 2 + dataSize; 10775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((err==UNZ_OK) && (szComment!=NULL)) 10815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 10825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uLong uSizeRead ; 10835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (file_info.size_file_comment<commentBufferSize) 10845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 10855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *(szComment+file_info.size_file_comment)='\0'; 10865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uSizeRead = file_info.size_file_comment; 10875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 10895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uSizeRead = commentBufferSize; 10905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (lSeek!=0) 10925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 10935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ZSEEK64(s->z_filefunc, s->filestream,lSeek,ZLIB_FILEFUNC_SEEK_CUR)==0) 10945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lSeek=0; 10955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 10965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) err=UNZ_ERRNO; 10975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((file_info.size_file_comment>0) && (commentBufferSize>0)) 11005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ZREAD64(s->z_filefunc, s->filestream,szComment,uSizeRead)!=uSizeRead) 11015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) err=UNZ_ERRNO; 11025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lSeek+=file_info.size_file_comment - uSizeRead; 11035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 11055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lSeek+=file_info.size_file_comment; 11065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((err==UNZ_OK) && (pfile_info!=NULL)) 11095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *pfile_info=file_info; 11105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((err==UNZ_OK) && (pfile_info_internal!=NULL)) 11125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *pfile_info_internal=file_info_internal; 11135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return err; 11155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 11205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Write info about the ZipFile in the *pglobal_info structure. 11215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) No preparation of the structure is needed 11225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return UNZ_OK if there is no problem. 11235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 11245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)extern int ZEXPORT unzGetCurrentFileInfo64 (unzFile file, 11255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unz_file_info64 * pfile_info, 11265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char * szFileName, uLong fileNameBufferSize, 11275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void *extraField, uLong extraFieldBufferSize, 11285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char* szComment, uLong commentBufferSize) 11295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 11305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return unz64local_GetCurrentFileInfoInternal(file,pfile_info,NULL, 11315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) szFileName,fileNameBufferSize, 11325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extraField,extraFieldBufferSize, 11335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) szComment,commentBufferSize); 11345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)extern int ZEXPORT unzGetCurrentFileInfo (unzFile file, 11375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unz_file_info * pfile_info, 11385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char * szFileName, uLong fileNameBufferSize, 11395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void *extraField, uLong extraFieldBufferSize, 11405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char* szComment, uLong commentBufferSize) 11415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 11425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int err; 11435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unz_file_info64 file_info64; 11445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) err = unz64local_GetCurrentFileInfoInternal(file,&file_info64,NULL, 11455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) szFileName,fileNameBufferSize, 11465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extraField,extraFieldBufferSize, 11475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) szComment,commentBufferSize); 11485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (err==UNZ_OK) 11495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 11505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pfile_info->version = file_info64.version; 11515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pfile_info->version_needed = file_info64.version_needed; 11525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pfile_info->flag = file_info64.flag; 11535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pfile_info->compression_method = file_info64.compression_method; 11545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pfile_info->dosDate = file_info64.dosDate; 11555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pfile_info->crc = file_info64.crc; 11565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pfile_info->size_filename = file_info64.size_filename; 11585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pfile_info->size_file_extra = file_info64.size_file_extra; 11595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pfile_info->size_file_comment = file_info64.size_file_comment; 11605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pfile_info->disk_num_start = file_info64.disk_num_start; 11625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pfile_info->internal_fa = file_info64.internal_fa; 11635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pfile_info->external_fa = file_info64.external_fa; 11645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pfile_info->tmu_date = file_info64.tmu_date, 11665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pfile_info->compressed_size = (uLong)file_info64.compressed_size; 11695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pfile_info->uncompressed_size = (uLong)file_info64.uncompressed_size; 11705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return err; 11735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 11755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Set the current file of the zipfile to the first file. 11765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return UNZ_OK if there is no problem 11775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 11785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)extern int ZEXPORT unzGoToFirstFile (unzFile file) 11795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 11805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int err=UNZ_OK; 11815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unz64_s* s; 11825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (file==NULL) 11835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return UNZ_PARAMERROR; 11845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) s=(unz64_s*)file; 11855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) s->pos_in_central_dir=s->offset_central_dir; 11865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) s->num_file=0; 11875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) err=unz64local_GetCurrentFileInfoInternal(file,&s->cur_file_info, 11885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &s->cur_file_info_internal, 11895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL,0,NULL,0,NULL,0); 11905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) s->current_file_ok = (err == UNZ_OK); 11915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return err; 11925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 11955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Set the current file of the zipfile to the next file. 11965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return UNZ_OK if there is no problem 11975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return UNZ_END_OF_LIST_OF_FILE if the actual file was the latest. 11985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 11995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)extern int ZEXPORT unzGoToNextFile (unzFile file) 12005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 12015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unz64_s* s; 12025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int err; 12035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (file==NULL) 12055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return UNZ_PARAMERROR; 12065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) s=(unz64_s*)file; 12075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!s->current_file_ok) 12085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return UNZ_END_OF_LIST_OF_FILE; 12095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (s->gi.number_entry != 0xffff) /* 2^16 files overflow hack */ 12105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (s->num_file+1==s->gi.number_entry) 12115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return UNZ_END_OF_LIST_OF_FILE; 12125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) s->pos_in_central_dir += SIZECENTRALDIRITEM + s->cur_file_info.size_filename + 12145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) s->cur_file_info.size_file_extra + s->cur_file_info.size_file_comment ; 12155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) s->num_file++; 12165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) err = unz64local_GetCurrentFileInfoInternal(file,&s->cur_file_info, 12175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &s->cur_file_info_internal, 12185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL,0,NULL,0,NULL,0); 12195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) s->current_file_ok = (err == UNZ_OK); 12205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return err; 12215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 12255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Try locate the file szFileName in the zipfile. 12265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) For the iCaseSensitivity signification, see unzipStringFileNameCompare 12275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return value : 12295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UNZ_OK if the file is found. It becomes the current file. 12305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UNZ_END_OF_LIST_OF_FILE if the file is not found 12315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 12325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)extern int ZEXPORT unzLocateFile (unzFile file, const char *szFileName, int iCaseSensitivity) 12335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 12345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unz64_s* s; 12355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int err; 12365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* We remember the 'current' position in the file so that we can jump 12385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * back there if we fail. 12395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 12405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unz_file_info64 cur_file_infoSaved; 12415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unz_file_info64_internal cur_file_info_internalSaved; 12425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ZPOS64_T num_fileSaved; 12435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ZPOS64_T pos_in_central_dirSaved; 12445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (file==NULL) 12475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return UNZ_PARAMERROR; 12485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (strlen(szFileName)>=UNZ_MAXFILENAMEINZIP) 12505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return UNZ_PARAMERROR; 12515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) s=(unz64_s*)file; 12535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!s->current_file_ok) 12545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return UNZ_END_OF_LIST_OF_FILE; 12555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Save the current state */ 12575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) num_fileSaved = s->num_file; 12585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pos_in_central_dirSaved = s->pos_in_central_dir; 12595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur_file_infoSaved = s->cur_file_info; 12605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur_file_info_internalSaved = s->cur_file_info_internal; 12615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) err = unzGoToFirstFile(file); 12635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (err == UNZ_OK) 12655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 12665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char szCurrentFileName[UNZ_MAXFILENAMEINZIP+1]; 12675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) err = unzGetCurrentFileInfo64(file,NULL, 12685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) szCurrentFileName,sizeof(szCurrentFileName)-1, 12695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL,0,NULL,0); 12705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (err == UNZ_OK) 12715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 12725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (unzStringFileNameCompare(szCurrentFileName, 12735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) szFileName,iCaseSensitivity)==0) 12745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return UNZ_OK; 12755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) err = unzGoToNextFile(file); 12765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* We failed, so restore the state of the 'current file' to where we 12805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * were. 12815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 12825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) s->num_file = num_fileSaved ; 12835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) s->pos_in_central_dir = pos_in_central_dirSaved ; 12845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) s->cur_file_info = cur_file_infoSaved; 12855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) s->cur_file_info_internal = cur_file_info_internalSaved; 12865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return err; 12875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 12915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/////////////////////////////////////////// 12925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Contributed by Ryan Haksi (mailto://cryogen@infoserve.net) 12935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// I need random access 12945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 12955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Further optimization could be realized by adding an ability 12965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// to cache the directory in memory. The goal being a single 12975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// comprehensive file read to put the file I need in a memory. 12985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 12995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 13015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef struct unz_file_pos_s 13025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 13035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ZPOS64_T pos_in_zip_directory; // offset in file 13045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ZPOS64_T num_of_file; // # of file 13055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} unz_file_pos; 13065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 13075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)extern int ZEXPORT unzGetFilePos64(unzFile file, unz64_file_pos* file_pos) 13095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 13105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unz64_s* s; 13115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (file==NULL || file_pos==NULL) 13135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return UNZ_PARAMERROR; 13145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) s=(unz64_s*)file; 13155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!s->current_file_ok) 13165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return UNZ_END_OF_LIST_OF_FILE; 13175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) file_pos->pos_in_zip_directory = s->pos_in_central_dir; 13195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) file_pos->num_of_file = s->num_file; 13205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return UNZ_OK; 13225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)extern int ZEXPORT unzGetFilePos( 13255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unzFile file, 13265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unz_file_pos* file_pos) 13275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 13285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unz64_file_pos file_pos64; 13295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int err = unzGetFilePos64(file,&file_pos64); 13305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (err==UNZ_OK) 13315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 13325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) file_pos->pos_in_zip_directory = (uLong)file_pos64.pos_in_zip_directory; 13335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) file_pos->num_of_file = (uLong)file_pos64.num_of_file; 13345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return err; 13365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)extern int ZEXPORT unzGoToFilePos64(unzFile file, const unz64_file_pos* file_pos) 13395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 13405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unz64_s* s; 13415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int err; 13425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (file==NULL || file_pos==NULL) 13445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return UNZ_PARAMERROR; 13455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) s=(unz64_s*)file; 13465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* jump to the right spot */ 13485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) s->pos_in_central_dir = file_pos->pos_in_zip_directory; 13495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) s->num_file = file_pos->num_of_file; 13505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* set the current file */ 13525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) err = unz64local_GetCurrentFileInfoInternal(file,&s->cur_file_info, 13535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &s->cur_file_info_internal, 13545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL,0,NULL,0,NULL,0); 13555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* return results */ 13565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) s->current_file_ok = (err == UNZ_OK); 13575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return err; 13585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)extern int ZEXPORT unzGoToFilePos( 13615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unzFile file, 13625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unz_file_pos* file_pos) 13635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 13645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unz64_file_pos file_pos64; 13655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (file_pos == NULL) 13665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return UNZ_PARAMERROR; 13675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) file_pos64.pos_in_zip_directory = file_pos->pos_in_zip_directory; 13695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) file_pos64.num_of_file = file_pos->num_of_file; 13705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return unzGoToFilePos64(file,&file_pos64); 13715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 13745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Unzip Helper Functions - should be here? 13755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/////////////////////////////////////////// 13765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 13775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 13795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Read the local header of the current zipfile 13805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Check the coherency of the local header and info in the end of central 13815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) directory about this file 13825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) store in *piSizeVar the size of extra info in local header 13835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (filename and size of extra field data) 13845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 13855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)local int unz64local_CheckCurrentFileCoherencyHeader (unz64_s* s, uInt* piSizeVar, 13865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ZPOS64_T * poffset_local_extrafield, 13875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uInt * psize_local_extrafield) 13885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 13895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uLong uMagic,uData,uFlags; 13905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uLong size_filename; 13915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uLong size_extra_field; 13925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int err=UNZ_OK; 13935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *piSizeVar = 0; 13955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *poffset_local_extrafield = 0; 13965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *psize_local_extrafield = 0; 13975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ZSEEK64(s->z_filefunc, s->filestream,s->cur_file_info_internal.offset_curfile + 13995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) s->byte_before_the_zipfile,ZLIB_FILEFUNC_SEEK_SET)!=0) 14005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return UNZ_ERRNO; 14015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (err==UNZ_OK) 14045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 14055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (unz64local_getLong(&s->z_filefunc, s->filestream,&uMagic) != UNZ_OK) 14065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) err=UNZ_ERRNO; 14075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (uMagic!=0x04034b50) 14085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) err=UNZ_BADZIPFILE; 14095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (unz64local_getShort(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) 14125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) err=UNZ_ERRNO; 14135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 14145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if ((err==UNZ_OK) && (uData!=s->cur_file_info.wVersion)) 14155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) err=UNZ_BADZIPFILE; 14165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 14175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (unz64local_getShort(&s->z_filefunc, s->filestream,&uFlags) != UNZ_OK) 14185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) err=UNZ_ERRNO; 14195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (unz64local_getShort(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) 14215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) err=UNZ_ERRNO; 14225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if ((err==UNZ_OK) && (uData!=s->cur_file_info.compression_method)) 14235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) err=UNZ_BADZIPFILE; 14245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((err==UNZ_OK) && (s->cur_file_info.compression_method!=0) && 14265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* #ifdef HAVE_BZIP2 */ 14275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (s->cur_file_info.compression_method!=Z_BZIP2ED) && 14285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* #endif */ 14295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (s->cur_file_info.compression_method!=Z_DEFLATED)) 14305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) err=UNZ_BADZIPFILE; 14315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (unz64local_getLong(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) /* date/time */ 14335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) err=UNZ_ERRNO; 14345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (unz64local_getLong(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) /* crc */ 14365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) err=UNZ_ERRNO; 14375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if ((err==UNZ_OK) && (uData!=s->cur_file_info.crc) && ((uFlags & 8)==0)) 14385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) err=UNZ_BADZIPFILE; 14395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (unz64local_getLong(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) /* size compr */ 14415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) err=UNZ_ERRNO; 14425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (uData != 0xFFFFFFFF && (err==UNZ_OK) && (uData!=s->cur_file_info.compressed_size) && ((uFlags & 8)==0)) 14435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) err=UNZ_BADZIPFILE; 14445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (unz64local_getLong(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) /* size uncompr */ 14465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) err=UNZ_ERRNO; 14475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (uData != 0xFFFFFFFF && (err==UNZ_OK) && (uData!=s->cur_file_info.uncompressed_size) && ((uFlags & 8)==0)) 14485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) err=UNZ_BADZIPFILE; 14495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (unz64local_getShort(&s->z_filefunc, s->filestream,&size_filename) != UNZ_OK) 14515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) err=UNZ_ERRNO; 14525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if ((err==UNZ_OK) && (size_filename!=s->cur_file_info.size_filename)) 14535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) err=UNZ_BADZIPFILE; 14545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *piSizeVar += (uInt)size_filename; 14565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (unz64local_getShort(&s->z_filefunc, s->filestream,&size_extra_field) != UNZ_OK) 14585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) err=UNZ_ERRNO; 14595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *poffset_local_extrafield= s->cur_file_info_internal.offset_curfile + 14605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SIZEZIPLOCALHEADER + size_filename; 14615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *psize_local_extrafield = (uInt)size_extra_field; 14625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *piSizeVar += (uInt)size_extra_field; 14645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return err; 14665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 14695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Open for reading data the current file in the zipfile. 14705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) If there is no error and the file is opened, the return value is UNZ_OK. 14715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 14725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)extern int ZEXPORT unzOpenCurrentFile3 (unzFile file, int* method, 14735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int* level, int raw, const char* password) 14745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 14755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int err=UNZ_OK; 14765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uInt iSizeVar; 14775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unz64_s* s; 14785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) file_in_zip64_read_info_s* pfile_in_zip_read_info; 14795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ZPOS64_T offset_local_extrafield; /* offset of the local extra field */ 14805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uInt size_local_extrafield; /* size of the local extra field */ 14815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# ifndef NOUNCRYPT 14825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char source[12]; 14835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# else 14845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (password != NULL) 14855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return UNZ_PARAMERROR; 14865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# endif 14875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (file==NULL) 14895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return UNZ_PARAMERROR; 14905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) s=(unz64_s*)file; 14915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!s->current_file_ok) 14925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return UNZ_PARAMERROR; 14935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (s->pfile_in_zip_read != NULL) 14955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unzCloseCurrentFile(file); 14965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (unz64local_CheckCurrentFileCoherencyHeader(s,&iSizeVar, &offset_local_extrafield,&size_local_extrafield)!=UNZ_OK) 14985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return UNZ_BADZIPFILE; 14995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pfile_in_zip_read_info = (file_in_zip64_read_info_s*)ALLOC(sizeof(file_in_zip64_read_info_s)); 15015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (pfile_in_zip_read_info==NULL) 15025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return UNZ_INTERNALERROR; 15035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pfile_in_zip_read_info->read_buffer=(char*)ALLOC(UNZ_BUFSIZE); 15055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pfile_in_zip_read_info->offset_local_extrafield = offset_local_extrafield; 15065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pfile_in_zip_read_info->size_local_extrafield = size_local_extrafield; 15075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pfile_in_zip_read_info->pos_local_extrafield=0; 15085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pfile_in_zip_read_info->raw=raw; 15095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (pfile_in_zip_read_info->read_buffer==NULL) 15115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 15125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TRYFREE(pfile_in_zip_read_info); 15135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return UNZ_INTERNALERROR; 15145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pfile_in_zip_read_info->stream_initialised=0; 15175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (method!=NULL) 15195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *method = (int)s->cur_file_info.compression_method; 15205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (level!=NULL) 15225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 15235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *level = 6; 15245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (s->cur_file_info.flag & 0x06) 15255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 15265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case 6 : *level = 1; break; 15275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case 4 : *level = 2; break; 15285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case 2 : *level = 9; break; 15295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((s->cur_file_info.compression_method!=0) && 15335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* #ifdef HAVE_BZIP2 */ 15345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (s->cur_file_info.compression_method!=Z_BZIP2ED) && 15355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* #endif */ 15365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (s->cur_file_info.compression_method!=Z_DEFLATED)) 15375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) err=UNZ_BADZIPFILE; 15395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pfile_in_zip_read_info->crc32_wait=s->cur_file_info.crc; 15415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pfile_in_zip_read_info->crc32=0; 15425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pfile_in_zip_read_info->total_out_64=0; 15435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pfile_in_zip_read_info->compression_method = s->cur_file_info.compression_method; 15445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pfile_in_zip_read_info->filestream=s->filestream; 15455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pfile_in_zip_read_info->z_filefunc=s->z_filefunc; 15465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pfile_in_zip_read_info->byte_before_the_zipfile=s->byte_before_the_zipfile; 15475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pfile_in_zip_read_info->stream.total_out = 0; 15495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((s->cur_file_info.compression_method==Z_BZIP2ED) && (!raw)) 15515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 15525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef HAVE_BZIP2 15535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pfile_in_zip_read_info->bstream.bzalloc = (void *(*) (void *, int, int))0; 15545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pfile_in_zip_read_info->bstream.bzfree = (free_func)0; 15555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pfile_in_zip_read_info->bstream.opaque = (voidpf)0; 15565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pfile_in_zip_read_info->bstream.state = (voidpf)0; 15575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pfile_in_zip_read_info->stream.zalloc = (alloc_func)0; 15595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pfile_in_zip_read_info->stream.zfree = (free_func)0; 15605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pfile_in_zip_read_info->stream.opaque = (voidpf)0; 15615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pfile_in_zip_read_info->stream.next_in = (voidpf)0; 15625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pfile_in_zip_read_info->stream.avail_in = 0; 15635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) err=BZ2_bzDecompressInit(&pfile_in_zip_read_info->bstream, 0, 0); 15655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (err == Z_OK) 15665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pfile_in_zip_read_info->stream_initialised=Z_BZIP2ED; 15675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 15685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 15695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TRYFREE(pfile_in_zip_read_info); 15705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return err; 15715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 15735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pfile_in_zip_read_info->raw=1; 15745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 15755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if ((s->cur_file_info.compression_method==Z_DEFLATED) && (!raw)) 15775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 15785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pfile_in_zip_read_info->stream.zalloc = (alloc_func)0; 15795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pfile_in_zip_read_info->stream.zfree = (free_func)0; 15805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pfile_in_zip_read_info->stream.opaque = (voidpf)0; 15815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pfile_in_zip_read_info->stream.next_in = 0; 15825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pfile_in_zip_read_info->stream.avail_in = 0; 15835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) err=inflateInit2(&pfile_in_zip_read_info->stream, -MAX_WBITS); 15855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (err == Z_OK) 15865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pfile_in_zip_read_info->stream_initialised=Z_DEFLATED; 15875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 15885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 15895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TRYFREE(pfile_in_zip_read_info); 15905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return err; 15915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* windowBits is passed < 0 to tell that there is no zlib header. 15935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Note that in this case inflate *requires* an extra "dummy" byte 15945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * after the compressed stream in order to complete decompression and 15955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * return Z_STREAM_END. 15965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * In unzip, i don't wait absolutely Z_STREAM_END because I known the 15975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * size of both compressed and uncompressed data 15985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 15995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pfile_in_zip_read_info->rest_read_compressed = 16015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) s->cur_file_info.compressed_size ; 16025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pfile_in_zip_read_info->rest_read_uncompressed = 16035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) s->cur_file_info.uncompressed_size ; 16045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pfile_in_zip_read_info->pos_in_zipfile = 16075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) s->cur_file_info_internal.offset_curfile + SIZEZIPLOCALHEADER + 16085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) iSizeVar; 16095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pfile_in_zip_read_info->stream.avail_in = (uInt)0; 16115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) s->pfile_in_zip_read = pfile_in_zip_read_info; 16135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) s->encrypted = 0; 16145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# ifndef NOUNCRYPT 16165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (password != NULL) 16175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 16185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i; 16195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) s->pcrc_32_tab = get_crc_table(); 16205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) init_keys(password,s->keys,s->pcrc_32_tab); 16215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ZSEEK64(s->z_filefunc, s->filestream, 16225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) s->pfile_in_zip_read->pos_in_zipfile + 16235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) s->pfile_in_zip_read->byte_before_the_zipfile, 16245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SEEK_SET)!=0) 16255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return UNZ_INTERNALERROR; 16265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if(ZREAD64(s->z_filefunc, s->filestream,source, 12)<12) 16275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return UNZ_INTERNALERROR; 16285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (i = 0; i<12; i++) 16305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zdecode(s->keys,s->pcrc_32_tab,source[i]); 16315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) s->pfile_in_zip_read->pos_in_zipfile+=12; 16335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) s->encrypted=1; 16345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# endif 16365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return UNZ_OK; 16395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)extern int ZEXPORT unzOpenCurrentFile (unzFile file) 16425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 16435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return unzOpenCurrentFile3(file, NULL, NULL, 0, NULL); 16445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)extern int ZEXPORT unzOpenCurrentFilePassword (unzFile file, const char* password) 16475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 16485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return unzOpenCurrentFile3(file, NULL, NULL, 0, password); 16495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)extern int ZEXPORT unzOpenCurrentFile2 (unzFile file, int* method, int* level, int raw) 16525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 16535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return unzOpenCurrentFile3(file, method, level, raw, NULL); 16545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** Addition for GDAL : START */ 16575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)extern ZPOS64_T ZEXPORT unzGetCurrentFileZStreamPos64( unzFile file) 16595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 16605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unz64_s* s; 16615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) file_in_zip64_read_info_s* pfile_in_zip_read_info; 16625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) s=(unz64_s*)file; 16635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (file==NULL) 16645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; //UNZ_PARAMERROR; 16655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pfile_in_zip_read_info=s->pfile_in_zip_read; 16665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (pfile_in_zip_read_info==NULL) 16675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; //UNZ_PARAMERROR; 16685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return pfile_in_zip_read_info->pos_in_zipfile + 16695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pfile_in_zip_read_info->byte_before_the_zipfile; 16705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** Addition for GDAL : END */ 16735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 16755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Read bytes from the current file. 16765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) buf contain buffer where data must be copied 16775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) len the size of buf. 16785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return the number of byte copied if somes bytes are copied 16805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0 if the end of file was reached 16815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return <0 with error code if there is an error 16825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (UNZ_ERRNO for IO error, or zLib error for uncompress error) 16835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 16845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)extern int ZEXPORT unzReadCurrentFile (unzFile file, voidp buf, unsigned len) 16855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 16865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int err=UNZ_OK; 16875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uInt iRead = 0; 16885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unz64_s* s; 16895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) file_in_zip64_read_info_s* pfile_in_zip_read_info; 16905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (file==NULL) 16915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return UNZ_PARAMERROR; 16925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) s=(unz64_s*)file; 16935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pfile_in_zip_read_info=s->pfile_in_zip_read; 16945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (pfile_in_zip_read_info==NULL) 16965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return UNZ_PARAMERROR; 16975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((pfile_in_zip_read_info->read_buffer == NULL)) 17005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return UNZ_END_OF_LIST_OF_FILE; 17015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (len==0) 17025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; 17035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pfile_in_zip_read_info->stream.next_out = (Bytef*)buf; 17055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pfile_in_zip_read_info->stream.avail_out = (uInt)len; 17075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((len>pfile_in_zip_read_info->rest_read_compressed+ 17095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pfile_in_zip_read_info->stream.avail_in) && 17105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (pfile_in_zip_read_info->raw)) 17115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pfile_in_zip_read_info->stream.avail_out = 17125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (uInt)pfile_in_zip_read_info->rest_read_compressed+ 17135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pfile_in_zip_read_info->stream.avail_in; 17145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (pfile_in_zip_read_info->stream.avail_out>0) 17165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 17175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((pfile_in_zip_read_info->stream.avail_in==0) && 17185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (pfile_in_zip_read_info->rest_read_compressed>0)) 17195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 17205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uInt uReadThis = UNZ_BUFSIZE; 17215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (pfile_in_zip_read_info->rest_read_compressed<uReadThis) 17225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uReadThis = (uInt)pfile_in_zip_read_info->rest_read_compressed; 17235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (uReadThis == 0) 17245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return UNZ_EOF; 17255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ZSEEK64(pfile_in_zip_read_info->z_filefunc, 17265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pfile_in_zip_read_info->filestream, 17275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pfile_in_zip_read_info->pos_in_zipfile + 17285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pfile_in_zip_read_info->byte_before_the_zipfile, 17295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ZLIB_FILEFUNC_SEEK_SET)!=0) 17305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return UNZ_ERRNO; 17315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ZREAD64(pfile_in_zip_read_info->z_filefunc, 17325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pfile_in_zip_read_info->filestream, 17335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pfile_in_zip_read_info->read_buffer, 17345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uReadThis)!=uReadThis) 17355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return UNZ_ERRNO; 17365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# ifndef NOUNCRYPT 17395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if(s->encrypted) 17405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 17415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uInt i; 17425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(i=0;i<uReadThis;i++) 17435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pfile_in_zip_read_info->read_buffer[i] = 17445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zdecode(s->keys,s->pcrc_32_tab, 17455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pfile_in_zip_read_info->read_buffer[i]); 17465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# endif 17485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pfile_in_zip_read_info->pos_in_zipfile += uReadThis; 17515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pfile_in_zip_read_info->rest_read_compressed-=uReadThis; 17535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pfile_in_zip_read_info->stream.next_in = 17555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (Bytef*)pfile_in_zip_read_info->read_buffer; 17565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pfile_in_zip_read_info->stream.avail_in = (uInt)uReadThis; 17575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((pfile_in_zip_read_info->compression_method==0) || (pfile_in_zip_read_info->raw)) 17605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 17615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uInt uDoCopy,i ; 17625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((pfile_in_zip_read_info->stream.avail_in == 0) && 17645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (pfile_in_zip_read_info->rest_read_compressed == 0)) 17655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (iRead==0) ? UNZ_EOF : iRead; 17665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (pfile_in_zip_read_info->stream.avail_out < 17685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pfile_in_zip_read_info->stream.avail_in) 17695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uDoCopy = pfile_in_zip_read_info->stream.avail_out ; 17705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 17715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uDoCopy = pfile_in_zip_read_info->stream.avail_in ; 17725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (i=0;i<uDoCopy;i++) 17745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *(pfile_in_zip_read_info->stream.next_out+i) = 17755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *(pfile_in_zip_read_info->stream.next_in+i); 17765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pfile_in_zip_read_info->total_out_64 = pfile_in_zip_read_info->total_out_64 + uDoCopy; 17785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pfile_in_zip_read_info->crc32 = crc32(pfile_in_zip_read_info->crc32, 17805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pfile_in_zip_read_info->stream.next_out, 17815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uDoCopy); 17825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pfile_in_zip_read_info->rest_read_uncompressed-=uDoCopy; 17835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pfile_in_zip_read_info->stream.avail_in -= uDoCopy; 17845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pfile_in_zip_read_info->stream.avail_out -= uDoCopy; 17855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pfile_in_zip_read_info->stream.next_out += uDoCopy; 17865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pfile_in_zip_read_info->stream.next_in += uDoCopy; 17875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pfile_in_zip_read_info->stream.total_out += uDoCopy; 17885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) iRead += uDoCopy; 17895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (pfile_in_zip_read_info->compression_method==Z_BZIP2ED) 17915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 17925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef HAVE_BZIP2 17935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uLong uTotalOutBefore,uTotalOutAfter; 17945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Bytef *bufBefore; 17955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uLong uOutThis; 17965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pfile_in_zip_read_info->bstream.next_in = (char*)pfile_in_zip_read_info->stream.next_in; 17985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pfile_in_zip_read_info->bstream.avail_in = pfile_in_zip_read_info->stream.avail_in; 17995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pfile_in_zip_read_info->bstream.total_in_lo32 = pfile_in_zip_read_info->stream.total_in; 18005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pfile_in_zip_read_info->bstream.total_in_hi32 = 0; 18015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pfile_in_zip_read_info->bstream.next_out = (char*)pfile_in_zip_read_info->stream.next_out; 18025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pfile_in_zip_read_info->bstream.avail_out = pfile_in_zip_read_info->stream.avail_out; 18035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pfile_in_zip_read_info->bstream.total_out_lo32 = pfile_in_zip_read_info->stream.total_out; 18045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pfile_in_zip_read_info->bstream.total_out_hi32 = 0; 18055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uTotalOutBefore = pfile_in_zip_read_info->bstream.total_out_lo32; 18075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bufBefore = (const Bytef *)pfile_in_zip_read_info->bstream.next_out; 18085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) err=BZ2_bzDecompress(&pfile_in_zip_read_info->bstream); 18105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uTotalOutAfter = pfile_in_zip_read_info->bstream.total_out_lo32; 18125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uOutThis = uTotalOutAfter-uTotalOutBefore; 18135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pfile_in_zip_read_info->total_out_64 = pfile_in_zip_read_info->total_out_64 + uOutThis; 18155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pfile_in_zip_read_info->crc32 = crc32(pfile_in_zip_read_info->crc32,bufBefore, (uInt)(uOutThis)); 18175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pfile_in_zip_read_info->rest_read_uncompressed -= uOutThis; 18185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) iRead += (uInt)(uTotalOutAfter - uTotalOutBefore); 18195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pfile_in_zip_read_info->stream.next_in = (Bytef*)pfile_in_zip_read_info->bstream.next_in; 18215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pfile_in_zip_read_info->stream.avail_in = pfile_in_zip_read_info->bstream.avail_in; 18225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pfile_in_zip_read_info->stream.total_in = pfile_in_zip_read_info->bstream.total_in_lo32; 18235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pfile_in_zip_read_info->stream.next_out = (Bytef*)pfile_in_zip_read_info->bstream.next_out; 18245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pfile_in_zip_read_info->stream.avail_out = pfile_in_zip_read_info->bstream.avail_out; 18255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pfile_in_zip_read_info->stream.total_out = pfile_in_zip_read_info->bstream.total_out_lo32; 18265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (err==BZ_STREAM_END) 18285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (iRead==0) ? UNZ_EOF : iRead; 18295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (err!=BZ_OK) 18305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 18315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 18325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } // end Z_BZIP2ED 18335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 18345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 18355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ZPOS64_T uTotalOutBefore,uTotalOutAfter; 18365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Bytef *bufBefore; 18375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ZPOS64_T uOutThis; 18385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int flush=Z_SYNC_FLUSH; 18395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uTotalOutBefore = pfile_in_zip_read_info->stream.total_out; 18415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bufBefore = pfile_in_zip_read_info->stream.next_out; 18425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 18445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((pfile_in_zip_read_info->rest_read_uncompressed == 18455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pfile_in_zip_read_info->stream.avail_out) && 18465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (pfile_in_zip_read_info->rest_read_compressed == 0)) 18475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) flush = Z_FINISH; 18485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 18495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) err=inflate(&pfile_in_zip_read_info->stream,flush); 18505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((err>=0) && (pfile_in_zip_read_info->stream.msg!=NULL)) 18525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) err = Z_DATA_ERROR; 18535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uTotalOutAfter = pfile_in_zip_read_info->stream.total_out; 18555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uOutThis = uTotalOutAfter-uTotalOutBefore; 18565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pfile_in_zip_read_info->total_out_64 = pfile_in_zip_read_info->total_out_64 + uOutThis; 18585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pfile_in_zip_read_info->crc32 = 18605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) crc32(pfile_in_zip_read_info->crc32,bufBefore, 18615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (uInt)(uOutThis)); 18625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pfile_in_zip_read_info->rest_read_uncompressed -= 18645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uOutThis; 18655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) iRead += (uInt)(uTotalOutAfter - uTotalOutBefore); 18675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (err==Z_STREAM_END) 18695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (iRead==0) ? UNZ_EOF : iRead; 18705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (err!=Z_OK) 18715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 18725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 18735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 18745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (err==Z_OK) 18765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return iRead; 18775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return err; 18785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 18795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 18825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Give the current position in uncompressed data 18835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 18845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)extern z_off_t ZEXPORT unztell (unzFile file) 18855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 18865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unz64_s* s; 18875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) file_in_zip64_read_info_s* pfile_in_zip_read_info; 18885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (file==NULL) 18895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return UNZ_PARAMERROR; 18905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) s=(unz64_s*)file; 18915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pfile_in_zip_read_info=s->pfile_in_zip_read; 18925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (pfile_in_zip_read_info==NULL) 18945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return UNZ_PARAMERROR; 18955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (z_off_t)pfile_in_zip_read_info->stream.total_out; 18975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 18985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)extern ZPOS64_T ZEXPORT unztell64 (unzFile file) 19005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 19015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unz64_s* s; 19035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) file_in_zip64_read_info_s* pfile_in_zip_read_info; 19045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (file==NULL) 19055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (ZPOS64_T)-1; 19065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) s=(unz64_s*)file; 19075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pfile_in_zip_read_info=s->pfile_in_zip_read; 19085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (pfile_in_zip_read_info==NULL) 19105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (ZPOS64_T)-1; 19115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return pfile_in_zip_read_info->total_out_64; 19135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 19175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 1 if the end of file was reached, 0 elsewhere 19185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 19195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)extern int ZEXPORT unzeof (unzFile file) 19205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 19215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unz64_s* s; 19225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) file_in_zip64_read_info_s* pfile_in_zip_read_info; 19235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (file==NULL) 19245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return UNZ_PARAMERROR; 19255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) s=(unz64_s*)file; 19265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pfile_in_zip_read_info=s->pfile_in_zip_read; 19275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (pfile_in_zip_read_info==NULL) 19295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return UNZ_PARAMERROR; 19305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (pfile_in_zip_read_info->rest_read_uncompressed == 0) 19325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 1; 19335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 19345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; 19355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 19405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Read extra field from the current file (opened by unzOpenCurrentFile) 19415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)This is the local-header version of the extra field (sometimes, there is 19425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)more info in the local-header version than in the central-header) 19435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if buf==NULL, it return the size of the local extra field that can be read 19455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if buf!=NULL, len is the size of the buffer, the extra header is copied in 19475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) buf. 19485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) the return value is the number of bytes copied in buf, or (if <0) 19495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) the error code 19505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 19515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)extern int ZEXPORT unzGetLocalExtrafield (unzFile file, voidp buf, unsigned len) 19525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 19535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unz64_s* s; 19545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) file_in_zip64_read_info_s* pfile_in_zip_read_info; 19555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uInt read_now; 19565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ZPOS64_T size_to_read; 19575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (file==NULL) 19595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return UNZ_PARAMERROR; 19605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) s=(unz64_s*)file; 19615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pfile_in_zip_read_info=s->pfile_in_zip_read; 19625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (pfile_in_zip_read_info==NULL) 19645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return UNZ_PARAMERROR; 19655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_to_read = (pfile_in_zip_read_info->size_local_extrafield - 19675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pfile_in_zip_read_info->pos_local_extrafield); 19685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (buf==NULL) 19705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (int)size_to_read; 19715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (len>size_to_read) 19735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) read_now = (uInt)size_to_read; 19745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 19755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) read_now = (uInt)len ; 19765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (read_now==0) 19785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; 19795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ZSEEK64(pfile_in_zip_read_info->z_filefunc, 19815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pfile_in_zip_read_info->filestream, 19825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pfile_in_zip_read_info->offset_local_extrafield + 19835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pfile_in_zip_read_info->pos_local_extrafield, 19845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ZLIB_FILEFUNC_SEEK_SET)!=0) 19855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return UNZ_ERRNO; 19865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ZREAD64(pfile_in_zip_read_info->z_filefunc, 19885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pfile_in_zip_read_info->filestream, 19895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) buf,read_now)!=read_now) 19905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return UNZ_ERRNO; 19915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (int)read_now; 19935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 19965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Close the file in zip opened with unzipOpenCurrentFile 19975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Return UNZ_CRCERROR if all the file was read but the CRC is not good 19985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 19995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)extern int ZEXPORT unzCloseCurrentFile (unzFile file) 20005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 20015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int err=UNZ_OK; 20025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unz64_s* s; 20045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) file_in_zip64_read_info_s* pfile_in_zip_read_info; 20055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (file==NULL) 20065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return UNZ_PARAMERROR; 20075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) s=(unz64_s*)file; 20085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pfile_in_zip_read_info=s->pfile_in_zip_read; 20095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (pfile_in_zip_read_info==NULL) 20115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return UNZ_PARAMERROR; 20125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((pfile_in_zip_read_info->rest_read_uncompressed == 0) && 20155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (!pfile_in_zip_read_info->raw)) 20165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 20175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (pfile_in_zip_read_info->crc32 != pfile_in_zip_read_info->crc32_wait) 20185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) err=UNZ_CRCERROR; 20195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 20205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TRYFREE(pfile_in_zip_read_info->read_buffer); 20235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pfile_in_zip_read_info->read_buffer = NULL; 20245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (pfile_in_zip_read_info->stream_initialised == Z_DEFLATED) 20255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) inflateEnd(&pfile_in_zip_read_info->stream); 20265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef HAVE_BZIP2 20275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (pfile_in_zip_read_info->stream_initialised == Z_BZIP2ED) 20285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BZ2_bzDecompressEnd(&pfile_in_zip_read_info->bstream); 20295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 20305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pfile_in_zip_read_info->stream_initialised = 0; 20335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TRYFREE(pfile_in_zip_read_info); 20345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) s->pfile_in_zip_read=NULL; 20365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return err; 20385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 20395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 20425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Get the global comment string of the ZipFile, in the szComment buffer. 20435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uSizeBuf is the size of the szComment buffer. 20445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return the number of byte copied or an error code <0 20455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 20465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)extern int ZEXPORT unzGetGlobalComment (unzFile file, char * szComment, uLong uSizeBuf) 20475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 20485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unz64_s* s; 20495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uLong uReadThis ; 20505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (file==NULL) 20515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (int)UNZ_PARAMERROR; 20525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) s=(unz64_s*)file; 20535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uReadThis = uSizeBuf; 20555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (uReadThis>s->gi.size_comment) 20565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uReadThis = s->gi.size_comment; 20575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ZSEEK64(s->z_filefunc,s->filestream,s->central_pos+22,ZLIB_FILEFUNC_SEEK_SET)!=0) 20595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return UNZ_ERRNO; 20605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (uReadThis>0) 20625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 20635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *szComment='\0'; 20645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ZREAD64(s->z_filefunc,s->filestream,szComment,uReadThis)!=uReadThis) 20655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return UNZ_ERRNO; 20665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 20675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((szComment != NULL) && (uSizeBuf > s->gi.size_comment)) 20695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *(szComment+s->gi.size_comment)='\0'; 20705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (int)uReadThis; 20715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 20725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Additions by RX '2004 */ 20745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)extern ZPOS64_T ZEXPORT unzGetOffset64(unzFile file) 20755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 20765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unz64_s* s; 20775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (file==NULL) 20795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; //UNZ_PARAMERROR; 20805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) s=(unz64_s*)file; 20815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!s->current_file_ok) 20825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; 20835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (s->gi.number_entry != 0 && s->gi.number_entry != 0xffff) 20845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (s->num_file==s->gi.number_entry) 20855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; 20865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return s->pos_in_central_dir; 20875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 20885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)extern uLong ZEXPORT unzGetOffset (unzFile file) 20905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 20915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ZPOS64_T offset64; 20925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (file==NULL) 20945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; //UNZ_PARAMERROR; 20955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) offset64 = unzGetOffset64(file); 20965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (uLong)offset64; 20975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 20985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)extern int ZEXPORT unzSetOffset64(unzFile file, ZPOS64_T pos) 21005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 21015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unz64_s* s; 21025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int err; 21035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (file==NULL) 21055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return UNZ_PARAMERROR; 21065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) s=(unz64_s*)file; 21075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) s->pos_in_central_dir = pos; 21095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) s->num_file = s->gi.number_entry; /* hack */ 21105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) err = unz64local_GetCurrentFileInfoInternal(file,&s->cur_file_info, 21115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &s->cur_file_info_internal, 21125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL,0,NULL,0,NULL,0); 21135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) s->current_file_ok = (err == UNZ_OK); 21145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return err; 21155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)extern int ZEXPORT unzSetOffset (unzFile file, uLong pos) 21185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 21195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return unzSetOffset64(file,pos); 21205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2121