zip.c revision 9e38dfa2f95fce609707a0941f10af9a785288de
19e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project/* zip.c -- IO on .zip files using zlib 29e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project Version 1.01e, February 12th, 2005 39e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 49e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 27 Dec 2004 Rolf Kalbermatter 59e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project Modification to zipOpen2 to support globalComment retrieval. 69e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 79e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project Copyright (C) 1998-2005 Gilles Vollant 89e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 99e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project Read zip.h for more info 109e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project*/ 119e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 129e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 139e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#include <stdio.h> 149e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#include <stdlib.h> 159e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#include <string.h> 169e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#include <time.h> 179e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#include "zlib.h" 189e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#include "zip.h" 199e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 209e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#ifdef STDC 219e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project# include <stddef.h> 229e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project# include <string.h> 239e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project# include <stdlib.h> 249e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#endif 259e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#ifdef NO_ERRNO_H 269e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project extern int errno; 279e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#else 289e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project# include <errno.h> 299e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#endif 309e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 319e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 329e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#ifndef local 339e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project# define local static 349e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#endif 359e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project/* compile with -Dlocal if your debugger can't find static symbols */ 369e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 379e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#ifndef VERSIONMADEBY 389e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project# define VERSIONMADEBY (0x0) /* platform depedent */ 399e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#endif 409e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 419e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#ifndef Z_BUFSIZE 429e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#define Z_BUFSIZE (16384) 439e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#endif 449e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 459e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#ifndef Z_MAXFILENAMEINZIP 469e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#define Z_MAXFILENAMEINZIP (256) 479e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#endif 489e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 499e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#ifndef ALLOC 509e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project# define ALLOC(size) (malloc(size)) 519e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#endif 529e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#ifndef TRYFREE 539e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project# define TRYFREE(p) {if (p) free(p);} 549e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#endif 559e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 569e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project/* 579e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#define SIZECENTRALDIRITEM (0x2e) 589e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#define SIZEZIPLOCALHEADER (0x1e) 599e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project*/ 609e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 619e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project/* I've found an old Unix (a SunOS 4.1.3_U1) without all SEEK_* defined.... */ 629e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 639e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#ifndef SEEK_CUR 649e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#define SEEK_CUR 1 659e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#endif 669e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 679e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#ifndef SEEK_END 689e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#define SEEK_END 2 699e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#endif 709e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 719e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#ifndef SEEK_SET 729e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#define SEEK_SET 0 739e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#endif 749e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 759e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#ifndef DEF_MEM_LEVEL 769e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#if MAX_MEM_LEVEL >= 8 779e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project# define DEF_MEM_LEVEL 8 789e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#else 799e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project# define DEF_MEM_LEVEL MAX_MEM_LEVEL 809e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#endif 819e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#endif 829e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectconst char zip_copyright[] = 839e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project " zip 1.01 Copyright 1998-2004 Gilles Vollant - http://www.winimage.com/zLibDll"; 849e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 859e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 869e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#define SIZEDATA_INDATABLOCK (4096-(4*4)) 879e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 889e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#define LOCALHEADERMAGIC (0x04034b50) 899e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#define CENTRALHEADERMAGIC (0x02014b50) 909e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#define ENDHEADERMAGIC (0x06054b50) 919e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 929e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#define FLAG_LOCALHEADER_OFFSET (0x06) 939e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#define CRC_LOCALHEADER_OFFSET (0x0e) 949e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 959e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#define SIZECENTRALHEADER (0x2e) /* 46 */ 969e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 979e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projecttypedef struct linkedlist_datablock_internal_s 989e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{ 999e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project struct linkedlist_datablock_internal_s* next_datablock; 1009e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project uLong avail_in_this_block; 1019e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project uLong filled_in_this_block; 1029e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project uLong unused; /* for future use and alignement */ 1039e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project unsigned char data[SIZEDATA_INDATABLOCK]; 1049e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project} linkedlist_datablock_internal; 1059e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 1069e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projecttypedef struct linkedlist_data_s 1079e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{ 1089e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project linkedlist_datablock_internal* first_block; 1099e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project linkedlist_datablock_internal* last_block; 1109e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project} linkedlist_data; 1119e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 1129e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 1139e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projecttypedef struct 1149e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{ 1159e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project z_stream stream; /* zLib stream structure for inflate */ 1169e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project int stream_initialised; /* 1 is stream is initialised */ 1179e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project uInt pos_in_buffered_data; /* last written byte in buffered_data */ 1189e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 1199e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project uLong pos_local_header; /* offset of the local header of the file 1209e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project currenty writing */ 1219e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project char* central_header; /* central header data for the current file */ 1229e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project uLong size_centralheader; /* size of the central header for cur file */ 1239e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project uLong flag; /* flag of the file currently writing */ 1249e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 1259e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project int method; /* compression method of file currenty wr.*/ 1269e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project int raw; /* 1 for directly writing raw data */ 1279e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project Byte buffered_data[Z_BUFSIZE];/* buffer contain compressed data to be writ*/ 1289e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project uLong dosDate; 1299e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project uLong crc32; 1309e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project int encrypt; 1319e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#ifndef NOCRYPT 1329e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project unsigned long keys[3]; /* keys defining the pseudo-random sequence */ 1339e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project const unsigned long* pcrc_32_tab; 1349e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project int crypt_header_size; 1359e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#endif 1369e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project} curfile_info; 1379e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 1389e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projecttypedef struct 1399e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{ 1409e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project zlib_filefunc_def z_filefunc; 1419e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project voidpf filestream; /* io structore of the zipfile */ 1429e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project linkedlist_data central_dir;/* datablock with central dir in construction*/ 1439e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project int in_opened_file_inzip; /* 1 if a file in the zip is currently writ.*/ 1449e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project curfile_info ci; /* info on the file curretly writing */ 1459e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 1469e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project uLong begin_pos; /* position of the beginning of the zipfile */ 1479e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project uLong add_position_when_writting_offset; 1489e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project uLong number_entry; 1499e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#ifndef NO_ADDFILEINEXISTINGZIP 1509e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project char *globalcomment; 1519e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#endif 1529e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project} zip_internal; 1539e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 1549e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 1559e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 1569e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#ifndef NOCRYPT 1579e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#define INCLUDECRYPTINGCODE_IFCRYPTALLOWED 1589e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#include "crypt.h" 1599e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#endif 1609e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 1619e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectlocal linkedlist_datablock_internal* allocate_new_datablock() 1629e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{ 1639e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project linkedlist_datablock_internal* ldi; 1649e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project ldi = (linkedlist_datablock_internal*) 1659e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project ALLOC(sizeof(linkedlist_datablock_internal)); 1669e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (ldi!=NULL) 1679e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project { 1689e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project ldi->next_datablock = NULL ; 1699e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project ldi->filled_in_this_block = 0 ; 1709e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project ldi->avail_in_this_block = SIZEDATA_INDATABLOCK ; 1719e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project } 1729e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project return ldi; 1739e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project} 1749e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 1759e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectlocal void free_datablock(ldi) 1769e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project linkedlist_datablock_internal* ldi; 1779e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{ 1789e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project while (ldi!=NULL) 1799e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project { 1809e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project linkedlist_datablock_internal* ldinext = ldi->next_datablock; 1819e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project TRYFREE(ldi); 1829e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project ldi = ldinext; 1839e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project } 1849e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project} 1859e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 1869e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectlocal void init_linkedlist(ll) 1879e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project linkedlist_data* ll; 1889e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{ 1899e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project ll->first_block = ll->last_block = NULL; 1909e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project} 1919e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 1929e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectlocal void free_linkedlist(ll) 1939e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project linkedlist_data* ll; 1949e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{ 1959e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project free_datablock(ll->first_block); 1969e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project ll->first_block = ll->last_block = NULL; 1979e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project} 1989e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 1999e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 2009e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectlocal int add_data_in_datablock(ll,buf,len) 2019e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project linkedlist_data* ll; 2029e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project const void* buf; 2039e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project uLong len; 2049e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{ 2059e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project linkedlist_datablock_internal* ldi; 2069e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project const unsigned char* from_copy; 2079e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 2089e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (ll==NULL) 2099e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project return ZIP_INTERNALERROR; 2109e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 2119e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (ll->last_block == NULL) 2129e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project { 2139e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project ll->first_block = ll->last_block = allocate_new_datablock(); 2149e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (ll->first_block == NULL) 2159e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project return ZIP_INTERNALERROR; 2169e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project } 2179e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 2189e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project ldi = ll->last_block; 2199e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project from_copy = (unsigned char*)buf; 2209e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 2219e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project while (len>0) 2229e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project { 2239e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project uInt copy_this; 2249e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project uInt i; 2259e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project unsigned char* to_copy; 2269e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 2279e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (ldi->avail_in_this_block==0) 2289e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project { 2299e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project ldi->next_datablock = allocate_new_datablock(); 2309e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (ldi->next_datablock == NULL) 2319e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project return ZIP_INTERNALERROR; 2329e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project ldi = ldi->next_datablock ; 2339e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project ll->last_block = ldi; 2349e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project } 2359e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 2369e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (ldi->avail_in_this_block < len) 2379e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project copy_this = (uInt)ldi->avail_in_this_block; 2389e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project else 2399e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project copy_this = (uInt)len; 2409e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 2419e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project to_copy = &(ldi->data[ldi->filled_in_this_block]); 2429e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 2439e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project for (i=0;i<copy_this;i++) 2449e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project *(to_copy+i)=*(from_copy+i); 2459e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 2469e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project ldi->filled_in_this_block += copy_this; 2479e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project ldi->avail_in_this_block -= copy_this; 2489e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project from_copy += copy_this ; 2499e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project len -= copy_this; 2509e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project } 2519e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project return ZIP_OK; 2529e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project} 2539e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 2549e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 2559e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 2569e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project/****************************************************************************/ 2579e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 2589e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#ifndef NO_ADDFILEINEXISTINGZIP 2599e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project/* =========================================================================== 2609e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project Inputs a long in LSB order to the given file 2619e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project nbByte == 1, 2 or 4 (byte, short or long) 2629e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project*/ 2639e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 2649e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectlocal int ziplocal_putValue OF((const zlib_filefunc_def* pzlib_filefunc_def, 2659e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project voidpf filestream, uLong x, int nbByte)); 2669e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectlocal int ziplocal_putValue (pzlib_filefunc_def, filestream, x, nbByte) 2679e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project const zlib_filefunc_def* pzlib_filefunc_def; 2689e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project voidpf filestream; 2699e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project uLong x; 2709e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project int nbByte; 2719e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{ 2729e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project unsigned char buf[4]; 2739e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project int n; 2749e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project for (n = 0; n < nbByte; n++) 2759e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project { 2769e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project buf[n] = (unsigned char)(x & 0xff); 2779e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project x >>= 8; 2789e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project } 2799e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (x != 0) 2809e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project { /* data overflow - hack for ZIP64 (X Roche) */ 2819e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project for (n = 0; n < nbByte; n++) 2829e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project { 2839e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project buf[n] = 0xff; 2849e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project } 2859e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project } 2869e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 2879e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (ZWRITE(*pzlib_filefunc_def,filestream,buf,nbByte)!=(uLong)nbByte) 2889e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project return ZIP_ERRNO; 2899e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project else 2909e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project return ZIP_OK; 2919e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project} 2929e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 2939e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectlocal void ziplocal_putValue_inmemory OF((void* dest, uLong x, int nbByte)); 2949e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectlocal void ziplocal_putValue_inmemory (dest, x, nbByte) 2959e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project void* dest; 2969e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project uLong x; 2979e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project int nbByte; 2989e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{ 2999e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project unsigned char* buf=(unsigned char*)dest; 3009e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project int n; 3019e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project for (n = 0; n < nbByte; n++) { 3029e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project buf[n] = (unsigned char)(x & 0xff); 3039e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project x >>= 8; 3049e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project } 3059e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 3069e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (x != 0) 3079e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project { /* data overflow - hack for ZIP64 */ 3089e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project for (n = 0; n < nbByte; n++) 3099e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project { 3109e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project buf[n] = 0xff; 3119e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project } 3129e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project } 3139e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project} 3149e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 3159e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project/****************************************************************************/ 3169e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 3179e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 3189e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectlocal uLong ziplocal_TmzDateToDosDate(ptm,dosDate) 3199e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project const tm_zip* ptm; 3209e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project uLong dosDate; 3219e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{ 3229e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project uLong year = (uLong)ptm->tm_year; 3239e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (year>1980) 3249e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project year-=1980; 3259e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project else if (year>80) 3269e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project year-=80; 3279e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project return 3289e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project (uLong) (((ptm->tm_mday) + (32 * (ptm->tm_mon+1)) + (512 * year)) << 16) | 3299e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project ((ptm->tm_sec/2) + (32* ptm->tm_min) + (2048 * (uLong)ptm->tm_hour)); 3309e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project} 3319e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 3329e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 3339e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project/****************************************************************************/ 3349e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 3359e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectlocal int ziplocal_getByte OF(( 3369e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project const zlib_filefunc_def* pzlib_filefunc_def, 3379e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project voidpf filestream, 3389e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project int *pi)); 3399e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 3409e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectlocal int ziplocal_getByte(pzlib_filefunc_def,filestream,pi) 3419e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project const zlib_filefunc_def* pzlib_filefunc_def; 3429e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project voidpf filestream; 3439e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project int *pi; 3449e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{ 3459e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project unsigned char c; 3469e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project int err = (int)ZREAD(*pzlib_filefunc_def,filestream,&c,1); 3479e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (err==1) 3489e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project { 3499e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project *pi = (int)c; 3509e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project return ZIP_OK; 3519e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project } 3529e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project else 3539e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project { 3549e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (ZERROR(*pzlib_filefunc_def,filestream)) 3559e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project return ZIP_ERRNO; 3569e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project else 3579e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project return ZIP_EOF; 3589e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project } 3599e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project} 3609e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 3619e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 3629e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project/* =========================================================================== 3639e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project Reads a long in LSB order from the given gz_stream. Sets 3649e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project*/ 3659e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectlocal int ziplocal_getShort OF(( 3669e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project const zlib_filefunc_def* pzlib_filefunc_def, 3679e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project voidpf filestream, 3689e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project uLong *pX)); 3699e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 3709e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectlocal int ziplocal_getShort (pzlib_filefunc_def,filestream,pX) 3719e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project const zlib_filefunc_def* pzlib_filefunc_def; 3729e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project voidpf filestream; 3739e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project uLong *pX; 3749e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{ 3759e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project uLong x ; 3769e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project int i; 3779e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project int err; 3789e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 3799e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project err = ziplocal_getByte(pzlib_filefunc_def,filestream,&i); 3809e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project x = (uLong)i; 3819e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 3829e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (err==ZIP_OK) 3839e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project err = ziplocal_getByte(pzlib_filefunc_def,filestream,&i); 3849e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project x += ((uLong)i)<<8; 3859e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 3869e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (err==ZIP_OK) 3879e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project *pX = x; 3889e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project else 3899e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project *pX = 0; 3909e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project return err; 3919e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project} 3929e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 3939e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectlocal int ziplocal_getLong OF(( 3949e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project const zlib_filefunc_def* pzlib_filefunc_def, 3959e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project voidpf filestream, 3969e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project uLong *pX)); 3979e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 3989e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectlocal int ziplocal_getLong (pzlib_filefunc_def,filestream,pX) 3999e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project const zlib_filefunc_def* pzlib_filefunc_def; 4009e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project voidpf filestream; 4019e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project uLong *pX; 4029e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{ 4039e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project uLong x ; 4049e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project int i; 4059e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project int err; 4069e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 4079e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project err = ziplocal_getByte(pzlib_filefunc_def,filestream,&i); 4089e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project x = (uLong)i; 4099e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 4109e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (err==ZIP_OK) 4119e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project err = ziplocal_getByte(pzlib_filefunc_def,filestream,&i); 4129e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project x += ((uLong)i)<<8; 4139e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 4149e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (err==ZIP_OK) 4159e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project err = ziplocal_getByte(pzlib_filefunc_def,filestream,&i); 4169e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project x += ((uLong)i)<<16; 4179e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 4189e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (err==ZIP_OK) 4199e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project err = ziplocal_getByte(pzlib_filefunc_def,filestream,&i); 4209e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project x += ((uLong)i)<<24; 4219e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 4229e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (err==ZIP_OK) 4239e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project *pX = x; 4249e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project else 4259e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project *pX = 0; 4269e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project return err; 4279e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project} 4289e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 4299e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#ifndef BUFREADCOMMENT 4309e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#define BUFREADCOMMENT (0x400) 4319e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#endif 4329e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project/* 4339e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project Locate the Central directory of a zipfile (at the end, just before 4349e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project the global comment) 4359e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project*/ 4369e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectlocal uLong ziplocal_SearchCentralDir OF(( 4379e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project const zlib_filefunc_def* pzlib_filefunc_def, 4389e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project voidpf filestream)); 4399e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 4409e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectlocal uLong ziplocal_SearchCentralDir(pzlib_filefunc_def,filestream) 4419e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project const zlib_filefunc_def* pzlib_filefunc_def; 4429e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project voidpf filestream; 4439e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{ 4449e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project unsigned char* buf; 4459e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project uLong uSizeFile; 4469e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project uLong uBackRead; 4479e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project uLong uMaxBack=0xffff; /* maximum size of global comment */ 4489e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project uLong uPosFound=0; 4499e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 4509e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (ZSEEK(*pzlib_filefunc_def,filestream,0,ZLIB_FILEFUNC_SEEK_END) != 0) 4519e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project return 0; 4529e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 4539e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 4549e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project uSizeFile = ZTELL(*pzlib_filefunc_def,filestream); 4559e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 4569e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (uMaxBack>uSizeFile) 4579e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project uMaxBack = uSizeFile; 4589e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 4599e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project buf = (unsigned char*)ALLOC(BUFREADCOMMENT+4); 4609e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (buf==NULL) 4619e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project return 0; 4629e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 4639e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project uBackRead = 4; 4649e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project while (uBackRead<uMaxBack) 4659e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project { 4669e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project uLong uReadSize,uReadPos ; 4679e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project int i; 4689e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (uBackRead+BUFREADCOMMENT>uMaxBack) 4699e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project uBackRead = uMaxBack; 4709e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project else 4719e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project uBackRead+=BUFREADCOMMENT; 4729e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project uReadPos = uSizeFile-uBackRead ; 4739e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 4749e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project uReadSize = ((BUFREADCOMMENT+4) < (uSizeFile-uReadPos)) ? 4759e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project (BUFREADCOMMENT+4) : (uSizeFile-uReadPos); 4769e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (ZSEEK(*pzlib_filefunc_def,filestream,uReadPos,ZLIB_FILEFUNC_SEEK_SET)!=0) 4779e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project break; 4789e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 4799e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (ZREAD(*pzlib_filefunc_def,filestream,buf,uReadSize)!=uReadSize) 4809e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project break; 4819e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 4829e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project for (i=(int)uReadSize-3; (i--)>0;) 4839e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (((*(buf+i))==0x50) && ((*(buf+i+1))==0x4b) && 4849e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project ((*(buf+i+2))==0x05) && ((*(buf+i+3))==0x06)) 4859e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project { 4869e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project uPosFound = uReadPos+i; 4879e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project break; 4889e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project } 4899e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 4909e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (uPosFound!=0) 4919e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project break; 4929e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project } 4939e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project TRYFREE(buf); 4949e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project return uPosFound; 4959e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project} 4969e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#endif /* !NO_ADDFILEINEXISTINGZIP*/ 4979e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 4989e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project/************************************************************/ 4999e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectextern zipFile ZEXPORT zipOpen2 (pathname, append, globalcomment, pzlib_filefunc_def) 5009e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project const char *pathname; 5019e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project int append; 5029e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project zipcharpc* globalcomment; 5039e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project zlib_filefunc_def* pzlib_filefunc_def; 5049e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{ 5059e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project zip_internal ziinit; 5069e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project zip_internal* zi; 5079e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project int err=ZIP_OK; 5089e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 5099e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 5109e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (pzlib_filefunc_def==NULL) 5119e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project fill_fopen_filefunc(&ziinit.z_filefunc); 5129e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project else 5139e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project ziinit.z_filefunc = *pzlib_filefunc_def; 5149e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 5159e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project ziinit.filestream = (*(ziinit.z_filefunc.zopen_file)) 5169e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project (ziinit.z_filefunc.opaque, 5179e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project pathname, 5189e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project (append == APPEND_STATUS_CREATE) ? 5199e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project (ZLIB_FILEFUNC_MODE_READ | ZLIB_FILEFUNC_MODE_WRITE | ZLIB_FILEFUNC_MODE_CREATE) : 5209e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project (ZLIB_FILEFUNC_MODE_READ | ZLIB_FILEFUNC_MODE_WRITE | ZLIB_FILEFUNC_MODE_EXISTING)); 5219e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 5229e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (ziinit.filestream == NULL) 5239e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project return NULL; 5249e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project ziinit.begin_pos = ZTELL(ziinit.z_filefunc,ziinit.filestream); 5259e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project ziinit.in_opened_file_inzip = 0; 5269e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project ziinit.ci.stream_initialised = 0; 5279e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project ziinit.number_entry = 0; 5289e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project ziinit.add_position_when_writting_offset = 0; 5299e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project init_linkedlist(&(ziinit.central_dir)); 5309e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 5319e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 5329e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project zi = (zip_internal*)ALLOC(sizeof(zip_internal)); 5339e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (zi==NULL) 5349e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project { 5359e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project ZCLOSE(ziinit.z_filefunc,ziinit.filestream); 5369e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project return NULL; 5379e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project } 5389e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 5399e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project /* now we add file in a zipfile */ 5409e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project# ifndef NO_ADDFILEINEXISTINGZIP 5419e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project ziinit.globalcomment = NULL; 5429e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (append == APPEND_STATUS_ADDINZIP) 5439e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project { 5449e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project uLong byte_before_the_zipfile;/* byte before the zipfile, (>0 for sfx)*/ 5459e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 5469e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project uLong size_central_dir; /* size of the central directory */ 5479e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project uLong offset_central_dir; /* offset of start of central directory */ 5489e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project uLong central_pos,uL; 5499e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 5509e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project uLong number_disk; /* number of the current dist, used for 5519e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project spaning ZIP, unsupported, always 0*/ 5529e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project uLong number_disk_with_CD; /* number the the disk with central dir, used 5539e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project for spaning ZIP, unsupported, always 0*/ 5549e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project uLong number_entry; 5559e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project uLong number_entry_CD; /* total number of entries in 5569e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project the central dir 5579e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project (same than number_entry on nospan) */ 5589e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project uLong size_comment; 5599e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 5609e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project central_pos = ziplocal_SearchCentralDir(&ziinit.z_filefunc,ziinit.filestream); 5619e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (central_pos==0) 5629e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project err=ZIP_ERRNO; 5639e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 5649e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (ZSEEK(ziinit.z_filefunc, ziinit.filestream, 5659e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project central_pos,ZLIB_FILEFUNC_SEEK_SET)!=0) 5669e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project err=ZIP_ERRNO; 5679e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 5689e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project /* the signature, already checked */ 5699e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (ziplocal_getLong(&ziinit.z_filefunc, ziinit.filestream,&uL)!=ZIP_OK) 5709e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project err=ZIP_ERRNO; 5719e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 5729e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project /* number of this disk */ 5739e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (ziplocal_getShort(&ziinit.z_filefunc, ziinit.filestream,&number_disk)!=ZIP_OK) 5749e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project err=ZIP_ERRNO; 5759e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 5769e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project /* number of the disk with the start of the central directory */ 5779e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (ziplocal_getShort(&ziinit.z_filefunc, ziinit.filestream,&number_disk_with_CD)!=ZIP_OK) 5789e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project err=ZIP_ERRNO; 5799e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 5809e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project /* total number of entries in the central dir on this disk */ 5819e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (ziplocal_getShort(&ziinit.z_filefunc, ziinit.filestream,&number_entry)!=ZIP_OK) 5829e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project err=ZIP_ERRNO; 5839e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 5849e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project /* total number of entries in the central dir */ 5859e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (ziplocal_getShort(&ziinit.z_filefunc, ziinit.filestream,&number_entry_CD)!=ZIP_OK) 5869e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project err=ZIP_ERRNO; 5879e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 5889e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if ((number_entry_CD!=number_entry) || 5899e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project (number_disk_with_CD!=0) || 5909e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project (number_disk!=0)) 5919e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project err=ZIP_BADZIPFILE; 5929e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 5939e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project /* size of the central directory */ 5949e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (ziplocal_getLong(&ziinit.z_filefunc, ziinit.filestream,&size_central_dir)!=ZIP_OK) 5959e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project err=ZIP_ERRNO; 5969e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 5979e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project /* offset of start of central directory with respect to the 5989e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project starting disk number */ 5999e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (ziplocal_getLong(&ziinit.z_filefunc, ziinit.filestream,&offset_central_dir)!=ZIP_OK) 6009e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project err=ZIP_ERRNO; 6019e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 6029e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project /* zipfile global comment length */ 6039e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (ziplocal_getShort(&ziinit.z_filefunc, ziinit.filestream,&size_comment)!=ZIP_OK) 6049e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project err=ZIP_ERRNO; 6059e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 6069e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if ((central_pos<offset_central_dir+size_central_dir) && 6079e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project (err==ZIP_OK)) 6089e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project err=ZIP_BADZIPFILE; 6099e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 6109e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (err!=ZIP_OK) 6119e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project { 6129e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project ZCLOSE(ziinit.z_filefunc, ziinit.filestream); 6139e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project return NULL; 6149e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project } 6159e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 6169e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (size_comment>0) 6179e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project { 6189e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project ziinit.globalcomment = ALLOC(size_comment+1); 6199e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (ziinit.globalcomment) 6209e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project { 6219e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project size_comment = ZREAD(ziinit.z_filefunc, ziinit.filestream,ziinit.globalcomment,size_comment); 6229e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project ziinit.globalcomment[size_comment]=0; 6239e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project } 6249e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project } 6259e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 6269e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project byte_before_the_zipfile = central_pos - 6279e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project (offset_central_dir+size_central_dir); 6289e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project ziinit.add_position_when_writting_offset = byte_before_the_zipfile; 6299e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 6309e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project { 6319e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project uLong size_central_dir_to_read = size_central_dir; 6329e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project size_t buf_size = SIZEDATA_INDATABLOCK; 6339e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project void* buf_read = (void*)ALLOC(buf_size); 6349e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (ZSEEK(ziinit.z_filefunc, ziinit.filestream, 6359e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project offset_central_dir + byte_before_the_zipfile, 6369e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project ZLIB_FILEFUNC_SEEK_SET) != 0) 6379e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project err=ZIP_ERRNO; 6389e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 6399e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project while ((size_central_dir_to_read>0) && (err==ZIP_OK)) 6409e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project { 6419e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project uLong read_this = SIZEDATA_INDATABLOCK; 6429e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (read_this > size_central_dir_to_read) 6439e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project read_this = size_central_dir_to_read; 6449e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (ZREAD(ziinit.z_filefunc, ziinit.filestream,buf_read,read_this) != read_this) 6459e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project err=ZIP_ERRNO; 6469e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 6479e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (err==ZIP_OK) 6489e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project err = add_data_in_datablock(&ziinit.central_dir,buf_read, 6499e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project (uLong)read_this); 6509e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project size_central_dir_to_read-=read_this; 6519e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project } 6529e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project TRYFREE(buf_read); 6539e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project } 6549e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project ziinit.begin_pos = byte_before_the_zipfile; 6559e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project ziinit.number_entry = number_entry_CD; 6569e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 6579e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (ZSEEK(ziinit.z_filefunc, ziinit.filestream, 6589e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project offset_central_dir+byte_before_the_zipfile,ZLIB_FILEFUNC_SEEK_SET)!=0) 6599e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project err=ZIP_ERRNO; 6609e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project } 6619e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 6629e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (globalcomment) 6639e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project { 6649e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project *globalcomment = ziinit.globalcomment; 6659e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project } 6669e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project# endif /* !NO_ADDFILEINEXISTINGZIP*/ 6679e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 6689e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (err != ZIP_OK) 6699e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project { 6709e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project# ifndef NO_ADDFILEINEXISTINGZIP 6719e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project TRYFREE(ziinit.globalcomment); 6729e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project# endif /* !NO_ADDFILEINEXISTINGZIP*/ 6739e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project TRYFREE(zi); 6749e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project return NULL; 6759e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project } 6769e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project else 6779e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project { 6789e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project *zi = ziinit; 6799e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project return (zipFile)zi; 6809e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project } 6819e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project} 6829e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 6839e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectextern zipFile ZEXPORT zipOpen (pathname, append) 6849e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project const char *pathname; 6859e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project int append; 6869e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{ 6879e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project return zipOpen2(pathname,append,NULL,NULL); 6889e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project} 6899e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 6909e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectextern int ZEXPORT zipOpenNewFileInZip3 (file, filename, zipfi, 6919e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project extrafield_local, size_extrafield_local, 6929e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project extrafield_global, size_extrafield_global, 6939e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project comment, method, level, raw, 6949e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project windowBits, memLevel, strategy, 6959e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project password, crcForCrypting) 6969e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project zipFile file; 6979e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project const char* filename; 6989e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project const zip_fileinfo* zipfi; 6999e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project const void* extrafield_local; 7009e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project uInt size_extrafield_local; 7019e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project const void* extrafield_global; 7029e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project uInt size_extrafield_global; 7039e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project const char* comment; 7049e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project int method; 7059e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project int level; 7069e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project int raw; 7079e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project int windowBits; 7089e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project int memLevel; 7099e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project int strategy; 7109e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project const char* password; 7119e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project uLong crcForCrypting; 7129e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{ 7139e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project zip_internal* zi; 7149e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project uInt size_filename; 7159e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project uInt size_comment; 7169e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project uInt i; 7179e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project int err = ZIP_OK; 7189e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 7199e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project# ifdef NOCRYPT 7209e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (password != NULL) 7219e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project return ZIP_PARAMERROR; 7229e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project# endif 7239e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 7249e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (file == NULL) 7259e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project return ZIP_PARAMERROR; 7269e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if ((method!=0) && (method!=Z_DEFLATED)) 7279e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project return ZIP_PARAMERROR; 7289e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 7299e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project zi = (zip_internal*)file; 7309e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 7319e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (zi->in_opened_file_inzip == 1) 7329e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project { 7339e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project err = zipCloseFileInZip (file); 7349e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (err != ZIP_OK) 7359e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project return err; 7369e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project } 7379e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 7389e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 7399e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (filename==NULL) 7409e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project filename="-"; 7419e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 7429e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (comment==NULL) 7439e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project size_comment = 0; 7449e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project else 7459e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project size_comment = (uInt)strlen(comment); 7469e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 7479e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project size_filename = (uInt)strlen(filename); 7489e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 7499e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (zipfi == NULL) 7509e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project zi->ci.dosDate = 0; 7519e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project else 7529e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project { 7539e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (zipfi->dosDate != 0) 7549e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project zi->ci.dosDate = zipfi->dosDate; 7559e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project else zi->ci.dosDate = ziplocal_TmzDateToDosDate(&zipfi->tmz_date,zipfi->dosDate); 7569e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project } 7579e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 7589e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project zi->ci.flag = 0; 7599e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if ((level==8) || (level==9)) 7609e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project zi->ci.flag |= 2; 7619e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if ((level==2)) 7629e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project zi->ci.flag |= 4; 7639e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if ((level==1)) 7649e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project zi->ci.flag |= 6; 7659e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (password != NULL) 7669e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project zi->ci.flag |= 1; 7679e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 7689e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project zi->ci.crc32 = 0; 7699e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project zi->ci.method = method; 7709e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project zi->ci.encrypt = 0; 7719e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project zi->ci.stream_initialised = 0; 7729e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project zi->ci.pos_in_buffered_data = 0; 7739e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project zi->ci.raw = raw; 7749e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project zi->ci.pos_local_header = ZTELL(zi->z_filefunc,zi->filestream) ; 7759e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project zi->ci.size_centralheader = SIZECENTRALHEADER + size_filename + 7769e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project size_extrafield_global + size_comment; 7779e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project zi->ci.central_header = (char*)ALLOC((uInt)zi->ci.size_centralheader); 7789e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 7799e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project ziplocal_putValue_inmemory(zi->ci.central_header,(uLong)CENTRALHEADERMAGIC,4); 7809e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project /* version info */ 7819e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project ziplocal_putValue_inmemory(zi->ci.central_header+4,(uLong)VERSIONMADEBY,2); 7829e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project ziplocal_putValue_inmemory(zi->ci.central_header+6,(uLong)20,2); 7839e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project ziplocal_putValue_inmemory(zi->ci.central_header+8,(uLong)zi->ci.flag,2); 7849e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project ziplocal_putValue_inmemory(zi->ci.central_header+10,(uLong)zi->ci.method,2); 7859e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project ziplocal_putValue_inmemory(zi->ci.central_header+12,(uLong)zi->ci.dosDate,4); 7869e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project ziplocal_putValue_inmemory(zi->ci.central_header+16,(uLong)0,4); /*crc*/ 7879e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project ziplocal_putValue_inmemory(zi->ci.central_header+20,(uLong)0,4); /*compr size*/ 7889e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project ziplocal_putValue_inmemory(zi->ci.central_header+24,(uLong)0,4); /*uncompr size*/ 7899e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project ziplocal_putValue_inmemory(zi->ci.central_header+28,(uLong)size_filename,2); 7909e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project ziplocal_putValue_inmemory(zi->ci.central_header+30,(uLong)size_extrafield_global,2); 7919e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project ziplocal_putValue_inmemory(zi->ci.central_header+32,(uLong)size_comment,2); 7929e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project ziplocal_putValue_inmemory(zi->ci.central_header+34,(uLong)0,2); /*disk nm start*/ 7939e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 7949e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (zipfi==NULL) 7959e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project ziplocal_putValue_inmemory(zi->ci.central_header+36,(uLong)0,2); 7969e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project else 7979e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project ziplocal_putValue_inmemory(zi->ci.central_header+36,(uLong)zipfi->internal_fa,2); 7989e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 7999e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (zipfi==NULL) 8009e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project ziplocal_putValue_inmemory(zi->ci.central_header+38,(uLong)0,4); 8019e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project else 8029e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project ziplocal_putValue_inmemory(zi->ci.central_header+38,(uLong)zipfi->external_fa,4); 8039e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 8049e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project ziplocal_putValue_inmemory(zi->ci.central_header+42,(uLong)zi->ci.pos_local_header- zi->add_position_when_writting_offset,4); 8059e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 8069e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project for (i=0;i<size_filename;i++) 8079e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project *(zi->ci.central_header+SIZECENTRALHEADER+i) = *(filename+i); 8089e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 8099e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project for (i=0;i<size_extrafield_global;i++) 8109e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project *(zi->ci.central_header+SIZECENTRALHEADER+size_filename+i) = 8119e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project *(((const char*)extrafield_global)+i); 8129e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 8139e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project for (i=0;i<size_comment;i++) 8149e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project *(zi->ci.central_header+SIZECENTRALHEADER+size_filename+ 8159e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project size_extrafield_global+i) = *(comment+i); 8169e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (zi->ci.central_header == NULL) 8179e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project return ZIP_INTERNALERROR; 8189e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 8199e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project /* write the local header */ 8209e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)LOCALHEADERMAGIC,4); 8219e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 8229e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (err==ZIP_OK) 8239e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)20,2);/* version needed to extract */ 8249e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (err==ZIP_OK) 8259e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)zi->ci.flag,2); 8269e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 8279e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (err==ZIP_OK) 8289e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)zi->ci.method,2); 8299e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 8309e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (err==ZIP_OK) 8319e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)zi->ci.dosDate,4); 8329e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 8339e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (err==ZIP_OK) 8349e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)0,4); /* crc 32, unknown */ 8359e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (err==ZIP_OK) 8369e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)0,4); /* compressed size, unknown */ 8379e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (err==ZIP_OK) 8389e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)0,4); /* uncompressed size, unknown */ 8399e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 8409e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (err==ZIP_OK) 8419e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)size_filename,2); 8429e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 8439e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (err==ZIP_OK) 8449e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)size_extrafield_local,2); 8459e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 8469e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if ((err==ZIP_OK) && (size_filename>0)) 8479e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (ZWRITE(zi->z_filefunc,zi->filestream,filename,size_filename)!=size_filename) 8489e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project err = ZIP_ERRNO; 8499e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 8509e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if ((err==ZIP_OK) && (size_extrafield_local>0)) 8519e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (ZWRITE(zi->z_filefunc,zi->filestream,extrafield_local,size_extrafield_local) 8529e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project !=size_extrafield_local) 8539e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project err = ZIP_ERRNO; 8549e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 8559e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project zi->ci.stream.avail_in = (uInt)0; 8569e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project zi->ci.stream.avail_out = (uInt)Z_BUFSIZE; 8579e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project zi->ci.stream.next_out = zi->ci.buffered_data; 8589e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project zi->ci.stream.total_in = 0; 8599e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project zi->ci.stream.total_out = 0; 8609e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 8619e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if ((err==ZIP_OK) && (zi->ci.method == Z_DEFLATED) && (!zi->ci.raw)) 8629e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project { 8639e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project zi->ci.stream.zalloc = (alloc_func)0; 8649e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project zi->ci.stream.zfree = (free_func)0; 8659e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project zi->ci.stream.opaque = (voidpf)0; 8669e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 8679e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (windowBits>0) 8689e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project windowBits = -windowBits; 8699e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 8709e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project err = deflateInit2(&zi->ci.stream, level, 8719e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project Z_DEFLATED, windowBits, memLevel, strategy); 8729e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 8739e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (err==Z_OK) 8749e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project zi->ci.stream_initialised = 1; 8759e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project } 8769e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project# ifndef NOCRYPT 8779e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project zi->ci.crypt_header_size = 0; 8789e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if ((err==Z_OK) && (password != NULL)) 8799e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project { 8809e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project unsigned char bufHead[RAND_HEAD_LEN]; 8819e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project unsigned int sizeHead; 8829e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project zi->ci.encrypt = 1; 8839e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project zi->ci.pcrc_32_tab = get_crc_table(); 8849e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project /*init_keys(password,zi->ci.keys,zi->ci.pcrc_32_tab);*/ 8859e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 8869e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project sizeHead=crypthead(password,bufHead,RAND_HEAD_LEN,zi->ci.keys,zi->ci.pcrc_32_tab,crcForCrypting); 8879e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project zi->ci.crypt_header_size = sizeHead; 8889e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 8899e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (ZWRITE(zi->z_filefunc,zi->filestream,bufHead,sizeHead) != sizeHead) 8909e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project err = ZIP_ERRNO; 8919e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project } 8929e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project# endif 8939e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 8949e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (err==Z_OK) 8959e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project zi->in_opened_file_inzip = 1; 8969e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project return err; 8979e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project} 8989e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 8999e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectextern int ZEXPORT zipOpenNewFileInZip2(file, filename, zipfi, 9009e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project extrafield_local, size_extrafield_local, 9019e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project extrafield_global, size_extrafield_global, 9029e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project comment, method, level, raw) 9039e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project zipFile file; 9049e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project const char* filename; 9059e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project const zip_fileinfo* zipfi; 9069e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project const void* extrafield_local; 9079e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project uInt size_extrafield_local; 9089e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project const void* extrafield_global; 9099e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project uInt size_extrafield_global; 9109e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project const char* comment; 9119e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project int method; 9129e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project int level; 9139e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project int raw; 9149e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{ 9159e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project return zipOpenNewFileInZip3 (file, filename, zipfi, 9169e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project extrafield_local, size_extrafield_local, 9179e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project extrafield_global, size_extrafield_global, 9189e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project comment, method, level, raw, 9199e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project -MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY, 9209e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project NULL, 0); 9219e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project} 9229e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 9239e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectextern int ZEXPORT zipOpenNewFileInZip (file, filename, zipfi, 9249e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project extrafield_local, size_extrafield_local, 9259e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project extrafield_global, size_extrafield_global, 9269e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project comment, method, level) 9279e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project zipFile file; 9289e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project const char* filename; 9299e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project const zip_fileinfo* zipfi; 9309e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project const void* extrafield_local; 9319e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project uInt size_extrafield_local; 9329e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project const void* extrafield_global; 9339e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project uInt size_extrafield_global; 9349e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project const char* comment; 9359e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project int method; 9369e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project int level; 9379e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{ 9389e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project return zipOpenNewFileInZip2 (file, filename, zipfi, 9399e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project extrafield_local, size_extrafield_local, 9409e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project extrafield_global, size_extrafield_global, 9419e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project comment, method, level, 0); 9429e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project} 9439e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 9449e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectlocal int zipFlushWriteBuffer(zi) 9459e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project zip_internal* zi; 9469e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{ 9479e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project int err=ZIP_OK; 9489e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 9499e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (zi->ci.encrypt != 0) 9509e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project { 9519e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#ifndef NOCRYPT 9529e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project uInt i; 9539e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project int t; 9549e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project for (i=0;i<zi->ci.pos_in_buffered_data;i++) 9559e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project zi->ci.buffered_data[i] = zencode(zi->ci.keys, zi->ci.pcrc_32_tab, 9569e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project zi->ci.buffered_data[i],t); 9579e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#endif 9589e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project } 9599e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (ZWRITE(zi->z_filefunc,zi->filestream,zi->ci.buffered_data,zi->ci.pos_in_buffered_data) 9609e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project !=zi->ci.pos_in_buffered_data) 9619e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project err = ZIP_ERRNO; 9629e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project zi->ci.pos_in_buffered_data = 0; 9639e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project return err; 9649e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project} 9659e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 9669e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectextern int ZEXPORT zipWriteInFileInZip (file, buf, len) 9679e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project zipFile file; 9689e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project const void* buf; 9699e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project unsigned len; 9709e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{ 9719e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project zip_internal* zi; 9729e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project int err=ZIP_OK; 9739e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 9749e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (file == NULL) 9759e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project return ZIP_PARAMERROR; 9769e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project zi = (zip_internal*)file; 9779e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 9789e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (zi->in_opened_file_inzip == 0) 9799e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project return ZIP_PARAMERROR; 9809e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 9819e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project zi->ci.stream.next_in = (void*)buf; 9829e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project zi->ci.stream.avail_in = len; 9839e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project zi->ci.crc32 = crc32(zi->ci.crc32,buf,len); 9849e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 9859e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project while ((err==ZIP_OK) && (zi->ci.stream.avail_in>0)) 9869e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project { 9879e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (zi->ci.stream.avail_out == 0) 9889e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project { 9899e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (zipFlushWriteBuffer(zi) == ZIP_ERRNO) 9909e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project err = ZIP_ERRNO; 9919e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project zi->ci.stream.avail_out = (uInt)Z_BUFSIZE; 9929e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project zi->ci.stream.next_out = zi->ci.buffered_data; 9939e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project } 9949e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 9959e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 9969e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if(err != ZIP_OK) 9979e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project break; 9989e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 9999e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if ((zi->ci.method == Z_DEFLATED) && (!zi->ci.raw)) 10009e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project { 10019e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project uLong uTotalOutBefore = zi->ci.stream.total_out; 10029e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project err=deflate(&zi->ci.stream, Z_NO_FLUSH); 10039e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project zi->ci.pos_in_buffered_data += (uInt)(zi->ci.stream.total_out - uTotalOutBefore) ; 10049e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 10059e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project } 10069e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project else 10079e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project { 10089e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project uInt copy_this,i; 10099e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (zi->ci.stream.avail_in < zi->ci.stream.avail_out) 10109e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project copy_this = zi->ci.stream.avail_in; 10119e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project else 10129e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project copy_this = zi->ci.stream.avail_out; 10139e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project for (i=0;i<copy_this;i++) 10149e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project *(((char*)zi->ci.stream.next_out)+i) = 10159e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project *(((const char*)zi->ci.stream.next_in)+i); 10169e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project { 10179e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project zi->ci.stream.avail_in -= copy_this; 10189e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project zi->ci.stream.avail_out-= copy_this; 10199e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project zi->ci.stream.next_in+= copy_this; 10209e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project zi->ci.stream.next_out+= copy_this; 10219e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project zi->ci.stream.total_in+= copy_this; 10229e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project zi->ci.stream.total_out+= copy_this; 10239e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project zi->ci.pos_in_buffered_data += copy_this; 10249e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project } 10259e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project } 10269e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project } 10279e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 10289e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project return err; 10299e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project} 10309e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 10319e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectextern int ZEXPORT zipCloseFileInZipRaw (file, uncompressed_size, crc32) 10329e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project zipFile file; 10339e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project uLong uncompressed_size; 10349e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project uLong crc32; 10359e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{ 10369e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project zip_internal* zi; 10379e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project uLong compressed_size; 10389e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project int err=ZIP_OK; 10399e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 10409e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (file == NULL) 10419e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project return ZIP_PARAMERROR; 10429e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project zi = (zip_internal*)file; 10439e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 10449e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (zi->in_opened_file_inzip == 0) 10459e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project return ZIP_PARAMERROR; 10469e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project zi->ci.stream.avail_in = 0; 10479e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 10489e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if ((zi->ci.method == Z_DEFLATED) && (!zi->ci.raw)) 10499e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project while (err==ZIP_OK) 10509e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project { 10519e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project uLong uTotalOutBefore; 10529e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (zi->ci.stream.avail_out == 0) 10539e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project { 10549e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (zipFlushWriteBuffer(zi) == ZIP_ERRNO) 10559e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project err = ZIP_ERRNO; 10569e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project zi->ci.stream.avail_out = (uInt)Z_BUFSIZE; 10579e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project zi->ci.stream.next_out = zi->ci.buffered_data; 10589e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project } 10599e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project uTotalOutBefore = zi->ci.stream.total_out; 10609e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project err=deflate(&zi->ci.stream, Z_FINISH); 10619e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project zi->ci.pos_in_buffered_data += (uInt)(zi->ci.stream.total_out - uTotalOutBefore) ; 10629e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project } 10639e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 10649e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (err==Z_STREAM_END) 10659e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project err=ZIP_OK; /* this is normal */ 10669e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 10679e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if ((zi->ci.pos_in_buffered_data>0) && (err==ZIP_OK)) 10689e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (zipFlushWriteBuffer(zi)==ZIP_ERRNO) 10699e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project err = ZIP_ERRNO; 10709e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 10719e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if ((zi->ci.method == Z_DEFLATED) && (!zi->ci.raw)) 10729e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project { 10739e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project err=deflateEnd(&zi->ci.stream); 10749e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project zi->ci.stream_initialised = 0; 10759e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project } 10769e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 10779e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (!zi->ci.raw) 10789e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project { 10799e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project crc32 = (uLong)zi->ci.crc32; 10809e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project uncompressed_size = (uLong)zi->ci.stream.total_in; 10819e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project } 10829e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project compressed_size = (uLong)zi->ci.stream.total_out; 10839e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project# ifndef NOCRYPT 10849e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project compressed_size += zi->ci.crypt_header_size; 10859e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project# endif 10869e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 10879e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project ziplocal_putValue_inmemory(zi->ci.central_header+16,crc32,4); /*crc*/ 10889e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project ziplocal_putValue_inmemory(zi->ci.central_header+20, 10899e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project compressed_size,4); /*compr size*/ 10909e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (zi->ci.stream.data_type == Z_ASCII) 10919e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project ziplocal_putValue_inmemory(zi->ci.central_header+36,(uLong)Z_ASCII,2); 10929e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project ziplocal_putValue_inmemory(zi->ci.central_header+24, 10939e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project uncompressed_size,4); /*uncompr size*/ 10949e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 10959e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (err==ZIP_OK) 10969e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project err = add_data_in_datablock(&zi->central_dir,zi->ci.central_header, 10979e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project (uLong)zi->ci.size_centralheader); 10989e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project free(zi->ci.central_header); 10999e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 11009e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (err==ZIP_OK) 11019e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project { 11029e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project long cur_pos_inzip = ZTELL(zi->z_filefunc,zi->filestream); 11039e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (ZSEEK(zi->z_filefunc,zi->filestream, 11049e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project zi->ci.pos_local_header + 14,ZLIB_FILEFUNC_SEEK_SET)!=0) 11059e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project err = ZIP_ERRNO; 11069e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 11079e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (err==ZIP_OK) 11089e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,crc32,4); /* crc 32, unknown */ 11099e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 11109e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (err==ZIP_OK) /* compressed size, unknown */ 11119e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,compressed_size,4); 11129e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 11139e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (err==ZIP_OK) /* uncompressed size, unknown */ 11149e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,uncompressed_size,4); 11159e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 11169e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (ZSEEK(zi->z_filefunc,zi->filestream, 11179e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project cur_pos_inzip,ZLIB_FILEFUNC_SEEK_SET)!=0) 11189e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project err = ZIP_ERRNO; 11199e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project } 11209e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 11219e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project zi->number_entry ++; 11229e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project zi->in_opened_file_inzip = 0; 11239e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 11249e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project return err; 11259e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project} 11269e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 11279e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectextern int ZEXPORT zipCloseFileInZip (file) 11289e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project zipFile file; 11299e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{ 11309e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project return zipCloseFileInZipRaw (file,0,0); 11319e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project} 11329e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 11339e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectextern int ZEXPORT zipClose (file, global_comment) 11349e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project zipFile file; 11359e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project const char* global_comment; 11369e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{ 11379e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project zip_internal* zi; 11389e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project int err = 0; 11399e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project uLong size_centraldir = 0; 11409e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project uLong centraldir_pos_inzip; 11419e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project uInt size_global_comment; 11429e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (file == NULL) 11439e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project return ZIP_PARAMERROR; 11449e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project zi = (zip_internal*)file; 11459e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 11469e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (zi->in_opened_file_inzip == 1) 11479e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project { 11489e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project err = zipCloseFileInZip (file); 11499e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project } 11509e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 11519e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#ifndef NO_ADDFILEINEXISTINGZIP 11529e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (global_comment==NULL) 11539e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project global_comment = zi->globalcomment; 11549e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#endif 11559e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (global_comment==NULL) 11569e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project size_global_comment = 0; 11579e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project else 11589e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project size_global_comment = (uInt)strlen(global_comment); 11599e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 11609e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project centraldir_pos_inzip = ZTELL(zi->z_filefunc,zi->filestream); 11619e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (err==ZIP_OK) 11629e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project { 11639e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project linkedlist_datablock_internal* ldi = zi->central_dir.first_block ; 11649e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project while (ldi!=NULL) 11659e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project { 11669e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if ((err==ZIP_OK) && (ldi->filled_in_this_block>0)) 11679e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (ZWRITE(zi->z_filefunc,zi->filestream, 11689e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project ldi->data,ldi->filled_in_this_block) 11699e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project !=ldi->filled_in_this_block ) 11709e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project err = ZIP_ERRNO; 11719e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 11729e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project size_centraldir += ldi->filled_in_this_block; 11739e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project ldi = ldi->next_datablock; 11749e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project } 11759e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project } 11769e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project free_datablock(zi->central_dir.first_block); 11779e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 11789e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (err==ZIP_OK) /* Magic End */ 11799e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)ENDHEADERMAGIC,4); 11809e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 11819e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (err==ZIP_OK) /* number of this disk */ 11829e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)0,2); 11839e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 11849e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (err==ZIP_OK) /* number of the disk with the start of the central directory */ 11859e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)0,2); 11869e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 11879e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (err==ZIP_OK) /* total number of entries in the central dir on this disk */ 11889e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)zi->number_entry,2); 11899e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 11909e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (err==ZIP_OK) /* total number of entries in the central dir */ 11919e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)zi->number_entry,2); 11929e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 11939e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (err==ZIP_OK) /* size of the central directory */ 11949e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)size_centraldir,4); 11959e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 11969e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (err==ZIP_OK) /* offset of start of central directory with respect to the 11979e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project starting disk number */ 11989e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project err = ziplocal_putValue(&zi->z_filefunc,zi->filestream, 11999e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project (uLong)(centraldir_pos_inzip - zi->add_position_when_writting_offset),4); 12009e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 12019e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (err==ZIP_OK) /* zipfile comment length */ 12029e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)size_global_comment,2); 12039e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 12049e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if ((err==ZIP_OK) && (size_global_comment>0)) 12059e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (ZWRITE(zi->z_filefunc,zi->filestream, 12069e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project global_comment,size_global_comment) != size_global_comment) 12079e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project err = ZIP_ERRNO; 12089e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 12099e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (ZCLOSE(zi->z_filefunc,zi->filestream) != 0) 12109e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (err == ZIP_OK) 12119e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project err = ZIP_ERRNO; 12129e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 12139e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#ifndef NO_ADDFILEINEXISTINGZIP 12149e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project TRYFREE(zi->globalcomment); 12159e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#endif 12169e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project TRYFREE(zi); 12179e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 12189e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project return err; 12199e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project} 1220