1*86ee64e7SAndroid Build Coastguard Worker /*
2*86ee64e7SAndroid Build Coastguard Worker miniunz.c
3*86ee64e7SAndroid Build Coastguard Worker Version 1.1, February 14h, 2010
4*86ee64e7SAndroid Build Coastguard Worker sample part of the MiniZip project - ( http://www.winimage.com/zLibDll/minizip.html )
5*86ee64e7SAndroid Build Coastguard Worker
6*86ee64e7SAndroid Build Coastguard Worker Copyright (C) 1998-2010 Gilles Vollant (minizip) ( http://www.winimage.com/zLibDll/minizip.html )
7*86ee64e7SAndroid Build Coastguard Worker
8*86ee64e7SAndroid Build Coastguard Worker Modifications of Unzip for Zip64
9*86ee64e7SAndroid Build Coastguard Worker Copyright (C) 2007-2008 Even Rouault
10*86ee64e7SAndroid Build Coastguard Worker
11*86ee64e7SAndroid Build Coastguard Worker Modifications for Zip64 support on both zip and unzip
12*86ee64e7SAndroid Build Coastguard Worker Copyright (C) 2009-2010 Mathias Svensson ( http://result42.com )
13*86ee64e7SAndroid Build Coastguard Worker */
14*86ee64e7SAndroid Build Coastguard Worker
15*86ee64e7SAndroid Build Coastguard Worker #if (!defined(_WIN32)) && (!defined(WIN32)) && (!defined(__APPLE__)) && (!defined(__ANDROID_API__))
16*86ee64e7SAndroid Build Coastguard Worker #ifndef __USE_FILE_OFFSET64
17*86ee64e7SAndroid Build Coastguard Worker #define __USE_FILE_OFFSET64
18*86ee64e7SAndroid Build Coastguard Worker #endif
19*86ee64e7SAndroid Build Coastguard Worker #ifndef __USE_LARGEFILE64
20*86ee64e7SAndroid Build Coastguard Worker #define __USE_LARGEFILE64
21*86ee64e7SAndroid Build Coastguard Worker #endif
22*86ee64e7SAndroid Build Coastguard Worker #ifndef _LARGEFILE64_SOURCE
23*86ee64e7SAndroid Build Coastguard Worker #define _LARGEFILE64_SOURCE
24*86ee64e7SAndroid Build Coastguard Worker #endif
25*86ee64e7SAndroid Build Coastguard Worker #ifndef _FILE_OFFSET_BIT
26*86ee64e7SAndroid Build Coastguard Worker #define _FILE_OFFSET_BIT 64
27*86ee64e7SAndroid Build Coastguard Worker #endif
28*86ee64e7SAndroid Build Coastguard Worker #endif
29*86ee64e7SAndroid Build Coastguard Worker
30*86ee64e7SAndroid Build Coastguard Worker #if defined(__APPLE__) || defined(__HAIKU__) || defined(MINIZIP_FOPEN_NO_64) || defined(__Fuchsia__) || defined(__ANDROID_API__)
31*86ee64e7SAndroid Build Coastguard Worker // In darwin and perhaps other BSD variants off_t is a 64 bit value, hence no need for specific 64 bit functions
32*86ee64e7SAndroid Build Coastguard Worker #define FOPEN_FUNC(filename, mode) fopen(filename, mode)
33*86ee64e7SAndroid Build Coastguard Worker #define FTELLO_FUNC(stream) ftello(stream)
34*86ee64e7SAndroid Build Coastguard Worker #define FSEEKO_FUNC(stream, offset, origin) fseeko(stream, offset, origin)
35*86ee64e7SAndroid Build Coastguard Worker #else
36*86ee64e7SAndroid Build Coastguard Worker #define FOPEN_FUNC(filename, mode) fopen64(filename, mode)
37*86ee64e7SAndroid Build Coastguard Worker #define FTELLO_FUNC(stream) ftello64(stream)
38*86ee64e7SAndroid Build Coastguard Worker #define FSEEKO_FUNC(stream, offset, origin) fseeko64(stream, offset, origin)
39*86ee64e7SAndroid Build Coastguard Worker #endif
40*86ee64e7SAndroid Build Coastguard Worker
41*86ee64e7SAndroid Build Coastguard Worker
42*86ee64e7SAndroid Build Coastguard Worker #include <stdio.h>
43*86ee64e7SAndroid Build Coastguard Worker #include <stdlib.h>
44*86ee64e7SAndroid Build Coastguard Worker #include <string.h>
45*86ee64e7SAndroid Build Coastguard Worker #include <time.h>
46*86ee64e7SAndroid Build Coastguard Worker #include <errno.h>
47*86ee64e7SAndroid Build Coastguard Worker #include <fcntl.h>
48*86ee64e7SAndroid Build Coastguard Worker #include <sys/stat.h>
49*86ee64e7SAndroid Build Coastguard Worker
50*86ee64e7SAndroid Build Coastguard Worker #ifdef _WIN32
51*86ee64e7SAndroid Build Coastguard Worker # include <direct.h>
52*86ee64e7SAndroid Build Coastguard Worker # include <io.h>
53*86ee64e7SAndroid Build Coastguard Worker #else
54*86ee64e7SAndroid Build Coastguard Worker # include <unistd.h>
55*86ee64e7SAndroid Build Coastguard Worker # include <utime.h>
56*86ee64e7SAndroid Build Coastguard Worker #endif
57*86ee64e7SAndroid Build Coastguard Worker
58*86ee64e7SAndroid Build Coastguard Worker
59*86ee64e7SAndroid Build Coastguard Worker #include "unzip.h"
60*86ee64e7SAndroid Build Coastguard Worker
61*86ee64e7SAndroid Build Coastguard Worker #define CASESENSITIVITY (0)
62*86ee64e7SAndroid Build Coastguard Worker #define WRITEBUFFERSIZE (8192)
63*86ee64e7SAndroid Build Coastguard Worker #define MAXFILENAME (256)
64*86ee64e7SAndroid Build Coastguard Worker
65*86ee64e7SAndroid Build Coastguard Worker #ifdef _WIN32
66*86ee64e7SAndroid Build Coastguard Worker #define USEWIN32IOAPI
67*86ee64e7SAndroid Build Coastguard Worker #include "iowin32.h"
68*86ee64e7SAndroid Build Coastguard Worker #endif
69*86ee64e7SAndroid Build Coastguard Worker /*
70*86ee64e7SAndroid Build Coastguard Worker mini unzip, demo of unzip package
71*86ee64e7SAndroid Build Coastguard Worker
72*86ee64e7SAndroid Build Coastguard Worker usage :
73*86ee64e7SAndroid Build Coastguard Worker Usage : miniunz [-exvlo] file.zip [file_to_extract] [-d extractdir]
74*86ee64e7SAndroid Build Coastguard Worker
75*86ee64e7SAndroid Build Coastguard Worker list the file in the zipfile, and print the content of FILE_ID.ZIP or README.TXT
76*86ee64e7SAndroid Build Coastguard Worker if it exists
77*86ee64e7SAndroid Build Coastguard Worker */
78*86ee64e7SAndroid Build Coastguard Worker
79*86ee64e7SAndroid Build Coastguard Worker
80*86ee64e7SAndroid Build Coastguard Worker /* change_file_date : change the date/time of a file
81*86ee64e7SAndroid Build Coastguard Worker filename : the filename of the file where date/time must be modified
82*86ee64e7SAndroid Build Coastguard Worker dosdate : the new date at the MSDos format (4 bytes)
83*86ee64e7SAndroid Build Coastguard Worker tmu_date : the SAME new date at the tm_unz format */
change_file_date(const char * filename,uLong dosdate,tm_unz tmu_date)84*86ee64e7SAndroid Build Coastguard Worker static void change_file_date(const char *filename, uLong dosdate, tm_unz tmu_date) {
85*86ee64e7SAndroid Build Coastguard Worker #ifdef _WIN32
86*86ee64e7SAndroid Build Coastguard Worker HANDLE hFile;
87*86ee64e7SAndroid Build Coastguard Worker FILETIME ftm,ftLocal,ftCreate,ftLastAcc,ftLastWrite;
88*86ee64e7SAndroid Build Coastguard Worker
89*86ee64e7SAndroid Build Coastguard Worker hFile = CreateFileA(filename,GENERIC_READ | GENERIC_WRITE,
90*86ee64e7SAndroid Build Coastguard Worker 0,NULL,OPEN_EXISTING,0,NULL);
91*86ee64e7SAndroid Build Coastguard Worker GetFileTime(hFile,&ftCreate,&ftLastAcc,&ftLastWrite);
92*86ee64e7SAndroid Build Coastguard Worker DosDateTimeToFileTime((WORD)(dosdate>>16),(WORD)dosdate,&ftLocal);
93*86ee64e7SAndroid Build Coastguard Worker LocalFileTimeToFileTime(&ftLocal,&ftm);
94*86ee64e7SAndroid Build Coastguard Worker SetFileTime(hFile,&ftm,&ftLastAcc,&ftm);
95*86ee64e7SAndroid Build Coastguard Worker CloseHandle(hFile);
96*86ee64e7SAndroid Build Coastguard Worker #else
97*86ee64e7SAndroid Build Coastguard Worker #if defined(unix) || defined(__APPLE__) || defined(__Fuchsia__) || defined(__ANDROID_API__)
98*86ee64e7SAndroid Build Coastguard Worker (void)dosdate;
99*86ee64e7SAndroid Build Coastguard Worker struct utimbuf ut;
100*86ee64e7SAndroid Build Coastguard Worker struct tm newdate;
101*86ee64e7SAndroid Build Coastguard Worker newdate.tm_sec = tmu_date.tm_sec;
102*86ee64e7SAndroid Build Coastguard Worker newdate.tm_min=tmu_date.tm_min;
103*86ee64e7SAndroid Build Coastguard Worker newdate.tm_hour=tmu_date.tm_hour;
104*86ee64e7SAndroid Build Coastguard Worker newdate.tm_mday=tmu_date.tm_mday;
105*86ee64e7SAndroid Build Coastguard Worker newdate.tm_mon=tmu_date.tm_mon;
106*86ee64e7SAndroid Build Coastguard Worker if (tmu_date.tm_year > 1900)
107*86ee64e7SAndroid Build Coastguard Worker newdate.tm_year=tmu_date.tm_year - 1900;
108*86ee64e7SAndroid Build Coastguard Worker else
109*86ee64e7SAndroid Build Coastguard Worker newdate.tm_year=tmu_date.tm_year ;
110*86ee64e7SAndroid Build Coastguard Worker newdate.tm_isdst=-1;
111*86ee64e7SAndroid Build Coastguard Worker
112*86ee64e7SAndroid Build Coastguard Worker ut.actime=ut.modtime=mktime(&newdate);
113*86ee64e7SAndroid Build Coastguard Worker utime(filename,&ut);
114*86ee64e7SAndroid Build Coastguard Worker #else
115*86ee64e7SAndroid Build Coastguard Worker (void)filename;
116*86ee64e7SAndroid Build Coastguard Worker (void)dosdate;
117*86ee64e7SAndroid Build Coastguard Worker (void)tmu_date;
118*86ee64e7SAndroid Build Coastguard Worker #endif
119*86ee64e7SAndroid Build Coastguard Worker #endif
120*86ee64e7SAndroid Build Coastguard Worker }
121*86ee64e7SAndroid Build Coastguard Worker
122*86ee64e7SAndroid Build Coastguard Worker
123*86ee64e7SAndroid Build Coastguard Worker /* mymkdir and change_file_date are not 100 % portable
124*86ee64e7SAndroid Build Coastguard Worker As I don't know well Unix, I wait feedback for the unix portion */
125*86ee64e7SAndroid Build Coastguard Worker
mymkdir(const char * dirname)126*86ee64e7SAndroid Build Coastguard Worker static int mymkdir(const char* dirname) {
127*86ee64e7SAndroid Build Coastguard Worker int ret=0;
128*86ee64e7SAndroid Build Coastguard Worker #if defined(_WIN32)
129*86ee64e7SAndroid Build Coastguard Worker ret = _mkdir(dirname);
130*86ee64e7SAndroid Build Coastguard Worker #elif defined(unix) || defined(__APPLE__) || defined(__Fuchsia__) || defined(__ANDROID_API__)
131*86ee64e7SAndroid Build Coastguard Worker ret = mkdir (dirname,0775);
132*86ee64e7SAndroid Build Coastguard Worker #else
133*86ee64e7SAndroid Build Coastguard Worker (void)dirname;
134*86ee64e7SAndroid Build Coastguard Worker #endif
135*86ee64e7SAndroid Build Coastguard Worker return ret;
136*86ee64e7SAndroid Build Coastguard Worker }
137*86ee64e7SAndroid Build Coastguard Worker
makedir(const char * newdir)138*86ee64e7SAndroid Build Coastguard Worker static int makedir(const char *newdir) {
139*86ee64e7SAndroid Build Coastguard Worker char *buffer ;
140*86ee64e7SAndroid Build Coastguard Worker char *p;
141*86ee64e7SAndroid Build Coastguard Worker size_t len = strlen(newdir);
142*86ee64e7SAndroid Build Coastguard Worker
143*86ee64e7SAndroid Build Coastguard Worker if (len == 0)
144*86ee64e7SAndroid Build Coastguard Worker return 0;
145*86ee64e7SAndroid Build Coastguard Worker
146*86ee64e7SAndroid Build Coastguard Worker buffer = (char*)malloc(len+1);
147*86ee64e7SAndroid Build Coastguard Worker if (buffer==NULL)
148*86ee64e7SAndroid Build Coastguard Worker {
149*86ee64e7SAndroid Build Coastguard Worker printf("Error allocating memory\n");
150*86ee64e7SAndroid Build Coastguard Worker return UNZ_INTERNALERROR;
151*86ee64e7SAndroid Build Coastguard Worker }
152*86ee64e7SAndroid Build Coastguard Worker strcpy(buffer,newdir);
153*86ee64e7SAndroid Build Coastguard Worker
154*86ee64e7SAndroid Build Coastguard Worker if (buffer[len-1] == '/') {
155*86ee64e7SAndroid Build Coastguard Worker buffer[len-1] = '\0';
156*86ee64e7SAndroid Build Coastguard Worker }
157*86ee64e7SAndroid Build Coastguard Worker if (mymkdir(buffer) == 0)
158*86ee64e7SAndroid Build Coastguard Worker {
159*86ee64e7SAndroid Build Coastguard Worker free(buffer);
160*86ee64e7SAndroid Build Coastguard Worker return 1;
161*86ee64e7SAndroid Build Coastguard Worker }
162*86ee64e7SAndroid Build Coastguard Worker
163*86ee64e7SAndroid Build Coastguard Worker p = buffer+1;
164*86ee64e7SAndroid Build Coastguard Worker while (1)
165*86ee64e7SAndroid Build Coastguard Worker {
166*86ee64e7SAndroid Build Coastguard Worker char hold;
167*86ee64e7SAndroid Build Coastguard Worker
168*86ee64e7SAndroid Build Coastguard Worker while(*p && *p != '\\' && *p != '/')
169*86ee64e7SAndroid Build Coastguard Worker p++;
170*86ee64e7SAndroid Build Coastguard Worker hold = *p;
171*86ee64e7SAndroid Build Coastguard Worker *p = 0;
172*86ee64e7SAndroid Build Coastguard Worker if ((mymkdir(buffer) == -1) && (errno == ENOENT))
173*86ee64e7SAndroid Build Coastguard Worker {
174*86ee64e7SAndroid Build Coastguard Worker printf("couldn't create directory %s\n",buffer);
175*86ee64e7SAndroid Build Coastguard Worker free(buffer);
176*86ee64e7SAndroid Build Coastguard Worker return 0;
177*86ee64e7SAndroid Build Coastguard Worker }
178*86ee64e7SAndroid Build Coastguard Worker if (hold == 0)
179*86ee64e7SAndroid Build Coastguard Worker break;
180*86ee64e7SAndroid Build Coastguard Worker *p++ = hold;
181*86ee64e7SAndroid Build Coastguard Worker }
182*86ee64e7SAndroid Build Coastguard Worker free(buffer);
183*86ee64e7SAndroid Build Coastguard Worker return 1;
184*86ee64e7SAndroid Build Coastguard Worker }
185*86ee64e7SAndroid Build Coastguard Worker
do_banner(void)186*86ee64e7SAndroid Build Coastguard Worker static void do_banner(void) {
187*86ee64e7SAndroid Build Coastguard Worker printf("MiniUnz 1.1, demo of zLib + Unz package written by Gilles Vollant\n");
188*86ee64e7SAndroid Build Coastguard Worker printf("more info at http://www.winimage.com/zLibDll/unzip.html\n\n");
189*86ee64e7SAndroid Build Coastguard Worker }
190*86ee64e7SAndroid Build Coastguard Worker
do_help(void)191*86ee64e7SAndroid Build Coastguard Worker static void do_help(void) {
192*86ee64e7SAndroid Build Coastguard Worker printf("Usage : miniunz [-e] [-x] [-v] [-l] [-o] [-p password] file.zip [file_to_extr.] [-d extractdir]\n\n" \
193*86ee64e7SAndroid Build Coastguard Worker " -e Extract without pathname (junk paths)\n" \
194*86ee64e7SAndroid Build Coastguard Worker " -x Extract with pathname\n" \
195*86ee64e7SAndroid Build Coastguard Worker " -v list files\n" \
196*86ee64e7SAndroid Build Coastguard Worker " -l list files\n" \
197*86ee64e7SAndroid Build Coastguard Worker " -d directory to extract into\n" \
198*86ee64e7SAndroid Build Coastguard Worker " -o overwrite files without prompting\n" \
199*86ee64e7SAndroid Build Coastguard Worker " -p extract encrypted file using password\n\n");
200*86ee64e7SAndroid Build Coastguard Worker }
201*86ee64e7SAndroid Build Coastguard Worker
Display64BitsSize(ZPOS64_T n,int size_char)202*86ee64e7SAndroid Build Coastguard Worker static void Display64BitsSize(ZPOS64_T n, int size_char) {
203*86ee64e7SAndroid Build Coastguard Worker /* to avoid compatibility problem , we do here the conversion */
204*86ee64e7SAndroid Build Coastguard Worker char number[21];
205*86ee64e7SAndroid Build Coastguard Worker int offset=19;
206*86ee64e7SAndroid Build Coastguard Worker int pos_string = 19;
207*86ee64e7SAndroid Build Coastguard Worker number[20]=0;
208*86ee64e7SAndroid Build Coastguard Worker for (;;) {
209*86ee64e7SAndroid Build Coastguard Worker number[offset]=(char)((n%10)+'0');
210*86ee64e7SAndroid Build Coastguard Worker if (number[offset] != '0')
211*86ee64e7SAndroid Build Coastguard Worker pos_string=offset;
212*86ee64e7SAndroid Build Coastguard Worker n/=10;
213*86ee64e7SAndroid Build Coastguard Worker if (offset==0)
214*86ee64e7SAndroid Build Coastguard Worker break;
215*86ee64e7SAndroid Build Coastguard Worker offset--;
216*86ee64e7SAndroid Build Coastguard Worker }
217*86ee64e7SAndroid Build Coastguard Worker {
218*86ee64e7SAndroid Build Coastguard Worker int size_display_string = 19-pos_string;
219*86ee64e7SAndroid Build Coastguard Worker while (size_char > size_display_string)
220*86ee64e7SAndroid Build Coastguard Worker {
221*86ee64e7SAndroid Build Coastguard Worker size_char--;
222*86ee64e7SAndroid Build Coastguard Worker printf(" ");
223*86ee64e7SAndroid Build Coastguard Worker }
224*86ee64e7SAndroid Build Coastguard Worker }
225*86ee64e7SAndroid Build Coastguard Worker
226*86ee64e7SAndroid Build Coastguard Worker printf("%s",&number[pos_string]);
227*86ee64e7SAndroid Build Coastguard Worker }
228*86ee64e7SAndroid Build Coastguard Worker
do_list(unzFile uf)229*86ee64e7SAndroid Build Coastguard Worker static int do_list(unzFile uf) {
230*86ee64e7SAndroid Build Coastguard Worker uLong i;
231*86ee64e7SAndroid Build Coastguard Worker unz_global_info64 gi;
232*86ee64e7SAndroid Build Coastguard Worker int err;
233*86ee64e7SAndroid Build Coastguard Worker
234*86ee64e7SAndroid Build Coastguard Worker err = unzGetGlobalInfo64(uf,&gi);
235*86ee64e7SAndroid Build Coastguard Worker if (err!=UNZ_OK)
236*86ee64e7SAndroid Build Coastguard Worker printf("error %d with zipfile in unzGetGlobalInfo \n",err);
237*86ee64e7SAndroid Build Coastguard Worker printf(" Length Method Size Ratio Date Time CRC-32 Name\n");
238*86ee64e7SAndroid Build Coastguard Worker printf(" ------ ------ ---- ----- ---- ---- ------ ----\n");
239*86ee64e7SAndroid Build Coastguard Worker for (i=0;i<gi.number_entry;i++)
240*86ee64e7SAndroid Build Coastguard Worker {
241*86ee64e7SAndroid Build Coastguard Worker char filename_inzip[256];
242*86ee64e7SAndroid Build Coastguard Worker unz_file_info64 file_info;
243*86ee64e7SAndroid Build Coastguard Worker uLong ratio=0;
244*86ee64e7SAndroid Build Coastguard Worker const char *string_method = "";
245*86ee64e7SAndroid Build Coastguard Worker char charCrypt=' ';
246*86ee64e7SAndroid Build Coastguard Worker err = unzGetCurrentFileInfo64(uf,&file_info,filename_inzip,sizeof(filename_inzip),NULL,0,NULL,0);
247*86ee64e7SAndroid Build Coastguard Worker if (err!=UNZ_OK)
248*86ee64e7SAndroid Build Coastguard Worker {
249*86ee64e7SAndroid Build Coastguard Worker printf("error %d with zipfile in unzGetCurrentFileInfo\n",err);
250*86ee64e7SAndroid Build Coastguard Worker break;
251*86ee64e7SAndroid Build Coastguard Worker }
252*86ee64e7SAndroid Build Coastguard Worker if (file_info.uncompressed_size>0)
253*86ee64e7SAndroid Build Coastguard Worker ratio = (uLong)((file_info.compressed_size*100)/file_info.uncompressed_size);
254*86ee64e7SAndroid Build Coastguard Worker
255*86ee64e7SAndroid Build Coastguard Worker /* display a '*' if the file is encrypted */
256*86ee64e7SAndroid Build Coastguard Worker if ((file_info.flag & 1) != 0)
257*86ee64e7SAndroid Build Coastguard Worker charCrypt='*';
258*86ee64e7SAndroid Build Coastguard Worker
259*86ee64e7SAndroid Build Coastguard Worker if (file_info.compression_method==0)
260*86ee64e7SAndroid Build Coastguard Worker string_method="Stored";
261*86ee64e7SAndroid Build Coastguard Worker else
262*86ee64e7SAndroid Build Coastguard Worker if (file_info.compression_method==Z_DEFLATED)
263*86ee64e7SAndroid Build Coastguard Worker {
264*86ee64e7SAndroid Build Coastguard Worker uInt iLevel=(uInt)((file_info.flag & 0x6)/2);
265*86ee64e7SAndroid Build Coastguard Worker if (iLevel==0)
266*86ee64e7SAndroid Build Coastguard Worker string_method="Defl:N";
267*86ee64e7SAndroid Build Coastguard Worker else if (iLevel==1)
268*86ee64e7SAndroid Build Coastguard Worker string_method="Defl:X";
269*86ee64e7SAndroid Build Coastguard Worker else if ((iLevel==2) || (iLevel==3))
270*86ee64e7SAndroid Build Coastguard Worker string_method="Defl:F"; /* 2:fast , 3 : extra fast*/
271*86ee64e7SAndroid Build Coastguard Worker }
272*86ee64e7SAndroid Build Coastguard Worker else
273*86ee64e7SAndroid Build Coastguard Worker if (file_info.compression_method==Z_BZIP2ED)
274*86ee64e7SAndroid Build Coastguard Worker {
275*86ee64e7SAndroid Build Coastguard Worker string_method="BZip2 ";
276*86ee64e7SAndroid Build Coastguard Worker }
277*86ee64e7SAndroid Build Coastguard Worker else
278*86ee64e7SAndroid Build Coastguard Worker string_method="Unkn. ";
279*86ee64e7SAndroid Build Coastguard Worker
280*86ee64e7SAndroid Build Coastguard Worker Display64BitsSize(file_info.uncompressed_size,7);
281*86ee64e7SAndroid Build Coastguard Worker printf(" %6s%c",string_method,charCrypt);
282*86ee64e7SAndroid Build Coastguard Worker Display64BitsSize(file_info.compressed_size,7);
283*86ee64e7SAndroid Build Coastguard Worker printf(" %3lu%% %2.2lu-%2.2lu-%2.2lu %2.2lu:%2.2lu %8.8lx %s\n",
284*86ee64e7SAndroid Build Coastguard Worker ratio,
285*86ee64e7SAndroid Build Coastguard Worker (uLong)file_info.tmu_date.tm_mon + 1,
286*86ee64e7SAndroid Build Coastguard Worker (uLong)file_info.tmu_date.tm_mday,
287*86ee64e7SAndroid Build Coastguard Worker (uLong)file_info.tmu_date.tm_year % 100,
288*86ee64e7SAndroid Build Coastguard Worker (uLong)file_info.tmu_date.tm_hour,(uLong)file_info.tmu_date.tm_min,
289*86ee64e7SAndroid Build Coastguard Worker (uLong)file_info.crc,filename_inzip);
290*86ee64e7SAndroid Build Coastguard Worker if ((i+1)<gi.number_entry)
291*86ee64e7SAndroid Build Coastguard Worker {
292*86ee64e7SAndroid Build Coastguard Worker err = unzGoToNextFile(uf);
293*86ee64e7SAndroid Build Coastguard Worker if (err!=UNZ_OK)
294*86ee64e7SAndroid Build Coastguard Worker {
295*86ee64e7SAndroid Build Coastguard Worker printf("error %d with zipfile in unzGoToNextFile\n",err);
296*86ee64e7SAndroid Build Coastguard Worker break;
297*86ee64e7SAndroid Build Coastguard Worker }
298*86ee64e7SAndroid Build Coastguard Worker }
299*86ee64e7SAndroid Build Coastguard Worker }
300*86ee64e7SAndroid Build Coastguard Worker
301*86ee64e7SAndroid Build Coastguard Worker return 0;
302*86ee64e7SAndroid Build Coastguard Worker }
303*86ee64e7SAndroid Build Coastguard Worker
304*86ee64e7SAndroid Build Coastguard Worker
do_extract_currentfile(unzFile uf,const int * popt_extract_without_path,int * popt_overwrite,const char * password)305*86ee64e7SAndroid Build Coastguard Worker static int do_extract_currentfile(unzFile uf, const int* popt_extract_without_path, int* popt_overwrite, const char* password) {
306*86ee64e7SAndroid Build Coastguard Worker char filename_inzip[256];
307*86ee64e7SAndroid Build Coastguard Worker char* filename_withoutpath;
308*86ee64e7SAndroid Build Coastguard Worker char* p;
309*86ee64e7SAndroid Build Coastguard Worker int err=UNZ_OK;
310*86ee64e7SAndroid Build Coastguard Worker FILE *fout=NULL;
311*86ee64e7SAndroid Build Coastguard Worker void* buf;
312*86ee64e7SAndroid Build Coastguard Worker uInt size_buf;
313*86ee64e7SAndroid Build Coastguard Worker
314*86ee64e7SAndroid Build Coastguard Worker unz_file_info64 file_info;
315*86ee64e7SAndroid Build Coastguard Worker err = unzGetCurrentFileInfo64(uf,&file_info,filename_inzip,sizeof(filename_inzip),NULL,0,NULL,0);
316*86ee64e7SAndroid Build Coastguard Worker
317*86ee64e7SAndroid Build Coastguard Worker if (err!=UNZ_OK)
318*86ee64e7SAndroid Build Coastguard Worker {
319*86ee64e7SAndroid Build Coastguard Worker printf("error %d with zipfile in unzGetCurrentFileInfo\n",err);
320*86ee64e7SAndroid Build Coastguard Worker return err;
321*86ee64e7SAndroid Build Coastguard Worker }
322*86ee64e7SAndroid Build Coastguard Worker
323*86ee64e7SAndroid Build Coastguard Worker size_buf = WRITEBUFFERSIZE;
324*86ee64e7SAndroid Build Coastguard Worker buf = (void*)malloc(size_buf);
325*86ee64e7SAndroid Build Coastguard Worker if (buf==NULL)
326*86ee64e7SAndroid Build Coastguard Worker {
327*86ee64e7SAndroid Build Coastguard Worker printf("Error allocating memory\n");
328*86ee64e7SAndroid Build Coastguard Worker return UNZ_INTERNALERROR;
329*86ee64e7SAndroid Build Coastguard Worker }
330*86ee64e7SAndroid Build Coastguard Worker
331*86ee64e7SAndroid Build Coastguard Worker p = filename_withoutpath = filename_inzip;
332*86ee64e7SAndroid Build Coastguard Worker while ((*p) != '\0')
333*86ee64e7SAndroid Build Coastguard Worker {
334*86ee64e7SAndroid Build Coastguard Worker if (((*p)=='/') || ((*p)=='\\'))
335*86ee64e7SAndroid Build Coastguard Worker filename_withoutpath = p+1;
336*86ee64e7SAndroid Build Coastguard Worker p++;
337*86ee64e7SAndroid Build Coastguard Worker }
338*86ee64e7SAndroid Build Coastguard Worker
339*86ee64e7SAndroid Build Coastguard Worker if ((*filename_withoutpath)=='\0')
340*86ee64e7SAndroid Build Coastguard Worker {
341*86ee64e7SAndroid Build Coastguard Worker if ((*popt_extract_without_path)==0)
342*86ee64e7SAndroid Build Coastguard Worker {
343*86ee64e7SAndroid Build Coastguard Worker printf("creating directory: %s\n",filename_inzip);
344*86ee64e7SAndroid Build Coastguard Worker mymkdir(filename_inzip);
345*86ee64e7SAndroid Build Coastguard Worker }
346*86ee64e7SAndroid Build Coastguard Worker }
347*86ee64e7SAndroid Build Coastguard Worker else
348*86ee64e7SAndroid Build Coastguard Worker {
349*86ee64e7SAndroid Build Coastguard Worker const char* write_filename;
350*86ee64e7SAndroid Build Coastguard Worker int skip=0;
351*86ee64e7SAndroid Build Coastguard Worker
352*86ee64e7SAndroid Build Coastguard Worker if ((*popt_extract_without_path)==0)
353*86ee64e7SAndroid Build Coastguard Worker write_filename = filename_inzip;
354*86ee64e7SAndroid Build Coastguard Worker else
355*86ee64e7SAndroid Build Coastguard Worker write_filename = filename_withoutpath;
356*86ee64e7SAndroid Build Coastguard Worker
357*86ee64e7SAndroid Build Coastguard Worker err = unzOpenCurrentFilePassword(uf,password);
358*86ee64e7SAndroid Build Coastguard Worker if (err!=UNZ_OK)
359*86ee64e7SAndroid Build Coastguard Worker {
360*86ee64e7SAndroid Build Coastguard Worker printf("error %d with zipfile in unzOpenCurrentFilePassword\n",err);
361*86ee64e7SAndroid Build Coastguard Worker }
362*86ee64e7SAndroid Build Coastguard Worker
363*86ee64e7SAndroid Build Coastguard Worker if (((*popt_overwrite)==0) && (err==UNZ_OK))
364*86ee64e7SAndroid Build Coastguard Worker {
365*86ee64e7SAndroid Build Coastguard Worker char rep=0;
366*86ee64e7SAndroid Build Coastguard Worker FILE* ftestexist;
367*86ee64e7SAndroid Build Coastguard Worker ftestexist = FOPEN_FUNC(write_filename,"rb");
368*86ee64e7SAndroid Build Coastguard Worker if (ftestexist!=NULL)
369*86ee64e7SAndroid Build Coastguard Worker {
370*86ee64e7SAndroid Build Coastguard Worker fclose(ftestexist);
371*86ee64e7SAndroid Build Coastguard Worker do
372*86ee64e7SAndroid Build Coastguard Worker {
373*86ee64e7SAndroid Build Coastguard Worker char answer[128];
374*86ee64e7SAndroid Build Coastguard Worker int ret;
375*86ee64e7SAndroid Build Coastguard Worker
376*86ee64e7SAndroid Build Coastguard Worker printf("The file %s exists. Overwrite ? [y]es, [n]o, [A]ll: ",write_filename);
377*86ee64e7SAndroid Build Coastguard Worker ret = scanf("%1s",answer);
378*86ee64e7SAndroid Build Coastguard Worker if (ret != 1)
379*86ee64e7SAndroid Build Coastguard Worker {
380*86ee64e7SAndroid Build Coastguard Worker exit(EXIT_FAILURE);
381*86ee64e7SAndroid Build Coastguard Worker }
382*86ee64e7SAndroid Build Coastguard Worker rep = answer[0] ;
383*86ee64e7SAndroid Build Coastguard Worker if ((rep>='a') && (rep<='z'))
384*86ee64e7SAndroid Build Coastguard Worker rep -= 0x20;
385*86ee64e7SAndroid Build Coastguard Worker }
386*86ee64e7SAndroid Build Coastguard Worker while ((rep!='Y') && (rep!='N') && (rep!='A'));
387*86ee64e7SAndroid Build Coastguard Worker }
388*86ee64e7SAndroid Build Coastguard Worker
389*86ee64e7SAndroid Build Coastguard Worker if (rep == 'N')
390*86ee64e7SAndroid Build Coastguard Worker skip = 1;
391*86ee64e7SAndroid Build Coastguard Worker
392*86ee64e7SAndroid Build Coastguard Worker if (rep == 'A')
393*86ee64e7SAndroid Build Coastguard Worker *popt_overwrite=1;
394*86ee64e7SAndroid Build Coastguard Worker }
395*86ee64e7SAndroid Build Coastguard Worker
396*86ee64e7SAndroid Build Coastguard Worker if ((skip==0) && (err==UNZ_OK))
397*86ee64e7SAndroid Build Coastguard Worker {
398*86ee64e7SAndroid Build Coastguard Worker fout=FOPEN_FUNC(write_filename,"wb");
399*86ee64e7SAndroid Build Coastguard Worker /* some zipfile don't contain directory alone before file */
400*86ee64e7SAndroid Build Coastguard Worker if ((fout==NULL) && ((*popt_extract_without_path)==0) &&
401*86ee64e7SAndroid Build Coastguard Worker (filename_withoutpath!=(char*)filename_inzip))
402*86ee64e7SAndroid Build Coastguard Worker {
403*86ee64e7SAndroid Build Coastguard Worker char c=*(filename_withoutpath-1);
404*86ee64e7SAndroid Build Coastguard Worker *(filename_withoutpath-1)='\0';
405*86ee64e7SAndroid Build Coastguard Worker makedir(write_filename);
406*86ee64e7SAndroid Build Coastguard Worker *(filename_withoutpath-1)=c;
407*86ee64e7SAndroid Build Coastguard Worker fout=FOPEN_FUNC(write_filename,"wb");
408*86ee64e7SAndroid Build Coastguard Worker }
409*86ee64e7SAndroid Build Coastguard Worker
410*86ee64e7SAndroid Build Coastguard Worker if (fout==NULL)
411*86ee64e7SAndroid Build Coastguard Worker {
412*86ee64e7SAndroid Build Coastguard Worker printf("error opening %s\n",write_filename);
413*86ee64e7SAndroid Build Coastguard Worker }
414*86ee64e7SAndroid Build Coastguard Worker }
415*86ee64e7SAndroid Build Coastguard Worker
416*86ee64e7SAndroid Build Coastguard Worker if (fout!=NULL)
417*86ee64e7SAndroid Build Coastguard Worker {
418*86ee64e7SAndroid Build Coastguard Worker printf(" extracting: %s\n",write_filename);
419*86ee64e7SAndroid Build Coastguard Worker
420*86ee64e7SAndroid Build Coastguard Worker do
421*86ee64e7SAndroid Build Coastguard Worker {
422*86ee64e7SAndroid Build Coastguard Worker err = unzReadCurrentFile(uf,buf,size_buf);
423*86ee64e7SAndroid Build Coastguard Worker if (err<0)
424*86ee64e7SAndroid Build Coastguard Worker {
425*86ee64e7SAndroid Build Coastguard Worker printf("error %d with zipfile in unzReadCurrentFile\n",err);
426*86ee64e7SAndroid Build Coastguard Worker break;
427*86ee64e7SAndroid Build Coastguard Worker }
428*86ee64e7SAndroid Build Coastguard Worker if (err>0)
429*86ee64e7SAndroid Build Coastguard Worker if (fwrite(buf,(unsigned)err,1,fout)!=1)
430*86ee64e7SAndroid Build Coastguard Worker {
431*86ee64e7SAndroid Build Coastguard Worker printf("error in writing extracted file\n");
432*86ee64e7SAndroid Build Coastguard Worker err=UNZ_ERRNO;
433*86ee64e7SAndroid Build Coastguard Worker break;
434*86ee64e7SAndroid Build Coastguard Worker }
435*86ee64e7SAndroid Build Coastguard Worker }
436*86ee64e7SAndroid Build Coastguard Worker while (err>0);
437*86ee64e7SAndroid Build Coastguard Worker if (fout)
438*86ee64e7SAndroid Build Coastguard Worker fclose(fout);
439*86ee64e7SAndroid Build Coastguard Worker
440*86ee64e7SAndroid Build Coastguard Worker if (err==0)
441*86ee64e7SAndroid Build Coastguard Worker change_file_date(write_filename,file_info.dosDate,
442*86ee64e7SAndroid Build Coastguard Worker file_info.tmu_date);
443*86ee64e7SAndroid Build Coastguard Worker }
444*86ee64e7SAndroid Build Coastguard Worker
445*86ee64e7SAndroid Build Coastguard Worker if (err==UNZ_OK)
446*86ee64e7SAndroid Build Coastguard Worker {
447*86ee64e7SAndroid Build Coastguard Worker err = unzCloseCurrentFile (uf);
448*86ee64e7SAndroid Build Coastguard Worker if (err!=UNZ_OK)
449*86ee64e7SAndroid Build Coastguard Worker {
450*86ee64e7SAndroid Build Coastguard Worker printf("error %d with zipfile in unzCloseCurrentFile\n",err);
451*86ee64e7SAndroid Build Coastguard Worker }
452*86ee64e7SAndroid Build Coastguard Worker }
453*86ee64e7SAndroid Build Coastguard Worker else
454*86ee64e7SAndroid Build Coastguard Worker unzCloseCurrentFile(uf); /* don't lose the error */
455*86ee64e7SAndroid Build Coastguard Worker }
456*86ee64e7SAndroid Build Coastguard Worker
457*86ee64e7SAndroid Build Coastguard Worker free(buf);
458*86ee64e7SAndroid Build Coastguard Worker return err;
459*86ee64e7SAndroid Build Coastguard Worker }
460*86ee64e7SAndroid Build Coastguard Worker
461*86ee64e7SAndroid Build Coastguard Worker
do_extract(unzFile uf,int opt_extract_without_path,int opt_overwrite,const char * password)462*86ee64e7SAndroid Build Coastguard Worker static int do_extract(unzFile uf, int opt_extract_without_path, int opt_overwrite, const char* password) {
463*86ee64e7SAndroid Build Coastguard Worker uLong i;
464*86ee64e7SAndroid Build Coastguard Worker unz_global_info64 gi;
465*86ee64e7SAndroid Build Coastguard Worker int err;
466*86ee64e7SAndroid Build Coastguard Worker
467*86ee64e7SAndroid Build Coastguard Worker err = unzGetGlobalInfo64(uf,&gi);
468*86ee64e7SAndroid Build Coastguard Worker if (err!=UNZ_OK)
469*86ee64e7SAndroid Build Coastguard Worker printf("error %d with zipfile in unzGetGlobalInfo \n",err);
470*86ee64e7SAndroid Build Coastguard Worker
471*86ee64e7SAndroid Build Coastguard Worker for (i=0;i<gi.number_entry;i++)
472*86ee64e7SAndroid Build Coastguard Worker {
473*86ee64e7SAndroid Build Coastguard Worker if (do_extract_currentfile(uf,&opt_extract_without_path,
474*86ee64e7SAndroid Build Coastguard Worker &opt_overwrite,
475*86ee64e7SAndroid Build Coastguard Worker password) != UNZ_OK)
476*86ee64e7SAndroid Build Coastguard Worker break;
477*86ee64e7SAndroid Build Coastguard Worker
478*86ee64e7SAndroid Build Coastguard Worker if ((i+1)<gi.number_entry)
479*86ee64e7SAndroid Build Coastguard Worker {
480*86ee64e7SAndroid Build Coastguard Worker err = unzGoToNextFile(uf);
481*86ee64e7SAndroid Build Coastguard Worker if (err!=UNZ_OK)
482*86ee64e7SAndroid Build Coastguard Worker {
483*86ee64e7SAndroid Build Coastguard Worker printf("error %d with zipfile in unzGoToNextFile\n",err);
484*86ee64e7SAndroid Build Coastguard Worker break;
485*86ee64e7SAndroid Build Coastguard Worker }
486*86ee64e7SAndroid Build Coastguard Worker }
487*86ee64e7SAndroid Build Coastguard Worker }
488*86ee64e7SAndroid Build Coastguard Worker
489*86ee64e7SAndroid Build Coastguard Worker return 0;
490*86ee64e7SAndroid Build Coastguard Worker }
491*86ee64e7SAndroid Build Coastguard Worker
do_extract_onefile(unzFile uf,const char * filename,int opt_extract_without_path,int opt_overwrite,const char * password)492*86ee64e7SAndroid Build Coastguard Worker static int do_extract_onefile(unzFile uf, const char* filename, int opt_extract_without_path, int opt_overwrite, const char* password) {
493*86ee64e7SAndroid Build Coastguard Worker if (unzLocateFile(uf,filename,CASESENSITIVITY)!=UNZ_OK)
494*86ee64e7SAndroid Build Coastguard Worker {
495*86ee64e7SAndroid Build Coastguard Worker printf("file %s not found in the zipfile\n",filename);
496*86ee64e7SAndroid Build Coastguard Worker return 2;
497*86ee64e7SAndroid Build Coastguard Worker }
498*86ee64e7SAndroid Build Coastguard Worker
499*86ee64e7SAndroid Build Coastguard Worker if (do_extract_currentfile(uf,&opt_extract_without_path,
500*86ee64e7SAndroid Build Coastguard Worker &opt_overwrite,
501*86ee64e7SAndroid Build Coastguard Worker password) == UNZ_OK)
502*86ee64e7SAndroid Build Coastguard Worker return 0;
503*86ee64e7SAndroid Build Coastguard Worker else
504*86ee64e7SAndroid Build Coastguard Worker return 1;
505*86ee64e7SAndroid Build Coastguard Worker }
506*86ee64e7SAndroid Build Coastguard Worker
507*86ee64e7SAndroid Build Coastguard Worker
main(int argc,char * argv[])508*86ee64e7SAndroid Build Coastguard Worker int main(int argc, char *argv[]) {
509*86ee64e7SAndroid Build Coastguard Worker const char *zipfilename=NULL;
510*86ee64e7SAndroid Build Coastguard Worker const char *filename_to_extract=NULL;
511*86ee64e7SAndroid Build Coastguard Worker const char *password=NULL;
512*86ee64e7SAndroid Build Coastguard Worker char filename_try[MAXFILENAME+16] = "";
513*86ee64e7SAndroid Build Coastguard Worker int i;
514*86ee64e7SAndroid Build Coastguard Worker int ret_value=0;
515*86ee64e7SAndroid Build Coastguard Worker int opt_do_list=0;
516*86ee64e7SAndroid Build Coastguard Worker int opt_do_extract=1;
517*86ee64e7SAndroid Build Coastguard Worker int opt_do_extract_withoutpath=0;
518*86ee64e7SAndroid Build Coastguard Worker int opt_overwrite=0;
519*86ee64e7SAndroid Build Coastguard Worker int opt_extractdir=0;
520*86ee64e7SAndroid Build Coastguard Worker const char *dirname=NULL;
521*86ee64e7SAndroid Build Coastguard Worker unzFile uf=NULL;
522*86ee64e7SAndroid Build Coastguard Worker
523*86ee64e7SAndroid Build Coastguard Worker do_banner();
524*86ee64e7SAndroid Build Coastguard Worker if (argc==1)
525*86ee64e7SAndroid Build Coastguard Worker {
526*86ee64e7SAndroid Build Coastguard Worker do_help();
527*86ee64e7SAndroid Build Coastguard Worker return 0;
528*86ee64e7SAndroid Build Coastguard Worker }
529*86ee64e7SAndroid Build Coastguard Worker else
530*86ee64e7SAndroid Build Coastguard Worker {
531*86ee64e7SAndroid Build Coastguard Worker for (i=1;i<argc;i++)
532*86ee64e7SAndroid Build Coastguard Worker {
533*86ee64e7SAndroid Build Coastguard Worker if ((*argv[i])=='-')
534*86ee64e7SAndroid Build Coastguard Worker {
535*86ee64e7SAndroid Build Coastguard Worker const char *p=argv[i]+1;
536*86ee64e7SAndroid Build Coastguard Worker
537*86ee64e7SAndroid Build Coastguard Worker while ((*p)!='\0')
538*86ee64e7SAndroid Build Coastguard Worker {
539*86ee64e7SAndroid Build Coastguard Worker char c=*(p++);
540*86ee64e7SAndroid Build Coastguard Worker if ((c=='l') || (c=='L'))
541*86ee64e7SAndroid Build Coastguard Worker opt_do_list = 1;
542*86ee64e7SAndroid Build Coastguard Worker if ((c=='v') || (c=='V'))
543*86ee64e7SAndroid Build Coastguard Worker opt_do_list = 1;
544*86ee64e7SAndroid Build Coastguard Worker if ((c=='x') || (c=='X'))
545*86ee64e7SAndroid Build Coastguard Worker opt_do_extract = 1;
546*86ee64e7SAndroid Build Coastguard Worker if ((c=='e') || (c=='E'))
547*86ee64e7SAndroid Build Coastguard Worker opt_do_extract = opt_do_extract_withoutpath = 1;
548*86ee64e7SAndroid Build Coastguard Worker if ((c=='o') || (c=='O'))
549*86ee64e7SAndroid Build Coastguard Worker opt_overwrite=1;
550*86ee64e7SAndroid Build Coastguard Worker if ((c=='d') || (c=='D'))
551*86ee64e7SAndroid Build Coastguard Worker {
552*86ee64e7SAndroid Build Coastguard Worker opt_extractdir=1;
553*86ee64e7SAndroid Build Coastguard Worker dirname=argv[i+1];
554*86ee64e7SAndroid Build Coastguard Worker }
555*86ee64e7SAndroid Build Coastguard Worker
556*86ee64e7SAndroid Build Coastguard Worker if (((c=='p') || (c=='P')) && (i+1<argc))
557*86ee64e7SAndroid Build Coastguard Worker {
558*86ee64e7SAndroid Build Coastguard Worker password=argv[i+1];
559*86ee64e7SAndroid Build Coastguard Worker i++;
560*86ee64e7SAndroid Build Coastguard Worker }
561*86ee64e7SAndroid Build Coastguard Worker }
562*86ee64e7SAndroid Build Coastguard Worker }
563*86ee64e7SAndroid Build Coastguard Worker else
564*86ee64e7SAndroid Build Coastguard Worker {
565*86ee64e7SAndroid Build Coastguard Worker if (zipfilename == NULL)
566*86ee64e7SAndroid Build Coastguard Worker zipfilename = argv[i];
567*86ee64e7SAndroid Build Coastguard Worker else if ((filename_to_extract==NULL) && (!opt_extractdir))
568*86ee64e7SAndroid Build Coastguard Worker filename_to_extract = argv[i] ;
569*86ee64e7SAndroid Build Coastguard Worker }
570*86ee64e7SAndroid Build Coastguard Worker }
571*86ee64e7SAndroid Build Coastguard Worker }
572*86ee64e7SAndroid Build Coastguard Worker
573*86ee64e7SAndroid Build Coastguard Worker if (zipfilename!=NULL)
574*86ee64e7SAndroid Build Coastguard Worker {
575*86ee64e7SAndroid Build Coastguard Worker
576*86ee64e7SAndroid Build Coastguard Worker # ifdef USEWIN32IOAPI
577*86ee64e7SAndroid Build Coastguard Worker zlib_filefunc64_def ffunc;
578*86ee64e7SAndroid Build Coastguard Worker # endif
579*86ee64e7SAndroid Build Coastguard Worker
580*86ee64e7SAndroid Build Coastguard Worker strncpy(filename_try, zipfilename,MAXFILENAME-1);
581*86ee64e7SAndroid Build Coastguard Worker /* strncpy doesn't append the trailing NULL, of the string is too long. */
582*86ee64e7SAndroid Build Coastguard Worker filename_try[ MAXFILENAME ] = '\0';
583*86ee64e7SAndroid Build Coastguard Worker
584*86ee64e7SAndroid Build Coastguard Worker # ifdef USEWIN32IOAPI
585*86ee64e7SAndroid Build Coastguard Worker fill_win32_filefunc64A(&ffunc);
586*86ee64e7SAndroid Build Coastguard Worker uf = unzOpen2_64(zipfilename,&ffunc);
587*86ee64e7SAndroid Build Coastguard Worker # else
588*86ee64e7SAndroid Build Coastguard Worker uf = unzOpen64(zipfilename);
589*86ee64e7SAndroid Build Coastguard Worker # endif
590*86ee64e7SAndroid Build Coastguard Worker if (uf==NULL)
591*86ee64e7SAndroid Build Coastguard Worker {
592*86ee64e7SAndroid Build Coastguard Worker strcat(filename_try,".zip");
593*86ee64e7SAndroid Build Coastguard Worker # ifdef USEWIN32IOAPI
594*86ee64e7SAndroid Build Coastguard Worker uf = unzOpen2_64(filename_try,&ffunc);
595*86ee64e7SAndroid Build Coastguard Worker # else
596*86ee64e7SAndroid Build Coastguard Worker uf = unzOpen64(filename_try);
597*86ee64e7SAndroid Build Coastguard Worker # endif
598*86ee64e7SAndroid Build Coastguard Worker }
599*86ee64e7SAndroid Build Coastguard Worker }
600*86ee64e7SAndroid Build Coastguard Worker
601*86ee64e7SAndroid Build Coastguard Worker if (uf==NULL)
602*86ee64e7SAndroid Build Coastguard Worker {
603*86ee64e7SAndroid Build Coastguard Worker printf("Cannot open %s or %s.zip\n",zipfilename,zipfilename);
604*86ee64e7SAndroid Build Coastguard Worker return 1;
605*86ee64e7SAndroid Build Coastguard Worker }
606*86ee64e7SAndroid Build Coastguard Worker printf("%s opened\n",filename_try);
607*86ee64e7SAndroid Build Coastguard Worker
608*86ee64e7SAndroid Build Coastguard Worker if (opt_do_list==1)
609*86ee64e7SAndroid Build Coastguard Worker ret_value = do_list(uf);
610*86ee64e7SAndroid Build Coastguard Worker else if (opt_do_extract==1)
611*86ee64e7SAndroid Build Coastguard Worker {
612*86ee64e7SAndroid Build Coastguard Worker #ifdef _WIN32
613*86ee64e7SAndroid Build Coastguard Worker if (opt_extractdir && _chdir(dirname))
614*86ee64e7SAndroid Build Coastguard Worker #else
615*86ee64e7SAndroid Build Coastguard Worker if (opt_extractdir && chdir(dirname))
616*86ee64e7SAndroid Build Coastguard Worker #endif
617*86ee64e7SAndroid Build Coastguard Worker {
618*86ee64e7SAndroid Build Coastguard Worker printf("Error changing into %s, aborting\n", dirname);
619*86ee64e7SAndroid Build Coastguard Worker exit(-1);
620*86ee64e7SAndroid Build Coastguard Worker }
621*86ee64e7SAndroid Build Coastguard Worker
622*86ee64e7SAndroid Build Coastguard Worker if (filename_to_extract == NULL)
623*86ee64e7SAndroid Build Coastguard Worker ret_value = do_extract(uf, opt_do_extract_withoutpath, opt_overwrite, password);
624*86ee64e7SAndroid Build Coastguard Worker else
625*86ee64e7SAndroid Build Coastguard Worker ret_value = do_extract_onefile(uf, filename_to_extract, opt_do_extract_withoutpath, opt_overwrite, password);
626*86ee64e7SAndroid Build Coastguard Worker }
627*86ee64e7SAndroid Build Coastguard Worker
628*86ee64e7SAndroid Build Coastguard Worker unzClose(uf);
629*86ee64e7SAndroid Build Coastguard Worker
630*86ee64e7SAndroid Build Coastguard Worker return ret_value;
631*86ee64e7SAndroid Build Coastguard Worker }
632