xref: /aosp_15_r20/external/zlib/contrib/minizip/miniunz.c (revision 86ee64e75fa5f8bce2c8c356138035642429cd05)
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