1275793eaSopenharmony_ci/* zip.c -- IO on .zip files using zlib 2275793eaSopenharmony_ci Version 1.1, February 14h, 2010 3275793eaSopenharmony_ci part of the MiniZip project - ( http://www.winimage.com/zLibDll/minizip.html ) 4275793eaSopenharmony_ci 5275793eaSopenharmony_ci Copyright (C) 1998-2010 Gilles Vollant (minizip) ( http://www.winimage.com/zLibDll/minizip.html ) 6275793eaSopenharmony_ci 7275793eaSopenharmony_ci Modifications for Zip64 support 8275793eaSopenharmony_ci Copyright (C) 2009-2010 Mathias Svensson ( http://result42.com ) 9275793eaSopenharmony_ci 10275793eaSopenharmony_ci For more info read MiniZip_info.txt 11275793eaSopenharmony_ci 12275793eaSopenharmony_ci Changes 13275793eaSopenharmony_ci Oct-2009 - Mathias Svensson - Remove old C style function prototypes 14275793eaSopenharmony_ci Oct-2009 - Mathias Svensson - Added Zip64 Support when creating new file archives 15275793eaSopenharmony_ci Oct-2009 - Mathias Svensson - Did some code cleanup and refactoring to get better overview of some functions. 16275793eaSopenharmony_ci Oct-2009 - Mathias Svensson - Added zipRemoveExtraInfoBlock to strip extra field data from its ZIP64 data 17275793eaSopenharmony_ci It is used when recreating zip archive with RAW when deleting items from a zip. 18275793eaSopenharmony_ci ZIP64 data is automatically added to items that needs it, and existing ZIP64 data need to be removed. 19275793eaSopenharmony_ci Oct-2009 - Mathias Svensson - Added support for BZIP2 as compression mode (bzip2 lib is required) 20275793eaSopenharmony_ci Jan-2010 - back to unzip and minizip 1.0 name scheme, with compatibility layer 21275793eaSopenharmony_ci 22275793eaSopenharmony_ci*/ 23275793eaSopenharmony_ci 24275793eaSopenharmony_ci 25275793eaSopenharmony_ci#include <stdio.h> 26275793eaSopenharmony_ci#include <stdlib.h> 27275793eaSopenharmony_ci#include <string.h> 28275793eaSopenharmony_ci#include <stdint.h> 29275793eaSopenharmony_ci#include <time.h> 30275793eaSopenharmony_ci#include "zlib.h" 31275793eaSopenharmony_ci#include "zip.h" 32275793eaSopenharmony_ci 33275793eaSopenharmony_ci#ifdef STDC 34275793eaSopenharmony_ci# include <stddef.h> 35275793eaSopenharmony_ci#endif 36275793eaSopenharmony_ci#ifdef NO_ERRNO_H 37275793eaSopenharmony_ci extern int errno; 38275793eaSopenharmony_ci#else 39275793eaSopenharmony_ci# include <errno.h> 40275793eaSopenharmony_ci#endif 41275793eaSopenharmony_ci 42275793eaSopenharmony_ci 43275793eaSopenharmony_ci#ifndef local 44275793eaSopenharmony_ci# define local static 45275793eaSopenharmony_ci#endif 46275793eaSopenharmony_ci/* compile with -Dlocal if your debugger can't find static symbols */ 47275793eaSopenharmony_ci 48275793eaSopenharmony_ci#ifndef VERSIONMADEBY 49275793eaSopenharmony_ci# define VERSIONMADEBY (0x0) /* platform dependent */ 50275793eaSopenharmony_ci#endif 51275793eaSopenharmony_ci 52275793eaSopenharmony_ci#ifndef Z_BUFSIZE 53275793eaSopenharmony_ci#define Z_BUFSIZE (64*1024) //(16384) 54275793eaSopenharmony_ci#endif 55275793eaSopenharmony_ci 56275793eaSopenharmony_ci#ifndef Z_MAXFILENAMEINZIP 57275793eaSopenharmony_ci#define Z_MAXFILENAMEINZIP (256) 58275793eaSopenharmony_ci#endif 59275793eaSopenharmony_ci 60275793eaSopenharmony_ci#ifndef ALLOC 61275793eaSopenharmony_ci# define ALLOC(size) (malloc(size)) 62275793eaSopenharmony_ci#endif 63275793eaSopenharmony_ci 64275793eaSopenharmony_ci/* 65275793eaSopenharmony_ci#define SIZECENTRALDIRITEM (0x2e) 66275793eaSopenharmony_ci#define SIZEZIPLOCALHEADER (0x1e) 67275793eaSopenharmony_ci*/ 68275793eaSopenharmony_ci 69275793eaSopenharmony_ci/* I've found an old Unix (a SunOS 4.1.3_U1) without all SEEK_* defined.... */ 70275793eaSopenharmony_ci 71275793eaSopenharmony_ci 72275793eaSopenharmony_ci// NOT sure that this work on ALL platform 73275793eaSopenharmony_ci#define MAKEULONG64(a, b) ((ZPOS64_T)(((unsigned long)(a)) | ((ZPOS64_T)((unsigned long)(b))) << 32)) 74275793eaSopenharmony_ci 75275793eaSopenharmony_ci#ifndef SEEK_CUR 76275793eaSopenharmony_ci#define SEEK_CUR 1 77275793eaSopenharmony_ci#endif 78275793eaSopenharmony_ci 79275793eaSopenharmony_ci#ifndef SEEK_END 80275793eaSopenharmony_ci#define SEEK_END 2 81275793eaSopenharmony_ci#endif 82275793eaSopenharmony_ci 83275793eaSopenharmony_ci#ifndef SEEK_SET 84275793eaSopenharmony_ci#define SEEK_SET 0 85275793eaSopenharmony_ci#endif 86275793eaSopenharmony_ci 87275793eaSopenharmony_ci#ifndef DEF_MEM_LEVEL 88275793eaSopenharmony_ci#if MAX_MEM_LEVEL >= 8 89275793eaSopenharmony_ci# define DEF_MEM_LEVEL 8 90275793eaSopenharmony_ci#else 91275793eaSopenharmony_ci# define DEF_MEM_LEVEL MAX_MEM_LEVEL 92275793eaSopenharmony_ci#endif 93275793eaSopenharmony_ci#endif 94275793eaSopenharmony_ciconst char zip_copyright[] =" zip 1.01 Copyright 1998-2004 Gilles Vollant - http://www.winimage.com/zLibDll"; 95275793eaSopenharmony_ci 96275793eaSopenharmony_ci 97275793eaSopenharmony_ci#define SIZEDATA_INDATABLOCK (4096-(4*4)) 98275793eaSopenharmony_ci 99275793eaSopenharmony_ci#define LOCALHEADERMAGIC (0x04034b50) 100275793eaSopenharmony_ci#define CENTRALHEADERMAGIC (0x02014b50) 101275793eaSopenharmony_ci#define ENDHEADERMAGIC (0x06054b50) 102275793eaSopenharmony_ci#define ZIP64ENDHEADERMAGIC (0x6064b50) 103275793eaSopenharmony_ci#define ZIP64ENDLOCHEADERMAGIC (0x7064b50) 104275793eaSopenharmony_ci 105275793eaSopenharmony_ci#define FLAG_LOCALHEADER_OFFSET (0x06) 106275793eaSopenharmony_ci#define CRC_LOCALHEADER_OFFSET (0x0e) 107275793eaSopenharmony_ci 108275793eaSopenharmony_ci#define SIZECENTRALHEADER (0x2e) /* 46 */ 109275793eaSopenharmony_ci 110275793eaSopenharmony_citypedef struct linkedlist_datablock_internal_s 111275793eaSopenharmony_ci{ 112275793eaSopenharmony_ci struct linkedlist_datablock_internal_s* next_datablock; 113275793eaSopenharmony_ci uLong avail_in_this_block; 114275793eaSopenharmony_ci uLong filled_in_this_block; 115275793eaSopenharmony_ci uLong unused; /* for future use and alignment */ 116275793eaSopenharmony_ci unsigned char data[SIZEDATA_INDATABLOCK]; 117275793eaSopenharmony_ci} linkedlist_datablock_internal; 118275793eaSopenharmony_ci 119275793eaSopenharmony_citypedef struct linkedlist_data_s 120275793eaSopenharmony_ci{ 121275793eaSopenharmony_ci linkedlist_datablock_internal* first_block; 122275793eaSopenharmony_ci linkedlist_datablock_internal* last_block; 123275793eaSopenharmony_ci} linkedlist_data; 124275793eaSopenharmony_ci 125275793eaSopenharmony_ci 126275793eaSopenharmony_citypedef struct 127275793eaSopenharmony_ci{ 128275793eaSopenharmony_ci z_stream stream; /* zLib stream structure for inflate */ 129275793eaSopenharmony_ci#ifdef HAVE_BZIP2 130275793eaSopenharmony_ci bz_stream bstream; /* bzLib stream structure for bziped */ 131275793eaSopenharmony_ci#endif 132275793eaSopenharmony_ci 133275793eaSopenharmony_ci int stream_initialised; /* 1 is stream is initialised */ 134275793eaSopenharmony_ci uInt pos_in_buffered_data; /* last written byte in buffered_data */ 135275793eaSopenharmony_ci 136275793eaSopenharmony_ci ZPOS64_T pos_local_header; /* offset of the local header of the file 137275793eaSopenharmony_ci currently writing */ 138275793eaSopenharmony_ci char* central_header; /* central header data for the current file */ 139275793eaSopenharmony_ci uLong size_centralExtra; 140275793eaSopenharmony_ci uLong size_centralheader; /* size of the central header for cur file */ 141275793eaSopenharmony_ci uLong size_centralExtraFree; /* Extra bytes allocated to the centralheader but that are not used */ 142275793eaSopenharmony_ci uLong flag; /* flag of the file currently writing */ 143275793eaSopenharmony_ci 144275793eaSopenharmony_ci int method; /* compression method of file currently wr.*/ 145275793eaSopenharmony_ci int raw; /* 1 for directly writing raw data */ 146275793eaSopenharmony_ci Byte buffered_data[Z_BUFSIZE];/* buffer contain compressed data to be writ*/ 147275793eaSopenharmony_ci uLong dosDate; 148275793eaSopenharmony_ci uLong crc32; 149275793eaSopenharmony_ci int encrypt; 150275793eaSopenharmony_ci int zip64; /* Add ZIP64 extended information in the extra field */ 151275793eaSopenharmony_ci ZPOS64_T pos_zip64extrainfo; 152275793eaSopenharmony_ci ZPOS64_T totalCompressedData; 153275793eaSopenharmony_ci ZPOS64_T totalUncompressedData; 154275793eaSopenharmony_ci#ifndef NOCRYPT 155275793eaSopenharmony_ci unsigned long keys[3]; /* keys defining the pseudo-random sequence */ 156275793eaSopenharmony_ci const z_crc_t* pcrc_32_tab; 157275793eaSopenharmony_ci unsigned crypt_header_size; 158275793eaSopenharmony_ci#endif 159275793eaSopenharmony_ci} curfile64_info; 160275793eaSopenharmony_ci 161275793eaSopenharmony_citypedef struct 162275793eaSopenharmony_ci{ 163275793eaSopenharmony_ci zlib_filefunc64_32_def z_filefunc; 164275793eaSopenharmony_ci voidpf filestream; /* io structure of the zipfile */ 165275793eaSopenharmony_ci linkedlist_data central_dir;/* datablock with central dir in construction*/ 166275793eaSopenharmony_ci int in_opened_file_inzip; /* 1 if a file in the zip is currently writ.*/ 167275793eaSopenharmony_ci curfile64_info ci; /* info on the file currently writing */ 168275793eaSopenharmony_ci 169275793eaSopenharmony_ci ZPOS64_T begin_pos; /* position of the beginning of the zipfile */ 170275793eaSopenharmony_ci ZPOS64_T add_position_when_writing_offset; 171275793eaSopenharmony_ci ZPOS64_T number_entry; 172275793eaSopenharmony_ci 173275793eaSopenharmony_ci#ifndef NO_ADDFILEINEXISTINGZIP 174275793eaSopenharmony_ci char *globalcomment; 175275793eaSopenharmony_ci#endif 176275793eaSopenharmony_ci 177275793eaSopenharmony_ci} zip64_internal; 178275793eaSopenharmony_ci 179275793eaSopenharmony_ci 180275793eaSopenharmony_ci#ifndef NOCRYPT 181275793eaSopenharmony_ci#define INCLUDECRYPTINGCODE_IFCRYPTALLOWED 182275793eaSopenharmony_ci#include "crypt.h" 183275793eaSopenharmony_ci#endif 184275793eaSopenharmony_ci 185275793eaSopenharmony_cilocal linkedlist_datablock_internal* allocate_new_datablock(void) 186275793eaSopenharmony_ci{ 187275793eaSopenharmony_ci linkedlist_datablock_internal* ldi; 188275793eaSopenharmony_ci ldi = (linkedlist_datablock_internal*) 189275793eaSopenharmony_ci ALLOC(sizeof(linkedlist_datablock_internal)); 190275793eaSopenharmony_ci if (ldi != NULL) 191275793eaSopenharmony_ci { 192275793eaSopenharmony_ci ldi->next_datablock = NULL ; 193275793eaSopenharmony_ci ldi->filled_in_this_block = 0 ; 194275793eaSopenharmony_ci ldi->avail_in_this_block = SIZEDATA_INDATABLOCK ; 195275793eaSopenharmony_ci } 196275793eaSopenharmony_ci return ldi; 197275793eaSopenharmony_ci} 198275793eaSopenharmony_ci 199275793eaSopenharmony_cilocal void free_datablock(linkedlist_datablock_internal* ldi) 200275793eaSopenharmony_ci{ 201275793eaSopenharmony_ci while (ldi != NULL) 202275793eaSopenharmony_ci { 203275793eaSopenharmony_ci linkedlist_datablock_internal* ldinext = ldi->next_datablock; 204275793eaSopenharmony_ci free(ldi); 205275793eaSopenharmony_ci ldi = ldinext; 206275793eaSopenharmony_ci } 207275793eaSopenharmony_ci} 208275793eaSopenharmony_ci 209275793eaSopenharmony_cilocal void init_linkedlist(linkedlist_data* ll) 210275793eaSopenharmony_ci{ 211275793eaSopenharmony_ci ll->first_block = ll->last_block = NULL; 212275793eaSopenharmony_ci} 213275793eaSopenharmony_ci 214275793eaSopenharmony_cilocal void free_linkedlist(linkedlist_data* ll) 215275793eaSopenharmony_ci{ 216275793eaSopenharmony_ci free_datablock(ll->first_block); 217275793eaSopenharmony_ci ll->first_block = ll->last_block = NULL; 218275793eaSopenharmony_ci} 219275793eaSopenharmony_ci 220275793eaSopenharmony_ci 221275793eaSopenharmony_cilocal int add_data_in_datablock(linkedlist_data* ll, const void* buf, uLong len) 222275793eaSopenharmony_ci{ 223275793eaSopenharmony_ci linkedlist_datablock_internal* ldi; 224275793eaSopenharmony_ci const unsigned char* from_copy; 225275793eaSopenharmony_ci 226275793eaSopenharmony_ci if (ll == NULL) 227275793eaSopenharmony_ci { 228275793eaSopenharmony_ci return ZIP_INTERNALERROR; 229275793eaSopenharmony_ci } 230275793eaSopenharmony_ci 231275793eaSopenharmony_ci if (ll->last_block == NULL) 232275793eaSopenharmony_ci { 233275793eaSopenharmony_ci ll->first_block = ll->last_block = allocate_new_datablock(); 234275793eaSopenharmony_ci if (ll->first_block == NULL) 235275793eaSopenharmony_ci return ZIP_INTERNALERROR; 236275793eaSopenharmony_ci } 237275793eaSopenharmony_ci 238275793eaSopenharmony_ci ldi = ll->last_block; 239275793eaSopenharmony_ci from_copy = (const unsigned char*)buf; 240275793eaSopenharmony_ci 241275793eaSopenharmony_ci while (len>0) 242275793eaSopenharmony_ci { 243275793eaSopenharmony_ci uInt copy_this; 244275793eaSopenharmony_ci uInt i; 245275793eaSopenharmony_ci unsigned char* to_copy; 246275793eaSopenharmony_ci 247275793eaSopenharmony_ci if (ldi->avail_in_this_block == 0) 248275793eaSopenharmony_ci { 249275793eaSopenharmony_ci ldi->next_datablock = allocate_new_datablock(); 250275793eaSopenharmony_ci if (ldi->next_datablock == NULL) 251275793eaSopenharmony_ci return ZIP_INTERNALERROR; 252275793eaSopenharmony_ci ldi = ldi->next_datablock ; 253275793eaSopenharmony_ci ll->last_block = ldi; 254275793eaSopenharmony_ci } 255275793eaSopenharmony_ci 256275793eaSopenharmony_ci if (ldi->avail_in_this_block < len) 257275793eaSopenharmony_ci { 258275793eaSopenharmony_ci copy_this = (uInt)ldi->avail_in_this_block; 259275793eaSopenharmony_ci } 260275793eaSopenharmony_ci else 261275793eaSopenharmony_ci { 262275793eaSopenharmony_ci copy_this = (uInt)len; 263275793eaSopenharmony_ci } 264275793eaSopenharmony_ci 265275793eaSopenharmony_ci to_copy = &(ldi->data[ldi->filled_in_this_block]); 266275793eaSopenharmony_ci 267275793eaSopenharmony_ci for (i = 0;i < copy_this; i++) { 268275793eaSopenharmony_ci *(to_copy+i) = *(from_copy+i); 269275793eaSopenharmony_ci } 270275793eaSopenharmony_ci 271275793eaSopenharmony_ci ldi->filled_in_this_block += copy_this; 272275793eaSopenharmony_ci ldi->avail_in_this_block -= copy_this; 273275793eaSopenharmony_ci from_copy += copy_this ; 274275793eaSopenharmony_ci len -= copy_this; 275275793eaSopenharmony_ci } 276275793eaSopenharmony_ci return ZIP_OK; 277275793eaSopenharmony_ci} 278275793eaSopenharmony_ci 279275793eaSopenharmony_ci 280275793eaSopenharmony_ci 281275793eaSopenharmony_ci/****************************************************************************/ 282275793eaSopenharmony_ci 283275793eaSopenharmony_ci#ifndef NO_ADDFILEINEXISTINGZIP 284275793eaSopenharmony_ci/* =========================================================================== 285275793eaSopenharmony_ci Inputs a long in LSB order to the given file 286275793eaSopenharmony_ci nbByte == 1, 2 ,4 or 8 (byte, short or long, ZPOS64_T) 287275793eaSopenharmony_ci*/ 288275793eaSopenharmony_ci 289275793eaSopenharmony_cilocal int zip64local_putValue(const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, ZPOS64_T x, int nbByte) 290275793eaSopenharmony_ci{ 291275793eaSopenharmony_ci unsigned char buf[8]; 292275793eaSopenharmony_ci int n; 293275793eaSopenharmony_ci for (n = 0; n < nbByte; n++) 294275793eaSopenharmony_ci { 295275793eaSopenharmony_ci buf[n] = (unsigned char)(x & 0xff); 296275793eaSopenharmony_ci x >>= 8; 297275793eaSopenharmony_ci } 298275793eaSopenharmony_ci if (x != 0) 299275793eaSopenharmony_ci { /* data overflow - hack for ZIP64 (X Roche) */ 300275793eaSopenharmony_ci for (n = 0; n < nbByte; n++) { 301275793eaSopenharmony_ci buf[n] = 0xff; 302275793eaSopenharmony_ci } 303275793eaSopenharmony_ci } 304275793eaSopenharmony_ci 305275793eaSopenharmony_ci if (ZWRITE64(*pzlib_filefunc_def,filestream,buf,(uLong)nbByte) != (uLong)nbByte) 306275793eaSopenharmony_ci { 307275793eaSopenharmony_ci return ZIP_ERRNO; 308275793eaSopenharmony_ci } 309275793eaSopenharmony_ci else 310275793eaSopenharmony_ci { 311275793eaSopenharmony_ci return ZIP_OK; 312275793eaSopenharmony_ci } 313275793eaSopenharmony_ci} 314275793eaSopenharmony_ci 315275793eaSopenharmony_cilocal void zip64local_putValue_inmemory (void* dest, ZPOS64_T x, int nbByte) 316275793eaSopenharmony_ci{ 317275793eaSopenharmony_ci unsigned char* buf = (unsigned char*)dest; 318275793eaSopenharmony_ci int n; 319275793eaSopenharmony_ci for (n = 0; n < nbByte; n++) { 320275793eaSopenharmony_ci buf[n] = (unsigned char)(x & 0xff); 321275793eaSopenharmony_ci x >>= 8; 322275793eaSopenharmony_ci } 323275793eaSopenharmony_ci 324275793eaSopenharmony_ci if (x != 0) 325275793eaSopenharmony_ci { /* data overflow - hack for ZIP64 */ 326275793eaSopenharmony_ci for (n = 0; n < nbByte; n++) 327275793eaSopenharmony_ci { 328275793eaSopenharmony_ci buf[n] = 0xff; 329275793eaSopenharmony_ci } 330275793eaSopenharmony_ci } 331275793eaSopenharmony_ci} 332275793eaSopenharmony_ci 333275793eaSopenharmony_ci/****************************************************************************/ 334275793eaSopenharmony_ci 335275793eaSopenharmony_ci 336275793eaSopenharmony_cilocal uLong zip64local_TmzDateToDosDate(const tm_zip* ptm) 337275793eaSopenharmony_ci{ 338275793eaSopenharmony_ci uLong year = (uLong)ptm->tm_year; 339275793eaSopenharmony_ci if (year >= 1980) 340275793eaSopenharmony_ci { 341275793eaSopenharmony_ci year -= 1980; 342275793eaSopenharmony_ci } 343275793eaSopenharmony_ci else if (year >= 80) 344275793eaSopenharmony_ci { 345275793eaSopenharmony_ci year -= 80; 346275793eaSopenharmony_ci } 347275793eaSopenharmony_ci return 348275793eaSopenharmony_ci (uLong) (((uLong)(ptm->tm_mday) + (32 * (uLong)(ptm->tm_mon + 1)) + (512 * year)) << 16) | 349275793eaSopenharmony_ci (((uLong)ptm->tm_sec / 2) + (32 * (uLong)ptm->tm_min) + (2048 * (uLong)ptm->tm_hour)); 350275793eaSopenharmony_ci} 351275793eaSopenharmony_ci 352275793eaSopenharmony_ci 353275793eaSopenharmony_ci/****************************************************************************/ 354275793eaSopenharmony_ci 355275793eaSopenharmony_cilocal int zip64local_getByte(const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, int* pi) 356275793eaSopenharmony_ci{ 357275793eaSopenharmony_ci unsigned char c; 358275793eaSopenharmony_ci int err = (int)ZREAD64(*pzlib_filefunc_def,filestream,&c,1); 359275793eaSopenharmony_ci if (err == 1) 360275793eaSopenharmony_ci { 361275793eaSopenharmony_ci *pi = (int)c; 362275793eaSopenharmony_ci return ZIP_OK; 363275793eaSopenharmony_ci } 364275793eaSopenharmony_ci else 365275793eaSopenharmony_ci { 366275793eaSopenharmony_ci if (ZERROR64(*pzlib_filefunc_def,filestream)) 367275793eaSopenharmony_ci { 368275793eaSopenharmony_ci return ZIP_ERRNO; 369275793eaSopenharmony_ci } 370275793eaSopenharmony_ci else 371275793eaSopenharmony_ci { 372275793eaSopenharmony_ci return ZIP_EOF; 373275793eaSopenharmony_ci } 374275793eaSopenharmony_ci } 375275793eaSopenharmony_ci} 376275793eaSopenharmony_ci 377275793eaSopenharmony_ci 378275793eaSopenharmony_ci/* =========================================================================== 379275793eaSopenharmony_ci Reads a long in LSB order from the given gz_stream. Sets 380275793eaSopenharmony_ci*/ 381275793eaSopenharmony_cilocal int zip64local_getShort(const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, uLong* pX) 382275793eaSopenharmony_ci{ 383275793eaSopenharmony_ci uLong x ; 384275793eaSopenharmony_ci int i = 0; 385275793eaSopenharmony_ci int err; 386275793eaSopenharmony_ci 387275793eaSopenharmony_ci err = zip64local_getByte(pzlib_filefunc_def,filestream,&i); 388275793eaSopenharmony_ci x = (uLong)i; 389275793eaSopenharmony_ci 390275793eaSopenharmony_ci if (err == ZIP_OK) 391275793eaSopenharmony_ci { 392275793eaSopenharmony_ci err = zip64local_getByte(pzlib_filefunc_def,filestream,&i); 393275793eaSopenharmony_ci } 394275793eaSopenharmony_ci x += ((uLong)i) << 8; 395275793eaSopenharmony_ci 396275793eaSopenharmony_ci if (err == ZIP_OK) 397275793eaSopenharmony_ci { 398275793eaSopenharmony_ci *pX = x; 399275793eaSopenharmony_ci } 400275793eaSopenharmony_ci else 401275793eaSopenharmony_ci { 402275793eaSopenharmony_ci *pX = 0; 403275793eaSopenharmony_ci } 404275793eaSopenharmony_ci return err; 405275793eaSopenharmony_ci} 406275793eaSopenharmony_ci 407275793eaSopenharmony_cilocal int zip64local_getLong(const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, uLong* pX) 408275793eaSopenharmony_ci{ 409275793eaSopenharmony_ci uLong x ; 410275793eaSopenharmony_ci int i = 0; 411275793eaSopenharmony_ci int err; 412275793eaSopenharmony_ci 413275793eaSopenharmony_ci err = zip64local_getByte(pzlib_filefunc_def,filestream,&i); 414275793eaSopenharmony_ci x = (uLong)i; 415275793eaSopenharmony_ci 416275793eaSopenharmony_ci if (err == ZIP_OK) 417275793eaSopenharmony_ci { 418275793eaSopenharmony_ci err = zip64local_getByte(pzlib_filefunc_def,filestream,&i); 419275793eaSopenharmony_ci } 420275793eaSopenharmony_ci x += ((uLong)i) << 8; 421275793eaSopenharmony_ci 422275793eaSopenharmony_ci if (err == ZIP_OK) 423275793eaSopenharmony_ci { 424275793eaSopenharmony_ci err = zip64local_getByte(pzlib_filefunc_def,filestream,&i); 425275793eaSopenharmony_ci } 426275793eaSopenharmony_ci x += ((uLong)i) << 16; 427275793eaSopenharmony_ci 428275793eaSopenharmony_ci if (err == ZIP_OK) 429275793eaSopenharmony_ci { 430275793eaSopenharmony_ci err = zip64local_getByte(pzlib_filefunc_def,filestream,&i); 431275793eaSopenharmony_ci } 432275793eaSopenharmony_ci x += ((uLong)i) << 24; 433275793eaSopenharmony_ci 434275793eaSopenharmony_ci if (err == ZIP_OK) 435275793eaSopenharmony_ci { 436275793eaSopenharmony_ci *pX = x; 437275793eaSopenharmony_ci } 438275793eaSopenharmony_ci else 439275793eaSopenharmony_ci { 440275793eaSopenharmony_ci *pX = 0; 441275793eaSopenharmony_ci } 442275793eaSopenharmony_ci return err; 443275793eaSopenharmony_ci} 444275793eaSopenharmony_ci 445275793eaSopenharmony_ci 446275793eaSopenharmony_cilocal int zip64local_getLong64(const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, ZPOS64_T *pX) 447275793eaSopenharmony_ci{ 448275793eaSopenharmony_ci ZPOS64_T x; 449275793eaSopenharmony_ci int i = 0; 450275793eaSopenharmony_ci int err; 451275793eaSopenharmony_ci 452275793eaSopenharmony_ci err = zip64local_getByte(pzlib_filefunc_def,filestream,&i); 453275793eaSopenharmony_ci x = (ZPOS64_T)i; 454275793eaSopenharmony_ci 455275793eaSopenharmony_ci if (err == ZIP_OK) 456275793eaSopenharmony_ci { 457275793eaSopenharmony_ci err = zip64local_getByte(pzlib_filefunc_def,filestream,&i); 458275793eaSopenharmony_ci } 459275793eaSopenharmony_ci x += ((ZPOS64_T)i) << 8; 460275793eaSopenharmony_ci 461275793eaSopenharmony_ci if (err == ZIP_OK) 462275793eaSopenharmony_ci { 463275793eaSopenharmony_ci err = zip64local_getByte(pzlib_filefunc_def,filestream,&i); 464275793eaSopenharmony_ci } 465275793eaSopenharmony_ci x += ((ZPOS64_T)i) << 16; 466275793eaSopenharmony_ci 467275793eaSopenharmony_ci if (err==ZIP_OK) 468275793eaSopenharmony_ci { 469275793eaSopenharmony_ci err = zip64local_getByte(pzlib_filefunc_def,filestream,&i); 470275793eaSopenharmony_ci } 471275793eaSopenharmony_ci x += ((ZPOS64_T)i) << 24; 472275793eaSopenharmony_ci 473275793eaSopenharmony_ci if (err == ZIP_OK) 474275793eaSopenharmony_ci { 475275793eaSopenharmony_ci err = zip64local_getByte(pzlib_filefunc_def,filestream,&i); 476275793eaSopenharmony_ci } 477275793eaSopenharmony_ci x += ((ZPOS64_T)i) << 32; 478275793eaSopenharmony_ci 479275793eaSopenharmony_ci if (err == ZIP_OK) 480275793eaSopenharmony_ci { 481275793eaSopenharmony_ci err = zip64local_getByte(pzlib_filefunc_def,filestream,&i); 482275793eaSopenharmony_ci } 483275793eaSopenharmony_ci x += ((ZPOS64_T)i) << 40; 484275793eaSopenharmony_ci 485275793eaSopenharmony_ci if (err == ZIP_OK) 486275793eaSopenharmony_ci { 487275793eaSopenharmony_ci err = zip64local_getByte(pzlib_filefunc_def,filestream,&i); 488275793eaSopenharmony_ci } 489275793eaSopenharmony_ci x += ((ZPOS64_T)i) << 48; 490275793eaSopenharmony_ci 491275793eaSopenharmony_ci if (err == ZIP_OK) 492275793eaSopenharmony_ci { 493275793eaSopenharmony_ci err = zip64local_getByte(pzlib_filefunc_def,filestream,&i); 494275793eaSopenharmony_ci } 495275793eaSopenharmony_ci x += ((ZPOS64_T)i) << 56; 496275793eaSopenharmony_ci 497275793eaSopenharmony_ci if (err == ZIP_OK) 498275793eaSopenharmony_ci { 499275793eaSopenharmony_ci *pX = x; 500275793eaSopenharmony_ci } 501275793eaSopenharmony_ci else 502275793eaSopenharmony_ci { 503275793eaSopenharmony_ci *pX = 0; 504275793eaSopenharmony_ci } 505275793eaSopenharmony_ci 506275793eaSopenharmony_ci return err; 507275793eaSopenharmony_ci} 508275793eaSopenharmony_ci 509275793eaSopenharmony_ci#ifndef BUFREADCOMMENT 510275793eaSopenharmony_ci#define BUFREADCOMMENT (0x400) 511275793eaSopenharmony_ci#endif 512275793eaSopenharmony_ci/* 513275793eaSopenharmony_ci Locate the Central directory of a zipfile (at the end, just before 514275793eaSopenharmony_ci the global comment) 515275793eaSopenharmony_ci*/ 516275793eaSopenharmony_cilocal ZPOS64_T zip64local_SearchCentralDir(const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream) 517275793eaSopenharmony_ci{ 518275793eaSopenharmony_ci unsigned char* buf; 519275793eaSopenharmony_ci ZPOS64_T uSizeFile; 520275793eaSopenharmony_ci ZPOS64_T uBackRead; 521275793eaSopenharmony_ci ZPOS64_T uMaxBack=0xffff; /* maximum size of global comment */ 522275793eaSopenharmony_ci ZPOS64_T uPosFound=0; 523275793eaSopenharmony_ci 524275793eaSopenharmony_ci if (ZSEEK64(*pzlib_filefunc_def,filestream,0,ZLIB_FILEFUNC_SEEK_END) != 0) 525275793eaSopenharmony_ci { 526275793eaSopenharmony_ci return 0; 527275793eaSopenharmony_ci } 528275793eaSopenharmony_ci 529275793eaSopenharmony_ci 530275793eaSopenharmony_ci uSizeFile = ZTELL64(*pzlib_filefunc_def,filestream); 531275793eaSopenharmony_ci 532275793eaSopenharmony_ci if (uMaxBack > uSizeFile) 533275793eaSopenharmony_ci { 534275793eaSopenharmony_ci uMaxBack = uSizeFile; 535275793eaSopenharmony_ci } 536275793eaSopenharmony_ci 537275793eaSopenharmony_ci buf = (unsigned char*)ALLOC(BUFREADCOMMENT + 4); 538275793eaSopenharmony_ci if (buf == NULL) 539275793eaSopenharmony_ci { 540275793eaSopenharmony_ci return 0; 541275793eaSopenharmony_ci } 542275793eaSopenharmony_ci 543275793eaSopenharmony_ci uBackRead = 4; 544275793eaSopenharmony_ci while (uBackRead<uMaxBack) 545275793eaSopenharmony_ci { 546275793eaSopenharmony_ci uLong uReadSize; 547275793eaSopenharmony_ci ZPOS64_T uReadPos ; 548275793eaSopenharmony_ci int i; 549275793eaSopenharmony_ci if (uBackRead + BUFREADCOMMENT > uMaxBack) 550275793eaSopenharmony_ci { 551275793eaSopenharmony_ci uBackRead = uMaxBack; 552275793eaSopenharmony_ci } 553275793eaSopenharmony_ci else 554275793eaSopenharmony_ci { 555275793eaSopenharmony_ci uBackRead += BUFREADCOMMENT; 556275793eaSopenharmony_ci } 557275793eaSopenharmony_ci uReadPos = uSizeFile - uBackRead ; 558275793eaSopenharmony_ci 559275793eaSopenharmony_ci uReadSize = ((BUFREADCOMMENT + 4) < (uSizeFile - uReadPos)) ? 560275793eaSopenharmony_ci (BUFREADCOMMENT + 4) : (uLong)(uSizeFile-uReadPos); 561275793eaSopenharmony_ci if (ZSEEK64(*pzlib_filefunc_def,filestream,uReadPos,ZLIB_FILEFUNC_SEEK_SET) != 0) 562275793eaSopenharmony_ci { 563275793eaSopenharmony_ci break; 564275793eaSopenharmony_ci } 565275793eaSopenharmony_ci 566275793eaSopenharmony_ci if (ZREAD64(*pzlib_filefunc_def,filestream,buf,uReadSize) != uReadSize) 567275793eaSopenharmony_ci { 568275793eaSopenharmony_ci break; 569275793eaSopenharmony_ci } 570275793eaSopenharmony_ci 571275793eaSopenharmony_ci for (i = (int)uReadSize - 3; (i--) > 0;) { 572275793eaSopenharmony_ci if (((*(buf + i)) == 0x50) && ((*(buf + i + 1)) == 0x4b) && 573275793eaSopenharmony_ci ((*(buf + i + 2)) == 0x05) && ((*(buf + i + 3)) == 0x06)) 574275793eaSopenharmony_ci { 575275793eaSopenharmony_ci uPosFound = uReadPos + (unsigned)i; 576275793eaSopenharmony_ci break; 577275793eaSopenharmony_ci } 578275793eaSopenharmony_ci } 579275793eaSopenharmony_ci 580275793eaSopenharmony_ci if (uPosFound != 0) 581275793eaSopenharmony_ci { 582275793eaSopenharmony_ci break; 583275793eaSopenharmony_ci } 584275793eaSopenharmony_ci } 585275793eaSopenharmony_ci free(buf); 586275793eaSopenharmony_ci return uPosFound; 587275793eaSopenharmony_ci} 588275793eaSopenharmony_ci 589275793eaSopenharmony_ci/* 590275793eaSopenharmony_ciLocate the End of Zip64 Central directory locator and from there find the CD of a zipfile (at the end, just before 591275793eaSopenharmony_cithe global comment) 592275793eaSopenharmony_ci*/ 593275793eaSopenharmony_cilocal ZPOS64_T zip64local_SearchCentralDir64(const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream) 594275793eaSopenharmony_ci{ 595275793eaSopenharmony_ci unsigned char* buf; 596275793eaSopenharmony_ci ZPOS64_T uSizeFile; 597275793eaSopenharmony_ci ZPOS64_T uBackRead; 598275793eaSopenharmony_ci ZPOS64_T uMaxBack = 0xffff; /* maximum size of global comment */ 599275793eaSopenharmony_ci ZPOS64_T uPosFound = 0; 600275793eaSopenharmony_ci uLong uL; 601275793eaSopenharmony_ci ZPOS64_T relativeOffset; 602275793eaSopenharmony_ci 603275793eaSopenharmony_ci if (ZSEEK64(*pzlib_filefunc_def,filestream,0,ZLIB_FILEFUNC_SEEK_END) != 0) 604275793eaSopenharmony_ci { 605275793eaSopenharmony_ci return 0; 606275793eaSopenharmony_ci } 607275793eaSopenharmony_ci 608275793eaSopenharmony_ci uSizeFile = ZTELL64(*pzlib_filefunc_def,filestream); 609275793eaSopenharmony_ci 610275793eaSopenharmony_ci if (uMaxBack > uSizeFile) 611275793eaSopenharmony_ci { 612275793eaSopenharmony_ci uMaxBack = uSizeFile; 613275793eaSopenharmony_ci } 614275793eaSopenharmony_ci 615275793eaSopenharmony_ci buf = (unsigned char*)ALLOC(BUFREADCOMMENT + 4); 616275793eaSopenharmony_ci if (buf == NULL) 617275793eaSopenharmony_ci { 618275793eaSopenharmony_ci return 0; 619275793eaSopenharmony_ci } 620275793eaSopenharmony_ci 621275793eaSopenharmony_ci uBackRead = 4; 622275793eaSopenharmony_ci while (uBackRead < uMaxBack) 623275793eaSopenharmony_ci { 624275793eaSopenharmony_ci uLong uReadSize; 625275793eaSopenharmony_ci ZPOS64_T uReadPos; 626275793eaSopenharmony_ci int i; 627275793eaSopenharmony_ci if (uBackRead + BUFREADCOMMENT > uMaxBack) 628275793eaSopenharmony_ci { 629275793eaSopenharmony_ci uBackRead = uMaxBack; 630275793eaSopenharmony_ci } 631275793eaSopenharmony_ci else 632275793eaSopenharmony_ci { 633275793eaSopenharmony_ci uBackRead += BUFREADCOMMENT; 634275793eaSopenharmony_ci } 635275793eaSopenharmony_ci uReadPos = uSizeFile - uBackRead ; 636275793eaSopenharmony_ci 637275793eaSopenharmony_ci uReadSize = ((BUFREADCOMMENT + 4) < (uSizeFile - uReadPos)) ? 638275793eaSopenharmony_ci (BUFREADCOMMENT + 4) : (uLong)(uSizeFile - uReadPos); 639275793eaSopenharmony_ci if (ZSEEK64(*pzlib_filefunc_def,filestream,uReadPos,ZLIB_FILEFUNC_SEEK_SET) != 0) 640275793eaSopenharmony_ci { 641275793eaSopenharmony_ci break; 642275793eaSopenharmony_ci } 643275793eaSopenharmony_ci 644275793eaSopenharmony_ci if (ZREAD64(*pzlib_filefunc_def,filestream,buf,uReadSize) != uReadSize) 645275793eaSopenharmony_ci { 646275793eaSopenharmony_ci break; 647275793eaSopenharmony_ci } 648275793eaSopenharmony_ci 649275793eaSopenharmony_ci for (i = (int)uReadSize - 3; (i--) > 0;) 650275793eaSopenharmony_ci { 651275793eaSopenharmony_ci // Signature "0x07064b50" Zip64 end of central directory locater 652275793eaSopenharmony_ci if (((*(buf + i)) == 0x50) && ((*(buf + i + 1)) == 0x4b) && ((*(buf + i + 2)) == 0x06) && ((*(buf + i + 3)) == 0x07)) 653275793eaSopenharmony_ci { 654275793eaSopenharmony_ci uPosFound = uReadPos + (unsigned)i; 655275793eaSopenharmony_ci break; 656275793eaSopenharmony_ci } 657275793eaSopenharmony_ci } 658275793eaSopenharmony_ci 659275793eaSopenharmony_ci if (uPosFound != 0) 660275793eaSopenharmony_ci { 661275793eaSopenharmony_ci break; 662275793eaSopenharmony_ci } 663275793eaSopenharmony_ci } 664275793eaSopenharmony_ci 665275793eaSopenharmony_ci free(buf); 666275793eaSopenharmony_ci if (uPosFound == 0) 667275793eaSopenharmony_ci { 668275793eaSopenharmony_ci return 0; 669275793eaSopenharmony_ci } 670275793eaSopenharmony_ci 671275793eaSopenharmony_ci /* Zip64 end of central directory locator */ 672275793eaSopenharmony_ci if (ZSEEK64(*pzlib_filefunc_def,filestream, uPosFound,ZLIB_FILEFUNC_SEEK_SET) != 0) 673275793eaSopenharmony_ci { 674275793eaSopenharmony_ci return 0; 675275793eaSopenharmony_ci } 676275793eaSopenharmony_ci 677275793eaSopenharmony_ci /* the signature, already checked */ 678275793eaSopenharmony_ci if (zip64local_getLong(pzlib_filefunc_def,filestream,&uL) != ZIP_OK) 679275793eaSopenharmony_ci { 680275793eaSopenharmony_ci return 0; 681275793eaSopenharmony_ci } 682275793eaSopenharmony_ci 683275793eaSopenharmony_ci /* number of the disk with the start of the zip64 end of central directory */ 684275793eaSopenharmony_ci if (zip64local_getLong(pzlib_filefunc_def,filestream,&uL) != ZIP_OK) 685275793eaSopenharmony_ci { 686275793eaSopenharmony_ci return 0; 687275793eaSopenharmony_ci } 688275793eaSopenharmony_ci if (uL != 0) 689275793eaSopenharmony_ci { 690275793eaSopenharmony_ci return 0; 691275793eaSopenharmony_ci } 692275793eaSopenharmony_ci 693275793eaSopenharmony_ci /* relative offset of the zip64 end of central directory record */ 694275793eaSopenharmony_ci if (zip64local_getLong64(pzlib_filefunc_def,filestream,&relativeOffset) != ZIP_OK) 695275793eaSopenharmony_ci { 696275793eaSopenharmony_ci return 0; 697275793eaSopenharmony_ci } 698275793eaSopenharmony_ci 699275793eaSopenharmony_ci /* total number of disks */ 700275793eaSopenharmony_ci if (zip64local_getLong(pzlib_filefunc_def,filestream,&uL) != ZIP_OK) 701275793eaSopenharmony_ci { 702275793eaSopenharmony_ci return 0; 703275793eaSopenharmony_ci } 704275793eaSopenharmony_ci if (uL != 1) 705275793eaSopenharmony_ci { 706275793eaSopenharmony_ci return 0; 707275793eaSopenharmony_ci } 708275793eaSopenharmony_ci 709275793eaSopenharmony_ci /* Goto Zip64 end of central directory record */ 710275793eaSopenharmony_ci if (ZSEEK64(*pzlib_filefunc_def,filestream, relativeOffset,ZLIB_FILEFUNC_SEEK_SET) != 0) 711275793eaSopenharmony_ci { 712275793eaSopenharmony_ci return 0; 713275793eaSopenharmony_ci } 714275793eaSopenharmony_ci 715275793eaSopenharmony_ci /* the signature */ 716275793eaSopenharmony_ci if (zip64local_getLong(pzlib_filefunc_def,filestream,&uL) != ZIP_OK) 717275793eaSopenharmony_ci { 718275793eaSopenharmony_ci return 0; 719275793eaSopenharmony_ci } 720275793eaSopenharmony_ci 721275793eaSopenharmony_ci if (uL != 0x06064b50) // signature of 'Zip64 end of central directory' 722275793eaSopenharmony_ci { 723275793eaSopenharmony_ci return 0; 724275793eaSopenharmony_ci } 725275793eaSopenharmony_ci 726275793eaSopenharmony_ci return relativeOffset; 727275793eaSopenharmony_ci} 728275793eaSopenharmony_ci 729275793eaSopenharmony_cilocal int LoadCentralDirectoryRecord(zip64_internal* pziinit) 730275793eaSopenharmony_ci{ 731275793eaSopenharmony_ci int err = ZIP_OK; 732275793eaSopenharmony_ci ZPOS64_T byte_before_the_zipfile;/* byte before the zipfile, (>0 for sfx)*/ 733275793eaSopenharmony_ci 734275793eaSopenharmony_ci ZPOS64_T size_central_dir; /* size of the central directory */ 735275793eaSopenharmony_ci ZPOS64_T offset_central_dir; /* offset of start of central directory */ 736275793eaSopenharmony_ci ZPOS64_T central_pos; 737275793eaSopenharmony_ci uLong uL; 738275793eaSopenharmony_ci 739275793eaSopenharmony_ci uLong number_disk; /* number of the current disk, used for 740275793eaSopenharmony_ci spanning ZIP, unsupported, always 0*/ 741275793eaSopenharmony_ci uLong number_disk_with_CD; /* number of the disk with central dir, used 742275793eaSopenharmony_ci for spanning ZIP, unsupported, always 0*/ 743275793eaSopenharmony_ci ZPOS64_T number_entry; 744275793eaSopenharmony_ci ZPOS64_T number_entry_CD; /* total number of entries in 745275793eaSopenharmony_ci the central dir 746275793eaSopenharmony_ci (same than number_entry on nospan) */ 747275793eaSopenharmony_ci uLong VersionMadeBy; 748275793eaSopenharmony_ci uLong VersionNeeded; 749275793eaSopenharmony_ci uLong size_comment; 750275793eaSopenharmony_ci 751275793eaSopenharmony_ci int hasZIP64Record = 0; 752275793eaSopenharmony_ci 753275793eaSopenharmony_ci // check first if we find a ZIP64 record 754275793eaSopenharmony_ci central_pos = zip64local_SearchCentralDir64(&pziinit->z_filefunc,pziinit->filestream); 755275793eaSopenharmony_ci if(central_pos > 0) 756275793eaSopenharmony_ci { 757275793eaSopenharmony_ci hasZIP64Record = 1; 758275793eaSopenharmony_ci } 759275793eaSopenharmony_ci else if(central_pos == 0) 760275793eaSopenharmony_ci { 761275793eaSopenharmony_ci central_pos = zip64local_SearchCentralDir(&pziinit->z_filefunc,pziinit->filestream); 762275793eaSopenharmony_ci } 763275793eaSopenharmony_ci 764275793eaSopenharmony_ci/* disable to allow appending to empty ZIP archive 765275793eaSopenharmony_ci if (central_pos==0) 766275793eaSopenharmony_ci err=ZIP_ERRNO; 767275793eaSopenharmony_ci*/ 768275793eaSopenharmony_ci 769275793eaSopenharmony_ci if(hasZIP64Record) 770275793eaSopenharmony_ci { 771275793eaSopenharmony_ci ZPOS64_T sizeEndOfCentralDirectory; 772275793eaSopenharmony_ci if (ZSEEK64(pziinit->z_filefunc, pziinit->filestream, central_pos, ZLIB_FILEFUNC_SEEK_SET) != 0) 773275793eaSopenharmony_ci { 774275793eaSopenharmony_ci err = ZIP_ERRNO; 775275793eaSopenharmony_ci } 776275793eaSopenharmony_ci 777275793eaSopenharmony_ci /* the signature, already checked */ 778275793eaSopenharmony_ci if (zip64local_getLong(&pziinit->z_filefunc, pziinit->filestream,&uL) != ZIP_OK) 779275793eaSopenharmony_ci { 780275793eaSopenharmony_ci err = ZIP_ERRNO; 781275793eaSopenharmony_ci } 782275793eaSopenharmony_ci 783275793eaSopenharmony_ci /* size of zip64 end of central directory record */ 784275793eaSopenharmony_ci if (zip64local_getLong64(&pziinit->z_filefunc, pziinit->filestream, &sizeEndOfCentralDirectory) != ZIP_OK) 785275793eaSopenharmony_ci { 786275793eaSopenharmony_ci err = ZIP_ERRNO; 787275793eaSopenharmony_ci } 788275793eaSopenharmony_ci 789275793eaSopenharmony_ci /* version made by */ 790275793eaSopenharmony_ci if (zip64local_getShort(&pziinit->z_filefunc, pziinit->filestream, &VersionMadeBy) != ZIP_OK) 791275793eaSopenharmony_ci { 792275793eaSopenharmony_ci err = ZIP_ERRNO; 793275793eaSopenharmony_ci } 794275793eaSopenharmony_ci 795275793eaSopenharmony_ci /* version needed to extract */ 796275793eaSopenharmony_ci if (zip64local_getShort(&pziinit->z_filefunc, pziinit->filestream, &VersionNeeded) != ZIP_OK) 797275793eaSopenharmony_ci { 798275793eaSopenharmony_ci err = ZIP_ERRNO; 799275793eaSopenharmony_ci } 800275793eaSopenharmony_ci 801275793eaSopenharmony_ci /* number of this disk */ 802275793eaSopenharmony_ci if (zip64local_getLong(&pziinit->z_filefunc, pziinit->filestream,&number_disk) != ZIP_OK) 803275793eaSopenharmony_ci { 804275793eaSopenharmony_ci err = ZIP_ERRNO; 805275793eaSopenharmony_ci } 806275793eaSopenharmony_ci 807275793eaSopenharmony_ci /* number of the disk with the start of the central directory */ 808275793eaSopenharmony_ci if (zip64local_getLong(&pziinit->z_filefunc, pziinit->filestream,&number_disk_with_CD) != ZIP_OK) 809275793eaSopenharmony_ci { 810275793eaSopenharmony_ci err = ZIP_ERRNO; 811275793eaSopenharmony_ci } 812275793eaSopenharmony_ci 813275793eaSopenharmony_ci /* total number of entries in the central directory on this disk */ 814275793eaSopenharmony_ci if (zip64local_getLong64(&pziinit->z_filefunc, pziinit->filestream, &number_entry) != ZIP_OK) 815275793eaSopenharmony_ci { 816275793eaSopenharmony_ci err = ZIP_ERRNO; 817275793eaSopenharmony_ci } 818275793eaSopenharmony_ci 819275793eaSopenharmony_ci /* total number of entries in the central directory */ 820275793eaSopenharmony_ci if (zip64local_getLong64(&pziinit->z_filefunc, pziinit->filestream,&number_entry_CD) != ZIP_OK) 821275793eaSopenharmony_ci { 822275793eaSopenharmony_ci err = ZIP_ERRNO; 823275793eaSopenharmony_ci } 824275793eaSopenharmony_ci 825275793eaSopenharmony_ci if ((number_entry_CD != number_entry) || (number_disk_with_CD != 0) || (number_disk != 0)) 826275793eaSopenharmony_ci { 827275793eaSopenharmony_ci err = ZIP_BADZIPFILE; 828275793eaSopenharmony_ci } 829275793eaSopenharmony_ci 830275793eaSopenharmony_ci /* size of the central directory */ 831275793eaSopenharmony_ci if (zip64local_getLong64(&pziinit->z_filefunc, pziinit->filestream,&size_central_dir) != ZIP_OK) 832275793eaSopenharmony_ci { 833275793eaSopenharmony_ci err = ZIP_ERRNO; 834275793eaSopenharmony_ci } 835275793eaSopenharmony_ci 836275793eaSopenharmony_ci /* offset of start of central directory with respect to the 837275793eaSopenharmony_ci starting disk number */ 838275793eaSopenharmony_ci if (zip64local_getLong64(&pziinit->z_filefunc, pziinit->filestream,&offset_central_dir) != ZIP_OK) 839275793eaSopenharmony_ci { 840275793eaSopenharmony_ci err = ZIP_ERRNO; 841275793eaSopenharmony_ci } 842275793eaSopenharmony_ci 843275793eaSopenharmony_ci // TODO.. 844275793eaSopenharmony_ci // read the comment from the standard central header. 845275793eaSopenharmony_ci size_comment = 0; 846275793eaSopenharmony_ci } 847275793eaSopenharmony_ci else 848275793eaSopenharmony_ci { 849275793eaSopenharmony_ci // Read End of central Directory info 850275793eaSopenharmony_ci if (ZSEEK64(pziinit->z_filefunc, pziinit->filestream, central_pos,ZLIB_FILEFUNC_SEEK_SET) != 0) 851275793eaSopenharmony_ci { 852275793eaSopenharmony_ci err = ZIP_ERRNO; 853275793eaSopenharmony_ci } 854275793eaSopenharmony_ci 855275793eaSopenharmony_ci /* the signature, already checked */ 856275793eaSopenharmony_ci if (zip64local_getLong(&pziinit->z_filefunc, pziinit->filestream,&uL) != ZIP_OK) 857275793eaSopenharmony_ci { 858275793eaSopenharmony_ci err = ZIP_ERRNO; 859275793eaSopenharmony_ci } 860275793eaSopenharmony_ci 861275793eaSopenharmony_ci /* number of this disk */ 862275793eaSopenharmony_ci if (zip64local_getShort(&pziinit->z_filefunc, pziinit->filestream,&number_disk) != ZIP_OK) 863275793eaSopenharmony_ci { 864275793eaSopenharmony_ci err = ZIP_ERRNO; 865275793eaSopenharmony_ci } 866275793eaSopenharmony_ci 867275793eaSopenharmony_ci /* number of the disk with the start of the central directory */ 868275793eaSopenharmony_ci if (zip64local_getShort(&pziinit->z_filefunc, pziinit->filestream,&number_disk_with_CD) != ZIP_OK) 869275793eaSopenharmony_ci { 870275793eaSopenharmony_ci err = ZIP_ERRNO; 871275793eaSopenharmony_ci } 872275793eaSopenharmony_ci 873275793eaSopenharmony_ci /* total number of entries in the central dir on this disk */ 874275793eaSopenharmony_ci number_entry = 0; 875275793eaSopenharmony_ci if (zip64local_getShort(&pziinit->z_filefunc, pziinit->filestream, &uL) != ZIP_OK) 876275793eaSopenharmony_ci { 877275793eaSopenharmony_ci err = ZIP_ERRNO; 878275793eaSopenharmony_ci } 879275793eaSopenharmony_ci else 880275793eaSopenharmony_ci { 881275793eaSopenharmony_ci number_entry = uL; 882275793eaSopenharmony_ci } 883275793eaSopenharmony_ci 884275793eaSopenharmony_ci /* total number of entries in the central dir */ 885275793eaSopenharmony_ci number_entry_CD = 0; 886275793eaSopenharmony_ci if (zip64local_getShort(&pziinit->z_filefunc, pziinit->filestream, &uL) != ZIP_OK) 887275793eaSopenharmony_ci { 888275793eaSopenharmony_ci err = ZIP_ERRNO; 889275793eaSopenharmony_ci } 890275793eaSopenharmony_ci else 891275793eaSopenharmony_ci { 892275793eaSopenharmony_ci number_entry_CD = uL; 893275793eaSopenharmony_ci } 894275793eaSopenharmony_ci 895275793eaSopenharmony_ci if ((number_entry_CD != number_entry) || (number_disk_with_CD != 0) || (number_disk != 0)) 896275793eaSopenharmony_ci { 897275793eaSopenharmony_ci err = ZIP_BADZIPFILE; 898275793eaSopenharmony_ci } 899275793eaSopenharmony_ci 900275793eaSopenharmony_ci /* size of the central directory */ 901275793eaSopenharmony_ci size_central_dir = 0; 902275793eaSopenharmony_ci if (zip64local_getLong(&pziinit->z_filefunc, pziinit->filestream, &uL) != ZIP_OK) 903275793eaSopenharmony_ci { 904275793eaSopenharmony_ci err = ZIP_ERRNO; 905275793eaSopenharmony_ci } 906275793eaSopenharmony_ci else 907275793eaSopenharmony_ci { 908275793eaSopenharmony_ci size_central_dir = uL; 909275793eaSopenharmony_ci } 910275793eaSopenharmony_ci 911275793eaSopenharmony_ci /* offset of start of central directory with respect to the starting disk number */ 912275793eaSopenharmony_ci offset_central_dir = 0; 913275793eaSopenharmony_ci if (zip64local_getLong(&pziinit->z_filefunc, pziinit->filestream, &uL) != ZIP_OK) 914275793eaSopenharmony_ci { 915275793eaSopenharmony_ci err = ZIP_ERRNO; 916275793eaSopenharmony_ci } 917275793eaSopenharmony_ci else 918275793eaSopenharmony_ci { 919275793eaSopenharmony_ci offset_central_dir = uL; 920275793eaSopenharmony_ci } 921275793eaSopenharmony_ci 922275793eaSopenharmony_ci 923275793eaSopenharmony_ci /* zipfile global comment length */ 924275793eaSopenharmony_ci if (zip64local_getShort(&pziinit->z_filefunc, pziinit->filestream, &size_comment) != ZIP_OK) 925275793eaSopenharmony_ci { 926275793eaSopenharmony_ci err = ZIP_ERRNO; 927275793eaSopenharmony_ci } 928275793eaSopenharmony_ci } 929275793eaSopenharmony_ci 930275793eaSopenharmony_ci if ((central_pos<offset_central_dir+size_central_dir) && 931275793eaSopenharmony_ci (err == ZIP_OK)) 932275793eaSopenharmony_ci { 933275793eaSopenharmony_ci err = ZIP_BADZIPFILE; 934275793eaSopenharmony_ci } 935275793eaSopenharmony_ci 936275793eaSopenharmony_ci if (err != ZIP_OK) 937275793eaSopenharmony_ci { 938275793eaSopenharmony_ci ZCLOSE64(pziinit->z_filefunc, pziinit->filestream); 939275793eaSopenharmony_ci return ZIP_ERRNO; 940275793eaSopenharmony_ci } 941275793eaSopenharmony_ci 942275793eaSopenharmony_ci if (size_comment > 0) 943275793eaSopenharmony_ci { 944275793eaSopenharmony_ci pziinit->globalcomment = (char*)ALLOC(size_comment + 1); 945275793eaSopenharmony_ci if (pziinit->globalcomment) 946275793eaSopenharmony_ci { 947275793eaSopenharmony_ci size_comment = ZREAD64(pziinit->z_filefunc, pziinit->filestream, pziinit->globalcomment,size_comment); 948275793eaSopenharmony_ci pziinit->globalcomment[size_comment] = 0; 949275793eaSopenharmony_ci } 950275793eaSopenharmony_ci } 951275793eaSopenharmony_ci 952275793eaSopenharmony_ci byte_before_the_zipfile = central_pos - (offset_central_dir+size_central_dir); 953275793eaSopenharmony_ci pziinit->add_position_when_writing_offset = byte_before_the_zipfile; 954275793eaSopenharmony_ci 955275793eaSopenharmony_ci { 956275793eaSopenharmony_ci ZPOS64_T size_central_dir_to_read = size_central_dir; 957275793eaSopenharmony_ci size_t buf_size = SIZEDATA_INDATABLOCK; 958275793eaSopenharmony_ci void* buf_read = (void*)ALLOC(buf_size); 959275793eaSopenharmony_ci if (ZSEEK64(pziinit->z_filefunc, pziinit->filestream, offset_central_dir + byte_before_the_zipfile, ZLIB_FILEFUNC_SEEK_SET) != 0) 960275793eaSopenharmony_ci { 961275793eaSopenharmony_ci err = ZIP_ERRNO; 962275793eaSopenharmony_ci } 963275793eaSopenharmony_ci 964275793eaSopenharmony_ci while ((size_central_dir_to_read>0) && (err == ZIP_OK)) 965275793eaSopenharmony_ci { 966275793eaSopenharmony_ci ZPOS64_T read_this = SIZEDATA_INDATABLOCK; 967275793eaSopenharmony_ci if (read_this > size_central_dir_to_read) 968275793eaSopenharmony_ci { 969275793eaSopenharmony_ci read_this = size_central_dir_to_read; 970275793eaSopenharmony_ci } 971275793eaSopenharmony_ci 972275793eaSopenharmony_ci if (ZREAD64(pziinit->z_filefunc, pziinit->filestream,buf_read,(uLong)read_this) != read_this) 973275793eaSopenharmony_ci { 974275793eaSopenharmony_ci err = ZIP_ERRNO; 975275793eaSopenharmony_ci } 976275793eaSopenharmony_ci 977275793eaSopenharmony_ci if (err == ZIP_OK) 978275793eaSopenharmony_ci { 979275793eaSopenharmony_ci err = add_data_in_datablock(&pziinit->central_dir,buf_read, (uLong)read_this); 980275793eaSopenharmony_ci } 981275793eaSopenharmony_ci 982275793eaSopenharmony_ci size_central_dir_to_read -= read_this; 983275793eaSopenharmony_ci } 984275793eaSopenharmony_ci free(buf_read); 985275793eaSopenharmony_ci } 986275793eaSopenharmony_ci pziinit->begin_pos = byte_before_the_zipfile; 987275793eaSopenharmony_ci pziinit->number_entry = number_entry_CD; 988275793eaSopenharmony_ci 989275793eaSopenharmony_ci if (ZSEEK64(pziinit->z_filefunc, pziinit->filestream, offset_central_dir+byte_before_the_zipfile,ZLIB_FILEFUNC_SEEK_SET) != 0) 990275793eaSopenharmony_ci { 991275793eaSopenharmony_ci err = ZIP_ERRNO; 992275793eaSopenharmony_ci } 993275793eaSopenharmony_ci 994275793eaSopenharmony_ci return err; 995275793eaSopenharmony_ci} 996275793eaSopenharmony_ci 997275793eaSopenharmony_ci 998275793eaSopenharmony_ci#endif /* !NO_ADDFILEINEXISTINGZIP*/ 999275793eaSopenharmony_ci 1000275793eaSopenharmony_ci 1001275793eaSopenharmony_ci/************************************************************/ 1002275793eaSopenharmony_ciextern zipFile ZEXPORT zipOpen3(const void *pathname, int append, zipcharpc* globalcomment, zlib_filefunc64_32_def* pzlib_filefunc64_32_def) 1003275793eaSopenharmony_ci{ 1004275793eaSopenharmony_ci zip64_internal ziinit; 1005275793eaSopenharmony_ci zip64_internal* zi; 1006275793eaSopenharmony_ci int err = ZIP_OK; 1007275793eaSopenharmony_ci 1008275793eaSopenharmony_ci ziinit.z_filefunc.zseek32_file = NULL; 1009275793eaSopenharmony_ci ziinit.z_filefunc.ztell32_file = NULL; 1010275793eaSopenharmony_ci if (pzlib_filefunc64_32_def == NULL) 1011275793eaSopenharmony_ci { 1012275793eaSopenharmony_ci fill_fopen64_filefunc(&ziinit.z_filefunc.zfile_func64); 1013275793eaSopenharmony_ci } 1014275793eaSopenharmony_ci else 1015275793eaSopenharmony_ci { 1016275793eaSopenharmony_ci ziinit.z_filefunc = *pzlib_filefunc64_32_def; 1017275793eaSopenharmony_ci } 1018275793eaSopenharmony_ci 1019275793eaSopenharmony_ci ziinit.filestream = ZOPEN64(ziinit.z_filefunc, 1020275793eaSopenharmony_ci pathname, 1021275793eaSopenharmony_ci (append == APPEND_STATUS_CREATE) ? 1022275793eaSopenharmony_ci (ZLIB_FILEFUNC_MODE_READ | ZLIB_FILEFUNC_MODE_WRITE | ZLIB_FILEFUNC_MODE_CREATE) : 1023275793eaSopenharmony_ci (ZLIB_FILEFUNC_MODE_READ | ZLIB_FILEFUNC_MODE_WRITE | ZLIB_FILEFUNC_MODE_EXISTING)); 1024275793eaSopenharmony_ci 1025275793eaSopenharmony_ci if (ziinit.filestream == NULL) 1026275793eaSopenharmony_ci { 1027275793eaSopenharmony_ci return NULL; 1028275793eaSopenharmony_ci } 1029275793eaSopenharmony_ci 1030275793eaSopenharmony_ci if (append == APPEND_STATUS_CREATEAFTER) 1031275793eaSopenharmony_ci { 1032275793eaSopenharmony_ci ZSEEK64(ziinit.z_filefunc,ziinit.filestream,0,SEEK_END); 1033275793eaSopenharmony_ci } 1034275793eaSopenharmony_ci 1035275793eaSopenharmony_ci ziinit.begin_pos = ZTELL64(ziinit.z_filefunc,ziinit.filestream); 1036275793eaSopenharmony_ci ziinit.in_opened_file_inzip = 0; 1037275793eaSopenharmony_ci ziinit.ci.stream_initialised = 0; 1038275793eaSopenharmony_ci ziinit.number_entry = 0; 1039275793eaSopenharmony_ci ziinit.add_position_when_writing_offset = 0; 1040275793eaSopenharmony_ci init_linkedlist(&(ziinit.central_dir)); 1041275793eaSopenharmony_ci 1042275793eaSopenharmony_ci 1043275793eaSopenharmony_ci 1044275793eaSopenharmony_ci zi = (zip64_internal*)ALLOC(sizeof(zip64_internal)); 1045275793eaSopenharmony_ci if (zi == NULL) 1046275793eaSopenharmony_ci { 1047275793eaSopenharmony_ci ZCLOSE64(ziinit.z_filefunc,ziinit.filestream); 1048275793eaSopenharmony_ci return NULL; 1049275793eaSopenharmony_ci } 1050275793eaSopenharmony_ci 1051275793eaSopenharmony_ci /* now we add file in a zipfile */ 1052275793eaSopenharmony_ci# ifndef NO_ADDFILEINEXISTINGZIP 1053275793eaSopenharmony_ci ziinit.globalcomment = NULL; 1054275793eaSopenharmony_ci if (append == APPEND_STATUS_ADDINZIP) 1055275793eaSopenharmony_ci { 1056275793eaSopenharmony_ci // Read and Cache Central Directory Records 1057275793eaSopenharmony_ci err = LoadCentralDirectoryRecord(&ziinit); 1058275793eaSopenharmony_ci } 1059275793eaSopenharmony_ci 1060275793eaSopenharmony_ci if (globalcomment) 1061275793eaSopenharmony_ci { 1062275793eaSopenharmony_ci *globalcomment = ziinit.globalcomment; 1063275793eaSopenharmony_ci } 1064275793eaSopenharmony_ci# endif /* !NO_ADDFILEINEXISTINGZIP*/ 1065275793eaSopenharmony_ci 1066275793eaSopenharmony_ci if (err != ZIP_OK) 1067275793eaSopenharmony_ci { 1068275793eaSopenharmony_ci# ifndef NO_ADDFILEINEXISTINGZIP 1069275793eaSopenharmony_ci free(ziinit.globalcomment); 1070275793eaSopenharmony_ci# endif /* !NO_ADDFILEINEXISTINGZIP*/ 1071275793eaSopenharmony_ci free(zi); 1072275793eaSopenharmony_ci return NULL; 1073275793eaSopenharmony_ci } 1074275793eaSopenharmony_ci else 1075275793eaSopenharmony_ci { 1076275793eaSopenharmony_ci *zi = ziinit; 1077275793eaSopenharmony_ci return (zipFile)zi; 1078275793eaSopenharmony_ci } 1079275793eaSopenharmony_ci} 1080275793eaSopenharmony_ci 1081275793eaSopenharmony_ciextern zipFile ZEXPORT zipOpen2(const char *pathname, int append, zipcharpc* globalcomment, zlib_filefunc_def* pzlib_filefunc32_def) 1082275793eaSopenharmony_ci{ 1083275793eaSopenharmony_ci if (pzlib_filefunc32_def != NULL) 1084275793eaSopenharmony_ci { 1085275793eaSopenharmony_ci zlib_filefunc64_32_def zlib_filefunc64_32_def_fill; 1086275793eaSopenharmony_ci fill_zlib_filefunc64_32_def_from_filefunc32(&zlib_filefunc64_32_def_fill,pzlib_filefunc32_def); 1087275793eaSopenharmony_ci return zipOpen3(pathname, append, globalcomment, &zlib_filefunc64_32_def_fill); 1088275793eaSopenharmony_ci } 1089275793eaSopenharmony_ci else 1090275793eaSopenharmony_ci { 1091275793eaSopenharmony_ci return zipOpen3(pathname, append, globalcomment, NULL); 1092275793eaSopenharmony_ci } 1093275793eaSopenharmony_ci} 1094275793eaSopenharmony_ci 1095275793eaSopenharmony_ciextern zipFile ZEXPORT zipOpen2_64(const void *pathname, int append, zipcharpc* globalcomment, zlib_filefunc64_def* pzlib_filefunc_def) 1096275793eaSopenharmony_ci{ 1097275793eaSopenharmony_ci if (pzlib_filefunc_def != NULL) 1098275793eaSopenharmony_ci { 1099275793eaSopenharmony_ci zlib_filefunc64_32_def zlib_filefunc64_32_def_fill; 1100275793eaSopenharmony_ci zlib_filefunc64_32_def_fill.zfile_func64 = *pzlib_filefunc_def; 1101275793eaSopenharmony_ci zlib_filefunc64_32_def_fill.ztell32_file = NULL; 1102275793eaSopenharmony_ci zlib_filefunc64_32_def_fill.zseek32_file = NULL; 1103275793eaSopenharmony_ci return zipOpen3(pathname, append, globalcomment, &zlib_filefunc64_32_def_fill); 1104275793eaSopenharmony_ci } 1105275793eaSopenharmony_ci else 1106275793eaSopenharmony_ci { 1107275793eaSopenharmony_ci return zipOpen3(pathname, append, globalcomment, NULL); 1108275793eaSopenharmony_ci } 1109275793eaSopenharmony_ci} 1110275793eaSopenharmony_ci 1111275793eaSopenharmony_ci 1112275793eaSopenharmony_ci 1113275793eaSopenharmony_ciextern zipFile ZEXPORT zipOpen(const char* pathname, int append) 1114275793eaSopenharmony_ci{ 1115275793eaSopenharmony_ci return zipOpen3((const void*)pathname,append,NULL,NULL); 1116275793eaSopenharmony_ci} 1117275793eaSopenharmony_ci 1118275793eaSopenharmony_ciextern zipFile ZEXPORT zipOpen64(const void* pathname, int append) 1119275793eaSopenharmony_ci{ 1120275793eaSopenharmony_ci return zipOpen3(pathname,append,NULL,NULL); 1121275793eaSopenharmony_ci} 1122275793eaSopenharmony_ci 1123275793eaSopenharmony_cilocal int Write_LocalFileHeader(zip64_internal* zi, const char* filename, uInt size_extrafield_local, const void* extrafield_local) 1124275793eaSopenharmony_ci{ 1125275793eaSopenharmony_ci /* write the local header */ 1126275793eaSopenharmony_ci int err; 1127275793eaSopenharmony_ci uInt size_filename = (uInt)strlen(filename); 1128275793eaSopenharmony_ci uInt size_extrafield = size_extrafield_local; 1129275793eaSopenharmony_ci 1130275793eaSopenharmony_ci err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)LOCALHEADERMAGIC, 4); 1131275793eaSopenharmony_ci 1132275793eaSopenharmony_ci if (err == ZIP_OK) 1133275793eaSopenharmony_ci { 1134275793eaSopenharmony_ci if(zi->ci.zip64) 1135275793eaSopenharmony_ci { 1136275793eaSopenharmony_ci err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)45,2);/* version needed to extract */ 1137275793eaSopenharmony_ci } 1138275793eaSopenharmony_ci else 1139275793eaSopenharmony_ci { 1140275793eaSopenharmony_ci err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)20,2);/* version needed to extract */ 1141275793eaSopenharmony_ci } 1142275793eaSopenharmony_ci } 1143275793eaSopenharmony_ci 1144275793eaSopenharmony_ci if (err == ZIP_OK) 1145275793eaSopenharmony_ci { 1146275793eaSopenharmony_ci err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)zi->ci.flag,2); 1147275793eaSopenharmony_ci } 1148275793eaSopenharmony_ci 1149275793eaSopenharmony_ci if (err == ZIP_OK) 1150275793eaSopenharmony_ci { 1151275793eaSopenharmony_ci err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)zi->ci.method,2); 1152275793eaSopenharmony_ci } 1153275793eaSopenharmony_ci 1154275793eaSopenharmony_ci if (err == ZIP_OK) 1155275793eaSopenharmony_ci { 1156275793eaSopenharmony_ci err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)zi->ci.dosDate,4); 1157275793eaSopenharmony_ci } 1158275793eaSopenharmony_ci 1159275793eaSopenharmony_ci // CRC / Compressed size / Uncompressed size will be filled in later and rewritten later 1160275793eaSopenharmony_ci if (err == ZIP_OK) 1161275793eaSopenharmony_ci { 1162275793eaSopenharmony_ci err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)0,4); /* crc 32, unknown */ 1163275793eaSopenharmony_ci } 1164275793eaSopenharmony_ci if (err == ZIP_OK) 1165275793eaSopenharmony_ci { 1166275793eaSopenharmony_ci if(zi->ci.zip64) 1167275793eaSopenharmony_ci { 1168275793eaSopenharmony_ci err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)0xFFFFFFFF,4); /* compressed size, unknown */ 1169275793eaSopenharmony_ci } 1170275793eaSopenharmony_ci else 1171275793eaSopenharmony_ci { 1172275793eaSopenharmony_ci err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)0,4); /* compressed size, unknown */ 1173275793eaSopenharmony_ci } 1174275793eaSopenharmony_ci } 1175275793eaSopenharmony_ci if (err == ZIP_OK) 1176275793eaSopenharmony_ci { 1177275793eaSopenharmony_ci if(zi->ci.zip64) 1178275793eaSopenharmony_ci { 1179275793eaSopenharmony_ci err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)0xFFFFFFFF,4); /* uncompressed size, unknown */ 1180275793eaSopenharmony_ci } 1181275793eaSopenharmony_ci else 1182275793eaSopenharmony_ci { 1183275793eaSopenharmony_ci err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)0,4); /* uncompressed size, unknown */ 1184275793eaSopenharmony_ci } 1185275793eaSopenharmony_ci } 1186275793eaSopenharmony_ci 1187275793eaSopenharmony_ci if (err == ZIP_OK) 1188275793eaSopenharmony_ci { 1189275793eaSopenharmony_ci err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)size_filename,2); 1190275793eaSopenharmony_ci } 1191275793eaSopenharmony_ci 1192275793eaSopenharmony_ci if(zi->ci.zip64) 1193275793eaSopenharmony_ci { 1194275793eaSopenharmony_ci size_extrafield += 20; 1195275793eaSopenharmony_ci } 1196275793eaSopenharmony_ci 1197275793eaSopenharmony_ci if (err == ZIP_OK) 1198275793eaSopenharmony_ci { 1199275793eaSopenharmony_ci err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)size_extrafield,2); 1200275793eaSopenharmony_ci } 1201275793eaSopenharmony_ci 1202275793eaSopenharmony_ci if ((err == ZIP_OK) && (size_filename > 0)) 1203275793eaSopenharmony_ci { 1204275793eaSopenharmony_ci if (ZWRITE64(zi->z_filefunc,zi->filestream,filename,size_filename) != size_filename) 1205275793eaSopenharmony_ci { 1206275793eaSopenharmony_ci err = ZIP_ERRNO; 1207275793eaSopenharmony_ci } 1208275793eaSopenharmony_ci } 1209275793eaSopenharmony_ci 1210275793eaSopenharmony_ci if ((err == ZIP_OK) && (size_extrafield_local > 0)) 1211275793eaSopenharmony_ci { 1212275793eaSopenharmony_ci if (ZWRITE64(zi->z_filefunc, zi->filestream, extrafield_local, size_extrafield_local) != size_extrafield_local) 1213275793eaSopenharmony_ci { 1214275793eaSopenharmony_ci err = ZIP_ERRNO; 1215275793eaSopenharmony_ci } 1216275793eaSopenharmony_ci } 1217275793eaSopenharmony_ci 1218275793eaSopenharmony_ci 1219275793eaSopenharmony_ci if ((err == ZIP_OK) && (zi->ci.zip64)) 1220275793eaSopenharmony_ci { 1221275793eaSopenharmony_ci // write the Zip64 extended info 1222275793eaSopenharmony_ci short HeaderID = 1; 1223275793eaSopenharmony_ci short DataSize = 16; 1224275793eaSopenharmony_ci ZPOS64_T CompressedSize = 0; 1225275793eaSopenharmony_ci ZPOS64_T UncompressedSize = 0; 1226275793eaSopenharmony_ci 1227275793eaSopenharmony_ci // Remember position of Zip64 extended info for the local file header. (needed when we update size after done with file) 1228275793eaSopenharmony_ci zi->ci.pos_zip64extrainfo = ZTELL64(zi->z_filefunc,zi->filestream); 1229275793eaSopenharmony_ci 1230275793eaSopenharmony_ci err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (ZPOS64_T)HeaderID,2); 1231275793eaSopenharmony_ci err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (ZPOS64_T)DataSize,2); 1232275793eaSopenharmony_ci 1233275793eaSopenharmony_ci err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (ZPOS64_T)UncompressedSize,8); 1234275793eaSopenharmony_ci err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (ZPOS64_T)CompressedSize,8); 1235275793eaSopenharmony_ci } 1236275793eaSopenharmony_ci 1237275793eaSopenharmony_ci return err; 1238275793eaSopenharmony_ci} 1239275793eaSopenharmony_ci 1240275793eaSopenharmony_ci/* 1241275793eaSopenharmony_ci NOTE. 1242275793eaSopenharmony_ci When writing RAW the ZIP64 extended information in extrafield_local and extrafield_global needs to be stripped 1243275793eaSopenharmony_ci before calling this function it can be done with zipRemoveExtraInfoBlock 1244275793eaSopenharmony_ci 1245275793eaSopenharmony_ci It is not done here because then we need to realloc a new buffer since parameters are 'const' and I want to minimize 1246275793eaSopenharmony_ci unnecessary allocations. 1247275793eaSopenharmony_ci */ 1248275793eaSopenharmony_ciextern int ZEXPORT zipOpenNewFileInZip4_64(zipFile file, const char* filename, const zip_fileinfo* zipfi, 1249275793eaSopenharmony_ci const void* extrafield_local, uInt size_extrafield_local, 1250275793eaSopenharmony_ci const void* extrafield_global, uInt size_extrafield_global, 1251275793eaSopenharmony_ci const char* comment, int method, int level, int raw, 1252275793eaSopenharmony_ci int windowBits,int memLevel, int strategy, 1253275793eaSopenharmony_ci const char* password, uLong crcForCrypting, 1254275793eaSopenharmony_ci uLong versionMadeBy, uLong flagBase, int zip64) { 1255275793eaSopenharmony_ci zip64_internal* zi; 1256275793eaSopenharmony_ci uInt size_filename; 1257275793eaSopenharmony_ci uInt size_comment; 1258275793eaSopenharmony_ci uInt i; 1259275793eaSopenharmony_ci int err = ZIP_OK; 1260275793eaSopenharmony_ci 1261275793eaSopenharmony_ci# ifdef NOCRYPT 1262275793eaSopenharmony_ci (crcForCrypting); 1263275793eaSopenharmony_ci if (password != NULL) 1264275793eaSopenharmony_ci { 1265275793eaSopenharmony_ci return ZIP_PARAMERROR; 1266275793eaSopenharmony_ci } 1267275793eaSopenharmony_ci# endif 1268275793eaSopenharmony_ci 1269275793eaSopenharmony_ci if (file == NULL) 1270275793eaSopenharmony_ci { 1271275793eaSopenharmony_ci return ZIP_PARAMERROR; 1272275793eaSopenharmony_ci } 1273275793eaSopenharmony_ci 1274275793eaSopenharmony_ci#ifdef HAVE_BZIP2 1275275793eaSopenharmony_ci if ((method != 0) && (method != Z_DEFLATED) && (method != Z_BZIP2ED)) 1276275793eaSopenharmony_ci { 1277275793eaSopenharmony_ci return ZIP_PARAMERROR; 1278275793eaSopenharmony_ci } 1279275793eaSopenharmony_ci#else 1280275793eaSopenharmony_ci if ((method != 0) && (method != Z_DEFLATED)) 1281275793eaSopenharmony_ci { 1282275793eaSopenharmony_ci return ZIP_PARAMERROR; 1283275793eaSopenharmony_ci } 1284275793eaSopenharmony_ci#endif 1285275793eaSopenharmony_ci 1286275793eaSopenharmony_ci // The filename and comment length must fit in 16 bits. 1287275793eaSopenharmony_ci if ((filename != NULL) && (strlen(filename) > 0xffff)) 1288275793eaSopenharmony_ci { 1289275793eaSopenharmony_ci return ZIP_PARAMERROR; 1290275793eaSopenharmony_ci } 1291275793eaSopenharmony_ci if ((comment != NULL) && (strlen(comment) > 0xffff)) 1292275793eaSopenharmony_ci { 1293275793eaSopenharmony_ci return ZIP_PARAMERROR; 1294275793eaSopenharmony_ci } 1295275793eaSopenharmony_ci // The extra field length must fit in 16 bits. If the member also requires 1296275793eaSopenharmony_ci // a Zip64 extra block, that will also need to fit within that 16-bit 1297275793eaSopenharmony_ci // length, but that will be checked for later. 1298275793eaSopenharmony_ci if ((size_extrafield_local > 0xffff) || (size_extrafield_global > 0xffff)) 1299275793eaSopenharmony_ci { 1300275793eaSopenharmony_ci return ZIP_PARAMERROR; 1301275793eaSopenharmony_ci } 1302275793eaSopenharmony_ci 1303275793eaSopenharmony_ci zi = (zip64_internal*)file; 1304275793eaSopenharmony_ci 1305275793eaSopenharmony_ci if (zi->in_opened_file_inzip == 1) 1306275793eaSopenharmony_ci { 1307275793eaSopenharmony_ci err = zipCloseFileInZip (file); 1308275793eaSopenharmony_ci if (err != ZIP_OK) 1309275793eaSopenharmony_ci { 1310275793eaSopenharmony_ci return err; 1311275793eaSopenharmony_ci } 1312275793eaSopenharmony_ci } 1313275793eaSopenharmony_ci 1314275793eaSopenharmony_ci if (filename == NULL) 1315275793eaSopenharmony_ci { 1316275793eaSopenharmony_ci filename = "-"; 1317275793eaSopenharmony_ci } 1318275793eaSopenharmony_ci 1319275793eaSopenharmony_ci if (comment == NULL) 1320275793eaSopenharmony_ci { 1321275793eaSopenharmony_ci size_comment = 0; 1322275793eaSopenharmony_ci } 1323275793eaSopenharmony_ci else 1324275793eaSopenharmony_ci { 1325275793eaSopenharmony_ci size_comment = (uInt)strlen(comment); 1326275793eaSopenharmony_ci } 1327275793eaSopenharmony_ci 1328275793eaSopenharmony_ci size_filename = (uInt)strlen(filename); 1329275793eaSopenharmony_ci 1330275793eaSopenharmony_ci if (zipfi == NULL) 1331275793eaSopenharmony_ci { 1332275793eaSopenharmony_ci zi->ci.dosDate = 0; 1333275793eaSopenharmony_ci } 1334275793eaSopenharmony_ci else 1335275793eaSopenharmony_ci { 1336275793eaSopenharmony_ci if (zipfi->dosDate != 0) 1337275793eaSopenharmony_ci { 1338275793eaSopenharmony_ci zi->ci.dosDate = zipfi->dosDate; 1339275793eaSopenharmony_ci } 1340275793eaSopenharmony_ci else 1341275793eaSopenharmony_ci { 1342275793eaSopenharmony_ci zi->ci.dosDate = zip64local_TmzDateToDosDate(&zipfi->tmz_date); 1343275793eaSopenharmony_ci } 1344275793eaSopenharmony_ci } 1345275793eaSopenharmony_ci 1346275793eaSopenharmony_ci zi->ci.flag = flagBase; 1347275793eaSopenharmony_ci if ((level == 8) || (level == 9)) 1348275793eaSopenharmony_ci { 1349275793eaSopenharmony_ci zi->ci.flag |= 2; 1350275793eaSopenharmony_ci } 1351275793eaSopenharmony_ci if (level == 2) 1352275793eaSopenharmony_ci { 1353275793eaSopenharmony_ci zi->ci.flag |= 4; 1354275793eaSopenharmony_ci } 1355275793eaSopenharmony_ci if (level == 1) 1356275793eaSopenharmony_ci { 1357275793eaSopenharmony_ci zi->ci.flag |= 6; 1358275793eaSopenharmony_ci } 1359275793eaSopenharmony_ci if (password != NULL) 1360275793eaSopenharmony_ci { 1361275793eaSopenharmony_ci zi->ci.flag |= 1; 1362275793eaSopenharmony_ci } 1363275793eaSopenharmony_ci 1364275793eaSopenharmony_ci zi->ci.crc32 = 0; 1365275793eaSopenharmony_ci zi->ci.method = method; 1366275793eaSopenharmony_ci zi->ci.encrypt = 0; 1367275793eaSopenharmony_ci zi->ci.stream_initialised = 0; 1368275793eaSopenharmony_ci zi->ci.pos_in_buffered_data = 0; 1369275793eaSopenharmony_ci zi->ci.raw = raw; 1370275793eaSopenharmony_ci zi->ci.pos_local_header = ZTELL64(zi->z_filefunc,zi->filestream); 1371275793eaSopenharmony_ci 1372275793eaSopenharmony_ci zi->ci.size_centralheader = SIZECENTRALHEADER + size_filename + size_extrafield_global + size_comment; 1373275793eaSopenharmony_ci zi->ci.size_centralExtraFree = 32; // Extra space we have reserved in case we need to add ZIP64 extra info data 1374275793eaSopenharmony_ci 1375275793eaSopenharmony_ci zi->ci.central_header = (char*)ALLOC((uInt)zi->ci.size_centralheader + zi->ci.size_centralExtraFree); 1376275793eaSopenharmony_ci 1377275793eaSopenharmony_ci zi->ci.size_centralExtra = size_extrafield_global; 1378275793eaSopenharmony_ci zip64local_putValue_inmemory(zi->ci.central_header,(uLong)CENTRALHEADERMAGIC,4); 1379275793eaSopenharmony_ci /* version info */ 1380275793eaSopenharmony_ci zip64local_putValue_inmemory(zi->ci.central_header+4,(uLong)versionMadeBy,2); 1381275793eaSopenharmony_ci zip64local_putValue_inmemory(zi->ci.central_header+6,(uLong)20,2); 1382275793eaSopenharmony_ci zip64local_putValue_inmemory(zi->ci.central_header+8,(uLong)zi->ci.flag,2); 1383275793eaSopenharmony_ci zip64local_putValue_inmemory(zi->ci.central_header+10,(uLong)zi->ci.method,2); 1384275793eaSopenharmony_ci zip64local_putValue_inmemory(zi->ci.central_header+12,(uLong)zi->ci.dosDate,4); 1385275793eaSopenharmony_ci zip64local_putValue_inmemory(zi->ci.central_header+16,(uLong)0,4); /*crc*/ 1386275793eaSopenharmony_ci zip64local_putValue_inmemory(zi->ci.central_header+20,(uLong)0,4); /*compr size*/ 1387275793eaSopenharmony_ci zip64local_putValue_inmemory(zi->ci.central_header+24,(uLong)0,4); /*uncompr size*/ 1388275793eaSopenharmony_ci zip64local_putValue_inmemory(zi->ci.central_header+28,(uLong)size_filename,2); 1389275793eaSopenharmony_ci zip64local_putValue_inmemory(zi->ci.central_header+30,(uLong)size_extrafield_global,2); 1390275793eaSopenharmony_ci zip64local_putValue_inmemory(zi->ci.central_header+32,(uLong)size_comment,2); 1391275793eaSopenharmony_ci zip64local_putValue_inmemory(zi->ci.central_header+34,(uLong)0,2); /*disk nm start*/ 1392275793eaSopenharmony_ci 1393275793eaSopenharmony_ci if (zipfi == NULL) 1394275793eaSopenharmony_ci { 1395275793eaSopenharmony_ci zip64local_putValue_inmemory(zi->ci.central_header + 36,(uLong)0,2); 1396275793eaSopenharmony_ci } 1397275793eaSopenharmony_ci else 1398275793eaSopenharmony_ci { 1399275793eaSopenharmony_ci zip64local_putValue_inmemory(zi->ci.central_header + 36,(uLong)zipfi->internal_fa,2); 1400275793eaSopenharmony_ci } 1401275793eaSopenharmony_ci 1402275793eaSopenharmony_ci if (zipfi == NULL) 1403275793eaSopenharmony_ci { 1404275793eaSopenharmony_ci zip64local_putValue_inmemory(zi->ci.central_header + 38,(uLong)0,4); 1405275793eaSopenharmony_ci } 1406275793eaSopenharmony_ci else 1407275793eaSopenharmony_ci { 1408275793eaSopenharmony_ci zip64local_putValue_inmemory(zi->ci.central_header + 38,(uLong)zipfi->external_fa,4); 1409275793eaSopenharmony_ci } 1410275793eaSopenharmony_ci 1411275793eaSopenharmony_ci if(zi->ci.pos_local_header >= 0xffffffff) 1412275793eaSopenharmony_ci { 1413275793eaSopenharmony_ci zip64local_putValue_inmemory(zi->ci.central_header+42,(uLong)0xffffffff,4); 1414275793eaSopenharmony_ci } 1415275793eaSopenharmony_ci else 1416275793eaSopenharmony_ci { 1417275793eaSopenharmony_ci zip64local_putValue_inmemory(zi->ci.central_header+42,(uLong)zi->ci.pos_local_header - zi->add_position_when_writing_offset,4); 1418275793eaSopenharmony_ci } 1419275793eaSopenharmony_ci 1420275793eaSopenharmony_ci for (i = 0;i < size_filename; i++){ 1421275793eaSopenharmony_ci *(zi->ci.central_header + SIZECENTRALHEADER + i) = *(filename + i); 1422275793eaSopenharmony_ci } 1423275793eaSopenharmony_ci 1424275793eaSopenharmony_ci for (i = 0;i < size_extrafield_global; i++){ 1425275793eaSopenharmony_ci *(zi->ci.central_header + SIZECENTRALHEADER + size_filename + i) = 1426275793eaSopenharmony_ci *(((const char*)extrafield_global) + i); 1427275793eaSopenharmony_ci } 1428275793eaSopenharmony_ci 1429275793eaSopenharmony_ci for (i = 0;i < size_comment; i++){ 1430275793eaSopenharmony_ci *(zi->ci.central_header + SIZECENTRALHEADER + size_filename + 1431275793eaSopenharmony_ci size_extrafield_global + i) = *(comment + i); 1432275793eaSopenharmony_ci } 1433275793eaSopenharmony_ci if (zi->ci.central_header == NULL) 1434275793eaSopenharmony_ci { 1435275793eaSopenharmony_ci return ZIP_INTERNALERROR; 1436275793eaSopenharmony_ci } 1437275793eaSopenharmony_ci 1438275793eaSopenharmony_ci zi->ci.zip64 = zip64; 1439275793eaSopenharmony_ci zi->ci.totalCompressedData = 0; 1440275793eaSopenharmony_ci zi->ci.totalUncompressedData = 0; 1441275793eaSopenharmony_ci zi->ci.pos_zip64extrainfo = 0; 1442275793eaSopenharmony_ci 1443275793eaSopenharmony_ci err = Write_LocalFileHeader(zi, filename, size_extrafield_local, extrafield_local); 1444275793eaSopenharmony_ci 1445275793eaSopenharmony_ci#ifdef HAVE_BZIP2 1446275793eaSopenharmony_ci zi->ci.bstream.avail_in = (uInt)0; 1447275793eaSopenharmony_ci zi->ci.bstream.avail_out = (uInt)Z_BUFSIZE; 1448275793eaSopenharmony_ci zi->ci.bstream.next_out = (char*)zi->ci.buffered_data; 1449275793eaSopenharmony_ci zi->ci.bstream.total_in_hi32 = 0; 1450275793eaSopenharmony_ci zi->ci.bstream.total_in_lo32 = 0; 1451275793eaSopenharmony_ci zi->ci.bstream.total_out_hi32 = 0; 1452275793eaSopenharmony_ci zi->ci.bstream.total_out_lo32 = 0; 1453275793eaSopenharmony_ci#endif 1454275793eaSopenharmony_ci 1455275793eaSopenharmony_ci zi->ci.stream.avail_in = (uInt)0; 1456275793eaSopenharmony_ci zi->ci.stream.avail_out = (uInt)Z_BUFSIZE; 1457275793eaSopenharmony_ci zi->ci.stream.next_out = zi->ci.buffered_data; 1458275793eaSopenharmony_ci zi->ci.stream.total_in = 0; 1459275793eaSopenharmony_ci zi->ci.stream.total_out = 0; 1460275793eaSopenharmony_ci zi->ci.stream.data_type = Z_BINARY; 1461275793eaSopenharmony_ci 1462275793eaSopenharmony_ci#ifdef HAVE_BZIP2 1463275793eaSopenharmony_ci if ((err == ZIP_OK) && (zi->ci.method == Z_DEFLATED || zi->ci.method == Z_BZIP2ED) && (!zi->ci.raw)) 1464275793eaSopenharmony_ci#else 1465275793eaSopenharmony_ci if ((err == ZIP_OK) && (zi->ci.method == Z_DEFLATED) && (!zi->ci.raw)) 1466275793eaSopenharmony_ci#endif 1467275793eaSopenharmony_ci { 1468275793eaSopenharmony_ci if(zi->ci.method == Z_DEFLATED) 1469275793eaSopenharmony_ci { 1470275793eaSopenharmony_ci zi->ci.stream.zalloc = (alloc_func)0; 1471275793eaSopenharmony_ci zi->ci.stream.zfree = (free_func)0; 1472275793eaSopenharmony_ci zi->ci.stream.opaque = (voidpf)0; 1473275793eaSopenharmony_ci 1474275793eaSopenharmony_ci if (windowBits>0) 1475275793eaSopenharmony_ci windowBits = -windowBits; 1476275793eaSopenharmony_ci 1477275793eaSopenharmony_ci err = deflateInit2(&zi->ci.stream, level, Z_DEFLATED, windowBits, memLevel, strategy); 1478275793eaSopenharmony_ci 1479275793eaSopenharmony_ci if (err == Z_OK) 1480275793eaSopenharmony_ci { 1481275793eaSopenharmony_ci zi->ci.stream_initialised = Z_DEFLATED; 1482275793eaSopenharmony_ci } 1483275793eaSopenharmony_ci } 1484275793eaSopenharmony_ci else if(zi->ci.method == Z_BZIP2ED) 1485275793eaSopenharmony_ci { 1486275793eaSopenharmony_ci#ifdef HAVE_BZIP2 1487275793eaSopenharmony_ci // Init BZip stuff here 1488275793eaSopenharmony_ci zi->ci.bstream.bzalloc = 0; 1489275793eaSopenharmony_ci zi->ci.bstream.bzfree = 0; 1490275793eaSopenharmony_ci zi->ci.bstream.opaque = (voidpf)0; 1491275793eaSopenharmony_ci 1492275793eaSopenharmony_ci err = BZ2_bzCompressInit(&zi->ci.bstream, level, 0,35); 1493275793eaSopenharmony_ci if(err == BZ_OK) 1494275793eaSopenharmony_ci { 1495275793eaSopenharmony_ci zi->ci.stream_initialised = Z_BZIP2ED; 1496275793eaSopenharmony_ci } 1497275793eaSopenharmony_ci#endif 1498275793eaSopenharmony_ci } 1499275793eaSopenharmony_ci 1500275793eaSopenharmony_ci } 1501275793eaSopenharmony_ci 1502275793eaSopenharmony_ci# ifndef NOCRYPT 1503275793eaSopenharmony_ci zi->ci.crypt_header_size = 0; 1504275793eaSopenharmony_ci if ((err == Z_OK) && (password != NULL)) 1505275793eaSopenharmony_ci { 1506275793eaSopenharmony_ci unsigned char bufHead[RAND_HEAD_LEN]; 1507275793eaSopenharmony_ci unsigned int sizeHead; 1508275793eaSopenharmony_ci zi->ci.encrypt = 1; 1509275793eaSopenharmony_ci zi->ci.pcrc_32_tab = get_crc_table(); 1510275793eaSopenharmony_ci /*init_keys(password,zi->ci.keys,zi->ci.pcrc_32_tab);*/ 1511275793eaSopenharmony_ci 1512275793eaSopenharmony_ci sizeHead=crypthead(password,bufHead,RAND_HEAD_LEN,zi->ci.keys,zi->ci.pcrc_32_tab,crcForCrypting); 1513275793eaSopenharmony_ci zi->ci.crypt_header_size = sizeHead; 1514275793eaSopenharmony_ci 1515275793eaSopenharmony_ci if (ZWRITE64(zi->z_filefunc,zi->filestream,bufHead,sizeHead) != sizeHead) 1516275793eaSopenharmony_ci { 1517275793eaSopenharmony_ci err = ZIP_ERRNO; 1518275793eaSopenharmony_ci } 1519275793eaSopenharmony_ci } 1520275793eaSopenharmony_ci# endif 1521275793eaSopenharmony_ci 1522275793eaSopenharmony_ci if (err == Z_OK) 1523275793eaSopenharmony_ci { 1524275793eaSopenharmony_ci zi->in_opened_file_inzip = 1; 1525275793eaSopenharmony_ci } 1526275793eaSopenharmony_ci return err; 1527275793eaSopenharmony_ci} 1528275793eaSopenharmony_ci 1529275793eaSopenharmony_ciextern int ZEXPORT zipOpenNewFileInZip4(zipFile file, const char* filename, const zip_fileinfo* zipfi, 1530275793eaSopenharmony_ci const void* extrafield_local, uInt size_extrafield_local, 1531275793eaSopenharmony_ci const void* extrafield_global, uInt size_extrafield_global, 1532275793eaSopenharmony_ci const char* comment, int method, int level, int raw, 1533275793eaSopenharmony_ci int windowBits,int memLevel, int strategy, 1534275793eaSopenharmony_ci const char* password, uLong crcForCrypting, 1535275793eaSopenharmony_ci uLong versionMadeBy, uLong flagBase) 1536275793eaSopenharmony_ci{ 1537275793eaSopenharmony_ci return zipOpenNewFileInZip4_64(file, filename, zipfi, 1538275793eaSopenharmony_ci extrafield_local, size_extrafield_local, 1539275793eaSopenharmony_ci extrafield_global, size_extrafield_global, 1540275793eaSopenharmony_ci comment, method, level, raw, 1541275793eaSopenharmony_ci windowBits, memLevel, strategy, 1542275793eaSopenharmony_ci password, crcForCrypting, versionMadeBy, flagBase, 0); 1543275793eaSopenharmony_ci} 1544275793eaSopenharmony_ci 1545275793eaSopenharmony_ciextern int ZEXPORT zipOpenNewFileInZip3(zipFile file, const char* filename, const zip_fileinfo* zipfi, 1546275793eaSopenharmony_ci const void* extrafield_local, uInt size_extrafield_local, 1547275793eaSopenharmony_ci const void* extrafield_global, uInt size_extrafield_global, 1548275793eaSopenharmony_ci const char* comment, int method, int level, int raw, 1549275793eaSopenharmony_ci int windowBits,int memLevel, int strategy, 1550275793eaSopenharmony_ci const char* password, uLong crcForCrypting) 1551275793eaSopenharmony_ci{ 1552275793eaSopenharmony_ci return zipOpenNewFileInZip4_64(file, filename, zipfi, 1553275793eaSopenharmony_ci extrafield_local, size_extrafield_local, 1554275793eaSopenharmony_ci extrafield_global, size_extrafield_global, 1555275793eaSopenharmony_ci comment, method, level, raw, 1556275793eaSopenharmony_ci windowBits, memLevel, strategy, 1557275793eaSopenharmony_ci password, crcForCrypting, VERSIONMADEBY, 0, 0); 1558275793eaSopenharmony_ci} 1559275793eaSopenharmony_ci 1560275793eaSopenharmony_ciextern int ZEXPORT zipOpenNewFileInZip3_64(zipFile file, const char* filename, const zip_fileinfo* zipfi, 1561275793eaSopenharmony_ci const void* extrafield_local, uInt size_extrafield_local, 1562275793eaSopenharmony_ci const void* extrafield_global, uInt size_extrafield_global, 1563275793eaSopenharmony_ci const char* comment, int method, int level, int raw, 1564275793eaSopenharmony_ci int windowBits,int memLevel, int strategy, 1565275793eaSopenharmony_ci const char* password, uLong crcForCrypting, int zip64) 1566275793eaSopenharmony_ci{ 1567275793eaSopenharmony_ci return zipOpenNewFileInZip4_64(file, filename, zipfi, 1568275793eaSopenharmony_ci extrafield_local, size_extrafield_local, 1569275793eaSopenharmony_ci extrafield_global, size_extrafield_global, 1570275793eaSopenharmony_ci comment, method, level, raw, 1571275793eaSopenharmony_ci windowBits, memLevel, strategy, 1572275793eaSopenharmony_ci password, crcForCrypting, VERSIONMADEBY, 0, zip64); 1573275793eaSopenharmony_ci} 1574275793eaSopenharmony_ci 1575275793eaSopenharmony_ciextern int ZEXPORT zipOpenNewFileInZip2(zipFile file, const char* filename, const zip_fileinfo* zipfi, 1576275793eaSopenharmony_ci const void* extrafield_local, uInt size_extrafield_local, 1577275793eaSopenharmony_ci const void* extrafield_global, uInt size_extrafield_global, 1578275793eaSopenharmony_ci const char* comment, int method, int level, int raw) 1579275793eaSopenharmony_ci{ 1580275793eaSopenharmony_ci return zipOpenNewFileInZip4_64(file, filename, zipfi, 1581275793eaSopenharmony_ci extrafield_local, size_extrafield_local, 1582275793eaSopenharmony_ci extrafield_global, size_extrafield_global, 1583275793eaSopenharmony_ci comment, method, level, raw, 1584275793eaSopenharmony_ci -MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY, 1585275793eaSopenharmony_ci NULL, 0, VERSIONMADEBY, 0, 0); 1586275793eaSopenharmony_ci} 1587275793eaSopenharmony_ci 1588275793eaSopenharmony_ciextern int ZEXPORT zipOpenNewFileInZip2_64(zipFile file, const char* filename, const zip_fileinfo* zipfi, 1589275793eaSopenharmony_ci const void* extrafield_local, uInt size_extrafield_local, 1590275793eaSopenharmony_ci const void* extrafield_global, uInt size_extrafield_global, 1591275793eaSopenharmony_ci const char* comment, int method, int level, int raw, int zip64) 1592275793eaSopenharmony_ci{ 1593275793eaSopenharmony_ci return zipOpenNewFileInZip4_64(file, filename, zipfi, 1594275793eaSopenharmony_ci extrafield_local, size_extrafield_local, 1595275793eaSopenharmony_ci extrafield_global, size_extrafield_global, 1596275793eaSopenharmony_ci comment, method, level, raw, 1597275793eaSopenharmony_ci -MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY, 1598275793eaSopenharmony_ci NULL, 0, VERSIONMADEBY, 0, zip64); 1599275793eaSopenharmony_ci} 1600275793eaSopenharmony_ci 1601275793eaSopenharmony_ciextern int ZEXPORT zipOpenNewFileInZip64(zipFile file, const char* filename, const zip_fileinfo* zipfi, 1602275793eaSopenharmony_ci const void* extrafield_local, uInt size_extrafield_local, 1603275793eaSopenharmony_ci const void*extrafield_global, uInt size_extrafield_global, 1604275793eaSopenharmony_ci const char* comment, int method, int level, int zip64) 1605275793eaSopenharmony_ci{ 1606275793eaSopenharmony_ci return zipOpenNewFileInZip4_64(file, filename, zipfi, 1607275793eaSopenharmony_ci extrafield_local, size_extrafield_local, 1608275793eaSopenharmony_ci extrafield_global, size_extrafield_global, 1609275793eaSopenharmony_ci comment, method, level, 0, 1610275793eaSopenharmony_ci -MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY, 1611275793eaSopenharmony_ci NULL, 0, VERSIONMADEBY, 0, zip64); 1612275793eaSopenharmony_ci} 1613275793eaSopenharmony_ci 1614275793eaSopenharmony_ciextern int ZEXPORT zipOpenNewFileInZip(zipFile file, const char* filename, const zip_fileinfo* zipfi, 1615275793eaSopenharmony_ci const void* extrafield_local, uInt size_extrafield_local, 1616275793eaSopenharmony_ci const void*extrafield_global, uInt size_extrafield_global, 1617275793eaSopenharmony_ci const char* comment, int method, int level) 1618275793eaSopenharmony_ci{ 1619275793eaSopenharmony_ci return zipOpenNewFileInZip4_64(file, filename, zipfi, 1620275793eaSopenharmony_ci extrafield_local, size_extrafield_local, 1621275793eaSopenharmony_ci extrafield_global, size_extrafield_global, 1622275793eaSopenharmony_ci comment, method, level, 0, 1623275793eaSopenharmony_ci -MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY, 1624275793eaSopenharmony_ci NULL, 0, VERSIONMADEBY, 0, 0); 1625275793eaSopenharmony_ci} 1626275793eaSopenharmony_ci 1627275793eaSopenharmony_cilocal int zip64FlushWriteBuffer(zip64_internal* zi) 1628275793eaSopenharmony_ci{ 1629275793eaSopenharmony_ci int err = ZIP_OK; 1630275793eaSopenharmony_ci 1631275793eaSopenharmony_ci if (zi->ci.encrypt != 0) 1632275793eaSopenharmony_ci { 1633275793eaSopenharmony_ci#ifndef NOCRYPT 1634275793eaSopenharmony_ci uInt i; 1635275793eaSopenharmony_ci int t; 1636275793eaSopenharmony_ci for (i = 0;i < zi->ci.pos_in_buffered_data; i++){ 1637275793eaSopenharmony_ci zi->ci.buffered_data[i] = zencode(zi->ci.keys, zi->ci.pcrc_32_tab, zi->ci.buffered_data[i],t); 1638275793eaSopenharmony_ci } 1639275793eaSopenharmony_ci#endif 1640275793eaSopenharmony_ci } 1641275793eaSopenharmony_ci 1642275793eaSopenharmony_ci if (ZWRITE64(zi->z_filefunc,zi->filestream,zi->ci.buffered_data,zi->ci.pos_in_buffered_data) != zi->ci.pos_in_buffered_data) 1643275793eaSopenharmony_ci { 1644275793eaSopenharmony_ci err = ZIP_ERRNO; 1645275793eaSopenharmony_ci } 1646275793eaSopenharmony_ci 1647275793eaSopenharmony_ci zi->ci.totalCompressedData += zi->ci.pos_in_buffered_data; 1648275793eaSopenharmony_ci 1649275793eaSopenharmony_ci#ifdef HAVE_BZIP2 1650275793eaSopenharmony_ci if(zi->ci.method == Z_BZIP2ED) 1651275793eaSopenharmony_ci { 1652275793eaSopenharmony_ci zi->ci.totalUncompressedData += zi->ci.bstream.total_in_lo32; 1653275793eaSopenharmony_ci zi->ci.bstream.total_in_lo32 = 0; 1654275793eaSopenharmony_ci zi->ci.bstream.total_in_hi32 = 0; 1655275793eaSopenharmony_ci } 1656275793eaSopenharmony_ci else 1657275793eaSopenharmony_ci#endif 1658275793eaSopenharmony_ci { 1659275793eaSopenharmony_ci zi->ci.totalUncompressedData += zi->ci.stream.total_in; 1660275793eaSopenharmony_ci zi->ci.stream.total_in = 0; 1661275793eaSopenharmony_ci } 1662275793eaSopenharmony_ci 1663275793eaSopenharmony_ci 1664275793eaSopenharmony_ci zi->ci.pos_in_buffered_data = 0; 1665275793eaSopenharmony_ci 1666275793eaSopenharmony_ci return err; 1667275793eaSopenharmony_ci} 1668275793eaSopenharmony_ci 1669275793eaSopenharmony_ciextern int ZEXPORT zipWriteInFileInZip(zipFile file, const void* buf, unsigned int len) { 1670275793eaSopenharmony_ci zip64_internal* zi; 1671275793eaSopenharmony_ci int err = ZIP_OK; 1672275793eaSopenharmony_ci 1673275793eaSopenharmony_ci if (file == NULL) 1674275793eaSopenharmony_ci { 1675275793eaSopenharmony_ci return ZIP_PARAMERROR; 1676275793eaSopenharmony_ci } 1677275793eaSopenharmony_ci zi = (zip64_internal*)file; 1678275793eaSopenharmony_ci 1679275793eaSopenharmony_ci if (zi->in_opened_file_inzip == 0) 1680275793eaSopenharmony_ci { 1681275793eaSopenharmony_ci return ZIP_PARAMERROR; 1682275793eaSopenharmony_ci } 1683275793eaSopenharmony_ci 1684275793eaSopenharmony_ci zi->ci.crc32 = crc32(zi->ci.crc32,buf,(uInt)len); 1685275793eaSopenharmony_ci 1686275793eaSopenharmony_ci#ifdef HAVE_BZIP2 1687275793eaSopenharmony_ci if(zi->ci.method == Z_BZIP2ED && (!zi->ci.raw)) 1688275793eaSopenharmony_ci { 1689275793eaSopenharmony_ci zi->ci.bstream.next_in = (void*)buf; 1690275793eaSopenharmony_ci zi->ci.bstream.avail_in = len; 1691275793eaSopenharmony_ci err = BZ_RUN_OK; 1692275793eaSopenharmony_ci 1693275793eaSopenharmony_ci while ((err == BZ_RUN_OK) && (zi->ci.bstream.avail_in > 0)) 1694275793eaSopenharmony_ci { 1695275793eaSopenharmony_ci if (zi->ci.bstream.avail_out == 0) 1696275793eaSopenharmony_ci { 1697275793eaSopenharmony_ci if (zip64FlushWriteBuffer(zi) == ZIP_ERRNO) 1698275793eaSopenharmony_ci { 1699275793eaSopenharmony_ci err = ZIP_ERRNO; 1700275793eaSopenharmony_ci } 1701275793eaSopenharmony_ci zi->ci.bstream.avail_out = (uInt)Z_BUFSIZE; 1702275793eaSopenharmony_ci zi->ci.bstream.next_out = (char*)zi->ci.buffered_data; 1703275793eaSopenharmony_ci } 1704275793eaSopenharmony_ci 1705275793eaSopenharmony_ci 1706275793eaSopenharmony_ci if(err != BZ_RUN_OK) 1707275793eaSopenharmony_ci { 1708275793eaSopenharmony_ci break; 1709275793eaSopenharmony_ci } 1710275793eaSopenharmony_ci 1711275793eaSopenharmony_ci if ((zi->ci.method == Z_BZIP2ED) && (!zi->ci.raw)) 1712275793eaSopenharmony_ci { 1713275793eaSopenharmony_ci uLong uTotalOutBefore_lo = zi->ci.bstream.total_out_lo32; 1714275793eaSopenharmony_ci// uLong uTotalOutBefore_hi = zi->ci.bstream.total_out_hi32; 1715275793eaSopenharmony_ci err=BZ2_bzCompress(&zi->ci.bstream, BZ_RUN); 1716275793eaSopenharmony_ci 1717275793eaSopenharmony_ci zi->ci.pos_in_buffered_data += (uInt)(zi->ci.bstream.total_out_lo32 - uTotalOutBefore_lo) ; 1718275793eaSopenharmony_ci } 1719275793eaSopenharmony_ci } 1720275793eaSopenharmony_ci 1721275793eaSopenharmony_ci if(err == BZ_RUN_OK) 1722275793eaSopenharmony_ci { 1723275793eaSopenharmony_ci err = ZIP_OK; 1724275793eaSopenharmony_ci } 1725275793eaSopenharmony_ci } 1726275793eaSopenharmony_ci else 1727275793eaSopenharmony_ci#endif 1728275793eaSopenharmony_ci { 1729275793eaSopenharmony_ci zi->ci.stream.next_in = (Bytef*)(uintptr_t)buf; 1730275793eaSopenharmony_ci zi->ci.stream.avail_in = len; 1731275793eaSopenharmony_ci 1732275793eaSopenharmony_ci while ((err == ZIP_OK) && (zi->ci.stream.avail_in > 0)) 1733275793eaSopenharmony_ci { 1734275793eaSopenharmony_ci if (zi->ci.stream.avail_out == 0) 1735275793eaSopenharmony_ci { 1736275793eaSopenharmony_ci if (zip64FlushWriteBuffer(zi) == ZIP_ERRNO) 1737275793eaSopenharmony_ci { 1738275793eaSopenharmony_ci err = ZIP_ERRNO; 1739275793eaSopenharmony_ci } 1740275793eaSopenharmony_ci zi->ci.stream.avail_out = (uInt)Z_BUFSIZE; 1741275793eaSopenharmony_ci zi->ci.stream.next_out = zi->ci.buffered_data; 1742275793eaSopenharmony_ci } 1743275793eaSopenharmony_ci 1744275793eaSopenharmony_ci 1745275793eaSopenharmony_ci if(err != ZIP_OK) 1746275793eaSopenharmony_ci break; 1747275793eaSopenharmony_ci 1748275793eaSopenharmony_ci if ((zi->ci.method == Z_DEFLATED) && (!zi->ci.raw)) 1749275793eaSopenharmony_ci { 1750275793eaSopenharmony_ci uLong uTotalOutBefore = zi->ci.stream.total_out; 1751275793eaSopenharmony_ci err = deflate(&zi->ci.stream, Z_NO_FLUSH); 1752275793eaSopenharmony_ci 1753275793eaSopenharmony_ci zi->ci.pos_in_buffered_data += (uInt)(zi->ci.stream.total_out - uTotalOutBefore) ; 1754275793eaSopenharmony_ci } 1755275793eaSopenharmony_ci else 1756275793eaSopenharmony_ci { 1757275793eaSopenharmony_ci uInt copy_this,i; 1758275793eaSopenharmony_ci if (zi->ci.stream.avail_in < zi->ci.stream.avail_out) 1759275793eaSopenharmony_ci copy_this = zi->ci.stream.avail_in; 1760275793eaSopenharmony_ci else 1761275793eaSopenharmony_ci copy_this = zi->ci.stream.avail_out; 1762275793eaSopenharmony_ci 1763275793eaSopenharmony_ci for (i = 0; i < copy_this; i++){ 1764275793eaSopenharmony_ci *(((char*)zi->ci.stream.next_out) + i) = 1765275793eaSopenharmony_ci *(((const char*)zi->ci.stream.next_in) + i); 1766275793eaSopenharmony_ci } 1767275793eaSopenharmony_ci { 1768275793eaSopenharmony_ci zi->ci.stream.avail_in -= copy_this; 1769275793eaSopenharmony_ci zi->ci.stream.avail_out -= copy_this; 1770275793eaSopenharmony_ci zi->ci.stream.next_in += copy_this; 1771275793eaSopenharmony_ci zi->ci.stream.next_out += copy_this; 1772275793eaSopenharmony_ci zi->ci.stream.total_in += copy_this; 1773275793eaSopenharmony_ci zi->ci.stream.total_out += copy_this; 1774275793eaSopenharmony_ci zi->ci.pos_in_buffered_data += copy_this; 1775275793eaSopenharmony_ci } 1776275793eaSopenharmony_ci } 1777275793eaSopenharmony_ci }// while(...) 1778275793eaSopenharmony_ci } 1779275793eaSopenharmony_ci 1780275793eaSopenharmony_ci return err; 1781275793eaSopenharmony_ci} 1782275793eaSopenharmony_ci 1783275793eaSopenharmony_ciextern int ZEXPORT zipCloseFileInZipRaw(zipFile file, uLong uncompressed_size, uLong crc32) 1784275793eaSopenharmony_ci{ 1785275793eaSopenharmony_ci return zipCloseFileInZipRaw64 (file, uncompressed_size, crc32); 1786275793eaSopenharmony_ci} 1787275793eaSopenharmony_ci 1788275793eaSopenharmony_ciextern int ZEXPORT zipCloseFileInZipRaw64(zipFile file, ZPOS64_T uncompressed_size, uLong crc32) 1789275793eaSopenharmony_ci{ 1790275793eaSopenharmony_ci zip64_internal* zi; 1791275793eaSopenharmony_ci ZPOS64_T compressed_size; 1792275793eaSopenharmony_ci uLong invalidValue = 0xffffffff; 1793275793eaSopenharmony_ci unsigned datasize = 0; 1794275793eaSopenharmony_ci int err = ZIP_OK; 1795275793eaSopenharmony_ci 1796275793eaSopenharmony_ci if (file == NULL) 1797275793eaSopenharmony_ci { 1798275793eaSopenharmony_ci return ZIP_PARAMERROR; 1799275793eaSopenharmony_ci } 1800275793eaSopenharmony_ci zi = (zip64_internal*)file; 1801275793eaSopenharmony_ci 1802275793eaSopenharmony_ci if (zi->in_opened_file_inzip == 0) 1803275793eaSopenharmony_ci { 1804275793eaSopenharmony_ci return ZIP_PARAMERROR; 1805275793eaSopenharmony_ci } 1806275793eaSopenharmony_ci zi->ci.stream.avail_in = 0; 1807275793eaSopenharmony_ci 1808275793eaSopenharmony_ci if ((zi->ci.method == Z_DEFLATED) && (!zi->ci.raw)) 1809275793eaSopenharmony_ci { 1810275793eaSopenharmony_ci while (err == ZIP_OK) 1811275793eaSopenharmony_ci { 1812275793eaSopenharmony_ci uLong uTotalOutBefore; 1813275793eaSopenharmony_ci if (zi->ci.stream.avail_out == 0) 1814275793eaSopenharmony_ci { 1815275793eaSopenharmony_ci if (zip64FlushWriteBuffer(zi) == ZIP_ERRNO) 1816275793eaSopenharmony_ci err = ZIP_ERRNO; 1817275793eaSopenharmony_ci zi->ci.stream.avail_out = (uInt)Z_BUFSIZE; 1818275793eaSopenharmony_ci zi->ci.stream.next_out = zi->ci.buffered_data; 1819275793eaSopenharmony_ci } 1820275793eaSopenharmony_ci uTotalOutBefore = zi->ci.stream.total_out; 1821275793eaSopenharmony_ci err=deflate(&zi->ci.stream, Z_FINISH); 1822275793eaSopenharmony_ci zi->ci.pos_in_buffered_data += (uInt)(zi->ci.stream.total_out - uTotalOutBefore) ; 1823275793eaSopenharmony_ci } 1824275793eaSopenharmony_ci } 1825275793eaSopenharmony_ci else if ((zi->ci.method == Z_BZIP2ED) && (!zi->ci.raw)) 1826275793eaSopenharmony_ci { 1827275793eaSopenharmony_ci#ifdef HAVE_BZIP2 1828275793eaSopenharmony_ci err = BZ_FINISH_OK; 1829275793eaSopenharmony_ci while (err == BZ_FINISH_OK) 1830275793eaSopenharmony_ci { 1831275793eaSopenharmony_ci uLong uTotalOutBefore; 1832275793eaSopenharmony_ci if (zi->ci.bstream.avail_out == 0) 1833275793eaSopenharmony_ci { 1834275793eaSopenharmony_ci if (zip64FlushWriteBuffer(zi) == ZIP_ERRNO) 1835275793eaSopenharmony_ci { 1836275793eaSopenharmony_ci err = ZIP_ERRNO; 1837275793eaSopenharmony_ci } 1838275793eaSopenharmony_ci zi->ci.bstream.avail_out = (uInt)Z_BUFSIZE; 1839275793eaSopenharmony_ci zi->ci.bstream.next_out = (char*)zi->ci.buffered_data; 1840275793eaSopenharmony_ci } 1841275793eaSopenharmony_ci uTotalOutBefore = zi->ci.bstream.total_out_lo32; 1842275793eaSopenharmony_ci err=BZ2_bzCompress(&zi->ci.bstream, BZ_FINISH); 1843275793eaSopenharmony_ci if(err == BZ_STREAM_END) 1844275793eaSopenharmony_ci { 1845275793eaSopenharmony_ci err = Z_STREAM_END; 1846275793eaSopenharmony_ci } 1847275793eaSopenharmony_ci 1848275793eaSopenharmony_ci zi->ci.pos_in_buffered_data += (uInt)(zi->ci.bstream.total_out_lo32 - uTotalOutBefore); 1849275793eaSopenharmony_ci } 1850275793eaSopenharmony_ci 1851275793eaSopenharmony_ci if(err == BZ_FINISH_OK) 1852275793eaSopenharmony_ci { 1853275793eaSopenharmony_ci err = ZIP_OK; 1854275793eaSopenharmony_ci } 1855275793eaSopenharmony_ci#endif 1856275793eaSopenharmony_ci } 1857275793eaSopenharmony_ci 1858275793eaSopenharmony_ci if (err == Z_STREAM_END) 1859275793eaSopenharmony_ci { 1860275793eaSopenharmony_ci err = ZIP_OK; /* this is normal */ 1861275793eaSopenharmony_ci } 1862275793eaSopenharmony_ci 1863275793eaSopenharmony_ci if ((zi->ci.pos_in_buffered_data>0) && (err == ZIP_OK)) 1864275793eaSopenharmony_ci { 1865275793eaSopenharmony_ci if (zip64FlushWriteBuffer(zi) == ZIP_ERRNO) 1866275793eaSopenharmony_ci { 1867275793eaSopenharmony_ci err = ZIP_ERRNO; 1868275793eaSopenharmony_ci } 1869275793eaSopenharmony_ci } 1870275793eaSopenharmony_ci 1871275793eaSopenharmony_ci if ((zi->ci.method == Z_DEFLATED) && (!zi->ci.raw)) 1872275793eaSopenharmony_ci { 1873275793eaSopenharmony_ci int tmp_err = deflateEnd(&zi->ci.stream); 1874275793eaSopenharmony_ci if (err == ZIP_OK) 1875275793eaSopenharmony_ci { 1876275793eaSopenharmony_ci err = tmp_err; 1877275793eaSopenharmony_ci } 1878275793eaSopenharmony_ci zi->ci.stream_initialised = 0; 1879275793eaSopenharmony_ci } 1880275793eaSopenharmony_ci#ifdef HAVE_BZIP2 1881275793eaSopenharmony_ci else if((zi->ci.method == Z_BZIP2ED) && (!zi->ci.raw)) 1882275793eaSopenharmony_ci { 1883275793eaSopenharmony_ci int tmperr = BZ2_bzCompressEnd(&zi->ci.bstream); 1884275793eaSopenharmony_ci if (err == ZIP_OK) 1885275793eaSopenharmony_ci { 1886275793eaSopenharmony_ci err = tmperr; 1887275793eaSopenharmony_ci } 1888275793eaSopenharmony_ci zi->ci.stream_initialised = 0; 1889275793eaSopenharmony_ci } 1890275793eaSopenharmony_ci#endif 1891275793eaSopenharmony_ci 1892275793eaSopenharmony_ci if (!zi->ci.raw) 1893275793eaSopenharmony_ci { 1894275793eaSopenharmony_ci crc32 = (uLong)zi->ci.crc32; 1895275793eaSopenharmony_ci uncompressed_size = zi->ci.totalUncompressedData; 1896275793eaSopenharmony_ci } 1897275793eaSopenharmony_ci compressed_size = zi->ci.totalCompressedData; 1898275793eaSopenharmony_ci 1899275793eaSopenharmony_ci# ifndef NOCRYPT 1900275793eaSopenharmony_ci compressed_size += zi->ci.crypt_header_size; 1901275793eaSopenharmony_ci# endif 1902275793eaSopenharmony_ci 1903275793eaSopenharmony_ci // update Current Item crc and sizes, 1904275793eaSopenharmony_ci if(compressed_size >= 0xffffffff || uncompressed_size >= 0xffffffff || zi->ci.pos_local_header >= 0xffffffff) 1905275793eaSopenharmony_ci { 1906275793eaSopenharmony_ci /*version Made by*/ 1907275793eaSopenharmony_ci zip64local_putValue_inmemory(zi->ci.central_header+4,(uLong)45,2); 1908275793eaSopenharmony_ci /*version needed*/ 1909275793eaSopenharmony_ci zip64local_putValue_inmemory(zi->ci.central_header+6,(uLong)45,2); 1910275793eaSopenharmony_ci 1911275793eaSopenharmony_ci } 1912275793eaSopenharmony_ci 1913275793eaSopenharmony_ci zip64local_putValue_inmemory(zi->ci.central_header+16,crc32,4); /*crc*/ 1914275793eaSopenharmony_ci 1915275793eaSopenharmony_ci 1916275793eaSopenharmony_ci if(compressed_size >= 0xffffffff) 1917275793eaSopenharmony_ci { 1918275793eaSopenharmony_ci zip64local_putValue_inmemory(zi->ci.central_header+20, invalidValue,4); /*compr size*/ 1919275793eaSopenharmony_ci } 1920275793eaSopenharmony_ci else 1921275793eaSopenharmony_ci { 1922275793eaSopenharmony_ci zip64local_putValue_inmemory(zi->ci.central_header+20, compressed_size,4); /*compr size*/ 1923275793eaSopenharmony_ci } 1924275793eaSopenharmony_ci 1925275793eaSopenharmony_ci /// set internal file attributes field 1926275793eaSopenharmony_ci if (zi->ci.stream.data_type == Z_ASCII) 1927275793eaSopenharmony_ci { 1928275793eaSopenharmony_ci zip64local_putValue_inmemory(zi->ci.central_header + 36,(uLong)Z_ASCII,2); 1929275793eaSopenharmony_ci } 1930275793eaSopenharmony_ci 1931275793eaSopenharmony_ci if(uncompressed_size >= 0xffffffff) 1932275793eaSopenharmony_ci { 1933275793eaSopenharmony_ci zip64local_putValue_inmemory(zi->ci.central_header+24, invalidValue,4); /*uncompr size*/ 1934275793eaSopenharmony_ci } 1935275793eaSopenharmony_ci else 1936275793eaSopenharmony_ci { 1937275793eaSopenharmony_ci zip64local_putValue_inmemory(zi->ci.central_header+24, uncompressed_size,4); /*uncompr size*/ 1938275793eaSopenharmony_ci } 1939275793eaSopenharmony_ci 1940275793eaSopenharmony_ci // Add ZIP64 extra info field for uncompressed size 1941275793eaSopenharmony_ci if(uncompressed_size >= 0xffffffff) 1942275793eaSopenharmony_ci { 1943275793eaSopenharmony_ci datasize += 8; 1944275793eaSopenharmony_ci } 1945275793eaSopenharmony_ci 1946275793eaSopenharmony_ci // Add ZIP64 extra info field for compressed size 1947275793eaSopenharmony_ci if(compressed_size >= 0xffffffff) 1948275793eaSopenharmony_ci { 1949275793eaSopenharmony_ci datasize += 8; 1950275793eaSopenharmony_ci } 1951275793eaSopenharmony_ci 1952275793eaSopenharmony_ci // Add ZIP64 extra info field for relative offset to local file header of current file 1953275793eaSopenharmony_ci if(zi->ci.pos_local_header >= 0xffffffff) 1954275793eaSopenharmony_ci { 1955275793eaSopenharmony_ci datasize += 8; 1956275793eaSopenharmony_ci } 1957275793eaSopenharmony_ci 1958275793eaSopenharmony_ci if(datasize > 0) 1959275793eaSopenharmony_ci { 1960275793eaSopenharmony_ci char* p = NULL; 1961275793eaSopenharmony_ci 1962275793eaSopenharmony_ci if((uLong)(datasize + 4) > zi->ci.size_centralExtraFree) 1963275793eaSopenharmony_ci { 1964275793eaSopenharmony_ci // we cannot write more data to the buffer that we have room for. 1965275793eaSopenharmony_ci return ZIP_BADZIPFILE; 1966275793eaSopenharmony_ci } 1967275793eaSopenharmony_ci 1968275793eaSopenharmony_ci p = zi->ci.central_header + zi->ci.size_centralheader; 1969275793eaSopenharmony_ci 1970275793eaSopenharmony_ci // Add Extra Information Header for 'ZIP64 information' 1971275793eaSopenharmony_ci zip64local_putValue_inmemory(p, 0x0001, 2); // HeaderID 1972275793eaSopenharmony_ci p += 2; 1973275793eaSopenharmony_ci zip64local_putValue_inmemory(p, datasize, 2); // DataSize 1974275793eaSopenharmony_ci p += 2; 1975275793eaSopenharmony_ci 1976275793eaSopenharmony_ci if(uncompressed_size >= 0xffffffff) 1977275793eaSopenharmony_ci { 1978275793eaSopenharmony_ci zip64local_putValue_inmemory(p, uncompressed_size, 8); 1979275793eaSopenharmony_ci p += 8; 1980275793eaSopenharmony_ci } 1981275793eaSopenharmony_ci 1982275793eaSopenharmony_ci if(compressed_size >= 0xffffffff) 1983275793eaSopenharmony_ci { 1984275793eaSopenharmony_ci zip64local_putValue_inmemory(p, compressed_size, 8); 1985275793eaSopenharmony_ci p += 8; 1986275793eaSopenharmony_ci } 1987275793eaSopenharmony_ci 1988275793eaSopenharmony_ci if(zi->ci.pos_local_header >= 0xffffffff) 1989275793eaSopenharmony_ci { 1990275793eaSopenharmony_ci zip64local_putValue_inmemory(p, zi->ci.pos_local_header, 8); 1991275793eaSopenharmony_ci p += 8; 1992275793eaSopenharmony_ci } 1993275793eaSopenharmony_ci 1994275793eaSopenharmony_ci // Update how much extra free space we got in the memory buffer 1995275793eaSopenharmony_ci // and increase the centralheader size so the new ZIP64 fields are included 1996275793eaSopenharmony_ci // ( 4 below is the size of HeaderID and DataSize field ) 1997275793eaSopenharmony_ci zi->ci.size_centralExtraFree -= datasize + 4; 1998275793eaSopenharmony_ci zi->ci.size_centralheader += datasize + 4; 1999275793eaSopenharmony_ci 2000275793eaSopenharmony_ci // Update the extra info size field 2001275793eaSopenharmony_ci zi->ci.size_centralExtra += datasize + 4; 2002275793eaSopenharmony_ci zip64local_putValue_inmemory(zi->ci.central_header+30,(uLong)zi->ci.size_centralExtra,2); 2003275793eaSopenharmony_ci } 2004275793eaSopenharmony_ci 2005275793eaSopenharmony_ci if (err == ZIP_OK) 2006275793eaSopenharmony_ci { 2007275793eaSopenharmony_ci err = add_data_in_datablock(&zi->central_dir, zi->ci.central_header, (uLong)zi->ci.size_centralheader); 2008275793eaSopenharmony_ci } 2009275793eaSopenharmony_ci 2010275793eaSopenharmony_ci free(zi->ci.central_header); 2011275793eaSopenharmony_ci 2012275793eaSopenharmony_ci if (err == ZIP_OK) 2013275793eaSopenharmony_ci { 2014275793eaSopenharmony_ci // Update the LocalFileHeader with the new values. 2015275793eaSopenharmony_ci 2016275793eaSopenharmony_ci ZPOS64_T cur_pos_inzip = ZTELL64(zi->z_filefunc,zi->filestream); 2017275793eaSopenharmony_ci 2018275793eaSopenharmony_ci if (ZSEEK64(zi->z_filefunc,zi->filestream, zi->ci.pos_local_header + 14,ZLIB_FILEFUNC_SEEK_SET) != 0) 2019275793eaSopenharmony_ci { 2020275793eaSopenharmony_ci err = ZIP_ERRNO; 2021275793eaSopenharmony_ci } 2022275793eaSopenharmony_ci 2023275793eaSopenharmony_ci if (err==ZIP_OK) 2024275793eaSopenharmony_ci { 2025275793eaSopenharmony_ci err = zip64local_putValue(&zi->z_filefunc,zi->filestream,crc32,4); /* crc 32, unknown */ 2026275793eaSopenharmony_ci } 2027275793eaSopenharmony_ci 2028275793eaSopenharmony_ci if(uncompressed_size >= 0xffffffff || compressed_size >= 0xffffffff ) 2029275793eaSopenharmony_ci { 2030275793eaSopenharmony_ci if(zi->ci.pos_zip64extrainfo > 0) 2031275793eaSopenharmony_ci { 2032275793eaSopenharmony_ci // Update the size in the ZIP64 extended field. 2033275793eaSopenharmony_ci if (ZSEEK64(zi->z_filefunc,zi->filestream, zi->ci.pos_zip64extrainfo + 4,ZLIB_FILEFUNC_SEEK_SET)!=0) 2034275793eaSopenharmony_ci { 2035275793eaSopenharmony_ci err = ZIP_ERRNO; 2036275793eaSopenharmony_ci } 2037275793eaSopenharmony_ci 2038275793eaSopenharmony_ci if (err == ZIP_OK) /* compressed size, unknown */ 2039275793eaSopenharmony_ci { 2040275793eaSopenharmony_ci err = zip64local_putValue(&zi->z_filefunc, zi->filestream, uncompressed_size, 8); 2041275793eaSopenharmony_ci } 2042275793eaSopenharmony_ci 2043275793eaSopenharmony_ci if (err == ZIP_OK) /* uncompressed size, unknown */ 2044275793eaSopenharmony_ci { 2045275793eaSopenharmony_ci err = zip64local_putValue(&zi->z_filefunc, zi->filestream, compressed_size, 8); 2046275793eaSopenharmony_ci } 2047275793eaSopenharmony_ci } 2048275793eaSopenharmony_ci else 2049275793eaSopenharmony_ci { 2050275793eaSopenharmony_ci err = ZIP_BADZIPFILE; // Caller passed zip64 = 0, so no room for zip64 info -> fatal 2051275793eaSopenharmony_ci } 2052275793eaSopenharmony_ci } 2053275793eaSopenharmony_ci else 2054275793eaSopenharmony_ci { 2055275793eaSopenharmony_ci if (err == ZIP_OK) /* compressed size, unknown */ 2056275793eaSopenharmony_ci { 2057275793eaSopenharmony_ci err = zip64local_putValue(&zi->z_filefunc,zi->filestream,compressed_size,4); 2058275793eaSopenharmony_ci } 2059275793eaSopenharmony_ci 2060275793eaSopenharmony_ci if (err == ZIP_OK) /* uncompressed size, unknown */ 2061275793eaSopenharmony_ci { 2062275793eaSopenharmony_ci err = zip64local_putValue(&zi->z_filefunc,zi->filestream,uncompressed_size,4); 2063275793eaSopenharmony_ci } 2064275793eaSopenharmony_ci } 2065275793eaSopenharmony_ci 2066275793eaSopenharmony_ci if (ZSEEK64(zi->z_filefunc,zi->filestream, cur_pos_inzip,ZLIB_FILEFUNC_SEEK_SET) != 0) 2067275793eaSopenharmony_ci { 2068275793eaSopenharmony_ci err = ZIP_ERRNO; 2069275793eaSopenharmony_ci } 2070275793eaSopenharmony_ci } 2071275793eaSopenharmony_ci 2072275793eaSopenharmony_ci zi->number_entry ++; 2073275793eaSopenharmony_ci zi->in_opened_file_inzip = 0; 2074275793eaSopenharmony_ci 2075275793eaSopenharmony_ci return err; 2076275793eaSopenharmony_ci} 2077275793eaSopenharmony_ci 2078275793eaSopenharmony_ciextern int ZEXPORT zipCloseFileInZip(zipFile file) 2079275793eaSopenharmony_ci{ 2080275793eaSopenharmony_ci return zipCloseFileInZipRaw (file,0,0); 2081275793eaSopenharmony_ci} 2082275793eaSopenharmony_ci 2083275793eaSopenharmony_cilocal int Write_Zip64EndOfCentralDirectoryLocator(zip64_internal* zi, ZPOS64_T zip64eocd_pos_inzip) 2084275793eaSopenharmony_ci{ 2085275793eaSopenharmony_ci int err = ZIP_OK; 2086275793eaSopenharmony_ci ZPOS64_T pos = zip64eocd_pos_inzip - zi->add_position_when_writing_offset; 2087275793eaSopenharmony_ci 2088275793eaSopenharmony_ci err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)ZIP64ENDLOCHEADERMAGIC,4); 2089275793eaSopenharmony_ci 2090275793eaSopenharmony_ci /*num disks*/ 2091275793eaSopenharmony_ci if (err == ZIP_OK) /* number of the disk with the start of the central directory */ 2092275793eaSopenharmony_ci { 2093275793eaSopenharmony_ci err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)0,4); 2094275793eaSopenharmony_ci } 2095275793eaSopenharmony_ci 2096275793eaSopenharmony_ci 2097275793eaSopenharmony_ci /*relative offset*/ 2098275793eaSopenharmony_ci if (err == ZIP_OK) /* Relative offset to the Zip64EndOfCentralDirectory */ 2099275793eaSopenharmony_ci { 2100275793eaSopenharmony_ci err = zip64local_putValue(&zi->z_filefunc,zi->filestream, pos,8); 2101275793eaSopenharmony_ci } 2102275793eaSopenharmony_ci 2103275793eaSopenharmony_ci /*total disks*/ /* Do not support spawning of disk so always say 1 here*/ 2104275793eaSopenharmony_ci if (err == ZIP_OK) /* number of the disk with the start of the central directory */ 2105275793eaSopenharmony_ci { 2106275793eaSopenharmony_ci err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)1,4); 2107275793eaSopenharmony_ci } 2108275793eaSopenharmony_ci 2109275793eaSopenharmony_ci return err; 2110275793eaSopenharmony_ci} 2111275793eaSopenharmony_ci 2112275793eaSopenharmony_cilocal int Write_Zip64EndOfCentralDirectoryRecord(zip64_internal* zi, uLong size_centraldir, ZPOS64_T centraldir_pos_inzip) 2113275793eaSopenharmony_ci{ 2114275793eaSopenharmony_ci int err = ZIP_OK; 2115275793eaSopenharmony_ci 2116275793eaSopenharmony_ci uLong Zip64DataSize = 44; 2117275793eaSopenharmony_ci 2118275793eaSopenharmony_ci err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)ZIP64ENDHEADERMAGIC,4); 2119275793eaSopenharmony_ci 2120275793eaSopenharmony_ci if (err == ZIP_OK) /* size of this 'zip64 end of central directory' */ 2121275793eaSopenharmony_ci { 2122275793eaSopenharmony_ci err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(ZPOS64_T)Zip64DataSize,8); // why ZPOS64_T of this ? 2123275793eaSopenharmony_ci } 2124275793eaSopenharmony_ci 2125275793eaSopenharmony_ci if (err == ZIP_OK) /* version made by */ 2126275793eaSopenharmony_ci { 2127275793eaSopenharmony_ci err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)45,2); 2128275793eaSopenharmony_ci } 2129275793eaSopenharmony_ci 2130275793eaSopenharmony_ci if (err == ZIP_OK) /* version needed */ 2131275793eaSopenharmony_ci { 2132275793eaSopenharmony_ci err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)45,2); 2133275793eaSopenharmony_ci } 2134275793eaSopenharmony_ci 2135275793eaSopenharmony_ci if (err == ZIP_OK) /* number of this disk */ 2136275793eaSopenharmony_ci { 2137275793eaSopenharmony_ci err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)0,4); 2138275793eaSopenharmony_ci } 2139275793eaSopenharmony_ci 2140275793eaSopenharmony_ci if (err == ZIP_OK) /* number of the disk with the start of the central directory */ 2141275793eaSopenharmony_ci { 2142275793eaSopenharmony_ci err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)0,4); 2143275793eaSopenharmony_ci } 2144275793eaSopenharmony_ci 2145275793eaSopenharmony_ci if (err == ZIP_OK) /* total number of entries in the central dir on this disk */ 2146275793eaSopenharmony_ci { 2147275793eaSopenharmony_ci err = zip64local_putValue(&zi->z_filefunc, zi->filestream, zi->number_entry, 8); 2148275793eaSopenharmony_ci } 2149275793eaSopenharmony_ci 2150275793eaSopenharmony_ci if (err == ZIP_OK) /* total number of entries in the central dir */ 2151275793eaSopenharmony_ci { 2152275793eaSopenharmony_ci err = zip64local_putValue(&zi->z_filefunc, zi->filestream, zi->number_entry, 8); 2153275793eaSopenharmony_ci } 2154275793eaSopenharmony_ci 2155275793eaSopenharmony_ci if (err == ZIP_OK) /* size of the central directory */ 2156275793eaSopenharmony_ci { 2157275793eaSopenharmony_ci err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(ZPOS64_T)size_centraldir,8); 2158275793eaSopenharmony_ci } 2159275793eaSopenharmony_ci 2160275793eaSopenharmony_ci if (err == ZIP_OK) /* offset of start of central directory with respect to the starting disk number */ 2161275793eaSopenharmony_ci { 2162275793eaSopenharmony_ci ZPOS64_T pos = centraldir_pos_inzip - zi->add_position_when_writing_offset; 2163275793eaSopenharmony_ci err = zip64local_putValue(&zi->z_filefunc,zi->filestream, (ZPOS64_T)pos,8); 2164275793eaSopenharmony_ci } 2165275793eaSopenharmony_ci return err; 2166275793eaSopenharmony_ci} 2167275793eaSopenharmony_ci 2168275793eaSopenharmony_cilocal int Write_EndOfCentralDirectoryRecord(zip64_internal* zi, uLong size_centraldir, ZPOS64_T centraldir_pos_inzip) 2169275793eaSopenharmony_ci{ 2170275793eaSopenharmony_ci int err = ZIP_OK; 2171275793eaSopenharmony_ci 2172275793eaSopenharmony_ci /*signature*/ 2173275793eaSopenharmony_ci err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)ENDHEADERMAGIC,4); 2174275793eaSopenharmony_ci 2175275793eaSopenharmony_ci if (err == ZIP_OK) /* number of this disk */ 2176275793eaSopenharmony_ci { 2177275793eaSopenharmony_ci err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)0,2); 2178275793eaSopenharmony_ci } 2179275793eaSopenharmony_ci 2180275793eaSopenharmony_ci if (err == ZIP_OK) /* number of the disk with the start of the central directory */ 2181275793eaSopenharmony_ci { 2182275793eaSopenharmony_ci err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)0,2); 2183275793eaSopenharmony_ci } 2184275793eaSopenharmony_ci 2185275793eaSopenharmony_ci if (err == ZIP_OK) /* total number of entries in the central dir on this disk */ 2186275793eaSopenharmony_ci { 2187275793eaSopenharmony_ci { 2188275793eaSopenharmony_ci if(zi->number_entry >= 0xFFFF) 2189275793eaSopenharmony_ci { 2190275793eaSopenharmony_ci err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)0xffff,2); // use value in ZIP64 record 2191275793eaSopenharmony_ci } 2192275793eaSopenharmony_ci else 2193275793eaSopenharmony_ci { 2194275793eaSopenharmony_ci err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)zi->number_entry,2); 2195275793eaSopenharmony_ci } 2196275793eaSopenharmony_ci } 2197275793eaSopenharmony_ci } 2198275793eaSopenharmony_ci 2199275793eaSopenharmony_ci if (err == ZIP_OK) /* total number of entries in the central dir */ 2200275793eaSopenharmony_ci { 2201275793eaSopenharmony_ci if(zi->number_entry >= 0xFFFF) 2202275793eaSopenharmony_ci { 2203275793eaSopenharmony_ci err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)0xffff,2); // use value in ZIP64 record 2204275793eaSopenharmony_ci } 2205275793eaSopenharmony_ci else 2206275793eaSopenharmony_ci { 2207275793eaSopenharmony_ci err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)zi->number_entry,2); 2208275793eaSopenharmony_ci } 2209275793eaSopenharmony_ci } 2210275793eaSopenharmony_ci 2211275793eaSopenharmony_ci if (err == ZIP_OK) /* size of the central directory */ 2212275793eaSopenharmony_ci { 2213275793eaSopenharmony_ci err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)size_centraldir,4); 2214275793eaSopenharmony_ci } 2215275793eaSopenharmony_ci 2216275793eaSopenharmony_ci if (err == ZIP_OK) /* offset of start of central directory with respect to the starting disk number */ 2217275793eaSopenharmony_ci { 2218275793eaSopenharmony_ci ZPOS64_T pos = centraldir_pos_inzip - zi->add_position_when_writing_offset; 2219275793eaSopenharmony_ci if(pos >= 0xffffffff) 2220275793eaSopenharmony_ci { 2221275793eaSopenharmony_ci err = zip64local_putValue(&zi->z_filefunc,zi->filestream, (uLong)0xffffffff,4); 2222275793eaSopenharmony_ci } 2223275793eaSopenharmony_ci else 2224275793eaSopenharmony_ci err = zip64local_putValue(&zi->z_filefunc,zi->filestream, (uLong)(centraldir_pos_inzip - zi->add_position_when_writing_offset),4); 2225275793eaSopenharmony_ci } 2226275793eaSopenharmony_ci 2227275793eaSopenharmony_ci return err; 2228275793eaSopenharmony_ci} 2229275793eaSopenharmony_ci 2230275793eaSopenharmony_cilocal int Write_GlobalComment(zip64_internal* zi, const char* global_comment) 2231275793eaSopenharmony_ci{ 2232275793eaSopenharmony_ci int err = ZIP_OK; 2233275793eaSopenharmony_ci uInt size_global_comment = 0; 2234275793eaSopenharmony_ci 2235275793eaSopenharmony_ci if(global_comment != NULL) 2236275793eaSopenharmony_ci { 2237275793eaSopenharmony_ci size_global_comment = (uInt)strlen(global_comment); 2238275793eaSopenharmony_ci } 2239275793eaSopenharmony_ci 2240275793eaSopenharmony_ci err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)size_global_comment,2); 2241275793eaSopenharmony_ci 2242275793eaSopenharmony_ci if (err == ZIP_OK && size_global_comment > 0) 2243275793eaSopenharmony_ci { 2244275793eaSopenharmony_ci if (ZWRITE64(zi->z_filefunc,zi->filestream, global_comment, size_global_comment) != size_global_comment) 2245275793eaSopenharmony_ci { 2246275793eaSopenharmony_ci err = ZIP_ERRNO; 2247275793eaSopenharmony_ci } 2248275793eaSopenharmony_ci } 2249275793eaSopenharmony_ci return err; 2250275793eaSopenharmony_ci} 2251275793eaSopenharmony_ci 2252275793eaSopenharmony_ciextern int ZEXPORT zipClose(zipFile file, const char* global_comment) 2253275793eaSopenharmony_ci{ 2254275793eaSopenharmony_ci zip64_internal* zi; 2255275793eaSopenharmony_ci int err = 0; 2256275793eaSopenharmony_ci uLong size_centraldir = 0; 2257275793eaSopenharmony_ci ZPOS64_T centraldir_pos_inzip; 2258275793eaSopenharmony_ci ZPOS64_T pos; 2259275793eaSopenharmony_ci 2260275793eaSopenharmony_ci if (file == NULL) 2261275793eaSopenharmony_ci { 2262275793eaSopenharmony_ci return ZIP_PARAMERROR; 2263275793eaSopenharmony_ci } 2264275793eaSopenharmony_ci 2265275793eaSopenharmony_ci zi = (zip64_internal*)file; 2266275793eaSopenharmony_ci 2267275793eaSopenharmony_ci if (zi->in_opened_file_inzip == 1) 2268275793eaSopenharmony_ci { 2269275793eaSopenharmony_ci err = zipCloseFileInZip (file); 2270275793eaSopenharmony_ci } 2271275793eaSopenharmony_ci 2272275793eaSopenharmony_ci#ifndef NO_ADDFILEINEXISTINGZIP 2273275793eaSopenharmony_ci if (global_comment == NULL) 2274275793eaSopenharmony_ci { 2275275793eaSopenharmony_ci global_comment = zi->globalcomment; 2276275793eaSopenharmony_ci } 2277275793eaSopenharmony_ci#endif 2278275793eaSopenharmony_ci 2279275793eaSopenharmony_ci centraldir_pos_inzip = ZTELL64(zi->z_filefunc,zi->filestream); 2280275793eaSopenharmony_ci 2281275793eaSopenharmony_ci if (err == ZIP_OK) 2282275793eaSopenharmony_ci { 2283275793eaSopenharmony_ci linkedlist_datablock_internal* ldi = zi->central_dir.first_block; 2284275793eaSopenharmony_ci while (ldi != NULL) 2285275793eaSopenharmony_ci { 2286275793eaSopenharmony_ci if ((err == ZIP_OK) && (ldi->filled_in_this_block>0)) 2287275793eaSopenharmony_ci { 2288275793eaSopenharmony_ci if (ZWRITE64(zi->z_filefunc,zi->filestream, ldi->data, ldi->filled_in_this_block) != ldi->filled_in_this_block) 2289275793eaSopenharmony_ci { 2290275793eaSopenharmony_ci err = ZIP_ERRNO; 2291275793eaSopenharmony_ci } 2292275793eaSopenharmony_ci } 2293275793eaSopenharmony_ci 2294275793eaSopenharmony_ci size_centraldir += ldi->filled_in_this_block; 2295275793eaSopenharmony_ci ldi = ldi->next_datablock; 2296275793eaSopenharmony_ci } 2297275793eaSopenharmony_ci } 2298275793eaSopenharmony_ci free_linkedlist(&(zi->central_dir)); 2299275793eaSopenharmony_ci 2300275793eaSopenharmony_ci pos = centraldir_pos_inzip - zi->add_position_when_writing_offset; 2301275793eaSopenharmony_ci if(pos >= 0xffffffff || zi->number_entry >= 0xFFFF) 2302275793eaSopenharmony_ci { 2303275793eaSopenharmony_ci ZPOS64_T Zip64EOCDpos = ZTELL64(zi->z_filefunc,zi->filestream); 2304275793eaSopenharmony_ci Write_Zip64EndOfCentralDirectoryRecord(zi, size_centraldir, centraldir_pos_inzip); 2305275793eaSopenharmony_ci 2306275793eaSopenharmony_ci Write_Zip64EndOfCentralDirectoryLocator(zi, Zip64EOCDpos); 2307275793eaSopenharmony_ci } 2308275793eaSopenharmony_ci 2309275793eaSopenharmony_ci if (err == ZIP_OK) 2310275793eaSopenharmony_ci { 2311275793eaSopenharmony_ci err = Write_EndOfCentralDirectoryRecord(zi, size_centraldir, centraldir_pos_inzip); 2312275793eaSopenharmony_ci } 2313275793eaSopenharmony_ci 2314275793eaSopenharmony_ci if(err == ZIP_OK) 2315275793eaSopenharmony_ci { 2316275793eaSopenharmony_ci err = Write_GlobalComment(zi, global_comment); 2317275793eaSopenharmony_ci } 2318275793eaSopenharmony_ci 2319275793eaSopenharmony_ci if (ZCLOSE64(zi->z_filefunc,zi->filestream) != 0) 2320275793eaSopenharmony_ci { 2321275793eaSopenharmony_ci if (err == ZIP_OK) 2322275793eaSopenharmony_ci { 2323275793eaSopenharmony_ci err = ZIP_ERRNO; 2324275793eaSopenharmony_ci } 2325275793eaSopenharmony_ci } 2326275793eaSopenharmony_ci 2327275793eaSopenharmony_ci#ifndef NO_ADDFILEINEXISTINGZIP 2328275793eaSopenharmony_ci free(zi->globalcomment); 2329275793eaSopenharmony_ci#endif 2330275793eaSopenharmony_ci free(zi); 2331275793eaSopenharmony_ci 2332275793eaSopenharmony_ci return err; 2333275793eaSopenharmony_ci} 2334275793eaSopenharmony_ci 2335275793eaSopenharmony_ciextern int ZEXPORT zipRemoveExtraInfoBlock(char* pData, int* dataLen, short sHeader) 2336275793eaSopenharmony_ci{ 2337275793eaSopenharmony_ci char* p = pData; 2338275793eaSopenharmony_ci int size = 0; 2339275793eaSopenharmony_ci char* pNewHeader; 2340275793eaSopenharmony_ci char* pTmp; 2341275793eaSopenharmony_ci short header; 2342275793eaSopenharmony_ci short dataSize; 2343275793eaSopenharmony_ci 2344275793eaSopenharmony_ci int retVal = ZIP_OK; 2345275793eaSopenharmony_ci 2346275793eaSopenharmony_ci if(pData == NULL || dataLen == NULL || *dataLen < 4) 2347275793eaSopenharmony_ci { 2348275793eaSopenharmony_ci return ZIP_PARAMERROR; 2349275793eaSopenharmony_ci } 2350275793eaSopenharmony_ci 2351275793eaSopenharmony_ci pNewHeader = (char*)ALLOC((unsigned)*dataLen); 2352275793eaSopenharmony_ci pTmp = pNewHeader; 2353275793eaSopenharmony_ci 2354275793eaSopenharmony_ci while(p < (pData + *dataLen)) 2355275793eaSopenharmony_ci { 2356275793eaSopenharmony_ci header = *(short*)p; 2357275793eaSopenharmony_ci dataSize = *(((short*)p) + 1); 2358275793eaSopenharmony_ci 2359275793eaSopenharmony_ci if( header == sHeader ) // Header found. 2360275793eaSopenharmony_ci { 2361275793eaSopenharmony_ci p += dataSize + 4; // skip it. do not copy to temp buffer 2362275793eaSopenharmony_ci } 2363275793eaSopenharmony_ci else 2364275793eaSopenharmony_ci { 2365275793eaSopenharmony_ci // Extra Info block should not be removed, So copy it to the temp buffer. 2366275793eaSopenharmony_ci memcpy(pTmp, p, dataSize + 4); 2367275793eaSopenharmony_ci p += dataSize + 4; 2368275793eaSopenharmony_ci size += dataSize + 4; 2369275793eaSopenharmony_ci } 2370275793eaSopenharmony_ci 2371275793eaSopenharmony_ci } 2372275793eaSopenharmony_ci 2373275793eaSopenharmony_ci if(size < *dataLen) 2374275793eaSopenharmony_ci { 2375275793eaSopenharmony_ci // clean old extra info block. 2376275793eaSopenharmony_ci memset(pData,0, *dataLen); 2377275793eaSopenharmony_ci 2378275793eaSopenharmony_ci // copy the new extra info block over the old 2379275793eaSopenharmony_ci if(size > 0) 2380275793eaSopenharmony_ci { 2381275793eaSopenharmony_ci memcpy(pData, pNewHeader, size); 2382275793eaSopenharmony_ci } 2383275793eaSopenharmony_ci 2384275793eaSopenharmony_ci // set the new extra info size 2385275793eaSopenharmony_ci *dataLen = size; 2386275793eaSopenharmony_ci 2387275793eaSopenharmony_ci retVal = ZIP_OK; 2388275793eaSopenharmony_ci } 2389275793eaSopenharmony_ci else 2390275793eaSopenharmony_ci { 2391275793eaSopenharmony_ci retVal = ZIP_ERRNO; 2392275793eaSopenharmony_ci } 2393275793eaSopenharmony_ci 2394275793eaSopenharmony_ci free(pNewHeader); 2395275793eaSopenharmony_ci 2396275793eaSopenharmony_ci return retVal; 2397275793eaSopenharmony_ci} 2398