annotate src/zlib-1.2.8/contrib/minizip/miniunz.c @ 155:54abead6ecce

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