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