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