tesseract  4.00.00dev
zip.c File Reference
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include "zlib.h"
#include "zip.h"
#include <errno.h>
#include "crypt.h"

Go to the source code of this file.

Classes

struct  linkedlist_datablock_internal_s
 
struct  linkedlist_data_s
 
struct  curfile_info
 
struct  zip_internal
 

Macros

#define local   static
 
#define VERSIONMADEBY   (0x0) /* platform depedent */
 
#define Z_BUFSIZE   (16384)
 
#define Z_MAXFILENAMEINZIP   (256)
 
#define ALLOC(size)   (malloc(size))
 
#define TRYFREE(p)   {if (p) free(p);}
 
#define SEEK_CUR   1
 
#define SEEK_END   2
 
#define SEEK_SET   0
 
#define SIZEDATA_INDATABLOCK   (4096-(4*4))
 
#define LOCALHEADERMAGIC   (0x04034b50)
 
#define CENTRALHEADERMAGIC   (0x02014b50)
 
#define ENDHEADERMAGIC   (0x06054b50)
 
#define FLAG_LOCALHEADER_OFFSET   (0x06)
 
#define CRC_LOCALHEADER_OFFSET   (0x0e)
 
#define SIZECENTRALHEADER   (0x2e) /* 46 */
 
#define INCLUDECRYPTINGCODE_IFCRYPTALLOWED
 
#define BUFREADCOMMENT   (0x400)
 

Typedefs

typedef struct linkedlist_datablock_internal_s linkedlist_datablock_internal
 
typedef struct linkedlist_data_s linkedlist_data
 

Functions

local linkedlist_datablock_internalallocate_new_datablock ()
 
local void free_datablock (linkedlist_datablock_internal *ldi)
 
local void init_linkedlist (linkedlist_data *ll)
 
local void free_linkedlist (linkedlist_data *ll)
 
local int add_data_in_datablock (linkedlist_data *ll, const void *buf, uLong len)
 
local int ziplocal_putValue OF ((const zlib_filefunc_def *pzlib_filefunc_def, voidpf filestream, uLong x, int nbByte))
 
local int ziplocal_putValue (zlib_filefunc_def *pzlib_filefunc_def, voidpf filestream, uLong x, int nbByte) const
 
local void ziplocal_putValue_inmemory OF ((void *dest, uLong x, int nbByte))
 
local void ziplocal_putValue_inmemory (void *dest, uLong x, int nbByte)
 
local uLong ziplocal_TmzDateToDosDate (tm_zip *ptm, uLong dosDate) const
 
local int ziplocal_getByte OF ((const zlib_filefunc_def *pzlib_filefunc_def, voidpf filestream, int *pi))
 
local int ziplocal_getByte (zlib_filefunc_def *pzlib_filefunc_def, voidpf filestream, int *pi) const
 
local int ziplocal_getShort OF ((const zlib_filefunc_def *pzlib_filefunc_def, voidpf filestream, uLong *pX))
 
local int ziplocal_getShort (zlib_filefunc_def *pzlib_filefunc_def, voidpf filestream, uLong *pX) const
 
local int ziplocal_getLong (zlib_filefunc_def *pzlib_filefunc_def, voidpf filestream, uLong *pX) const
 
local uLong ziplocal_SearchCentralDir OF ((const zlib_filefunc_def *pzlib_filefunc_def, voidpf filestream))
 
local uLong ziplocal_SearchCentralDir (zlib_filefunc_def *pzlib_filefunc_def, voidpf filestream) const
 
zipFile ZEXPORT zipOpen2 (char *pathname, int append, zipcharpc *globalcomment, zlib_filefunc_def *pzlib_filefunc_def) const
 
zipFile ZEXPORT zipOpen (char *pathname, int append) const
 
int ZEXPORT zipOpenNewFileInZip3 (zipFile file, const char *filename, const zip_fileinfo *zipfi, const void *extrafield_local, uInt size_extrafield_local, const void *extrafield_global, uInt size_extrafield_global, const char *comment, int method, int level, int raw, int windowBits, int memLevel, int strategy, const char *password, uLong crcForCrypting)
 
int ZEXPORT zipOpenNewFileInZip2 (zipFile file, const char *filename, const zip_fileinfo *zipfi, const void *extrafield_local, uInt size_extrafield_local, const void *extrafield_global, uInt size_extrafield_global, const char *comment, int method, int level, int raw)
 
int ZEXPORT zipOpenNewFileInZip (zipFile file, const char *filename, const zip_fileinfo *zipfi, const void *extrafield_local, uInt size_extrafield_local, const void *extrafield_global, uInt size_extrafield_global, const char *comment, int method, int level)
 
local int zipFlushWriteBuffer (zip_internal *zi)
 
int ZEXPORT zipWriteInFileInZip (zipFile file, const void *buf, unsigned len)
 
int ZEXPORT zipCloseFileInZipRaw (zipFile file, uLong uncompressed_size, uLong crc32)
 
int ZEXPORT zipCloseFileInZip (zipFile file)
 
int ZEXPORT zipClose (zipFile file, const char *global_comment)
 

Variables

const char zip_copyright []
 

Macro Definition Documentation

◆ ALLOC

#define ALLOC (   size)    (malloc(size))

Definition at line 50 of file zip.c.

◆ BUFREADCOMMENT

#define BUFREADCOMMENT   (0x400)

Definition at line 430 of file zip.c.

◆ CENTRALHEADERMAGIC

#define CENTRALHEADERMAGIC   (0x02014b50)

Definition at line 89 of file zip.c.

◆ CRC_LOCALHEADER_OFFSET

#define CRC_LOCALHEADER_OFFSET   (0x0e)

Definition at line 93 of file zip.c.

◆ ENDHEADERMAGIC

#define ENDHEADERMAGIC   (0x06054b50)

Definition at line 90 of file zip.c.

◆ FLAG_LOCALHEADER_OFFSET

#define FLAG_LOCALHEADER_OFFSET   (0x06)

Definition at line 92 of file zip.c.

◆ INCLUDECRYPTINGCODE_IFCRYPTALLOWED

#define INCLUDECRYPTINGCODE_IFCRYPTALLOWED

Definition at line 157 of file zip.c.

◆ local

#define local   static

Definition at line 33 of file zip.c.

◆ LOCALHEADERMAGIC

#define LOCALHEADERMAGIC   (0x04034b50)

Definition at line 88 of file zip.c.

◆ SEEK_CUR

#define SEEK_CUR   1

Definition at line 64 of file zip.c.

◆ SEEK_END

#define SEEK_END   2

Definition at line 68 of file zip.c.

◆ SEEK_SET

#define SEEK_SET   0

Definition at line 72 of file zip.c.

◆ SIZECENTRALHEADER

#define SIZECENTRALHEADER   (0x2e) /* 46 */

Definition at line 95 of file zip.c.

◆ SIZEDATA_INDATABLOCK

#define SIZEDATA_INDATABLOCK   (4096-(4*4))

Definition at line 86 of file zip.c.

◆ TRYFREE

#define TRYFREE (   p)    {if (p) free(p);}

Definition at line 53 of file zip.c.

◆ VERSIONMADEBY

#define VERSIONMADEBY   (0x0) /* platform depedent */

Definition at line 38 of file zip.c.

◆ Z_BUFSIZE

#define Z_BUFSIZE   (16384)

Definition at line 42 of file zip.c.

◆ Z_MAXFILENAMEINZIP

#define Z_MAXFILENAMEINZIP   (256)

Definition at line 46 of file zip.c.

Typedef Documentation

◆ linkedlist_data

◆ linkedlist_datablock_internal

Function Documentation

◆ add_data_in_datablock()

local int add_data_in_datablock ( linkedlist_data ll,
const void*  buf,
uLong  len 
)

Definition at line 200 of file zip.c.

204 {
206  const unsigned char* from_copy;
207 
208  if (ll==NULL)
209  return ZIP_INTERNALERROR;
210 
211  if (ll->last_block == NULL)
212  {
214  if (ll->first_block == NULL)
215  return ZIP_INTERNALERROR;
216  }
217 
218  ldi = ll->last_block;
219  from_copy = (unsigned char*)buf;
220 
221  while (len>0)
222  {
223  uInt copy_this;
224  uInt i;
225  unsigned char* to_copy;
226 
227  if (ldi->avail_in_this_block==0)
228  {
230  if (ldi->next_datablock == NULL)
231  return ZIP_INTERNALERROR;
232  ldi = ldi->next_datablock ;
233  ll->last_block = ldi;
234  }
235 
236  if (ldi->avail_in_this_block < len)
237  copy_this = (uInt)ldi->avail_in_this_block;
238  else
239  copy_this = (uInt)len;
240 
241  to_copy = &(ldi->data[ldi->filled_in_this_block]);
242 
243  for (i=0;i<copy_this;i++)
244  *(to_copy+i)=*(from_copy+i);
245 
246  ldi->filled_in_this_block += copy_this;
247  ldi->avail_in_this_block -= copy_this;
248  from_copy += copy_this ;
249  len -= copy_this;
250  }
251  return ZIP_OK;
252 }
linkedlist_datablock_internal * first_block
Definition: zip.c:108
#define ZIP_INTERNALERROR
Definition: zip.h:75
linkedlist_datablock_internal * last_block
Definition: zip.c:109
local linkedlist_datablock_internal * allocate_new_datablock()
Definition: zip.c:161
voidpf void * buf
Definition: ioapi.h:39
unsigned char data[SIZEDATA_INDATABLOCK]
Definition: zip.c:103
#define ZIP_OK
Definition: zip.h:70
struct linkedlist_datablock_internal_s * next_datablock
Definition: zip.c:99

◆ allocate_new_datablock()

local linkedlist_datablock_internal* allocate_new_datablock ( )

Definition at line 161 of file zip.c.

162 {
166  if (ldi!=NULL)
167  {
168  ldi->next_datablock = NULL ;
169  ldi->filled_in_this_block = 0 ;
171  }
172  return ldi;
173 }
#define ALLOC(size)
Definition: zip.c:50
#define SIZEDATA_INDATABLOCK
Definition: zip.c:86
struct linkedlist_datablock_internal_s * next_datablock
Definition: zip.c:99

◆ free_datablock()

local void free_datablock ( linkedlist_datablock_internal ldi)

Definition at line 175 of file zip.c.

177 {
178  while (ldi!=NULL)
179  {
181  TRYFREE(ldi);
182  ldi = ldinext;
183  }
184 }
#define TRYFREE(p)
Definition: zip.c:53
struct linkedlist_datablock_internal_s * next_datablock
Definition: zip.c:99

◆ free_linkedlist()

local void free_linkedlist ( linkedlist_data ll)

Definition at line 192 of file zip.c.

194 {
196  ll->first_block = ll->last_block = NULL;
197 }
linkedlist_datablock_internal * first_block
Definition: zip.c:108
local void free_datablock(linkedlist_datablock_internal *ldi)
Definition: zip.c:175
linkedlist_datablock_internal * last_block
Definition: zip.c:109

◆ init_linkedlist()

local void init_linkedlist ( linkedlist_data ll)

Definition at line 186 of file zip.c.

188 {
189  ll->first_block = ll->last_block = NULL;
190 }
linkedlist_datablock_internal * first_block
Definition: zip.c:108
linkedlist_datablock_internal * last_block
Definition: zip.c:109

◆ OF() [1/5]

local int ziplocal_putValue OF ( (const zlib_filefunc_def *pzlib_filefunc_def, voidpf filestream, uLong x, int nbByte)  )

◆ OF() [2/5]

local void ziplocal_putValue_inmemory OF ( (void *dest, uLong x, int nbByte)  )

◆ OF() [3/5]

local int ziplocal_getByte OF ( (const zlib_filefunc_def *pzlib_filefunc_def, voidpf filestream, int *pi)  )

◆ OF() [4/5]

local int ziplocal_getShort OF ( (const zlib_filefunc_def *pzlib_filefunc_def, voidpf filestream, uLong *pX)  )

◆ OF() [5/5]

local uLong ziplocal_SearchCentralDir OF ( (const zlib_filefunc_def *pzlib_filefunc_def, voidpf filestream)  )

◆ zipClose()

int ZEXPORT zipClose ( zipFile  file,
const char*  global_comment 
)

Definition at line 1133 of file zip.c.

1136 {
1137  zip_internal* zi;
1138  int err = 0;
1139  uLong size_centraldir = 0;
1140  uLong centraldir_pos_inzip;
1141  uInt size_global_comment;
1142  if (file == NULL)
1143  return ZIP_PARAMERROR;
1144  zi = (zip_internal*)file;
1145 
1146  if (zi->in_opened_file_inzip == 1)
1147  {
1148  err = zipCloseFileInZip (file);
1149  }
1150 
1151 #ifndef NO_ADDFILEINEXISTINGZIP
1152  if (global_comment==NULL)
1153  global_comment = zi->globalcomment;
1154 #endif
1155  if (global_comment==NULL)
1156  size_global_comment = 0;
1157  else
1158  size_global_comment = (uInt)strlen(global_comment);
1159 
1160  centraldir_pos_inzip = ZTELL(zi->z_filefunc,zi->filestream);
1161  if (err==ZIP_OK)
1162  {
1164  while (ldi!=NULL)
1165  {
1166  if ((err==ZIP_OK) && (ldi->filled_in_this_block>0))
1167  if (ZWRITE(zi->z_filefunc,zi->filestream,
1168  ldi->data,ldi->filled_in_this_block)
1169  !=ldi->filled_in_this_block )
1170  err = ZIP_ERRNO;
1171 
1172  size_centraldir += ldi->filled_in_this_block;
1173  ldi = ldi->next_datablock;
1174  }
1175  }
1177 
1178  if (err==ZIP_OK) /* Magic End */
1180 
1181  if (err==ZIP_OK) /* number of this disk */
1182  err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)0,2);
1183 
1184  if (err==ZIP_OK) /* number of the disk with the start of the central directory */
1185  err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)0,2);
1186 
1187  if (err==ZIP_OK) /* total number of entries in the central dir on this disk */
1188  err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)zi->number_entry,2);
1189 
1190  if (err==ZIP_OK) /* total number of entries in the central dir */
1191  err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)zi->number_entry,2);
1192 
1193  if (err==ZIP_OK) /* size of the central directory */
1194  err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)size_centraldir,4);
1195 
1196  if (err==ZIP_OK) /* offset of start of central directory with respect to the
1197  starting disk number */
1198  err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,
1199  (uLong)(centraldir_pos_inzip - zi->add_position_when_writting_offset),4);
1200 
1201  if (err==ZIP_OK) /* zipfile comment length */
1202  err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)size_global_comment,2);
1203 
1204  if ((err==ZIP_OK) && (size_global_comment>0))
1205  if (ZWRITE(zi->z_filefunc,zi->filestream,
1206  global_comment,size_global_comment) != size_global_comment)
1207  err = ZIP_ERRNO;
1208 
1209  if (ZCLOSE(zi->z_filefunc,zi->filestream) != 0)
1210  if (err == ZIP_OK)
1211  err = ZIP_ERRNO;
1212 
1213 #ifndef NO_ADDFILEINEXISTINGZIP
1214  TRYFREE(zi->globalcomment);
1215 #endif
1216  TRYFREE(zi);
1217 
1218  return err;
1219 }
linkedlist_data central_dir
Definition: zip.c:142
linkedlist_datablock_internal * first_block
Definition: zip.c:108
#define ZCLOSE(filefunc, filestream)
Definition: ioapi.h:66
#define ZIP_ERRNO
Definition: zip.h:72
#define ENDHEADERMAGIC
Definition: zip.c:90
local int ziplocal_putValue(zlib_filefunc_def *pzlib_filefunc_def, voidpf filestream, uLong x, int nbByte) const
Definition: zip.c:266
uLong number_entry
Definition: zip.c:148
typedef uLong(ZCALLBACK *read_file_func) OF((voidpf opaque
#define ZTELL(filefunc, filestream)
Definition: ioapi.h:64
local void free_datablock(linkedlist_datablock_internal *ldi)
Definition: zip.c:175
voidpf filestream
Definition: zip.c:141
#define TRYFREE(p)
Definition: zip.c:53
int ZEXPORT zipCloseFileInZip(zipFile file)
Definition: zip.c:1127
char * globalcomment
Definition: zip.c:150
uLong add_position_when_writting_offset
Definition: zip.c:147
#define ZWRITE(filefunc, filestream, buf, size)
Definition: ioapi.h:63
unsigned char data[SIZEDATA_INDATABLOCK]
Definition: zip.c:103
#define ZIP_OK
Definition: zip.h:70
struct linkedlist_datablock_internal_s * next_datablock
Definition: zip.c:99
int in_opened_file_inzip
Definition: zip.c:143
#define ZIP_PARAMERROR
Definition: zip.h:73
zlib_filefunc_def z_filefunc
Definition: zip.c:140

◆ zipCloseFileInZip()

int ZEXPORT zipCloseFileInZip ( zipFile  file)

Definition at line 1127 of file zip.c.

1129 {
1130  return zipCloseFileInZipRaw (file,0,0);
1131 }
int ZEXPORT zipCloseFileInZipRaw(zipFile file, uLong uncompressed_size, uLong crc32)
Definition: zip.c:1031

◆ zipCloseFileInZipRaw()

int ZEXPORT zipCloseFileInZipRaw ( zipFile  file,
uLong  uncompressed_size,
uLong  crc32 
)

Definition at line 1031 of file zip.c.

1035 {
1036  zip_internal* zi;
1037  uLong compressed_size;
1038  int err=ZIP_OK;
1039 
1040  if (file == NULL)
1041  return ZIP_PARAMERROR;
1042  zi = (zip_internal*)file;
1043 
1044  if (zi->in_opened_file_inzip == 0)
1045  return ZIP_PARAMERROR;
1046  zi->ci.stream.avail_in = 0;
1047 
1048  if ((zi->ci.method == Z_DEFLATED) && (!zi->ci.raw))
1049  while (err==ZIP_OK)
1050  {
1051  uLong uTotalOutBefore;
1052  if (zi->ci.stream.avail_out == 0)
1053  {
1054  if (zipFlushWriteBuffer(zi) == ZIP_ERRNO)
1055  err = ZIP_ERRNO;
1056  zi->ci.stream.avail_out = (uInt)Z_BUFSIZE;
1057  zi->ci.stream.next_out = zi->ci.buffered_data;
1058  }
1059  uTotalOutBefore = zi->ci.stream.total_out;
1060  err=deflate(&zi->ci.stream, Z_FINISH);
1061  zi->ci.pos_in_buffered_data += (uInt)(zi->ci.stream.total_out - uTotalOutBefore) ;
1062  }
1063 
1064  if (err==Z_STREAM_END)
1065  err=ZIP_OK; /* this is normal */
1066 
1067  if ((zi->ci.pos_in_buffered_data>0) && (err==ZIP_OK))
1068  if (zipFlushWriteBuffer(zi)==ZIP_ERRNO)
1069  err = ZIP_ERRNO;
1070 
1071  if ((zi->ci.method == Z_DEFLATED) && (!zi->ci.raw))
1072  {
1073  err=deflateEnd(&zi->ci.stream);
1074  zi->ci.stream_initialised = 0;
1075  }
1076 
1077  if (!zi->ci.raw)
1078  {
1079  crc32 = (uLong)zi->ci.crc32;
1080  uncompressed_size = (uLong)zi->ci.stream.total_in;
1081  }
1082  compressed_size = (uLong)zi->ci.stream.total_out;
1083 # ifndef NOCRYPT
1084  compressed_size += zi->ci.crypt_header_size;
1085 # endif
1086 
1087  ziplocal_putValue_inmemory(zi->ci.central_header+16,crc32,4); /*crc*/
1089  compressed_size,4); /*compr size*/
1090  if (zi->ci.stream.data_type == Z_ASCII)
1093  uncompressed_size,4); /*uncompr size*/
1094 
1095  if (err==ZIP_OK)
1097  (uLong)zi->ci.size_centralheader);
1098  free(zi->ci.central_header);
1099 
1100  if (err==ZIP_OK)
1101  {
1102  long cur_pos_inzip = ZTELL(zi->z_filefunc,zi->filestream);
1103  if (ZSEEK(zi->z_filefunc,zi->filestream,
1105  err = ZIP_ERRNO;
1106 
1107  if (err==ZIP_OK)
1108  err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,crc32,4); /* crc 32, unknown */
1109 
1110  if (err==ZIP_OK) /* compressed size, unknown */
1111  err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,compressed_size,4);
1112 
1113  if (err==ZIP_OK) /* uncompressed size, unknown */
1114  err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,uncompressed_size,4);
1115 
1116  if (ZSEEK(zi->z_filefunc,zi->filestream,
1117  cur_pos_inzip,ZLIB_FILEFUNC_SEEK_SET)!=0)
1118  err = ZIP_ERRNO;
1119  }
1120 
1121  zi->number_entry ++;
1122  zi->in_opened_file_inzip = 0;
1123 
1124  return err;
1125 }
uInt pos_in_buffered_data
Definition: zip.c:117
linkedlist_data central_dir
Definition: zip.c:142
#define ZIP_ERRNO
Definition: zip.h:72
z_stream stream
Definition: zip.c:115
local int ziplocal_putValue(zlib_filefunc_def *pzlib_filefunc_def, voidpf filestream, uLong x, int nbByte) const
Definition: zip.c:266
uLong number_entry
Definition: zip.c:148
local void ziplocal_putValue_inmemory(void *dest, uLong x, int nbByte)
Definition: zip.c:294
int crypt_header_size
Definition: zip.c:134
typedef uLong(ZCALLBACK *read_file_func) OF((voidpf opaque
#define ZTELL(filefunc, filestream)
Definition: ioapi.h:64
Byte buffered_data[Z_BUFSIZE]
Definition: zip.c:127
uLong pos_local_header
Definition: zip.c:119
voidpf filestream
Definition: zip.c:141
#define Z_BUFSIZE
Definition: zip.c:42
curfile_info ci
Definition: zip.c:144
#define ZLIB_FILEFUNC_SEEK_SET
Definition: ioapi.h:15
local int zipFlushWriteBuffer(zip_internal *zi)
Definition: zip.c:944
uLong size_centralheader
Definition: zip.c:122
local int add_data_in_datablock(linkedlist_data *ll, const void *buf, uLong len)
Definition: zip.c:200
int stream_initialised
Definition: zip.c:116
uLong crc32
Definition: zip.c:129
int method
Definition: zip.c:125
int raw
Definition: zip.c:126
#define ZIP_OK
Definition: zip.h:70
int in_opened_file_inzip
Definition: zip.c:143
#define ZIP_PARAMERROR
Definition: zip.h:73
zlib_filefunc_def z_filefunc
Definition: zip.c:140
char * central_header
Definition: zip.c:121
#define ZSEEK(filefunc, filestream, pos, mode)
Definition: ioapi.h:65

◆ zipFlushWriteBuffer()

local int zipFlushWriteBuffer ( zip_internal zi)

Definition at line 944 of file zip.c.

946 {
947  int err=ZIP_OK;
948 
949  if (zi->ci.encrypt != 0)
950  {
951 #ifndef NOCRYPT
952  uInt i;
953  int t;
954  for (i=0;i<zi->ci.pos_in_buffered_data;i++)
955  zi->ci.buffered_data[i] = zencode(zi->ci.keys, zi->ci.pcrc_32_tab,
956  zi->ci.buffered_data[i],t);
957 #endif
958  }
960  !=zi->ci.pos_in_buffered_data)
961  err = ZIP_ERRNO;
962  zi->ci.pos_in_buffered_data = 0;
963  return err;
964 }
uInt pos_in_buffered_data
Definition: zip.c:117
#define ZIP_ERRNO
Definition: zip.h:72
int encrypt
Definition: zip.c:130
Byte buffered_data[Z_BUFSIZE]
Definition: zip.c:127
voidpf filestream
Definition: zip.c:141
curfile_info ci
Definition: zip.c:144
unsigned long keys[3]
Definition: zip.c:132
#define ZWRITE(filefunc, filestream, buf, size)
Definition: ioapi.h:63
#define ZIP_OK
Definition: zip.h:70
const unsigned long * pcrc_32_tab
Definition: zip.c:133
zlib_filefunc_def z_filefunc
Definition: zip.c:140
#define zencode(pkeys, pcrc_32_tab, c, t)
Definition: crypt.h:79

◆ ziplocal_getByte()

local int ziplocal_getByte ( zlib_filefunc_def pzlib_filefunc_def,
voidpf  filestream,
int pi 
) const

Definition at line 340 of file zip.c.

344 {
345  unsigned char c;
346  int err = (int)ZREAD(*pzlib_filefunc_def,filestream,&c,1);
347  if (err==1)
348  {
349  *pi = (int)c;
350  return ZIP_OK;
351  }
352  else
353  {
354  if (ZERROR(*pzlib_filefunc_def,filestream))
355  return ZIP_ERRNO;
356  else
357  return ZIP_EOF;
358  }
359 }
#define ZIP_ERRNO
Definition: zip.h:72
#define ZERROR(filefunc, filestream)
Definition: ioapi.h:67
typedef int(ZCALLBACK *close_file_func) OF((voidpf opaque
#define ZIP_EOF
Definition: zip.h:71
#define ZIP_OK
Definition: zip.h:70
#define ZREAD(filefunc, filestream, buf, size)
Definition: ioapi.h:62

◆ ziplocal_getLong()

local int ziplocal_getLong ( zlib_filefunc_def pzlib_filefunc_def,
voidpf  filestream,
uLong pX 
) const

Definition at line 398 of file zip.c.

402 {
403  uLong x ;
404  int i;
405  int err;
406 
407  err = ziplocal_getByte(pzlib_filefunc_def,filestream,&i);
408  x = (uLong)i;
409 
410  if (err==ZIP_OK)
411  err = ziplocal_getByte(pzlib_filefunc_def,filestream,&i);
412  x += ((uLong)i)<<8;
413 
414  if (err==ZIP_OK)
415  err = ziplocal_getByte(pzlib_filefunc_def,filestream,&i);
416  x += ((uLong)i)<<16;
417 
418  if (err==ZIP_OK)
419  err = ziplocal_getByte(pzlib_filefunc_def,filestream,&i);
420  x += ((uLong)i)<<24;
421 
422  if (err==ZIP_OK)
423  *pX = x;
424  else
425  *pX = 0;
426  return err;
427 }
typedef uLong(ZCALLBACK *read_file_func) OF((voidpf opaque
local int ziplocal_getByte(zlib_filefunc_def *pzlib_filefunc_def, voidpf filestream, int *pi) const
Definition: zip.c:340
#define ZIP_OK
Definition: zip.h:70

◆ ziplocal_getShort()

local int ziplocal_getShort ( zlib_filefunc_def pzlib_filefunc_def,
voidpf  filestream,
uLong pX 
) const

Definition at line 370 of file zip.c.

374 {
375  uLong x ;
376  int i;
377  int err;
378 
379  err = ziplocal_getByte(pzlib_filefunc_def,filestream,&i);
380  x = (uLong)i;
381 
382  if (err==ZIP_OK)
383  err = ziplocal_getByte(pzlib_filefunc_def,filestream,&i);
384  x += ((uLong)i)<<8;
385 
386  if (err==ZIP_OK)
387  *pX = x;
388  else
389  *pX = 0;
390  return err;
391 }
typedef uLong(ZCALLBACK *read_file_func) OF((voidpf opaque
local int ziplocal_getByte(zlib_filefunc_def *pzlib_filefunc_def, voidpf filestream, int *pi) const
Definition: zip.c:340
#define ZIP_OK
Definition: zip.h:70

◆ ziplocal_putValue()

local int ziplocal_putValue ( zlib_filefunc_def pzlib_filefunc_def,
voidpf  filestream,
uLong  x,
int  nbByte 
) const

Definition at line 266 of file zip.c.

271 {
272  unsigned char buf[4];
273  int n;
274  for (n = 0; n < nbByte; n++)
275  {
276  buf[n] = (unsigned char)(x & 0xff);
277  x >>= 8;
278  }
279  if (x != 0)
280  { /* data overflow - hack for ZIP64 (X Roche) */
281  for (n = 0; n < nbByte; n++)
282  {
283  buf[n] = 0xff;
284  }
285  }
286 
287  if (ZWRITE(*pzlib_filefunc_def,filestream,buf,nbByte)!=(uLong)nbByte)
288  return ZIP_ERRNO;
289  else
290  return ZIP_OK;
291 }
#define ZIP_ERRNO
Definition: zip.h:72
typedef uLong(ZCALLBACK *read_file_func) OF((voidpf opaque
voidpf void * buf
Definition: ioapi.h:39
#define ZWRITE(filefunc, filestream, buf, size)
Definition: ioapi.h:63
#define ZIP_OK
Definition: zip.h:70

◆ ziplocal_putValue_inmemory()

local void ziplocal_putValue_inmemory ( void*  dest,
uLong  x,
int  nbByte 
)

Definition at line 294 of file zip.c.

298 {
299  unsigned char* buf=(unsigned char*)dest;
300  int n;
301  for (n = 0; n < nbByte; n++) {
302  buf[n] = (unsigned char)(x & 0xff);
303  x >>= 8;
304  }
305 
306  if (x != 0)
307  { /* data overflow - hack for ZIP64 */
308  for (n = 0; n < nbByte; n++)
309  {
310  buf[n] = 0xff;
311  }
312  }
313 }
voidpf void * buf
Definition: ioapi.h:39

◆ ziplocal_SearchCentralDir()

local uLong ziplocal_SearchCentralDir ( zlib_filefunc_def pzlib_filefunc_def,
voidpf  filestream 
) const

Definition at line 440 of file zip.c.

443 {
444  unsigned char* buf;
445  uLong uSizeFile;
446  uLong uBackRead;
447  uLong uMaxBack=0xffff; /* maximum size of global comment */
448  uLong uPosFound=0;
449 
450  if (ZSEEK(*pzlib_filefunc_def,filestream,0,ZLIB_FILEFUNC_SEEK_END) != 0)
451  return 0;
452 
453 
454  uSizeFile = ZTELL(*pzlib_filefunc_def,filestream);
455 
456  if (uMaxBack>uSizeFile)
457  uMaxBack = uSizeFile;
458 
459  buf = (unsigned char*)ALLOC(BUFREADCOMMENT+4);
460  if (buf==NULL)
461  return 0;
462 
463  uBackRead = 4;
464  while (uBackRead<uMaxBack)
465  {
466  uLong uReadSize,uReadPos ;
467  int i;
468  if (uBackRead+BUFREADCOMMENT>uMaxBack)
469  uBackRead = uMaxBack;
470  else
471  uBackRead+=BUFREADCOMMENT;
472  uReadPos = uSizeFile-uBackRead ;
473 
474  uReadSize = ((BUFREADCOMMENT+4) < (uSizeFile-uReadPos)) ?
475  (BUFREADCOMMENT+4) : (uSizeFile-uReadPos);
476  if (ZSEEK(*pzlib_filefunc_def,filestream,uReadPos,ZLIB_FILEFUNC_SEEK_SET)!=0)
477  break;
478 
479  if (ZREAD(*pzlib_filefunc_def,filestream,buf,uReadSize)!=uReadSize)
480  break;
481 
482  for (i=(int)uReadSize-3; (i--)>0;)
483  if (((*(buf+i))==0x50) && ((*(buf+i+1))==0x4b) &&
484  ((*(buf+i+2))==0x05) && ((*(buf+i+3))==0x06))
485  {
486  uPosFound = uReadPos+i;
487  break;
488  }
489 
490  if (uPosFound!=0)
491  break;
492  }
493  TRYFREE(buf);
494  return uPosFound;
495 }
#define ALLOC(size)
Definition: zip.c:50
typedef uLong(ZCALLBACK *read_file_func) OF((voidpf opaque
#define ZTELL(filefunc, filestream)
Definition: ioapi.h:64
#define TRYFREE(p)
Definition: zip.c:53
#define BUFREADCOMMENT
Definition: zip.c:430
#define ZLIB_FILEFUNC_SEEK_SET
Definition: ioapi.h:15
#define ZLIB_FILEFUNC_SEEK_END
Definition: ioapi.h:14
voidpf void * buf
Definition: ioapi.h:39
#define ZREAD(filefunc, filestream, buf, size)
Definition: ioapi.h:62
#define ZSEEK(filefunc, filestream, pos, mode)
Definition: ioapi.h:65

◆ ziplocal_TmzDateToDosDate()

local uLong ziplocal_TmzDateToDosDate ( tm_zip ptm,
uLong  dosDate 
) const

Definition at line 318 of file zip.c.

321 {
322  uLong year = (uLong)ptm->tm_year;
323  if (year>1980)
324  year-=1980;
325  else if (year>80)
326  year-=80;
327  return
328  (uLong) (((ptm->tm_mday) + (32 * (ptm->tm_mon+1)) + (512 * year)) << 16) |
329  ((ptm->tm_sec/2) + (32* ptm->tm_min) + (2048 * (uLong)ptm->tm_hour));
330 }
uInt tm_min
Definition: zip.h:90
typedef uLong(ZCALLBACK *read_file_func) OF((voidpf opaque
uInt tm_mday
Definition: zip.h:92
uInt tm_mon
Definition: zip.h:93
uInt tm_year
Definition: zip.h:94
uInt tm_hour
Definition: zip.h:91
uInt tm_sec
Definition: zip.h:89

◆ zipOpen()

zipFile ZEXPORT zipOpen ( char *  pathname,
int  append 
) const

Definition at line 683 of file zip.c.

686 {
687  return zipOpen2(pathname,append,NULL,NULL);
688 }
zipFile ZEXPORT zipOpen2(char *pathname, int append, zipcharpc *globalcomment, zlib_filefunc_def *pzlib_filefunc_def) const
Definition: zip.c:499

◆ zipOpen2()

zipFile ZEXPORT zipOpen2 ( char *  pathname,
int  append,
zipcharpc globalcomment,
zlib_filefunc_def pzlib_filefunc_def 
) const

Definition at line 499 of file zip.c.

504 {
505  zip_internal ziinit;
506  zip_internal* zi;
507  int err=ZIP_OK;
508 
509 
510  if (pzlib_filefunc_def==NULL)
512  else
513  ziinit.z_filefunc = *pzlib_filefunc_def;
514 
515  ziinit.filestream = (*(ziinit.z_filefunc.zopen_file))
516  (ziinit.z_filefunc.opaque,
517  pathname,
518  (append == APPEND_STATUS_CREATE) ?
521 
522  if (ziinit.filestream == NULL)
523  return NULL;
524  ziinit.begin_pos = ZTELL(ziinit.z_filefunc,ziinit.filestream);
525  ziinit.in_opened_file_inzip = 0;
526  ziinit.ci.stream_initialised = 0;
527  ziinit.number_entry = 0;
529  init_linkedlist(&(ziinit.central_dir));
530 
531 
532  zi = (zip_internal*)ALLOC(sizeof(zip_internal));
533  if (zi==NULL)
534  {
535  ZCLOSE(ziinit.z_filefunc,ziinit.filestream);
536  return NULL;
537  }
538 
539  /* now we add file in a zipfile */
540 # ifndef NO_ADDFILEINEXISTINGZIP
541  ziinit.globalcomment = NULL;
542  if (append == APPEND_STATUS_ADDINZIP)
543  {
544  uLong byte_before_the_zipfile;/* byte before the zipfile, (>0 for sfx)*/
545 
546  uLong size_central_dir; /* size of the central directory */
547  uLong offset_central_dir; /* offset of start of central directory */
548  uLong central_pos,uL;
549 
550  uLong number_disk; /* number of the current dist, used for
551  spaning ZIP, unsupported, always 0*/
552  uLong number_disk_with_CD; /* number the the disk with central dir, used
553  for spaning ZIP, unsupported, always 0*/
554  uLong number_entry;
555  uLong number_entry_CD; /* total number of entries in
556  the central dir
557  (same than number_entry on nospan) */
558  uLong size_comment;
559 
560  central_pos = ziplocal_SearchCentralDir(&ziinit.z_filefunc,ziinit.filestream);
561  if (central_pos==0)
562  err=ZIP_ERRNO;
563 
564  if (ZSEEK(ziinit.z_filefunc, ziinit.filestream,
565  central_pos,ZLIB_FILEFUNC_SEEK_SET)!=0)
566  err=ZIP_ERRNO;
567 
568  /* the signature, already checked */
569  if (ziplocal_getLong(&ziinit.z_filefunc, ziinit.filestream,&uL)!=ZIP_OK)
570  err=ZIP_ERRNO;
571 
572  /* number of this disk */
573  if (ziplocal_getShort(&ziinit.z_filefunc, ziinit.filestream,&number_disk)!=ZIP_OK)
574  err=ZIP_ERRNO;
575 
576  /* number of the disk with the start of the central directory */
577  if (ziplocal_getShort(&ziinit.z_filefunc, ziinit.filestream,&number_disk_with_CD)!=ZIP_OK)
578  err=ZIP_ERRNO;
579 
580  /* total number of entries in the central dir on this disk */
581  if (ziplocal_getShort(&ziinit.z_filefunc, ziinit.filestream,&number_entry)!=ZIP_OK)
582  err=ZIP_ERRNO;
583 
584  /* total number of entries in the central dir */
585  if (ziplocal_getShort(&ziinit.z_filefunc, ziinit.filestream,&number_entry_CD)!=ZIP_OK)
586  err=ZIP_ERRNO;
587 
588  if ((number_entry_CD!=number_entry) ||
589  (number_disk_with_CD!=0) ||
590  (number_disk!=0))
591  err=ZIP_BADZIPFILE;
592 
593  /* size of the central directory */
594  if (ziplocal_getLong(&ziinit.z_filefunc, ziinit.filestream,&size_central_dir)!=ZIP_OK)
595  err=ZIP_ERRNO;
596 
597  /* offset of start of central directory with respect to the
598  starting disk number */
599  if (ziplocal_getLong(&ziinit.z_filefunc, ziinit.filestream,&offset_central_dir)!=ZIP_OK)
600  err=ZIP_ERRNO;
601 
602  /* zipfile global comment length */
603  if (ziplocal_getShort(&ziinit.z_filefunc, ziinit.filestream,&size_comment)!=ZIP_OK)
604  err=ZIP_ERRNO;
605 
606  if ((central_pos<offset_central_dir+size_central_dir) &&
607  (err==ZIP_OK))
608  err=ZIP_BADZIPFILE;
609 
610  if (err!=ZIP_OK)
611  {
612  ZCLOSE(ziinit.z_filefunc, ziinit.filestream);
613  return NULL;
614  }
615 
616  if (size_comment>0)
617  {
618  ziinit.globalcomment = ALLOC(size_comment+1);
619  if (ziinit.globalcomment)
620  {
621  size_comment = ZREAD(ziinit.z_filefunc, ziinit.filestream,ziinit.globalcomment,size_comment);
622  ziinit.globalcomment[size_comment]=0;
623  }
624  }
625 
626  byte_before_the_zipfile = central_pos -
627  (offset_central_dir+size_central_dir);
628  ziinit.add_position_when_writting_offset = byte_before_the_zipfile;
629 
630  {
631  uLong size_central_dir_to_read = size_central_dir;
632  size_t buf_size = SIZEDATA_INDATABLOCK;
633  void* buf_read = (void*)ALLOC(buf_size);
634  if (ZSEEK(ziinit.z_filefunc, ziinit.filestream,
635  offset_central_dir + byte_before_the_zipfile,
637  err=ZIP_ERRNO;
638 
639  while ((size_central_dir_to_read>0) && (err==ZIP_OK))
640  {
641  uLong read_this = SIZEDATA_INDATABLOCK;
642  if (read_this > size_central_dir_to_read)
643  read_this = size_central_dir_to_read;
644  if (ZREAD(ziinit.z_filefunc, ziinit.filestream,buf_read,read_this) != read_this)
645  err=ZIP_ERRNO;
646 
647  if (err==ZIP_OK)
648  err = add_data_in_datablock(&ziinit.central_dir,buf_read,
649  (uLong)read_this);
650  size_central_dir_to_read-=read_this;
651  }
652  TRYFREE(buf_read);
653  }
654  ziinit.begin_pos = byte_before_the_zipfile;
655  ziinit.number_entry = number_entry_CD;
656 
657  if (ZSEEK(ziinit.z_filefunc, ziinit.filestream,
658  offset_central_dir+byte_before_the_zipfile,ZLIB_FILEFUNC_SEEK_SET)!=0)
659  err=ZIP_ERRNO;
660  }
661 
662  if (globalcomment)
663  {
664  *globalcomment = ziinit.globalcomment;
665  }
666 # endif /* !NO_ADDFILEINEXISTINGZIP*/
667 
668  if (err != ZIP_OK)
669  {
670 # ifndef NO_ADDFILEINEXISTINGZIP
671  TRYFREE(ziinit.globalcomment);
672 # endif /* !NO_ADDFILEINEXISTINGZIP*/
673  TRYFREE(zi);
674  return NULL;
675  }
676  else
677  {
678  *zi = ziinit;
679  return (zipFile)zi;
680  }
681 }
voidpf opaque
Definition: ioapi.h:55
#define ALLOC(size)
Definition: zip.c:50
linkedlist_data central_dir
Definition: zip.c:142
local uLong ziplocal_SearchCentralDir(zlib_filefunc_def *pzlib_filefunc_def, voidpf filestream) const
Definition: zip.c:440
#define ZCLOSE(filefunc, filestream)
Definition: ioapi.h:66
local int ziplocal_getShort(zlib_filefunc_def *pzlib_filefunc_def, voidpf filestream, uLong *pX) const
Definition: zip.c:370
#define ZIP_ERRNO
Definition: zip.h:72
uLong number_entry
Definition: zip.c:148
typedef uLong(ZCALLBACK *read_file_func) OF((voidpf opaque
#define APPEND_STATUS_ADDINZIP
Definition: zip.h:112
#define ZTELL(filefunc, filestream)
Definition: ioapi.h:64
voidpf filestream
Definition: zip.c:141
curfile_info ci
Definition: zip.c:144
#define TRYFREE(p)
Definition: zip.c:53
#define ZLIB_FILEFUNC_MODE_CREATE
Definition: ioapi.h:22
#define ZLIB_FILEFUNC_SEEK_SET
Definition: ioapi.h:15
#define SIZEDATA_INDATABLOCK
Definition: zip.c:86
void fill_fopen_filefunc(zlib_filefunc_def *pzlib_filefunc_def)
Definition: ioapi.c:166
#define ZLIB_FILEFUNC_MODE_WRITE
Definition: ioapi.h:18
local int add_data_in_datablock(linkedlist_data *ll, const void *buf, uLong len)
Definition: zip.c:200
int stream_initialised
Definition: zip.c:116
open_file_func zopen_file
Definition: ioapi.h:48
#define ZIP_BADZIPFILE
Definition: zip.h:74
char * globalcomment
Definition: zip.c:150
uLong add_position_when_writting_offset
Definition: zip.c:147
#define APPEND_STATUS_CREATE
Definition: zip.h:110
local void init_linkedlist(linkedlist_data *ll)
Definition: zip.c:186
#define ZIP_OK
Definition: zip.h:70
uLong begin_pos
Definition: zip.c:146
#define ZLIB_FILEFUNC_MODE_EXISTING
Definition: ioapi.h:21
voidp zipFile
Definition: zip.h:67
#define ZREAD(filefunc, filestream, buf, size)
Definition: ioapi.h:62
int in_opened_file_inzip
Definition: zip.c:143
#define ZLIB_FILEFUNC_MODE_READ
Definition: ioapi.h:17
zlib_filefunc_def z_filefunc
Definition: zip.c:140
#define ZSEEK(filefunc, filestream, pos, mode)
Definition: ioapi.h:65
local int ziplocal_getLong(zlib_filefunc_def *pzlib_filefunc_def, voidpf filestream, uLong *pX) const
Definition: zip.c:398

◆ zipOpenNewFileInZip()

int ZEXPORT zipOpenNewFileInZip ( zipFile  file,
const char*  filename,
const zip_fileinfo zipfi,
const void*  extrafield_local,
uInt  size_extrafield_local,
const void*  extrafield_global,
uInt  size_extrafield_global,
const char*  comment,
int  method,
int  level 
)

Definition at line 923 of file zip.c.

937 {
938  return zipOpenNewFileInZip2 (file, filename, zipfi,
939  extrafield_local, size_extrafield_local,
940  extrafield_global, size_extrafield_global,
941  comment, method, level, 0);
942 }
int ZEXPORT zipOpenNewFileInZip2(zipFile file, const char *filename, const zip_fileinfo *zipfi, const void *extrafield_local, uInt size_extrafield_local, const void *extrafield_global, uInt size_extrafield_global, const char *comment, int method, int level, int raw)
Definition: zip.c:899
const char * filename
Definition: ioapi.h:38

◆ zipOpenNewFileInZip2()

int ZEXPORT zipOpenNewFileInZip2 ( zipFile  file,
const char*  filename,
const zip_fileinfo zipfi,
const void*  extrafield_local,
uInt  size_extrafield_local,
const void*  extrafield_global,
uInt  size_extrafield_global,
const char*  comment,
int  method,
int  level,
int  raw 
)

Definition at line 899 of file zip.c.

914 {
915  return zipOpenNewFileInZip3 (file, filename, zipfi,
916  extrafield_local, size_extrafield_local,
917  extrafield_global, size_extrafield_global,
918  comment, method, level, raw,
919  -MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY,
920  NULL, 0);
921 }
const char * filename
Definition: ioapi.h:38
#define DEF_MEM_LEVEL
Definition: zip.h:81
int ZEXPORT zipOpenNewFileInZip3(zipFile file, const char *filename, const zip_fileinfo *zipfi, const void *extrafield_local, uInt size_extrafield_local, const void *extrafield_global, uInt size_extrafield_global, const char *comment, int method, int level, int raw, int windowBits, int memLevel, int strategy, const char *password, uLong crcForCrypting)
Definition: zip.c:690

◆ zipOpenNewFileInZip3()

int ZEXPORT zipOpenNewFileInZip3 ( zipFile  file,
const char*  filename,
const zip_fileinfo zipfi,
const void*  extrafield_local,
uInt  size_extrafield_local,
const void*  extrafield_global,
uInt  size_extrafield_global,
const char*  comment,
int  method,
int  level,
int  raw,
int  windowBits,
int  memLevel,
int  strategy,
const char*  password,
uLong  crcForCrypting 
)

Definition at line 690 of file zip.c.

712 {
713  zip_internal* zi;
714  uInt size_filename;
715  uInt size_comment;
716  uInt i;
717  int err = ZIP_OK;
718 
719 # ifdef NOCRYPT
720  if (password != NULL)
721  return ZIP_PARAMERROR;
722 # endif
723 
724  if (file == NULL)
725  return ZIP_PARAMERROR;
726  if ((method!=0) && (method!=Z_DEFLATED))
727  return ZIP_PARAMERROR;
728 
729  zi = (zip_internal*)file;
730 
731  if (zi->in_opened_file_inzip == 1)
732  {
733  err = zipCloseFileInZip (file);
734  if (err != ZIP_OK)
735  return err;
736  }
737 
738 
739  if (filename==NULL)
740  filename="-";
741 
742  if (comment==NULL)
743  size_comment = 0;
744  else
745  size_comment = (uInt)strlen(comment);
746 
747  size_filename = (uInt)strlen(filename);
748 
749  if (zipfi == NULL)
750  zi->ci.dosDate = 0;
751  else
752  {
753  if (zipfi->dosDate != 0)
754  zi->ci.dosDate = zipfi->dosDate;
755  else zi->ci.dosDate = ziplocal_TmzDateToDosDate(&zipfi->tmz_date,zipfi->dosDate);
756  }
757 
758  zi->ci.flag = 0;
759  if ((level==8) || (level==9))
760  zi->ci.flag |= 2;
761  if ((level==2))
762  zi->ci.flag |= 4;
763  if ((level==1))
764  zi->ci.flag |= 6;
765  if (password != NULL)
766  zi->ci.flag |= 1;
767 
768  zi->ci.crc32 = 0;
769  zi->ci.method = method;
770  zi->ci.encrypt = 0;
771  zi->ci.stream_initialised = 0;
772  zi->ci.pos_in_buffered_data = 0;
773  zi->ci.raw = raw;
775  zi->ci.size_centralheader = SIZECENTRALHEADER + size_filename +
776  size_extrafield_global + size_comment;
777  zi->ci.central_header = (char*)ALLOC((uInt)zi->ci.size_centralheader);
778 
780  /* version info */
786  ziplocal_putValue_inmemory(zi->ci.central_header+16,(uLong)0,4); /*crc*/
787  ziplocal_putValue_inmemory(zi->ci.central_header+20,(uLong)0,4); /*compr size*/
788  ziplocal_putValue_inmemory(zi->ci.central_header+24,(uLong)0,4); /*uncompr size*/
789  ziplocal_putValue_inmemory(zi->ci.central_header+28,(uLong)size_filename,2);
790  ziplocal_putValue_inmemory(zi->ci.central_header+30,(uLong)size_extrafield_global,2);
791  ziplocal_putValue_inmemory(zi->ci.central_header+32,(uLong)size_comment,2);
792  ziplocal_putValue_inmemory(zi->ci.central_header+34,(uLong)0,2); /*disk nm start*/
793 
794  if (zipfi==NULL)
796  else
798 
799  if (zipfi==NULL)
801  else
803 
805 
806  for (i=0;i<size_filename;i++)
808 
809  for (i=0;i<size_extrafield_global;i++)
810  *(zi->ci.central_header+SIZECENTRALHEADER+size_filename+i) =
811  *(((const char*)extrafield_global)+i);
812 
813  for (i=0;i<size_comment;i++)
814  *(zi->ci.central_header+SIZECENTRALHEADER+size_filename+
815  size_extrafield_global+i) = *(comment+i);
816  if (zi->ci.central_header == NULL)
817  return ZIP_INTERNALERROR;
818 
819  /* write the local header */
821 
822  if (err==ZIP_OK)
823  err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)20,2);/* version needed to extract */
824  if (err==ZIP_OK)
825  err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)zi->ci.flag,2);
826 
827  if (err==ZIP_OK)
828  err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)zi->ci.method,2);
829 
830  if (err==ZIP_OK)
831  err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)zi->ci.dosDate,4);
832 
833  if (err==ZIP_OK)
834  err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)0,4); /* crc 32, unknown */
835  if (err==ZIP_OK)
836  err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)0,4); /* compressed size, unknown */
837  if (err==ZIP_OK)
838  err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)0,4); /* uncompressed size, unknown */
839 
840  if (err==ZIP_OK)
841  err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)size_filename,2);
842 
843  if (err==ZIP_OK)
844  err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)size_extrafield_local,2);
845 
846  if ((err==ZIP_OK) && (size_filename>0))
847  if (ZWRITE(zi->z_filefunc,zi->filestream,filename,size_filename)!=size_filename)
848  err = ZIP_ERRNO;
849 
850  if ((err==ZIP_OK) && (size_extrafield_local>0))
851  if (ZWRITE(zi->z_filefunc,zi->filestream,extrafield_local,size_extrafield_local)
852  !=size_extrafield_local)
853  err = ZIP_ERRNO;
854 
855  zi->ci.stream.avail_in = (uInt)0;
856  zi->ci.stream.avail_out = (uInt)Z_BUFSIZE;
857  zi->ci.stream.next_out = zi->ci.buffered_data;
858  zi->ci.stream.total_in = 0;
859  zi->ci.stream.total_out = 0;
860 
861  if ((err==ZIP_OK) && (zi->ci.method == Z_DEFLATED) && (!zi->ci.raw))
862  {
863  zi->ci.stream.zalloc = (alloc_func)0;
864  zi->ci.stream.zfree = (free_func)0;
865  zi->ci.stream.opaque = (voidpf)0;
866 
867  if (windowBits>0)
868  windowBits = -windowBits;
869 
870  err = deflateInit2(&zi->ci.stream, level,
871  Z_DEFLATED, windowBits, memLevel, strategy);
872 
873  if (err==Z_OK)
874  zi->ci.stream_initialised = 1;
875  }
876 # ifndef NOCRYPT
877  zi->ci.crypt_header_size = 0;
878  if ((err==Z_OK) && (password != NULL))
879  {
880  unsigned char bufHead[RAND_HEAD_LEN];
881  unsigned int sizeHead;
882  zi->ci.encrypt = 1;
883  zi->ci.pcrc_32_tab = get_crc_table();
884  /*init_keys(password,zi->ci.keys,zi->ci.pcrc_32_tab);*/
885 
886  sizeHead=crypthead(password,bufHead,RAND_HEAD_LEN,zi->ci.keys,zi->ci.pcrc_32_tab,crcForCrypting);
887  zi->ci.crypt_header_size = sizeHead;
888 
889  if (ZWRITE(zi->z_filefunc,zi->filestream,bufHead,sizeHead) != sizeHead)
890  err = ZIP_ERRNO;
891  }
892 # endif
893 
894  if (err==Z_OK)
895  zi->in_opened_file_inzip = 1;
896  return err;
897 }
uInt pos_in_buffered_data
Definition: zip.c:117
#define ALLOC(size)
Definition: zip.c:50
#define ZIP_ERRNO
Definition: zip.h:72
#define LOCALHEADERMAGIC
Definition: zip.c:88
#define CENTRALHEADERMAGIC
Definition: zip.c:89
uLong internal_fa
Definition: zip.h:103
z_stream stream
Definition: zip.c:115
local int ziplocal_putValue(zlib_filefunc_def *pzlib_filefunc_def, voidpf filestream, uLong x, int nbByte) const
Definition: zip.c:266
local void ziplocal_putValue_inmemory(void *dest, uLong x, int nbByte)
Definition: zip.c:294
uLong dosDate
Definition: zip.h:100
int crypt_header_size
Definition: zip.c:134
typedef uLong(ZCALLBACK *read_file_func) OF((voidpf opaque
#define ZTELL(filefunc, filestream)
Definition: ioapi.h:64
#define VERSIONMADEBY
Definition: zip.c:38
#define ZIP_INTERNALERROR
Definition: zip.h:75
int encrypt
Definition: zip.c:130
Byte buffered_data[Z_BUFSIZE]
Definition: zip.c:127
uLong pos_local_header
Definition: zip.c:119
voidpf filestream
Definition: zip.c:141
#define Z_BUFSIZE
Definition: zip.c:42
curfile_info ci
Definition: zip.c:144
int ZEXPORT zipCloseFileInZip(zipFile file)
Definition: zip.c:1127
uLong dosDate
Definition: zip.c:128
uLong size_centralheader
Definition: zip.c:122
int stream_initialised
Definition: zip.c:116
uLong crc32
Definition: zip.c:129
uLong external_fa
Definition: zip.h:104
local uLong ziplocal_TmzDateToDosDate(tm_zip *ptm, uLong dosDate) const
Definition: zip.c:318
int method
Definition: zip.c:125
uLong add_position_when_writting_offset
Definition: zip.c:147
int raw
Definition: zip.c:126
const char * filename
Definition: ioapi.h:38
unsigned long keys[3]
Definition: zip.c:132
#define ZWRITE(filefunc, filestream, buf, size)
Definition: ioapi.h:63
#define ZIP_OK
Definition: zip.h:70
const unsigned long * pcrc_32_tab
Definition: zip.c:133
#define SIZECENTRALHEADER
Definition: zip.c:95
int in_opened_file_inzip
Definition: zip.c:143
#define ZIP_PARAMERROR
Definition: zip.h:73
typedef voidpf(ZCALLBACK *open_file_func) OF((voidpf opaque
zlib_filefunc_def z_filefunc
Definition: zip.c:140
tm_zip tmz_date
Definition: zip.h:99
char * central_header
Definition: zip.c:121
uLong flag
Definition: zip.c:123

◆ zipWriteInFileInZip()

int ZEXPORT zipWriteInFileInZip ( zipFile  file,
const void*  buf,
unsigned  len 
)

Definition at line 966 of file zip.c.

970 {
971  zip_internal* zi;
972  int err=ZIP_OK;
973 
974  if (file == NULL)
975  return ZIP_PARAMERROR;
976  zi = (zip_internal*)file;
977 
978  if (zi->in_opened_file_inzip == 0)
979  return ZIP_PARAMERROR;
980 
981  zi->ci.stream.next_in = (void*)buf;
982  zi->ci.stream.avail_in = len;
983  zi->ci.crc32 = crc32(zi->ci.crc32,buf,len);
984 
985  while ((err==ZIP_OK) && (zi->ci.stream.avail_in>0))
986  {
987  if (zi->ci.stream.avail_out == 0)
988  {
989  if (zipFlushWriteBuffer(zi) == ZIP_ERRNO)
990  err = ZIP_ERRNO;
991  zi->ci.stream.avail_out = (uInt)Z_BUFSIZE;
992  zi->ci.stream.next_out = zi->ci.buffered_data;
993  }
994 
995 
996  if(err != ZIP_OK)
997  break;
998 
999  if ((zi->ci.method == Z_DEFLATED) && (!zi->ci.raw))
1000  {
1001  uLong uTotalOutBefore = zi->ci.stream.total_out;
1002  err=deflate(&zi->ci.stream, Z_NO_FLUSH);
1003  zi->ci.pos_in_buffered_data += (uInt)(zi->ci.stream.total_out - uTotalOutBefore) ;
1004 
1005  }
1006  else
1007  {
1008  uInt copy_this,i;
1009  if (zi->ci.stream.avail_in < zi->ci.stream.avail_out)
1010  copy_this = zi->ci.stream.avail_in;
1011  else
1012  copy_this = zi->ci.stream.avail_out;
1013  for (i=0;i<copy_this;i++)
1014  *(((char*)zi->ci.stream.next_out)+i) =
1015  *(((const char*)zi->ci.stream.next_in)+i);
1016  {
1017  zi->ci.stream.avail_in -= copy_this;
1018  zi->ci.stream.avail_out-= copy_this;
1019  zi->ci.stream.next_in+= copy_this;
1020  zi->ci.stream.next_out+= copy_this;
1021  zi->ci.stream.total_in+= copy_this;
1022  zi->ci.stream.total_out+= copy_this;
1023  zi->ci.pos_in_buffered_data += copy_this;
1024  }
1025  }
1026  }
1027 
1028  return err;
1029 }
uInt pos_in_buffered_data
Definition: zip.c:117
#define ZIP_ERRNO
Definition: zip.h:72
z_stream stream
Definition: zip.c:115
typedef uLong(ZCALLBACK *read_file_func) OF((voidpf opaque
Byte buffered_data[Z_BUFSIZE]
Definition: zip.c:127
#define Z_BUFSIZE
Definition: zip.c:42
curfile_info ci
Definition: zip.c:144
local int zipFlushWriteBuffer(zip_internal *zi)
Definition: zip.c:944
uLong crc32
Definition: zip.c:129
int method
Definition: zip.c:125
int raw
Definition: zip.c:126
voidpf void * buf
Definition: ioapi.h:39
#define ZIP_OK
Definition: zip.h:70
int in_opened_file_inzip
Definition: zip.c:143
#define ZIP_PARAMERROR
Definition: zip.h:73

Variable Documentation

◆ zip_copyright

const char zip_copyright[]
Initial value:
=
" zip 1.01 Copyright 1998-2004 Gilles Vollant - http://www.winimage.com/zLibDll"

Definition at line 82 of file zip.c.