diff options
Diffstat (limited to 'contrib/minizip/zip.c')
-rw-r--r-- | contrib/minizip/zip.c | 2407 |
1 files changed, 1219 insertions, 1188 deletions
diff --git a/contrib/minizip/zip.c b/contrib/minizip/zip.c index 2ccd7fd..400e2ba 100644 --- a/contrib/minizip/zip.c +++ b/contrib/minizip/zip.c | |||
@@ -1,1188 +1,1219 @@ | |||
1 | /* zip.c -- IO on .zip files using zlib | 1 | /* zip.c -- IO on .zip files using zlib |
2 | Version 1.01, May 8th, 2004 | 2 | Version 1.01e, February 12th, 2005 |
3 | 3 | ||
4 | Copyright (C) 1998-2004 Gilles Vollant | 4 | 27 Dec 2004 Rolf Kalbermatter |
5 | 5 | Modification to zipOpen2 to support globalComment retrieval. | |
6 | Read zip.h for more info | 6 | |
7 | */ | 7 | Copyright (C) 1998-2005 Gilles Vollant |
8 | 8 | ||
9 | 9 | Read zip.h for more info | |
10 | #include <stdio.h> | 10 | */ |
11 | #include <stdlib.h> | 11 | |
12 | #include <string.h> | 12 | |
13 | #include <time.h> | 13 | #include <stdio.h> |
14 | #include "zlib.h" | 14 | #include <stdlib.h> |
15 | #include "zip.h" | 15 | #include <string.h> |
16 | 16 | #include <time.h> | |
17 | #ifdef STDC | 17 | #include "zlib.h" |
18 | # include <stddef.h> | 18 | #include "zip.h" |
19 | # include <string.h> | 19 | |
20 | # include <stdlib.h> | 20 | #ifdef STDC |
21 | #endif | 21 | # include <stddef.h> |
22 | #ifdef NO_ERRNO_H | 22 | # include <string.h> |
23 | extern int errno; | 23 | # include <stdlib.h> |
24 | #else | 24 | #endif |
25 | # include <errno.h> | 25 | #ifdef NO_ERRNO_H |
26 | #endif | 26 | extern int errno; |
27 | 27 | #else | |
28 | 28 | # include <errno.h> | |
29 | #ifndef local | 29 | #endif |
30 | # define local static | 30 | |
31 | #endif | 31 | |
32 | /* compile with -Dlocal if your debugger can't find static symbols */ | 32 | #ifndef local |
33 | 33 | # define local static | |
34 | #ifndef VERSIONMADEBY | 34 | #endif |
35 | # define VERSIONMADEBY (0x0) /* platform depedent */ | 35 | /* compile with -Dlocal if your debugger can't find static symbols */ |
36 | #endif | 36 | |
37 | 37 | #ifndef VERSIONMADEBY | |
38 | #ifndef Z_BUFSIZE | 38 | # define VERSIONMADEBY (0x0) /* platform depedent */ |
39 | #define Z_BUFSIZE (16384) | 39 | #endif |
40 | #endif | 40 | |
41 | 41 | #ifndef Z_BUFSIZE | |
42 | #ifndef Z_MAXFILENAMEINZIP | 42 | #define Z_BUFSIZE (16384) |
43 | #define Z_MAXFILENAMEINZIP (256) | 43 | #endif |
44 | #endif | 44 | |
45 | 45 | #ifndef Z_MAXFILENAMEINZIP | |
46 | #ifndef ALLOC | 46 | #define Z_MAXFILENAMEINZIP (256) |
47 | # define ALLOC(size) (malloc(size)) | 47 | #endif |
48 | #endif | 48 | |
49 | #ifndef TRYFREE | 49 | #ifndef ALLOC |
50 | # define TRYFREE(p) {if (p) free(p);} | 50 | # define ALLOC(size) (malloc(size)) |
51 | #endif | 51 | #endif |
52 | 52 | #ifndef TRYFREE | |
53 | /* | 53 | # define TRYFREE(p) {if (p) free(p);} |
54 | #define SIZECENTRALDIRITEM (0x2e) | 54 | #endif |
55 | #define SIZEZIPLOCALHEADER (0x1e) | 55 | |
56 | */ | 56 | /* |
57 | 57 | #define SIZECENTRALDIRITEM (0x2e) | |
58 | /* I've found an old Unix (a SunOS 4.1.3_U1) without all SEEK_* defined.... */ | 58 | #define SIZEZIPLOCALHEADER (0x1e) |
59 | 59 | */ | |
60 | #ifndef SEEK_CUR | 60 | |
61 | #define SEEK_CUR 1 | 61 | /* I've found an old Unix (a SunOS 4.1.3_U1) without all SEEK_* defined.... */ |
62 | #endif | 62 | |
63 | 63 | #ifndef SEEK_CUR | |
64 | #ifndef SEEK_END | 64 | #define SEEK_CUR 1 |
65 | #define SEEK_END 2 | 65 | #endif |
66 | #endif | 66 | |
67 | 67 | #ifndef SEEK_END | |
68 | #ifndef SEEK_SET | 68 | #define SEEK_END 2 |
69 | #define SEEK_SET 0 | 69 | #endif |
70 | #endif | 70 | |
71 | 71 | #ifndef SEEK_SET | |
72 | #ifndef DEF_MEM_LEVEL | 72 | #define SEEK_SET 0 |
73 | #if MAX_MEM_LEVEL >= 8 | 73 | #endif |
74 | # define DEF_MEM_LEVEL 8 | 74 | |
75 | #else | 75 | #ifndef DEF_MEM_LEVEL |
76 | # define DEF_MEM_LEVEL MAX_MEM_LEVEL | 76 | #if MAX_MEM_LEVEL >= 8 |
77 | #endif | 77 | # define DEF_MEM_LEVEL 8 |
78 | #endif | 78 | #else |
79 | const char zip_copyright[] = | 79 | # define DEF_MEM_LEVEL MAX_MEM_LEVEL |
80 | " zip 1.01 Copyright 1998-2004 Gilles Vollant - http://www.winimage.com/zLibDll"; | 80 | #endif |
81 | 81 | #endif | |
82 | 82 | const char zip_copyright[] = | |
83 | #define SIZEDATA_INDATABLOCK (4096-(4*4)) | 83 | " zip 1.01 Copyright 1998-2004 Gilles Vollant - http://www.winimage.com/zLibDll"; |
84 | 84 | ||
85 | #define LOCALHEADERMAGIC (0x04034b50) | 85 | |
86 | #define CENTRALHEADERMAGIC (0x02014b50) | 86 | #define SIZEDATA_INDATABLOCK (4096-(4*4)) |
87 | #define ENDHEADERMAGIC (0x06054b50) | 87 | |
88 | 88 | #define LOCALHEADERMAGIC (0x04034b50) | |
89 | #define FLAG_LOCALHEADER_OFFSET (0x06) | 89 | #define CENTRALHEADERMAGIC (0x02014b50) |
90 | #define CRC_LOCALHEADER_OFFSET (0x0e) | 90 | #define ENDHEADERMAGIC (0x06054b50) |
91 | 91 | ||
92 | #define SIZECENTRALHEADER (0x2e) /* 46 */ | 92 | #define FLAG_LOCALHEADER_OFFSET (0x06) |
93 | 93 | #define CRC_LOCALHEADER_OFFSET (0x0e) | |
94 | typedef struct linkedlist_datablock_internal_s | 94 | |
95 | { | 95 | #define SIZECENTRALHEADER (0x2e) /* 46 */ |
96 | struct linkedlist_datablock_internal_s* next_datablock; | 96 | |
97 | uLong avail_in_this_block; | 97 | typedef struct linkedlist_datablock_internal_s |
98 | uLong filled_in_this_block; | 98 | { |
99 | uLong unused; /* for future use and alignement */ | 99 | struct linkedlist_datablock_internal_s* next_datablock; |
100 | unsigned char data[SIZEDATA_INDATABLOCK]; | 100 | uLong avail_in_this_block; |
101 | } linkedlist_datablock_internal; | 101 | uLong filled_in_this_block; |
102 | 102 | uLong unused; /* for future use and alignement */ | |
103 | typedef struct linkedlist_data_s | 103 | unsigned char data[SIZEDATA_INDATABLOCK]; |
104 | { | 104 | } linkedlist_datablock_internal; |
105 | linkedlist_datablock_internal* first_block; | 105 | |
106 | linkedlist_datablock_internal* last_block; | 106 | typedef struct linkedlist_data_s |
107 | } linkedlist_data; | 107 | { |
108 | 108 | linkedlist_datablock_internal* first_block; | |
109 | 109 | linkedlist_datablock_internal* last_block; | |
110 | typedef struct | 110 | } linkedlist_data; |
111 | { | 111 | |
112 | z_stream stream; /* zLib stream structure for inflate */ | 112 | |
113 | int stream_initialised; /* 1 is stream is initialised */ | 113 | typedef struct |
114 | uInt pos_in_buffered_data; /* last written byte in buffered_data */ | 114 | { |
115 | 115 | z_stream stream; /* zLib stream structure for inflate */ | |
116 | uLong pos_local_header; /* offset of the local header of the file | 116 | int stream_initialised; /* 1 is stream is initialised */ |
117 | currenty writing */ | 117 | uInt pos_in_buffered_data; /* last written byte in buffered_data */ |
118 | char* central_header; /* central header data for the current file */ | 118 | |
119 | uLong size_centralheader; /* size of the central header for cur file */ | 119 | uLong pos_local_header; /* offset of the local header of the file |
120 | uLong flag; /* flag of the file currently writing */ | 120 | currenty writing */ |
121 | 121 | char* central_header; /* central header data for the current file */ | |
122 | int method; /* compression method of file currenty wr.*/ | 122 | uLong size_centralheader; /* size of the central header for cur file */ |
123 | int raw; /* 1 for directly writing raw data */ | 123 | uLong flag; /* flag of the file currently writing */ |
124 | Byte buffered_data[Z_BUFSIZE];/* buffer contain compressed data to be writ*/ | 124 | |
125 | uLong dosDate; | 125 | int method; /* compression method of file currenty wr.*/ |
126 | uLong crc32; | 126 | int raw; /* 1 for directly writing raw data */ |
127 | int encrypt; | 127 | Byte buffered_data[Z_BUFSIZE];/* buffer contain compressed data to be writ*/ |
128 | #ifndef NOCRYPT | 128 | uLong dosDate; |
129 | unsigned long keys[3]; /* keys defining the pseudo-random sequence */ | 129 | uLong crc32; |
130 | const unsigned long* pcrc_32_tab; | 130 | int encrypt; |
131 | int crypt_header_size; | 131 | #ifndef NOCRYPT |
132 | #endif | 132 | unsigned long keys[3]; /* keys defining the pseudo-random sequence */ |
133 | } curfile_info; | 133 | const unsigned long* pcrc_32_tab; |
134 | 134 | int crypt_header_size; | |
135 | typedef struct | 135 | #endif |
136 | { | 136 | } curfile_info; |
137 | zlib_filefunc_def z_filefunc; | 137 | |
138 | voidpf filestream; /* io structore of the zipfile */ | 138 | typedef struct |
139 | linkedlist_data central_dir;/* datablock with central dir in construction*/ | 139 | { |
140 | int in_opened_file_inzip; /* 1 if a file in the zip is currently writ.*/ | 140 | zlib_filefunc_def z_filefunc; |
141 | curfile_info ci; /* info on the file curretly writing */ | 141 | voidpf filestream; /* io structore of the zipfile */ |
142 | 142 | linkedlist_data central_dir;/* datablock with central dir in construction*/ | |
143 | uLong begin_pos; /* position of the beginning of the zipfile */ | 143 | int in_opened_file_inzip; /* 1 if a file in the zip is currently writ.*/ |
144 | uLong add_position_when_writting_offset; | 144 | curfile_info ci; /* info on the file curretly writing */ |
145 | uLong number_entry; | 145 | |
146 | } zip_internal; | 146 | uLong begin_pos; /* position of the beginning of the zipfile */ |
147 | 147 | uLong add_position_when_writting_offset; | |
148 | 148 | uLong number_entry; | |
149 | 149 | #ifndef NO_ADDFILEINEXISTINGZIP | |
150 | #ifndef NOCRYPT | 150 | char *globalcomment; |
151 | #define INCLUDECRYPTINGCODE_IFCRYPTALLOWED | 151 | #endif |
152 | #include "crypt.h" | 152 | } zip_internal; |
153 | #endif | 153 | |
154 | 154 | ||
155 | local linkedlist_datablock_internal* allocate_new_datablock() | 155 | |
156 | { | 156 | #ifndef NOCRYPT |
157 | linkedlist_datablock_internal* ldi; | 157 | #define INCLUDECRYPTINGCODE_IFCRYPTALLOWED |
158 | ldi = (linkedlist_datablock_internal*) | 158 | #include "crypt.h" |
159 | ALLOC(sizeof(linkedlist_datablock_internal)); | 159 | #endif |
160 | if (ldi!=NULL) | 160 | |
161 | { | 161 | local linkedlist_datablock_internal* allocate_new_datablock() |
162 | ldi->next_datablock = NULL ; | 162 | { |
163 | ldi->filled_in_this_block = 0 ; | 163 | linkedlist_datablock_internal* ldi; |
164 | ldi->avail_in_this_block = SIZEDATA_INDATABLOCK ; | 164 | ldi = (linkedlist_datablock_internal*) |
165 | } | 165 | ALLOC(sizeof(linkedlist_datablock_internal)); |
166 | return ldi; | 166 | if (ldi!=NULL) |
167 | } | 167 | { |
168 | 168 | ldi->next_datablock = NULL ; | |
169 | local void free_datablock(ldi) | 169 | ldi->filled_in_this_block = 0 ; |
170 | linkedlist_datablock_internal* ldi; | 170 | ldi->avail_in_this_block = SIZEDATA_INDATABLOCK ; |
171 | { | 171 | } |
172 | while (ldi!=NULL) | 172 | return ldi; |
173 | { | 173 | } |
174 | linkedlist_datablock_internal* ldinext = ldi->next_datablock; | 174 | |
175 | TRYFREE(ldi); | 175 | local void free_datablock(ldi) |
176 | ldi = ldinext; | 176 | linkedlist_datablock_internal* ldi; |
177 | } | 177 | { |
178 | } | 178 | while (ldi!=NULL) |
179 | 179 | { | |
180 | local void init_linkedlist(ll) | 180 | linkedlist_datablock_internal* ldinext = ldi->next_datablock; |
181 | linkedlist_data* ll; | 181 | TRYFREE(ldi); |
182 | { | 182 | ldi = ldinext; |
183 | ll->first_block = ll->last_block = NULL; | 183 | } |
184 | } | 184 | } |
185 | 185 | ||
186 | local void free_linkedlist(ll) | 186 | local void init_linkedlist(ll) |
187 | linkedlist_data* ll; | 187 | linkedlist_data* ll; |
188 | { | 188 | { |
189 | free_datablock(ll->first_block); | 189 | ll->first_block = ll->last_block = NULL; |
190 | ll->first_block = ll->last_block = NULL; | 190 | } |
191 | } | 191 | |
192 | 192 | local void free_linkedlist(ll) | |
193 | 193 | linkedlist_data* ll; | |
194 | local int add_data_in_datablock(ll,buf,len) | 194 | { |
195 | linkedlist_data* ll; | 195 | free_datablock(ll->first_block); |
196 | const void* buf; | 196 | ll->first_block = ll->last_block = NULL; |
197 | uLong len; | 197 | } |
198 | { | 198 | |
199 | linkedlist_datablock_internal* ldi; | 199 | |
200 | const unsigned char* from_copy; | 200 | local int add_data_in_datablock(ll,buf,len) |
201 | 201 | linkedlist_data* ll; | |
202 | if (ll==NULL) | 202 | const void* buf; |
203 | return ZIP_INTERNALERROR; | 203 | uLong len; |
204 | 204 | { | |
205 | if (ll->last_block == NULL) | 205 | linkedlist_datablock_internal* ldi; |
206 | { | 206 | const unsigned char* from_copy; |
207 | ll->first_block = ll->last_block = allocate_new_datablock(); | 207 | |
208 | if (ll->first_block == NULL) | 208 | if (ll==NULL) |
209 | return ZIP_INTERNALERROR; | 209 | return ZIP_INTERNALERROR; |
210 | } | 210 | |
211 | 211 | if (ll->last_block == NULL) | |
212 | ldi = ll->last_block; | 212 | { |
213 | from_copy = (unsigned char*)buf; | 213 | ll->first_block = ll->last_block = allocate_new_datablock(); |
214 | 214 | if (ll->first_block == NULL) | |
215 | while (len>0) | 215 | return ZIP_INTERNALERROR; |
216 | { | 216 | } |
217 | uInt copy_this; | 217 | |
218 | uInt i; | 218 | ldi = ll->last_block; |
219 | unsigned char* to_copy; | 219 | from_copy = (unsigned char*)buf; |
220 | 220 | ||
221 | if (ldi->avail_in_this_block==0) | 221 | while (len>0) |
222 | { | 222 | { |
223 | ldi->next_datablock = allocate_new_datablock(); | 223 | uInt copy_this; |
224 | if (ldi->next_datablock == NULL) | 224 | uInt i; |
225 | return ZIP_INTERNALERROR; | 225 | unsigned char* to_copy; |
226 | ldi = ldi->next_datablock ; | 226 | |
227 | ll->last_block = ldi; | 227 | if (ldi->avail_in_this_block==0) |
228 | } | 228 | { |
229 | 229 | ldi->next_datablock = allocate_new_datablock(); | |
230 | if (ldi->avail_in_this_block < len) | 230 | if (ldi->next_datablock == NULL) |
231 | copy_this = (uInt)ldi->avail_in_this_block; | 231 | return ZIP_INTERNALERROR; |
232 | else | 232 | ldi = ldi->next_datablock ; |
233 | copy_this = (uInt)len; | 233 | ll->last_block = ldi; |
234 | 234 | } | |
235 | to_copy = &(ldi->data[ldi->filled_in_this_block]); | 235 | |
236 | 236 | if (ldi->avail_in_this_block < len) | |
237 | for (i=0;i<copy_this;i++) | 237 | copy_this = (uInt)ldi->avail_in_this_block; |
238 | *(to_copy+i)=*(from_copy+i); | 238 | else |
239 | 239 | copy_this = (uInt)len; | |
240 | ldi->filled_in_this_block += copy_this; | 240 | |
241 | ldi->avail_in_this_block -= copy_this; | 241 | to_copy = &(ldi->data[ldi->filled_in_this_block]); |
242 | from_copy += copy_this ; | 242 | |
243 | len -= copy_this; | 243 | for (i=0;i<copy_this;i++) |
244 | } | 244 | *(to_copy+i)=*(from_copy+i); |
245 | return ZIP_OK; | 245 | |
246 | } | 246 | ldi->filled_in_this_block += copy_this; |
247 | 247 | ldi->avail_in_this_block -= copy_this; | |
248 | 248 | from_copy += copy_this ; | |
249 | 249 | len -= copy_this; | |
250 | /****************************************************************************/ | 250 | } |
251 | 251 | return ZIP_OK; | |
252 | #ifndef NO_ADDFILEINEXISTINGZIP | 252 | } |
253 | /* =========================================================================== | 253 | |
254 | Inputs a long in LSB order to the given file | 254 | |
255 | nbByte == 1, 2 or 4 (byte, short or long) | 255 | |
256 | */ | 256 | /****************************************************************************/ |
257 | 257 | ||
258 | local int ziplocal_putValue OF((const zlib_filefunc_def* pzlib_filefunc_def, | 258 | #ifndef NO_ADDFILEINEXISTINGZIP |
259 | voidpf filestream, uLong x, int nbByte)); | 259 | /* =========================================================================== |
260 | local int ziplocal_putValue (pzlib_filefunc_def, filestream, x, nbByte) | 260 | Inputs a long in LSB order to the given file |
261 | const zlib_filefunc_def* pzlib_filefunc_def; | 261 | nbByte == 1, 2 or 4 (byte, short or long) |
262 | voidpf filestream; | 262 | */ |
263 | uLong x; | 263 | |
264 | int nbByte; | 264 | local int ziplocal_putValue OF((const zlib_filefunc_def* pzlib_filefunc_def, |
265 | { | 265 | voidpf filestream, uLong x, int nbByte)); |
266 | unsigned char buf[4]; | 266 | local int ziplocal_putValue (pzlib_filefunc_def, filestream, x, nbByte) |
267 | int n; | 267 | const zlib_filefunc_def* pzlib_filefunc_def; |
268 | for (n = 0; n < nbByte; n++) | 268 | voidpf filestream; |
269 | { | 269 | uLong x; |
270 | buf[n] = (unsigned char)(x & 0xff); | 270 | int nbByte; |
271 | x >>= 8; | 271 | { |
272 | } | 272 | unsigned char buf[4]; |
273 | if (x != 0) | 273 | int n; |
274 | { /* data overflow - hack for ZIP64 (X Roche) */ | 274 | for (n = 0; n < nbByte; n++) |
275 | for (n = 0; n < nbByte; n++) | 275 | { |
276 | { | 276 | buf[n] = (unsigned char)(x & 0xff); |
277 | buf[n] = 0xff; | 277 | x >>= 8; |
278 | } | 278 | } |
279 | } | 279 | if (x != 0) |
280 | 280 | { /* data overflow - hack for ZIP64 (X Roche) */ | |
281 | if (ZWRITE(*pzlib_filefunc_def,filestream,buf,nbByte)!=(uLong)nbByte) | 281 | for (n = 0; n < nbByte; n++) |
282 | return ZIP_ERRNO; | 282 | { |
283 | else | 283 | buf[n] = 0xff; |
284 | return ZIP_OK; | 284 | } |
285 | } | 285 | } |
286 | 286 | ||
287 | local void ziplocal_putValue_inmemory OF((void* dest, uLong x, int nbByte)); | 287 | if (ZWRITE(*pzlib_filefunc_def,filestream,buf,nbByte)!=(uLong)nbByte) |
288 | local void ziplocal_putValue_inmemory (dest, x, nbByte) | 288 | return ZIP_ERRNO; |
289 | void* dest; | 289 | else |
290 | uLong x; | 290 | return ZIP_OK; |
291 | int nbByte; | 291 | } |
292 | { | 292 | |
293 | unsigned char* buf=(unsigned char*)dest; | 293 | local void ziplocal_putValue_inmemory OF((void* dest, uLong x, int nbByte)); |
294 | int n; | 294 | local void ziplocal_putValue_inmemory (dest, x, nbByte) |
295 | for (n = 0; n < nbByte; n++) { | 295 | void* dest; |
296 | buf[n] = (unsigned char)(x & 0xff); | 296 | uLong x; |
297 | x >>= 8; | 297 | int nbByte; |
298 | } | 298 | { |
299 | 299 | unsigned char* buf=(unsigned char*)dest; | |
300 | if (x != 0) | 300 | int n; |
301 | { /* data overflow - hack for ZIP64 */ | 301 | for (n = 0; n < nbByte; n++) { |
302 | for (n = 0; n < nbByte; n++) | 302 | buf[n] = (unsigned char)(x & 0xff); |
303 | { | 303 | x >>= 8; |
304 | buf[n] = 0xff; | 304 | } |
305 | } | 305 | |
306 | } | 306 | if (x != 0) |
307 | } | 307 | { /* data overflow - hack for ZIP64 */ |
308 | 308 | for (n = 0; n < nbByte; n++) | |
309 | /****************************************************************************/ | 309 | { |
310 | 310 | buf[n] = 0xff; | |
311 | 311 | } | |
312 | local uLong ziplocal_TmzDateToDosDate(ptm,dosDate) | 312 | } |
313 | const tm_zip* ptm; | 313 | } |
314 | uLong dosDate; | 314 | |
315 | { | 315 | /****************************************************************************/ |
316 | uLong year = (uLong)ptm->tm_year; | 316 | |
317 | if (year>1980) | 317 | |
318 | year-=1980; | 318 | local uLong ziplocal_TmzDateToDosDate(ptm,dosDate) |
319 | else if (year>80) | 319 | const tm_zip* ptm; |
320 | year-=80; | 320 | uLong dosDate; |
321 | return | 321 | { |
322 | (uLong) (((ptm->tm_mday) + (32 * (ptm->tm_mon+1)) + (512 * year)) << 16) | | 322 | uLong year = (uLong)ptm->tm_year; |
323 | ((ptm->tm_sec/2) + (32* ptm->tm_min) + (2048 * (uLong)ptm->tm_hour)); | 323 | if (year>1980) |
324 | } | 324 | year-=1980; |
325 | 325 | else if (year>80) | |
326 | 326 | year-=80; | |
327 | /****************************************************************************/ | 327 | return |
328 | 328 | (uLong) (((ptm->tm_mday) + (32 * (ptm->tm_mon+1)) + (512 * year)) << 16) | | |
329 | local int ziplocal_getByte OF(( | 329 | ((ptm->tm_sec/2) + (32* ptm->tm_min) + (2048 * (uLong)ptm->tm_hour)); |
330 | const zlib_filefunc_def* pzlib_filefunc_def, | 330 | } |
331 | voidpf filestream, | 331 | |
332 | int *pi)); | 332 | |
333 | 333 | /****************************************************************************/ | |
334 | local int ziplocal_getByte(pzlib_filefunc_def,filestream,pi) | 334 | |
335 | const zlib_filefunc_def* pzlib_filefunc_def; | 335 | local int ziplocal_getByte OF(( |
336 | voidpf filestream; | 336 | const zlib_filefunc_def* pzlib_filefunc_def, |
337 | int *pi; | 337 | voidpf filestream, |
338 | { | 338 | int *pi)); |
339 | unsigned char c; | 339 | |
340 | int err = (int)ZREAD(*pzlib_filefunc_def,filestream,&c,1); | 340 | local int ziplocal_getByte(pzlib_filefunc_def,filestream,pi) |
341 | if (err==1) | 341 | const zlib_filefunc_def* pzlib_filefunc_def; |
342 | { | 342 | voidpf filestream; |
343 | *pi = (int)c; | 343 | int *pi; |
344 | return ZIP_OK; | 344 | { |
345 | } | 345 | unsigned char c; |
346 | else | 346 | int err = (int)ZREAD(*pzlib_filefunc_def,filestream,&c,1); |
347 | { | 347 | if (err==1) |
348 | if (ZERROR(*pzlib_filefunc_def,filestream)) | 348 | { |
349 | return ZIP_ERRNO; | 349 | *pi = (int)c; |
350 | else | 350 | return ZIP_OK; |
351 | return ZIP_EOF; | 351 | } |
352 | } | 352 | else |
353 | } | 353 | { |
354 | 354 | if (ZERROR(*pzlib_filefunc_def,filestream)) | |
355 | 355 | return ZIP_ERRNO; | |
356 | /* =========================================================================== | 356 | else |
357 | Reads a long in LSB order from the given gz_stream. Sets | 357 | return ZIP_EOF; |
358 | */ | 358 | } |
359 | local int ziplocal_getShort OF(( | 359 | } |
360 | const zlib_filefunc_def* pzlib_filefunc_def, | 360 | |
361 | voidpf filestream, | 361 | |
362 | uLong *pX)); | 362 | /* =========================================================================== |
363 | 363 | Reads a long in LSB order from the given gz_stream. Sets | |
364 | local int ziplocal_getShort (pzlib_filefunc_def,filestream,pX) | 364 | */ |
365 | const zlib_filefunc_def* pzlib_filefunc_def; | 365 | local int ziplocal_getShort OF(( |
366 | voidpf filestream; | 366 | const zlib_filefunc_def* pzlib_filefunc_def, |
367 | uLong *pX; | 367 | voidpf filestream, |
368 | { | 368 | uLong *pX)); |
369 | uLong x ; | 369 | |
370 | int i; | 370 | local int ziplocal_getShort (pzlib_filefunc_def,filestream,pX) |
371 | int err; | 371 | const zlib_filefunc_def* pzlib_filefunc_def; |
372 | 372 | voidpf filestream; | |
373 | err = ziplocal_getByte(pzlib_filefunc_def,filestream,&i); | 373 | uLong *pX; |
374 | x = (uLong)i; | 374 | { |
375 | 375 | uLong x ; | |
376 | if (err==ZIP_OK) | 376 | int i; |
377 | err = ziplocal_getByte(pzlib_filefunc_def,filestream,&i); | 377 | int err; |
378 | x += ((uLong)i)<<8; | 378 | |
379 | 379 | err = ziplocal_getByte(pzlib_filefunc_def,filestream,&i); | |
380 | if (err==ZIP_OK) | 380 | x = (uLong)i; |
381 | *pX = x; | 381 | |
382 | else | 382 | if (err==ZIP_OK) |
383 | *pX = 0; | 383 | err = ziplocal_getByte(pzlib_filefunc_def,filestream,&i); |
384 | return err; | 384 | x += ((uLong)i)<<8; |
385 | } | 385 | |
386 | 386 | if (err==ZIP_OK) | |
387 | local int ziplocal_getLong OF(( | 387 | *pX = x; |
388 | const zlib_filefunc_def* pzlib_filefunc_def, | 388 | else |
389 | voidpf filestream, | 389 | *pX = 0; |
390 | uLong *pX)); | 390 | return err; |
391 | 391 | } | |
392 | local int ziplocal_getLong (pzlib_filefunc_def,filestream,pX) | 392 | |
393 | const zlib_filefunc_def* pzlib_filefunc_def; | 393 | local int ziplocal_getLong OF(( |
394 | voidpf filestream; | 394 | const zlib_filefunc_def* pzlib_filefunc_def, |
395 | uLong *pX; | 395 | voidpf filestream, |
396 | { | 396 | uLong *pX)); |
397 | uLong x ; | 397 | |
398 | int i; | 398 | local int ziplocal_getLong (pzlib_filefunc_def,filestream,pX) |
399 | int err; | 399 | const zlib_filefunc_def* pzlib_filefunc_def; |
400 | 400 | voidpf filestream; | |
401 | err = ziplocal_getByte(pzlib_filefunc_def,filestream,&i); | 401 | uLong *pX; |
402 | x = (uLong)i; | 402 | { |
403 | 403 | uLong x ; | |
404 | if (err==ZIP_OK) | 404 | int i; |
405 | err = ziplocal_getByte(pzlib_filefunc_def,filestream,&i); | 405 | int err; |
406 | x += ((uLong)i)<<8; | 406 | |
407 | 407 | err = ziplocal_getByte(pzlib_filefunc_def,filestream,&i); | |
408 | if (err==ZIP_OK) | 408 | x = (uLong)i; |
409 | err = ziplocal_getByte(pzlib_filefunc_def,filestream,&i); | 409 | |
410 | x += ((uLong)i)<<16; | 410 | if (err==ZIP_OK) |
411 | 411 | err = ziplocal_getByte(pzlib_filefunc_def,filestream,&i); | |
412 | if (err==ZIP_OK) | 412 | x += ((uLong)i)<<8; |
413 | err = ziplocal_getByte(pzlib_filefunc_def,filestream,&i); | 413 | |
414 | x += ((uLong)i)<<24; | 414 | if (err==ZIP_OK) |
415 | 415 | err = ziplocal_getByte(pzlib_filefunc_def,filestream,&i); | |
416 | if (err==ZIP_OK) | 416 | x += ((uLong)i)<<16; |
417 | *pX = x; | 417 | |
418 | else | 418 | if (err==ZIP_OK) |
419 | *pX = 0; | 419 | err = ziplocal_getByte(pzlib_filefunc_def,filestream,&i); |
420 | return err; | 420 | x += ((uLong)i)<<24; |
421 | } | 421 | |
422 | 422 | if (err==ZIP_OK) | |
423 | #ifndef BUFREADCOMMENT | 423 | *pX = x; |
424 | #define BUFREADCOMMENT (0x400) | 424 | else |
425 | #endif | 425 | *pX = 0; |
426 | /* | 426 | return err; |
427 | Locate the Central directory of a zipfile (at the end, just before | 427 | } |
428 | the global comment) | 428 | |
429 | */ | 429 | #ifndef BUFREADCOMMENT |
430 | local uLong ziplocal_SearchCentralDir OF(( | 430 | #define BUFREADCOMMENT (0x400) |
431 | const zlib_filefunc_def* pzlib_filefunc_def, | 431 | #endif |
432 | voidpf filestream)); | 432 | /* |
433 | 433 | Locate the Central directory of a zipfile (at the end, just before | |
434 | local uLong ziplocal_SearchCentralDir(pzlib_filefunc_def,filestream) | 434 | the global comment) |
435 | const zlib_filefunc_def* pzlib_filefunc_def; | 435 | */ |
436 | voidpf filestream; | 436 | local uLong ziplocal_SearchCentralDir OF(( |
437 | { | 437 | const zlib_filefunc_def* pzlib_filefunc_def, |
438 | unsigned char* buf; | 438 | voidpf filestream)); |
439 | uLong uSizeFile; | 439 | |
440 | uLong uBackRead; | 440 | local uLong ziplocal_SearchCentralDir(pzlib_filefunc_def,filestream) |
441 | uLong uMaxBack=0xffff; /* maximum size of global comment */ | 441 | const zlib_filefunc_def* pzlib_filefunc_def; |
442 | uLong uPosFound=0; | 442 | voidpf filestream; |
443 | 443 | { | |
444 | if (ZSEEK(*pzlib_filefunc_def,filestream,0,ZLIB_FILEFUNC_SEEK_END) != 0) | 444 | unsigned char* buf; |
445 | return 0; | 445 | uLong uSizeFile; |
446 | 446 | uLong uBackRead; | |
447 | 447 | uLong uMaxBack=0xffff; /* maximum size of global comment */ | |
448 | uSizeFile = ZTELL(*pzlib_filefunc_def,filestream); | 448 | uLong uPosFound=0; |
449 | 449 | ||
450 | if (uMaxBack>uSizeFile) | 450 | if (ZSEEK(*pzlib_filefunc_def,filestream,0,ZLIB_FILEFUNC_SEEK_END) != 0) |
451 | uMaxBack = uSizeFile; | 451 | return 0; |
452 | 452 | ||
453 | buf = (unsigned char*)ALLOC(BUFREADCOMMENT+4); | 453 | |
454 | if (buf==NULL) | 454 | uSizeFile = ZTELL(*pzlib_filefunc_def,filestream); |
455 | return 0; | 455 | |
456 | 456 | if (uMaxBack>uSizeFile) | |
457 | uBackRead = 4; | 457 | uMaxBack = uSizeFile; |
458 | while (uBackRead<uMaxBack) | 458 | |
459 | { | 459 | buf = (unsigned char*)ALLOC(BUFREADCOMMENT+4); |
460 | uLong uReadSize,uReadPos ; | 460 | if (buf==NULL) |
461 | int i; | 461 | return 0; |
462 | if (uBackRead+BUFREADCOMMENT>uMaxBack) | 462 | |
463 | uBackRead = uMaxBack; | 463 | uBackRead = 4; |
464 | else | 464 | while (uBackRead<uMaxBack) |
465 | uBackRead+=BUFREADCOMMENT; | 465 | { |
466 | uReadPos = uSizeFile-uBackRead ; | 466 | uLong uReadSize,uReadPos ; |
467 | 467 | int i; | |
468 | uReadSize = ((BUFREADCOMMENT+4) < (uSizeFile-uReadPos)) ? | 468 | if (uBackRead+BUFREADCOMMENT>uMaxBack) |
469 | (BUFREADCOMMENT+4) : (uSizeFile-uReadPos); | 469 | uBackRead = uMaxBack; |
470 | if (ZSEEK(*pzlib_filefunc_def,filestream,uReadPos,ZLIB_FILEFUNC_SEEK_SET)!=0) | 470 | else |
471 | break; | 471 | uBackRead+=BUFREADCOMMENT; |
472 | 472 | uReadPos = uSizeFile-uBackRead ; | |
473 | if (ZREAD(*pzlib_filefunc_def,filestream,buf,uReadSize)!=uReadSize) | 473 | |
474 | break; | 474 | uReadSize = ((BUFREADCOMMENT+4) < (uSizeFile-uReadPos)) ? |
475 | 475 | (BUFREADCOMMENT+4) : (uSizeFile-uReadPos); | |
476 | for (i=(int)uReadSize-3; (i--)>0;) | 476 | if (ZSEEK(*pzlib_filefunc_def,filestream,uReadPos,ZLIB_FILEFUNC_SEEK_SET)!=0) |
477 | if (((*(buf+i))==0x50) && ((*(buf+i+1))==0x4b) && | 477 | break; |
478 | ((*(buf+i+2))==0x05) && ((*(buf+i+3))==0x06)) | 478 | |
479 | { | 479 | if (ZREAD(*pzlib_filefunc_def,filestream,buf,uReadSize)!=uReadSize) |
480 | uPosFound = uReadPos+i; | 480 | break; |
481 | break; | 481 | |
482 | } | 482 | for (i=(int)uReadSize-3; (i--)>0;) |
483 | 483 | if (((*(buf+i))==0x50) && ((*(buf+i+1))==0x4b) && | |
484 | if (uPosFound!=0) | 484 | ((*(buf+i+2))==0x05) && ((*(buf+i+3))==0x06)) |
485 | break; | 485 | { |
486 | } | 486 | uPosFound = uReadPos+i; |
487 | TRYFREE(buf); | 487 | break; |
488 | return uPosFound; | 488 | } |
489 | } | 489 | |
490 | #endif /* !NO_ADDFILEINEXISTINGZIP*/ | 490 | if (uPosFound!=0) |
491 | 491 | break; | |
492 | /************************************************************/ | 492 | } |
493 | extern zipFile ZEXPORT zipOpen2 (pathname, append, globalcomment, pzlib_filefunc_def) | 493 | TRYFREE(buf); |
494 | const char *pathname; | 494 | return uPosFound; |
495 | int append; | 495 | } |
496 | zipcharpc* globalcomment; | 496 | #endif /* !NO_ADDFILEINEXISTINGZIP*/ |
497 | zlib_filefunc_def* pzlib_filefunc_def; | 497 | |
498 | { | 498 | /************************************************************/ |
499 | zip_internal ziinit; | 499 | extern zipFile ZEXPORT zipOpen2 (pathname, append, globalcomment, pzlib_filefunc_def) |
500 | zip_internal* zi; | 500 | const char *pathname; |
501 | int err=ZIP_OK; | 501 | int append; |
502 | 502 | zipcharpc* globalcomment; | |
503 | 503 | zlib_filefunc_def* pzlib_filefunc_def; | |
504 | if (pzlib_filefunc_def==NULL) | 504 | { |
505 | fill_fopen_filefunc(&ziinit.z_filefunc); | 505 | zip_internal ziinit; |
506 | else | 506 | zip_internal* zi; |
507 | ziinit.z_filefunc = *pzlib_filefunc_def; | 507 | int err=ZIP_OK; |
508 | 508 | ||
509 | ziinit.filestream = (*(ziinit.z_filefunc.zopen_file)) | 509 | |
510 | (ziinit.z_filefunc.opaque, | 510 | if (pzlib_filefunc_def==NULL) |
511 | pathname, | 511 | fill_fopen_filefunc(&ziinit.z_filefunc); |
512 | (append == APPEND_STATUS_CREATE) ? | 512 | else |
513 | (ZLIB_FILEFUNC_MODE_READ | ZLIB_FILEFUNC_MODE_WRITE | ZLIB_FILEFUNC_MODE_CREATE) : | 513 | ziinit.z_filefunc = *pzlib_filefunc_def; |
514 | (ZLIB_FILEFUNC_MODE_READ | ZLIB_FILEFUNC_MODE_WRITE | ZLIB_FILEFUNC_MODE_EXISTING)); | 514 | |
515 | 515 | ziinit.filestream = (*(ziinit.z_filefunc.zopen_file)) | |
516 | if (ziinit.filestream == NULL) | 516 | (ziinit.z_filefunc.opaque, |
517 | return NULL; | 517 | pathname, |
518 | ziinit.begin_pos = ZTELL(ziinit.z_filefunc,ziinit.filestream); | 518 | (append == APPEND_STATUS_CREATE) ? |
519 | ziinit.in_opened_file_inzip = 0; | 519 | (ZLIB_FILEFUNC_MODE_READ | ZLIB_FILEFUNC_MODE_WRITE | ZLIB_FILEFUNC_MODE_CREATE) : |
520 | ziinit.ci.stream_initialised = 0; | 520 | (ZLIB_FILEFUNC_MODE_READ | ZLIB_FILEFUNC_MODE_WRITE | ZLIB_FILEFUNC_MODE_EXISTING)); |
521 | ziinit.number_entry = 0; | 521 | |
522 | ziinit.add_position_when_writting_offset = 0; | 522 | if (ziinit.filestream == NULL) |
523 | init_linkedlist(&(ziinit.central_dir)); | 523 | return NULL; |
524 | 524 | ziinit.begin_pos = ZTELL(ziinit.z_filefunc,ziinit.filestream); | |
525 | 525 | ziinit.in_opened_file_inzip = 0; | |
526 | zi = (zip_internal*)ALLOC(sizeof(zip_internal)); | 526 | ziinit.ci.stream_initialised = 0; |
527 | if (zi==NULL) | 527 | ziinit.number_entry = 0; |
528 | { | 528 | ziinit.add_position_when_writting_offset = 0; |
529 | ZCLOSE(ziinit.z_filefunc,ziinit.filestream); | 529 | init_linkedlist(&(ziinit.central_dir)); |
530 | return NULL; | 530 | |
531 | } | 531 | |
532 | 532 | zi = (zip_internal*)ALLOC(sizeof(zip_internal)); | |
533 | /* now we add file in a zipfile */ | 533 | if (zi==NULL) |
534 | # ifndef NO_ADDFILEINEXISTINGZIP | 534 | { |
535 | if (append == APPEND_STATUS_ADDINZIP) | 535 | ZCLOSE(ziinit.z_filefunc,ziinit.filestream); |
536 | { | 536 | return NULL; |
537 | uLong byte_before_the_zipfile;/* byte before the zipfile, (>0 for sfx)*/ | 537 | } |
538 | 538 | ||
539 | uLong size_central_dir; /* size of the central directory */ | 539 | /* now we add file in a zipfile */ |
540 | uLong offset_central_dir; /* offset of start of central directory */ | 540 | # ifndef NO_ADDFILEINEXISTINGZIP |
541 | uLong central_pos,uL; | 541 | ziinit.globalcomment = NULL; |
542 | 542 | if (append == APPEND_STATUS_ADDINZIP) | |
543 | uLong number_disk; /* number of the current dist, used for | 543 | { |
544 | spaning ZIP, unsupported, always 0*/ | 544 | uLong byte_before_the_zipfile;/* byte before the zipfile, (>0 for sfx)*/ |
545 | uLong number_disk_with_CD; /* number the the disk with central dir, used | 545 | |
546 | for spaning ZIP, unsupported, always 0*/ | 546 | uLong size_central_dir; /* size of the central directory */ |
547 | uLong number_entry; | 547 | uLong offset_central_dir; /* offset of start of central directory */ |
548 | uLong number_entry_CD; /* total number of entries in | 548 | uLong central_pos,uL; |
549 | the central dir | 549 | |
550 | (same than number_entry on nospan) */ | 550 | uLong number_disk; /* number of the current dist, used for |
551 | uLong size_comment; | 551 | spaning ZIP, unsupported, always 0*/ |
552 | 552 | uLong number_disk_with_CD; /* number the the disk with central dir, used | |
553 | central_pos = ziplocal_SearchCentralDir(&ziinit.z_filefunc,ziinit.filestream); | 553 | for spaning ZIP, unsupported, always 0*/ |
554 | if (central_pos==0) | 554 | uLong number_entry; |
555 | err=ZIP_ERRNO; | 555 | uLong number_entry_CD; /* total number of entries in |
556 | 556 | the central dir | |
557 | if (ZSEEK(ziinit.z_filefunc, ziinit.filestream, | 557 | (same than number_entry on nospan) */ |
558 | central_pos,ZLIB_FILEFUNC_SEEK_SET)!=0) | 558 | uLong size_comment; |
559 | err=ZIP_ERRNO; | 559 | |
560 | 560 | central_pos = ziplocal_SearchCentralDir(&ziinit.z_filefunc,ziinit.filestream); | |
561 | /* the signature, already checked */ | 561 | if (central_pos==0) |
562 | if (ziplocal_getLong(&ziinit.z_filefunc, ziinit.filestream,&uL)!=ZIP_OK) | 562 | err=ZIP_ERRNO; |
563 | err=ZIP_ERRNO; | 563 | |
564 | 564 | if (ZSEEK(ziinit.z_filefunc, ziinit.filestream, | |
565 | /* number of this disk */ | 565 | central_pos,ZLIB_FILEFUNC_SEEK_SET)!=0) |
566 | if (ziplocal_getShort(&ziinit.z_filefunc, ziinit.filestream,&number_disk)!=ZIP_OK) | 566 | err=ZIP_ERRNO; |
567 | err=ZIP_ERRNO; | 567 | |
568 | 568 | /* the signature, already checked */ | |
569 | /* number of the disk with the start of the central directory */ | 569 | if (ziplocal_getLong(&ziinit.z_filefunc, ziinit.filestream,&uL)!=ZIP_OK) |
570 | if (ziplocal_getShort(&ziinit.z_filefunc, ziinit.filestream,&number_disk_with_CD)!=ZIP_OK) | 570 | err=ZIP_ERRNO; |
571 | err=ZIP_ERRNO; | 571 | |
572 | 572 | /* number of this disk */ | |
573 | /* total number of entries in the central dir on this disk */ | 573 | if (ziplocal_getShort(&ziinit.z_filefunc, ziinit.filestream,&number_disk)!=ZIP_OK) |
574 | if (ziplocal_getShort(&ziinit.z_filefunc, ziinit.filestream,&number_entry)!=ZIP_OK) | 574 | err=ZIP_ERRNO; |
575 | err=ZIP_ERRNO; | 575 | |
576 | 576 | /* number of the disk with the start of the central directory */ | |
577 | /* total number of entries in the central dir */ | 577 | if (ziplocal_getShort(&ziinit.z_filefunc, ziinit.filestream,&number_disk_with_CD)!=ZIP_OK) |
578 | if (ziplocal_getShort(&ziinit.z_filefunc, ziinit.filestream,&number_entry_CD)!=ZIP_OK) | 578 | err=ZIP_ERRNO; |
579 | err=ZIP_ERRNO; | 579 | |
580 | 580 | /* total number of entries in the central dir on this disk */ | |
581 | if ((number_entry_CD!=number_entry) || | 581 | if (ziplocal_getShort(&ziinit.z_filefunc, ziinit.filestream,&number_entry)!=ZIP_OK) |
582 | (number_disk_with_CD!=0) || | 582 | err=ZIP_ERRNO; |
583 | (number_disk!=0)) | 583 | |
584 | err=ZIP_BADZIPFILE; | 584 | /* total number of entries in the central dir */ |
585 | 585 | if (ziplocal_getShort(&ziinit.z_filefunc, ziinit.filestream,&number_entry_CD)!=ZIP_OK) | |
586 | /* size of the central directory */ | 586 | err=ZIP_ERRNO; |
587 | if (ziplocal_getLong(&ziinit.z_filefunc, ziinit.filestream,&size_central_dir)!=ZIP_OK) | 587 | |
588 | err=ZIP_ERRNO; | 588 | if ((number_entry_CD!=number_entry) || |
589 | 589 | (number_disk_with_CD!=0) || | |
590 | /* offset of start of central directory with respect to the | 590 | (number_disk!=0)) |
591 | starting disk number */ | 591 | err=ZIP_BADZIPFILE; |
592 | if (ziplocal_getLong(&ziinit.z_filefunc, ziinit.filestream,&offset_central_dir)!=ZIP_OK) | 592 | |
593 | err=ZIP_ERRNO; | 593 | /* size of the central directory */ |
594 | 594 | if (ziplocal_getLong(&ziinit.z_filefunc, ziinit.filestream,&size_central_dir)!=ZIP_OK) | |
595 | /* zipfile comment length */ | 595 | err=ZIP_ERRNO; |
596 | if (ziplocal_getShort(&ziinit.z_filefunc, ziinit.filestream,&size_comment)!=ZIP_OK) | 596 | |
597 | err=ZIP_ERRNO; | 597 | /* offset of start of central directory with respect to the |
598 | 598 | starting disk number */ | |
599 | if ((central_pos<offset_central_dir+size_central_dir) && | 599 | if (ziplocal_getLong(&ziinit.z_filefunc, ziinit.filestream,&offset_central_dir)!=ZIP_OK) |
600 | (err==ZIP_OK)) | 600 | err=ZIP_ERRNO; |
601 | err=ZIP_BADZIPFILE; | 601 | |
602 | 602 | /* zipfile global comment length */ | |
603 | if (err!=ZIP_OK) | 603 | if (ziplocal_getShort(&ziinit.z_filefunc, ziinit.filestream,&size_comment)!=ZIP_OK) |
604 | { | 604 | err=ZIP_ERRNO; |
605 | ZCLOSE(ziinit.z_filefunc, ziinit.filestream); | 605 | |
606 | return NULL; | 606 | if ((central_pos<offset_central_dir+size_central_dir) && |
607 | } | 607 | (err==ZIP_OK)) |
608 | 608 | err=ZIP_BADZIPFILE; | |
609 | byte_before_the_zipfile = central_pos - | 609 | |
610 | (offset_central_dir+size_central_dir); | 610 | if (err!=ZIP_OK) |
611 | ziinit.add_position_when_writting_offset = byte_before_the_zipfile ; | 611 | { |
612 | 612 | ZCLOSE(ziinit.z_filefunc, ziinit.filestream); | |
613 | { | 613 | return NULL; |
614 | uLong size_central_dir_to_read = size_central_dir; | 614 | } |
615 | size_t buf_size = SIZEDATA_INDATABLOCK; | 615 | |
616 | void* buf_read = (void*)ALLOC(buf_size); | 616 | if (size_comment>0) |
617 | if (ZSEEK(ziinit.z_filefunc, ziinit.filestream, | 617 | { |
618 | offset_central_dir + byte_before_the_zipfile, | 618 | ziinit.globalcomment = ALLOC(size_comment+1); |
619 | ZLIB_FILEFUNC_SEEK_SET) != 0) | 619 | if (ziinit.globalcomment) |
620 | err=ZIP_ERRNO; | 620 | { |
621 | 621 | size_comment = ZREAD(ziinit.z_filefunc, ziinit.filestream,ziinit.globalcomment,size_comment); | |
622 | while ((size_central_dir_to_read>0) && (err==ZIP_OK)) | 622 | ziinit.globalcomment[size_comment]=0; |
623 | { | 623 | } |
624 | uLong read_this = SIZEDATA_INDATABLOCK; | 624 | } |
625 | if (read_this > size_central_dir_to_read) | 625 | |
626 | read_this = size_central_dir_to_read; | 626 | byte_before_the_zipfile = central_pos - |
627 | if (ZREAD(ziinit.z_filefunc, ziinit.filestream,buf_read,read_this) != read_this) | 627 | (offset_central_dir+size_central_dir); |
628 | err=ZIP_ERRNO; | 628 | ziinit.add_position_when_writting_offset = byte_before_the_zipfile; |
629 | 629 | ||
630 | if (err==ZIP_OK) | 630 | { |
631 | err = add_data_in_datablock(&ziinit.central_dir,buf_read, | 631 | uLong size_central_dir_to_read = size_central_dir; |
632 | (uLong)read_this); | 632 | size_t buf_size = SIZEDATA_INDATABLOCK; |
633 | size_central_dir_to_read-=read_this; | 633 | void* buf_read = (void*)ALLOC(buf_size); |
634 | } | 634 | if (ZSEEK(ziinit.z_filefunc, ziinit.filestream, |
635 | TRYFREE(buf_read); | 635 | offset_central_dir + byte_before_the_zipfile, |
636 | } | 636 | ZLIB_FILEFUNC_SEEK_SET) != 0) |
637 | ziinit.begin_pos = byte_before_the_zipfile; | 637 | err=ZIP_ERRNO; |
638 | ziinit.number_entry = number_entry_CD; | 638 | |
639 | 639 | while ((size_central_dir_to_read>0) && (err==ZIP_OK)) | |
640 | if (ZSEEK(ziinit.z_filefunc, ziinit.filestream, | 640 | { |
641 | offset_central_dir+byte_before_the_zipfile,ZLIB_FILEFUNC_SEEK_SET)!=0) | 641 | uLong read_this = SIZEDATA_INDATABLOCK; |
642 | err=ZIP_ERRNO; | 642 | if (read_this > size_central_dir_to_read) |
643 | } | 643 | read_this = size_central_dir_to_read; |
644 | # endif /* !NO_ADDFILEINEXISTINGZIP*/ | 644 | if (ZREAD(ziinit.z_filefunc, ziinit.filestream,buf_read,read_this) != read_this) |
645 | 645 | err=ZIP_ERRNO; | |
646 | if (err != ZIP_OK) | 646 | |
647 | { | 647 | if (err==ZIP_OK) |
648 | TRYFREE(zi); | 648 | err = add_data_in_datablock(&ziinit.central_dir,buf_read, |
649 | return NULL; | 649 | (uLong)read_this); |
650 | } | 650 | size_central_dir_to_read-=read_this; |
651 | else | 651 | } |
652 | { | 652 | TRYFREE(buf_read); |
653 | *zi = ziinit; | 653 | } |
654 | return (zipFile)zi; | 654 | ziinit.begin_pos = byte_before_the_zipfile; |
655 | } | 655 | ziinit.number_entry = number_entry_CD; |
656 | } | 656 | |
657 | 657 | if (ZSEEK(ziinit.z_filefunc, ziinit.filestream, | |
658 | extern zipFile ZEXPORT zipOpen (pathname, append) | 658 | offset_central_dir+byte_before_the_zipfile,ZLIB_FILEFUNC_SEEK_SET)!=0) |
659 | const char *pathname; | 659 | err=ZIP_ERRNO; |
660 | int append; | 660 | } |
661 | { | 661 | |
662 | return zipOpen2(pathname,append,NULL,NULL); | 662 | if (globalcomment) |
663 | } | 663 | { |
664 | 664 | *globalcomment = ziinit.globalcomment; | |
665 | extern int ZEXPORT zipOpenNewFileInZip3 (file, filename, zipfi, | 665 | } |
666 | extrafield_local, size_extrafield_local, | 666 | # endif /* !NO_ADDFILEINEXISTINGZIP*/ |
667 | extrafield_global, size_extrafield_global, | 667 | |
668 | comment, method, level, raw, | 668 | if (err != ZIP_OK) |
669 | windowBits, memLevel, strategy, | 669 | { |
670 | password, crcForCrypting) | 670 | # ifndef NO_ADDFILEINEXISTINGZIP |
671 | zipFile file; | 671 | TRYFREE(ziinit.globalcomment); |
672 | const char* filename; | 672 | # endif /* !NO_ADDFILEINEXISTINGZIP*/ |
673 | const zip_fileinfo* zipfi; | 673 | TRYFREE(zi); |
674 | const void* extrafield_local; | 674 | return NULL; |
675 | uInt size_extrafield_local; | 675 | } |
676 | const void* extrafield_global; | 676 | else |
677 | uInt size_extrafield_global; | 677 | { |
678 | const char* comment; | 678 | *zi = ziinit; |
679 | int method; | 679 | return (zipFile)zi; |
680 | int level; | 680 | } |
681 | int raw; | 681 | } |
682 | int windowBits; | 682 | |
683 | int memLevel; | 683 | extern zipFile ZEXPORT zipOpen (pathname, append) |
684 | int strategy; | 684 | const char *pathname; |
685 | const char* password; | 685 | int append; |
686 | uLong crcForCrypting; | 686 | { |
687 | { | 687 | return zipOpen2(pathname,append,NULL,NULL); |
688 | zip_internal* zi; | 688 | } |
689 | uInt size_filename; | 689 | |
690 | uInt size_comment; | 690 | extern int ZEXPORT zipOpenNewFileInZip3 (file, filename, zipfi, |
691 | uInt i; | 691 | extrafield_local, size_extrafield_local, |
692 | int err = ZIP_OK; | 692 | extrafield_global, size_extrafield_global, |
693 | 693 | comment, method, level, raw, | |
694 | # ifdef NOCRYPT | 694 | windowBits, memLevel, strategy, |
695 | if (password != NULL) | 695 | password, crcForCrypting) |
696 | return ZIP_PARAMERROR; | 696 | zipFile file; |
697 | # endif | 697 | const char* filename; |
698 | 698 | const zip_fileinfo* zipfi; | |
699 | if (file == NULL) | 699 | const void* extrafield_local; |
700 | return ZIP_PARAMERROR; | 700 | uInt size_extrafield_local; |
701 | if ((method!=0) && (method!=Z_DEFLATED)) | 701 | const void* extrafield_global; |
702 | return ZIP_PARAMERROR; | 702 | uInt size_extrafield_global; |
703 | 703 | const char* comment; | |
704 | zi = (zip_internal*)file; | 704 | int method; |
705 | 705 | int level; | |
706 | if (zi->in_opened_file_inzip == 1) | 706 | int raw; |
707 | { | 707 | int windowBits; |
708 | err = zipCloseFileInZip (file); | 708 | int memLevel; |
709 | if (err != ZIP_OK) | 709 | int strategy; |
710 | return err; | 710 | const char* password; |
711 | } | 711 | uLong crcForCrypting; |
712 | 712 | { | |
713 | 713 | zip_internal* zi; | |
714 | if (filename==NULL) | 714 | uInt size_filename; |
715 | filename="-"; | 715 | uInt size_comment; |
716 | 716 | uInt i; | |
717 | if (comment==NULL) | 717 | int err = ZIP_OK; |
718 | size_comment = 0; | 718 | |
719 | else | 719 | # ifdef NOCRYPT |
720 | size_comment = (uInt)strlen(comment); | 720 | if (password != NULL) |
721 | 721 | return ZIP_PARAMERROR; | |
722 | size_filename = (uInt)strlen(filename); | 722 | # endif |
723 | 723 | ||
724 | if (zipfi == NULL) | 724 | if (file == NULL) |
725 | zi->ci.dosDate = 0; | 725 | return ZIP_PARAMERROR; |
726 | else | 726 | if ((method!=0) && (method!=Z_DEFLATED)) |
727 | { | 727 | return ZIP_PARAMERROR; |
728 | if (zipfi->dosDate != 0) | 728 | |
729 | zi->ci.dosDate = zipfi->dosDate; | 729 | zi = (zip_internal*)file; |
730 | else zi->ci.dosDate = ziplocal_TmzDateToDosDate(&zipfi->tmz_date,zipfi->dosDate); | 730 | |
731 | } | 731 | if (zi->in_opened_file_inzip == 1) |
732 | 732 | { | |
733 | zi->ci.flag = 0; | 733 | err = zipCloseFileInZip (file); |
734 | if ((level==8) || (level==9)) | 734 | if (err != ZIP_OK) |
735 | zi->ci.flag |= 2; | 735 | return err; |
736 | if ((level==2)) | 736 | } |
737 | zi->ci.flag |= 4; | 737 | |
738 | if ((level==1)) | 738 | |
739 | zi->ci.flag |= 6; | 739 | if (filename==NULL) |
740 | if (password != NULL) | 740 | filename="-"; |
741 | zi->ci.flag |= 1; | 741 | |
742 | 742 | if (comment==NULL) | |
743 | zi->ci.crc32 = 0; | 743 | size_comment = 0; |
744 | zi->ci.method = method; | 744 | else |
745 | zi->ci.encrypt = 0; | 745 | size_comment = (uInt)strlen(comment); |
746 | zi->ci.stream_initialised = 0; | 746 | |
747 | zi->ci.pos_in_buffered_data = 0; | 747 | size_filename = (uInt)strlen(filename); |
748 | zi->ci.raw = raw; | 748 | |
749 | zi->ci.pos_local_header = ZTELL(zi->z_filefunc,zi->filestream) ; | 749 | if (zipfi == NULL) |
750 | zi->ci.size_centralheader = SIZECENTRALHEADER + size_filename + | 750 | zi->ci.dosDate = 0; |
751 | size_extrafield_global + size_comment; | 751 | else |
752 | zi->ci.central_header = (char*)ALLOC((uInt)zi->ci.size_centralheader); | 752 | { |
753 | 753 | if (zipfi->dosDate != 0) | |
754 | ziplocal_putValue_inmemory(zi->ci.central_header,(uLong)CENTRALHEADERMAGIC,4); | 754 | zi->ci.dosDate = zipfi->dosDate; |
755 | /* version info */ | 755 | else zi->ci.dosDate = ziplocal_TmzDateToDosDate(&zipfi->tmz_date,zipfi->dosDate); |
756 | ziplocal_putValue_inmemory(zi->ci.central_header+4,(uLong)VERSIONMADEBY,2); | 756 | } |
757 | ziplocal_putValue_inmemory(zi->ci.central_header+6,(uLong)20,2); | 757 | |
758 | ziplocal_putValue_inmemory(zi->ci.central_header+8,(uLong)zi->ci.flag,2); | 758 | zi->ci.flag = 0; |
759 | ziplocal_putValue_inmemory(zi->ci.central_header+10,(uLong)zi->ci.method,2); | 759 | if ((level==8) || (level==9)) |
760 | ziplocal_putValue_inmemory(zi->ci.central_header+12,(uLong)zi->ci.dosDate,4); | 760 | zi->ci.flag |= 2; |
761 | ziplocal_putValue_inmemory(zi->ci.central_header+16,(uLong)0,4); /*crc*/ | 761 | if ((level==2)) |
762 | ziplocal_putValue_inmemory(zi->ci.central_header+20,(uLong)0,4); /*compr size*/ | 762 | zi->ci.flag |= 4; |
763 | ziplocal_putValue_inmemory(zi->ci.central_header+24,(uLong)0,4); /*uncompr size*/ | 763 | if ((level==1)) |
764 | ziplocal_putValue_inmemory(zi->ci.central_header+28,(uLong)size_filename,2); | 764 | zi->ci.flag |= 6; |
765 | ziplocal_putValue_inmemory(zi->ci.central_header+30,(uLong)size_extrafield_global,2); | 765 | if (password != NULL) |
766 | ziplocal_putValue_inmemory(zi->ci.central_header+32,(uLong)size_comment,2); | 766 | zi->ci.flag |= 1; |
767 | ziplocal_putValue_inmemory(zi->ci.central_header+34,(uLong)0,2); /*disk nm start*/ | 767 | |
768 | 768 | zi->ci.crc32 = 0; | |
769 | if (zipfi==NULL) | 769 | zi->ci.method = method; |
770 | ziplocal_putValue_inmemory(zi->ci.central_header+36,(uLong)0,2); | 770 | zi->ci.encrypt = 0; |
771 | else | 771 | zi->ci.stream_initialised = 0; |
772 | ziplocal_putValue_inmemory(zi->ci.central_header+36,(uLong)zipfi->internal_fa,2); | 772 | zi->ci.pos_in_buffered_data = 0; |
773 | 773 | zi->ci.raw = raw; | |
774 | if (zipfi==NULL) | 774 | zi->ci.pos_local_header = ZTELL(zi->z_filefunc,zi->filestream) ; |
775 | ziplocal_putValue_inmemory(zi->ci.central_header+38,(uLong)0,4); | 775 | zi->ci.size_centralheader = SIZECENTRALHEADER + size_filename + |
776 | else | 776 | size_extrafield_global + size_comment; |
777 | ziplocal_putValue_inmemory(zi->ci.central_header+38,(uLong)zipfi->external_fa,4); | 777 | zi->ci.central_header = (char*)ALLOC((uInt)zi->ci.size_centralheader); |
778 | 778 | ||
779 | ziplocal_putValue_inmemory(zi->ci.central_header+42,(uLong)zi->ci.pos_local_header- zi->add_position_when_writting_offset,4); | 779 | ziplocal_putValue_inmemory(zi->ci.central_header,(uLong)CENTRALHEADERMAGIC,4); |
780 | 780 | /* version info */ | |
781 | for (i=0;i<size_filename;i++) | 781 | ziplocal_putValue_inmemory(zi->ci.central_header+4,(uLong)VERSIONMADEBY,2); |
782 | *(zi->ci.central_header+SIZECENTRALHEADER+i) = *(filename+i); | 782 | ziplocal_putValue_inmemory(zi->ci.central_header+6,(uLong)20,2); |
783 | 783 | ziplocal_putValue_inmemory(zi->ci.central_header+8,(uLong)zi->ci.flag,2); | |
784 | for (i=0;i<size_extrafield_global;i++) | 784 | ziplocal_putValue_inmemory(zi->ci.central_header+10,(uLong)zi->ci.method,2); |
785 | *(zi->ci.central_header+SIZECENTRALHEADER+size_filename+i) = | 785 | ziplocal_putValue_inmemory(zi->ci.central_header+12,(uLong)zi->ci.dosDate,4); |
786 | *(((const char*)extrafield_global)+i); | 786 | ziplocal_putValue_inmemory(zi->ci.central_header+16,(uLong)0,4); /*crc*/ |
787 | 787 | ziplocal_putValue_inmemory(zi->ci.central_header+20,(uLong)0,4); /*compr size*/ | |
788 | for (i=0;i<size_comment;i++) | 788 | ziplocal_putValue_inmemory(zi->ci.central_header+24,(uLong)0,4); /*uncompr size*/ |
789 | *(zi->ci.central_header+SIZECENTRALHEADER+size_filename+ | 789 | ziplocal_putValue_inmemory(zi->ci.central_header+28,(uLong)size_filename,2); |
790 | size_extrafield_global+i) = *(comment+i); | 790 | ziplocal_putValue_inmemory(zi->ci.central_header+30,(uLong)size_extrafield_global,2); |
791 | if (zi->ci.central_header == NULL) | 791 | ziplocal_putValue_inmemory(zi->ci.central_header+32,(uLong)size_comment,2); |
792 | return ZIP_INTERNALERROR; | 792 | ziplocal_putValue_inmemory(zi->ci.central_header+34,(uLong)0,2); /*disk nm start*/ |
793 | 793 | ||
794 | /* write the local header */ | 794 | if (zipfi==NULL) |
795 | err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)LOCALHEADERMAGIC,4); | 795 | ziplocal_putValue_inmemory(zi->ci.central_header+36,(uLong)0,2); |
796 | 796 | else | |
797 | if (err==ZIP_OK) | 797 | ziplocal_putValue_inmemory(zi->ci.central_header+36,(uLong)zipfi->internal_fa,2); |
798 | err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)20,2);/* version needed to extract */ | 798 | |
799 | if (err==ZIP_OK) | 799 | if (zipfi==NULL) |
800 | err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)zi->ci.flag,2); | 800 | ziplocal_putValue_inmemory(zi->ci.central_header+38,(uLong)0,4); |
801 | 801 | else | |
802 | if (err==ZIP_OK) | 802 | ziplocal_putValue_inmemory(zi->ci.central_header+38,(uLong)zipfi->external_fa,4); |
803 | err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)zi->ci.method,2); | 803 | |
804 | 804 | ziplocal_putValue_inmemory(zi->ci.central_header+42,(uLong)zi->ci.pos_local_header- zi->add_position_when_writting_offset,4); | |
805 | if (err==ZIP_OK) | 805 | |
806 | err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)zi->ci.dosDate,4); | 806 | for (i=0;i<size_filename;i++) |
807 | 807 | *(zi->ci.central_header+SIZECENTRALHEADER+i) = *(filename+i); | |
808 | if (err==ZIP_OK) | 808 | |
809 | err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)0,4); /* crc 32, unknown */ | 809 | for (i=0;i<size_extrafield_global;i++) |
810 | if (err==ZIP_OK) | 810 | *(zi->ci.central_header+SIZECENTRALHEADER+size_filename+i) = |
811 | err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)0,4); /* compressed size, unknown */ | 811 | *(((const char*)extrafield_global)+i); |
812 | if (err==ZIP_OK) | 812 | |
813 | err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)0,4); /* uncompressed size, unknown */ | 813 | for (i=0;i<size_comment;i++) |
814 | 814 | *(zi->ci.central_header+SIZECENTRALHEADER+size_filename+ | |
815 | if (err==ZIP_OK) | 815 | size_extrafield_global+i) = *(comment+i); |
816 | err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)size_filename,2); | 816 | if (zi->ci.central_header == NULL) |
817 | 817 | return ZIP_INTERNALERROR; | |
818 | if (err==ZIP_OK) | 818 | |
819 | err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)size_extrafield_local,2); | 819 | /* write the local header */ |
820 | 820 | err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)LOCALHEADERMAGIC,4); | |
821 | if ((err==ZIP_OK) && (size_filename>0)) | 821 | |
822 | if (ZWRITE(zi->z_filefunc,zi->filestream,filename,size_filename)!=size_filename) | 822 | if (err==ZIP_OK) |
823 | err = ZIP_ERRNO; | 823 | err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)20,2);/* version needed to extract */ |
824 | 824 | if (err==ZIP_OK) | |
825 | if ((err==ZIP_OK) && (size_extrafield_local>0)) | 825 | err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)zi->ci.flag,2); |
826 | if (ZWRITE(zi->z_filefunc,zi->filestream,extrafield_local,size_extrafield_local) | 826 | |
827 | !=size_extrafield_local) | 827 | if (err==ZIP_OK) |
828 | err = ZIP_ERRNO; | 828 | err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)zi->ci.method,2); |
829 | 829 | ||
830 | zi->ci.stream.avail_in = (uInt)0; | 830 | if (err==ZIP_OK) |
831 | zi->ci.stream.avail_out = (uInt)Z_BUFSIZE; | 831 | err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)zi->ci.dosDate,4); |
832 | zi->ci.stream.next_out = zi->ci.buffered_data; | 832 | |
833 | zi->ci.stream.total_in = 0; | 833 | if (err==ZIP_OK) |
834 | zi->ci.stream.total_out = 0; | 834 | err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)0,4); /* crc 32, unknown */ |
835 | 835 | if (err==ZIP_OK) | |
836 | if ((err==ZIP_OK) && (zi->ci.method == Z_DEFLATED) && (!zi->ci.raw)) | 836 | err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)0,4); /* compressed size, unknown */ |
837 | { | 837 | if (err==ZIP_OK) |
838 | zi->ci.stream.zalloc = (alloc_func)0; | 838 | err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)0,4); /* uncompressed size, unknown */ |
839 | zi->ci.stream.zfree = (free_func)0; | 839 | |
840 | zi->ci.stream.opaque = (voidpf)0; | 840 | if (err==ZIP_OK) |
841 | 841 | err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)size_filename,2); | |
842 | if (windowBits>0) | 842 | |
843 | windowBits = -windowBits; | 843 | if (err==ZIP_OK) |
844 | 844 | err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)size_extrafield_local,2); | |
845 | err = deflateInit2(&zi->ci.stream, level, | 845 | |
846 | Z_DEFLATED, windowBits, memLevel, strategy); | 846 | if ((err==ZIP_OK) && (size_filename>0)) |
847 | 847 | if (ZWRITE(zi->z_filefunc,zi->filestream,filename,size_filename)!=size_filename) | |
848 | if (err==Z_OK) | 848 | err = ZIP_ERRNO; |
849 | zi->ci.stream_initialised = 1; | 849 | |
850 | } | 850 | if ((err==ZIP_OK) && (size_extrafield_local>0)) |
851 | # ifndef NOCRYPT | 851 | if (ZWRITE(zi->z_filefunc,zi->filestream,extrafield_local,size_extrafield_local) |
852 | zi->ci.crypt_header_size = 0; | 852 | !=size_extrafield_local) |
853 | if ((err==Z_OK) && (password != NULL)) | 853 | err = ZIP_ERRNO; |
854 | { | 854 | |
855 | unsigned char bufHead[RAND_HEAD_LEN]; | 855 | zi->ci.stream.avail_in = (uInt)0; |
856 | unsigned int sizeHead; | 856 | zi->ci.stream.avail_out = (uInt)Z_BUFSIZE; |
857 | zi->ci.encrypt = 1; | 857 | zi->ci.stream.next_out = zi->ci.buffered_data; |
858 | zi->ci.pcrc_32_tab = get_crc_table(); | 858 | zi->ci.stream.total_in = 0; |
859 | /*init_keys(password,zi->ci.keys,zi->ci.pcrc_32_tab);*/ | 859 | zi->ci.stream.total_out = 0; |
860 | 860 | ||
861 | sizeHead=crypthead(password,bufHead,RAND_HEAD_LEN,zi->ci.keys,zi->ci.pcrc_32_tab,crcForCrypting); | 861 | if ((err==ZIP_OK) && (zi->ci.method == Z_DEFLATED) && (!zi->ci.raw)) |
862 | zi->ci.crypt_header_size = sizeHead; | 862 | { |
863 | 863 | zi->ci.stream.zalloc = (alloc_func)0; | |
864 | if (ZWRITE(zi->z_filefunc,zi->filestream,bufHead,sizeHead) != sizeHead) | 864 | zi->ci.stream.zfree = (free_func)0; |
865 | err = ZIP_ERRNO; | 865 | zi->ci.stream.opaque = (voidpf)0; |
866 | } | 866 | |
867 | # endif | 867 | if (windowBits>0) |
868 | 868 | windowBits = -windowBits; | |
869 | if (err==Z_OK) | 869 | |
870 | zi->in_opened_file_inzip = 1; | 870 | err = deflateInit2(&zi->ci.stream, level, |
871 | return err; | 871 | Z_DEFLATED, windowBits, memLevel, strategy); |
872 | } | 872 | |
873 | 873 | if (err==Z_OK) | |
874 | extern int ZEXPORT zipOpenNewFileInZip2(file, filename, zipfi, | 874 | zi->ci.stream_initialised = 1; |
875 | extrafield_local, size_extrafield_local, | 875 | } |
876 | extrafield_global, size_extrafield_global, | 876 | # ifndef NOCRYPT |
877 | comment, method, level, raw) | 877 | zi->ci.crypt_header_size = 0; |
878 | zipFile file; | 878 | if ((err==Z_OK) && (password != NULL)) |
879 | const char* filename; | 879 | { |
880 | const zip_fileinfo* zipfi; | 880 | unsigned char bufHead[RAND_HEAD_LEN]; |
881 | const void* extrafield_local; | 881 | unsigned int sizeHead; |
882 | uInt size_extrafield_local; | 882 | zi->ci.encrypt = 1; |
883 | const void* extrafield_global; | 883 | zi->ci.pcrc_32_tab = get_crc_table(); |
884 | uInt size_extrafield_global; | 884 | /*init_keys(password,zi->ci.keys,zi->ci.pcrc_32_tab);*/ |
885 | const char* comment; | 885 | |
886 | int method; | 886 | sizeHead=crypthead(password,bufHead,RAND_HEAD_LEN,zi->ci.keys,zi->ci.pcrc_32_tab,crcForCrypting); |
887 | int level; | 887 | zi->ci.crypt_header_size = sizeHead; |
888 | int raw; | 888 | |
889 | { | 889 | if (ZWRITE(zi->z_filefunc,zi->filestream,bufHead,sizeHead) != sizeHead) |
890 | return zipOpenNewFileInZip3 (file, filename, zipfi, | 890 | err = ZIP_ERRNO; |
891 | extrafield_local, size_extrafield_local, | 891 | } |
892 | extrafield_global, size_extrafield_global, | 892 | # endif |
893 | comment, method, level, raw, | 893 | |
894 | -MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY, | 894 | if (err==Z_OK) |
895 | NULL, 0); | 895 | zi->in_opened_file_inzip = 1; |
896 | } | 896 | return err; |
897 | 897 | } | |
898 | extern int ZEXPORT zipOpenNewFileInZip (file, filename, zipfi, | 898 | |
899 | extrafield_local, size_extrafield_local, | 899 | extern int ZEXPORT zipOpenNewFileInZip2(file, filename, zipfi, |
900 | extrafield_global, size_extrafield_global, | 900 | extrafield_local, size_extrafield_local, |
901 | comment, method, level) | 901 | extrafield_global, size_extrafield_global, |
902 | zipFile file; | 902 | comment, method, level, raw) |
903 | const char* filename; | 903 | zipFile file; |
904 | const zip_fileinfo* zipfi; | 904 | const char* filename; |
905 | const void* extrafield_local; | 905 | const zip_fileinfo* zipfi; |
906 | uInt size_extrafield_local; | 906 | const void* extrafield_local; |
907 | const void* extrafield_global; | 907 | uInt size_extrafield_local; |
908 | uInt size_extrafield_global; | 908 | const void* extrafield_global; |
909 | const char* comment; | 909 | uInt size_extrafield_global; |
910 | int method; | 910 | const char* comment; |
911 | int level; | 911 | int method; |
912 | { | 912 | int level; |
913 | return zipOpenNewFileInZip2 (file, filename, zipfi, | 913 | int raw; |
914 | extrafield_local, size_extrafield_local, | 914 | { |
915 | extrafield_global, size_extrafield_global, | 915 | return zipOpenNewFileInZip3 (file, filename, zipfi, |
916 | comment, method, level, 0); | 916 | extrafield_local, size_extrafield_local, |
917 | } | 917 | extrafield_global, size_extrafield_global, |
918 | 918 | comment, method, level, raw, | |
919 | local int zipFlushWriteBuffer(zi) | 919 | -MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY, |
920 | zip_internal* zi; | 920 | NULL, 0); |
921 | { | 921 | } |
922 | int err=ZIP_OK; | 922 | |
923 | 923 | extern int ZEXPORT zipOpenNewFileInZip (file, filename, zipfi, | |
924 | if (zi->ci.encrypt != 0) | 924 | extrafield_local, size_extrafield_local, |
925 | { | 925 | extrafield_global, size_extrafield_global, |
926 | #ifndef NOCRYPT | 926 | comment, method, level) |
927 | uInt i; | 927 | zipFile file; |
928 | int t; | 928 | const char* filename; |
929 | for (i=0;i<zi->ci.pos_in_buffered_data;i++) | 929 | const zip_fileinfo* zipfi; |
930 | zi->ci.buffered_data[i] = zencode(zi->ci.keys, zi->ci.pcrc_32_tab, | 930 | const void* extrafield_local; |
931 | zi->ci.buffered_data[i],t); | 931 | uInt size_extrafield_local; |
932 | #endif | 932 | const void* extrafield_global; |
933 | } | 933 | uInt size_extrafield_global; |
934 | if (ZWRITE(zi->z_filefunc,zi->filestream,zi->ci.buffered_data,zi->ci.pos_in_buffered_data) | 934 | const char* comment; |
935 | !=zi->ci.pos_in_buffered_data) | 935 | int method; |
936 | err = ZIP_ERRNO; | 936 | int level; |
937 | zi->ci.pos_in_buffered_data = 0; | 937 | { |
938 | return err; | 938 | return zipOpenNewFileInZip2 (file, filename, zipfi, |
939 | } | 939 | extrafield_local, size_extrafield_local, |
940 | 940 | extrafield_global, size_extrafield_global, | |
941 | extern int ZEXPORT zipWriteInFileInZip (file, buf, len) | 941 | comment, method, level, 0); |
942 | zipFile file; | 942 | } |
943 | const void* buf; | 943 | |
944 | unsigned len; | 944 | local int zipFlushWriteBuffer(zi) |
945 | { | 945 | zip_internal* zi; |
946 | zip_internal* zi; | 946 | { |
947 | int err=ZIP_OK; | 947 | int err=ZIP_OK; |
948 | 948 | ||
949 | if (file == NULL) | 949 | if (zi->ci.encrypt != 0) |
950 | return ZIP_PARAMERROR; | 950 | { |
951 | zi = (zip_internal*)file; | 951 | #ifndef NOCRYPT |
952 | 952 | uInt i; | |
953 | if (zi->in_opened_file_inzip == 0) | 953 | int t; |
954 | return ZIP_PARAMERROR; | 954 | for (i=0;i<zi->ci.pos_in_buffered_data;i++) |
955 | 955 | zi->ci.buffered_data[i] = zencode(zi->ci.keys, zi->ci.pcrc_32_tab, | |
956 | zi->ci.stream.next_in = (void*)buf; | 956 | zi->ci.buffered_data[i],t); |
957 | zi->ci.stream.avail_in = len; | 957 | #endif |
958 | zi->ci.crc32 = crc32(zi->ci.crc32,buf,len); | 958 | } |
959 | 959 | if (ZWRITE(zi->z_filefunc,zi->filestream,zi->ci.buffered_data,zi->ci.pos_in_buffered_data) | |
960 | while ((err==ZIP_OK) && (zi->ci.stream.avail_in>0)) | 960 | !=zi->ci.pos_in_buffered_data) |
961 | { | 961 | err = ZIP_ERRNO; |
962 | if (zi->ci.stream.avail_out == 0) | 962 | zi->ci.pos_in_buffered_data = 0; |
963 | { | 963 | return err; |
964 | if (zipFlushWriteBuffer(zi) == ZIP_ERRNO) | 964 | } |
965 | err = ZIP_ERRNO; | 965 | |
966 | zi->ci.stream.avail_out = (uInt)Z_BUFSIZE; | 966 | extern int ZEXPORT zipWriteInFileInZip (file, buf, len) |
967 | zi->ci.stream.next_out = zi->ci.buffered_data; | 967 | zipFile file; |
968 | } | 968 | const void* buf; |
969 | 969 | unsigned len; | |
970 | 970 | { | |
971 | if(err != ZIP_OK) | 971 | zip_internal* zi; |
972 | break; | 972 | int err=ZIP_OK; |
973 | 973 | ||
974 | if ((zi->ci.method == Z_DEFLATED) && (!zi->ci.raw)) | 974 | if (file == NULL) |
975 | { | 975 | return ZIP_PARAMERROR; |
976 | uLong uTotalOutBefore = zi->ci.stream.total_out; | 976 | zi = (zip_internal*)file; |
977 | err=deflate(&zi->ci.stream, Z_NO_FLUSH); | 977 | |
978 | zi->ci.pos_in_buffered_data += (uInt)(zi->ci.stream.total_out - uTotalOutBefore) ; | 978 | if (zi->in_opened_file_inzip == 0) |
979 | 979 | return ZIP_PARAMERROR; | |
980 | } | 980 | |
981 | else | 981 | zi->ci.stream.next_in = (void*)buf; |
982 | { | 982 | zi->ci.stream.avail_in = len; |
983 | uInt copy_this,i; | 983 | zi->ci.crc32 = crc32(zi->ci.crc32,buf,len); |
984 | if (zi->ci.stream.avail_in < zi->ci.stream.avail_out) | 984 | |
985 | copy_this = zi->ci.stream.avail_in; | 985 | while ((err==ZIP_OK) && (zi->ci.stream.avail_in>0)) |
986 | else | 986 | { |
987 | copy_this = zi->ci.stream.avail_out; | 987 | if (zi->ci.stream.avail_out == 0) |
988 | for (i=0;i<copy_this;i++) | 988 | { |
989 | *(((char*)zi->ci.stream.next_out)+i) = | 989 | if (zipFlushWriteBuffer(zi) == ZIP_ERRNO) |
990 | *(((const char*)zi->ci.stream.next_in)+i); | 990 | err = ZIP_ERRNO; |
991 | { | 991 | zi->ci.stream.avail_out = (uInt)Z_BUFSIZE; |
992 | zi->ci.stream.avail_in -= copy_this; | 992 | zi->ci.stream.next_out = zi->ci.buffered_data; |
993 | zi->ci.stream.avail_out-= copy_this; | 993 | } |
994 | zi->ci.stream.next_in+= copy_this; | 994 | |
995 | zi->ci.stream.next_out+= copy_this; | 995 | |
996 | zi->ci.stream.total_in+= copy_this; | 996 | if(err != ZIP_OK) |
997 | zi->ci.stream.total_out+= copy_this; | 997 | break; |
998 | zi->ci.pos_in_buffered_data += copy_this; | 998 | |
999 | } | 999 | if ((zi->ci.method == Z_DEFLATED) && (!zi->ci.raw)) |
1000 | } | 1000 | { |
1001 | } | 1001 | uLong uTotalOutBefore = zi->ci.stream.total_out; |
1002 | 1002 | err=deflate(&zi->ci.stream, Z_NO_FLUSH); | |
1003 | return err; | 1003 | zi->ci.pos_in_buffered_data += (uInt)(zi->ci.stream.total_out - uTotalOutBefore) ; |
1004 | } | 1004 | |
1005 | 1005 | } | |
1006 | extern int ZEXPORT zipCloseFileInZipRaw (file, uncompressed_size, crc32) | 1006 | else |
1007 | zipFile file; | 1007 | { |
1008 | uLong uncompressed_size; | 1008 | uInt copy_this,i; |
1009 | uLong crc32; | 1009 | if (zi->ci.stream.avail_in < zi->ci.stream.avail_out) |
1010 | { | 1010 | copy_this = zi->ci.stream.avail_in; |
1011 | zip_internal* zi; | 1011 | else |
1012 | uLong compressed_size; | 1012 | copy_this = zi->ci.stream.avail_out; |
1013 | int err=ZIP_OK; | 1013 | for (i=0;i<copy_this;i++) |
1014 | 1014 | *(((char*)zi->ci.stream.next_out)+i) = | |
1015 | if (file == NULL) | 1015 | *(((const char*)zi->ci.stream.next_in)+i); |
1016 | return ZIP_PARAMERROR; | 1016 | { |
1017 | zi = (zip_internal*)file; | 1017 | zi->ci.stream.avail_in -= copy_this; |
1018 | 1018 | zi->ci.stream.avail_out-= copy_this; | |
1019 | if (zi->in_opened_file_inzip == 0) | 1019 | zi->ci.stream.next_in+= copy_this; |
1020 | return ZIP_PARAMERROR; | 1020 | zi->ci.stream.next_out+= copy_this; |
1021 | zi->ci.stream.avail_in = 0; | 1021 | zi->ci.stream.total_in+= copy_this; |
1022 | 1022 | zi->ci.stream.total_out+= copy_this; | |
1023 | if ((zi->ci.method == Z_DEFLATED) && (!zi->ci.raw)) | 1023 | zi->ci.pos_in_buffered_data += copy_this; |
1024 | while (err==ZIP_OK) | 1024 | } |
1025 | { | 1025 | } |
1026 | uLong uTotalOutBefore; | 1026 | } |
1027 | if (zi->ci.stream.avail_out == 0) | 1027 | |
1028 | { | 1028 | return err; |
1029 | if (zipFlushWriteBuffer(zi) == ZIP_ERRNO) | 1029 | } |
1030 | err = ZIP_ERRNO; | 1030 | |
1031 | zi->ci.stream.avail_out = (uInt)Z_BUFSIZE; | 1031 | extern int ZEXPORT zipCloseFileInZipRaw (file, uncompressed_size, crc32) |
1032 | zi->ci.stream.next_out = zi->ci.buffered_data; | 1032 | zipFile file; |
1033 | } | 1033 | uLong uncompressed_size; |
1034 | uTotalOutBefore = zi->ci.stream.total_out; | 1034 | uLong crc32; |
1035 | err=deflate(&zi->ci.stream, Z_FINISH); | 1035 | { |
1036 | zi->ci.pos_in_buffered_data += (uInt)(zi->ci.stream.total_out - uTotalOutBefore) ; | 1036 | zip_internal* zi; |
1037 | } | 1037 | uLong compressed_size; |
1038 | 1038 | int err=ZIP_OK; | |
1039 | if (err==Z_STREAM_END) | 1039 | |
1040 | err=ZIP_OK; /* this is normal */ | 1040 | if (file == NULL) |
1041 | 1041 | return ZIP_PARAMERROR; | |
1042 | if ((zi->ci.pos_in_buffered_data>0) && (err==ZIP_OK)) | 1042 | zi = (zip_internal*)file; |
1043 | if (zipFlushWriteBuffer(zi)==ZIP_ERRNO) | 1043 | |
1044 | err = ZIP_ERRNO; | 1044 | if (zi->in_opened_file_inzip == 0) |
1045 | 1045 | return ZIP_PARAMERROR; | |
1046 | if ((zi->ci.method == Z_DEFLATED) && (!zi->ci.raw)) | 1046 | zi->ci.stream.avail_in = 0; |
1047 | { | 1047 | |
1048 | err=deflateEnd(&zi->ci.stream); | 1048 | if ((zi->ci.method == Z_DEFLATED) && (!zi->ci.raw)) |
1049 | zi->ci.stream_initialised = 0; | 1049 | while (err==ZIP_OK) |
1050 | } | 1050 | { |
1051 | 1051 | uLong uTotalOutBefore; | |
1052 | if (!zi->ci.raw) | 1052 | if (zi->ci.stream.avail_out == 0) |
1053 | { | 1053 | { |
1054 | crc32 = (uLong)zi->ci.crc32; | 1054 | if (zipFlushWriteBuffer(zi) == ZIP_ERRNO) |
1055 | uncompressed_size = (uLong)zi->ci.stream.total_in; | 1055 | err = ZIP_ERRNO; |
1056 | } | 1056 | zi->ci.stream.avail_out = (uInt)Z_BUFSIZE; |
1057 | compressed_size = (uLong)zi->ci.stream.total_out; | 1057 | zi->ci.stream.next_out = zi->ci.buffered_data; |
1058 | # ifndef NOCRYPT | 1058 | } |
1059 | compressed_size += zi->ci.crypt_header_size; | 1059 | uTotalOutBefore = zi->ci.stream.total_out; |
1060 | # endif | 1060 | err=deflate(&zi->ci.stream, Z_FINISH); |
1061 | 1061 | zi->ci.pos_in_buffered_data += (uInt)(zi->ci.stream.total_out - uTotalOutBefore) ; | |
1062 | ziplocal_putValue_inmemory(zi->ci.central_header+16,crc32,4); /*crc*/ | 1062 | } |
1063 | ziplocal_putValue_inmemory(zi->ci.central_header+20, | 1063 | |
1064 | compressed_size,4); /*compr size*/ | 1064 | if (err==Z_STREAM_END) |
1065 | if (zi->ci.stream.data_type == Z_ASCII) | 1065 | err=ZIP_OK; /* this is normal */ |
1066 | ziplocal_putValue_inmemory(zi->ci.central_header+36,(uLong)Z_ASCII,2); | 1066 | |
1067 | ziplocal_putValue_inmemory(zi->ci.central_header+24, | 1067 | if ((zi->ci.pos_in_buffered_data>0) && (err==ZIP_OK)) |
1068 | uncompressed_size,4); /*uncompr size*/ | 1068 | if (zipFlushWriteBuffer(zi)==ZIP_ERRNO) |
1069 | 1069 | err = ZIP_ERRNO; | |
1070 | if (err==ZIP_OK) | 1070 | |
1071 | err = add_data_in_datablock(&zi->central_dir,zi->ci.central_header, | 1071 | if ((zi->ci.method == Z_DEFLATED) && (!zi->ci.raw)) |
1072 | (uLong)zi->ci.size_centralheader); | 1072 | { |
1073 | free(zi->ci.central_header); | 1073 | err=deflateEnd(&zi->ci.stream); |
1074 | 1074 | zi->ci.stream_initialised = 0; | |
1075 | if (err==ZIP_OK) | 1075 | } |
1076 | { | 1076 | |
1077 | long cur_pos_inzip = ZTELL(zi->z_filefunc,zi->filestream); | 1077 | if (!zi->ci.raw) |
1078 | if (ZSEEK(zi->z_filefunc,zi->filestream, | 1078 | { |
1079 | zi->ci.pos_local_header + 14,ZLIB_FILEFUNC_SEEK_SET)!=0) | 1079 | crc32 = (uLong)zi->ci.crc32; |
1080 | err = ZIP_ERRNO; | 1080 | uncompressed_size = (uLong)zi->ci.stream.total_in; |
1081 | 1081 | } | |
1082 | if (err==ZIP_OK) | 1082 | compressed_size = (uLong)zi->ci.stream.total_out; |
1083 | err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,crc32,4); /* crc 32, unknown */ | 1083 | # ifndef NOCRYPT |
1084 | 1084 | compressed_size += zi->ci.crypt_header_size; | |
1085 | if (err==ZIP_OK) /* compressed size, unknown */ | 1085 | # endif |
1086 | err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,compressed_size,4); | 1086 | |
1087 | 1087 | ziplocal_putValue_inmemory(zi->ci.central_header+16,crc32,4); /*crc*/ | |
1088 | if (err==ZIP_OK) /* uncompressed size, unknown */ | 1088 | ziplocal_putValue_inmemory(zi->ci.central_header+20, |
1089 | err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,uncompressed_size,4); | 1089 | compressed_size,4); /*compr size*/ |
1090 | 1090 | if (zi->ci.stream.data_type == Z_ASCII) | |
1091 | if (ZSEEK(zi->z_filefunc,zi->filestream, | 1091 | ziplocal_putValue_inmemory(zi->ci.central_header+36,(uLong)Z_ASCII,2); |
1092 | cur_pos_inzip,ZLIB_FILEFUNC_SEEK_SET)!=0) | 1092 | ziplocal_putValue_inmemory(zi->ci.central_header+24, |
1093 | err = ZIP_ERRNO; | 1093 | uncompressed_size,4); /*uncompr size*/ |
1094 | } | 1094 | |
1095 | 1095 | if (err==ZIP_OK) | |
1096 | zi->number_entry ++; | 1096 | err = add_data_in_datablock(&zi->central_dir,zi->ci.central_header, |
1097 | zi->in_opened_file_inzip = 0; | 1097 | (uLong)zi->ci.size_centralheader); |
1098 | 1098 | free(zi->ci.central_header); | |
1099 | return err; | 1099 | |
1100 | } | 1100 | if (err==ZIP_OK) |
1101 | 1101 | { | |
1102 | extern int ZEXPORT zipCloseFileInZip (file) | 1102 | long cur_pos_inzip = ZTELL(zi->z_filefunc,zi->filestream); |
1103 | zipFile file; | 1103 | if (ZSEEK(zi->z_filefunc,zi->filestream, |
1104 | { | 1104 | zi->ci.pos_local_header + 14,ZLIB_FILEFUNC_SEEK_SET)!=0) |
1105 | return zipCloseFileInZipRaw (file,0,0); | 1105 | err = ZIP_ERRNO; |
1106 | } | 1106 | |
1107 | 1107 | if (err==ZIP_OK) | |
1108 | extern int ZEXPORT zipClose (file, global_comment) | 1108 | err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,crc32,4); /* crc 32, unknown */ |
1109 | zipFile file; | 1109 | |
1110 | const char* global_comment; | 1110 | if (err==ZIP_OK) /* compressed size, unknown */ |
1111 | { | 1111 | err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,compressed_size,4); |
1112 | zip_internal* zi; | 1112 | |
1113 | int err = 0; | 1113 | if (err==ZIP_OK) /* uncompressed size, unknown */ |
1114 | uLong size_centraldir = 0; | 1114 | err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,uncompressed_size,4); |
1115 | uLong centraldir_pos_inzip ; | 1115 | |
1116 | uInt size_global_comment; | 1116 | if (ZSEEK(zi->z_filefunc,zi->filestream, |
1117 | if (file == NULL) | 1117 | cur_pos_inzip,ZLIB_FILEFUNC_SEEK_SET)!=0) |
1118 | return ZIP_PARAMERROR; | 1118 | err = ZIP_ERRNO; |
1119 | zi = (zip_internal*)file; | 1119 | } |
1120 | 1120 | ||
1121 | if (zi->in_opened_file_inzip == 1) | 1121 | zi->number_entry ++; |
1122 | { | 1122 | zi->in_opened_file_inzip = 0; |
1123 | err = zipCloseFileInZip (file); | 1123 | |
1124 | } | 1124 | return err; |
1125 | 1125 | } | |
1126 | if (global_comment==NULL) | 1126 | |
1127 | size_global_comment = 0; | 1127 | extern int ZEXPORT zipCloseFileInZip (file) |
1128 | else | 1128 | zipFile file; |
1129 | size_global_comment = (uInt)strlen(global_comment); | 1129 | { |
1130 | 1130 | return zipCloseFileInZipRaw (file,0,0); | |
1131 | 1131 | } | |
1132 | centraldir_pos_inzip = ZTELL(zi->z_filefunc,zi->filestream); | 1132 | |
1133 | if (err==ZIP_OK) | 1133 | extern int ZEXPORT zipClose (file, global_comment) |
1134 | { | 1134 | zipFile file; |
1135 | linkedlist_datablock_internal* ldi = zi->central_dir.first_block ; | 1135 | const char* global_comment; |
1136 | while (ldi!=NULL) | 1136 | { |
1137 | { | 1137 | zip_internal* zi; |
1138 | if ((err==ZIP_OK) && (ldi->filled_in_this_block>0)) | 1138 | int err = 0; |
1139 | if (ZWRITE(zi->z_filefunc,zi->filestream, | 1139 | uLong size_centraldir = 0; |
1140 | ldi->data,ldi->filled_in_this_block) | 1140 | uLong centraldir_pos_inzip; |
1141 | !=ldi->filled_in_this_block ) | 1141 | uInt size_global_comment; |
1142 | err = ZIP_ERRNO; | 1142 | if (file == NULL) |
1143 | 1143 | return ZIP_PARAMERROR; | |
1144 | size_centraldir += ldi->filled_in_this_block; | 1144 | zi = (zip_internal*)file; |
1145 | ldi = ldi->next_datablock; | 1145 | |
1146 | } | 1146 | if (zi->in_opened_file_inzip == 1) |
1147 | } | 1147 | { |
1148 | free_datablock(zi->central_dir.first_block); | 1148 | err = zipCloseFileInZip (file); |
1149 | 1149 | } | |
1150 | if (err==ZIP_OK) /* Magic End */ | 1150 | |
1151 | err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)ENDHEADERMAGIC,4); | 1151 | #ifndef NO_ADDFILEINEXISTINGZIP |
1152 | 1152 | if (global_comment==NULL) | |
1153 | if (err==ZIP_OK) /* number of this disk */ | 1153 | global_comment = zi->globalcomment; |
1154 | err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)0,2); | 1154 | #endif |
1155 | 1155 | if (global_comment==NULL) | |
1156 | if (err==ZIP_OK) /* number of the disk with the start of the central directory */ | 1156 | size_global_comment = 0; |
1157 | err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)0,2); | 1157 | else |
1158 | 1158 | size_global_comment = (uInt)strlen(global_comment); | |
1159 | if (err==ZIP_OK) /* total number of entries in the central dir on this disk */ | 1159 | |
1160 | err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)zi->number_entry,2); | 1160 | centraldir_pos_inzip = ZTELL(zi->z_filefunc,zi->filestream); |
1161 | 1161 | if (err==ZIP_OK) | |
1162 | if (err==ZIP_OK) /* total number of entries in the central dir */ | 1162 | { |
1163 | err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)zi->number_entry,2); | 1163 | linkedlist_datablock_internal* ldi = zi->central_dir.first_block ; |
1164 | 1164 | while (ldi!=NULL) | |
1165 | if (err==ZIP_OK) /* size of the central directory */ | 1165 | { |
1166 | err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)size_centraldir,4); | 1166 | if ((err==ZIP_OK) && (ldi->filled_in_this_block>0)) |
1167 | 1167 | if (ZWRITE(zi->z_filefunc,zi->filestream, | |
1168 | if (err==ZIP_OK) /* offset of start of central directory with respect to the | 1168 | ldi->data,ldi->filled_in_this_block) |
1169 | starting disk number */ | 1169 | !=ldi->filled_in_this_block ) |
1170 | err = ziplocal_putValue(&zi->z_filefunc,zi->filestream, | 1170 | err = ZIP_ERRNO; |
1171 | (uLong)(centraldir_pos_inzip - zi->add_position_when_writting_offset),4); | 1171 | |
1172 | 1172 | size_centraldir += ldi->filled_in_this_block; | |
1173 | if (err==ZIP_OK) /* zipfile comment length */ | 1173 | ldi = ldi->next_datablock; |
1174 | err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)size_global_comment,2); | 1174 | } |
1175 | 1175 | } | |
1176 | if ((err==ZIP_OK) && (size_global_comment>0)) | 1176 | free_datablock(zi->central_dir.first_block); |
1177 | if (ZWRITE(zi->z_filefunc,zi->filestream, | 1177 | |
1178 | global_comment,size_global_comment) != size_global_comment) | 1178 | if (err==ZIP_OK) /* Magic End */ |
1179 | err = ZIP_ERRNO; | 1179 | err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)ENDHEADERMAGIC,4); |
1180 | 1180 | ||
1181 | if (ZCLOSE(zi->z_filefunc,zi->filestream) != 0) | 1181 | if (err==ZIP_OK) /* number of this disk */ |
1182 | if (err == ZIP_OK) | 1182 | err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)0,2); |
1183 | err = ZIP_ERRNO; | 1183 | |
1184 | 1184 | if (err==ZIP_OK) /* number of the disk with the start of the central directory */ | |
1185 | TRYFREE(zi); | 1185 | err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)0,2); |
1186 | 1186 | ||
1187 | return err; | 1187 | if (err==ZIP_OK) /* total number of entries in the central dir on this disk */ |
1188 | } | 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 | } | ||