miniunz.c revision 9e38dfa2f95fce609707a0941f10af9a785288de
19e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project/* 29e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project miniunz.c 39e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project Version 1.01e, February 12th, 2005 49e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 59e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project Copyright (C) 1998-2005 Gilles Vollant 69e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project*/ 79e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 89e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 99e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#include <stdio.h> 109e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#include <stdlib.h> 119e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#include <string.h> 129e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#include <time.h> 139e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#include <errno.h> 149e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#include <fcntl.h> 159e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 169e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#ifdef unix 179e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project# include <unistd.h> 189e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project# include <utime.h> 199e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#else 209e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project# include <direct.h> 219e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project# include <io.h> 229e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#endif 239e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 249e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#include "unzip.h" 259e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 269e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#define CASESENSITIVITY (0) 279e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#define WRITEBUFFERSIZE (8192) 289e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#define MAXFILENAME (256) 299e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 309e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#ifdef WIN32 319e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#define USEWIN32IOAPI 329e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#include "iowin32.h" 339e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#endif 349e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project/* 359e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project mini unzip, demo of unzip package 369e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 379e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project usage : 389e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project Usage : miniunz [-exvlo] file.zip [file_to_extract] [-d extractdir] 399e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 409e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project list the file in the zipfile, and print the content of FILE_ID.ZIP or README.TXT 419e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if it exists 429e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project*/ 439e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 449e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 459e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project/* change_file_date : change the date/time of a file 469e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project filename : the filename of the file where date/time must be modified 479e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project dosdate : the new date at the MSDos format (4 bytes) 489e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project tmu_date : the SAME new date at the tm_unz format */ 499e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectvoid change_file_date(filename,dosdate,tmu_date) 509e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project const char *filename; 519e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project uLong dosdate; 529e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project tm_unz tmu_date; 539e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{ 549e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#ifdef WIN32 559e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project HANDLE hFile; 569e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project FILETIME ftm,ftLocal,ftCreate,ftLastAcc,ftLastWrite; 579e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 589e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project hFile = CreateFile(filename,GENERIC_READ | GENERIC_WRITE, 599e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 0,NULL,OPEN_EXISTING,0,NULL); 609e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project GetFileTime(hFile,&ftCreate,&ftLastAcc,&ftLastWrite); 619e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project DosDateTimeToFileTime((WORD)(dosdate>>16),(WORD)dosdate,&ftLocal); 629e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project LocalFileTimeToFileTime(&ftLocal,&ftm); 639e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project SetFileTime(hFile,&ftm,&ftLastAcc,&ftm); 649e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project CloseHandle(hFile); 659e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#else 669e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#ifdef unix 679e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project struct utimbuf ut; 689e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project struct tm newdate; 699e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project newdate.tm_sec = tmu_date.tm_sec; 709e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project newdate.tm_min=tmu_date.tm_min; 719e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project newdate.tm_hour=tmu_date.tm_hour; 729e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project newdate.tm_mday=tmu_date.tm_mday; 739e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project newdate.tm_mon=tmu_date.tm_mon; 749e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (tmu_date.tm_year > 1900) 759e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project newdate.tm_year=tmu_date.tm_year - 1900; 769e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project else 779e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project newdate.tm_year=tmu_date.tm_year ; 789e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project newdate.tm_isdst=-1; 799e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 809e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project ut.actime=ut.modtime=mktime(&newdate); 819e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project utime(filename,&ut); 829e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#endif 839e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#endif 849e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project} 859e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 869e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 879e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project/* mymkdir and change_file_date are not 100 % portable 889e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project As I don't know well Unix, I wait feedback for the unix portion */ 899e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 909e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectint mymkdir(dirname) 919e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project const char* dirname; 929e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{ 939e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project int ret=0; 949e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#ifdef WIN32 959e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project ret = mkdir(dirname); 969e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#else 979e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#ifdef unix 989e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project ret = mkdir (dirname,0775); 999e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#endif 1009e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#endif 1019e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project return ret; 1029e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project} 1039e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 1049e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectint makedir (newdir) 1059e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project char *newdir; 1069e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{ 1079e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project char *buffer ; 1089e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project char *p; 1099e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project int len = (int)strlen(newdir); 1109e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 1119e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (len <= 0) 1129e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project return 0; 1139e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 1149e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project buffer = (char*)malloc(len+1); 1159e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project strcpy(buffer,newdir); 1169e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 1179e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (buffer[len-1] == '/') { 1189e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project buffer[len-1] = '\0'; 1199e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project } 1209e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (mymkdir(buffer) == 0) 1219e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project { 1229e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project free(buffer); 1239e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project return 1; 1249e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project } 1259e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 1269e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project p = buffer+1; 1279e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project while (1) 1289e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project { 1299e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project char hold; 1309e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 1319e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project while(*p && *p != '\\' && *p != '/') 1329e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project p++; 1339e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project hold = *p; 1349e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project *p = 0; 1359e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if ((mymkdir(buffer) == -1) && (errno == ENOENT)) 1369e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project { 1379e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project printf("couldn't create directory %s\n",buffer); 1389e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project free(buffer); 1399e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project return 0; 1409e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project } 1419e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (hold == 0) 1429e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project break; 1439e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project *p++ = hold; 1449e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project } 1459e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project free(buffer); 1469e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project return 1; 1479e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project} 1489e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 1499e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectvoid do_banner() 1509e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{ 1519e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project printf("MiniUnz 1.01b, demo of zLib + Unz package written by Gilles Vollant\n"); 1529e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project printf("more info at http://www.winimage.com/zLibDll/unzip.html\n\n"); 1539e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project} 1549e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 1559e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectvoid do_help() 1569e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{ 1579e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project printf("Usage : miniunz [-e] [-x] [-v] [-l] [-o] [-p password] file.zip [file_to_extr.] [-d extractdir]\n\n" \ 1589e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project " -e Extract without pathname (junk paths)\n" \ 1599e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project " -x Extract with pathname\n" \ 1609e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project " -v list files\n" \ 1619e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project " -l list files\n" \ 1629e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project " -d directory to extract into\n" \ 1639e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project " -o overwrite files without prompting\n" \ 1649e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project " -p extract crypted file using password\n\n"); 1659e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project} 1669e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 1679e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 1689e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectint do_list(uf) 1699e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project unzFile uf; 1709e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{ 1719e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project uLong i; 1729e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project unz_global_info gi; 1739e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project int err; 1749e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 1759e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project err = unzGetGlobalInfo (uf,&gi); 1769e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (err!=UNZ_OK) 1779e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project printf("error %d with zipfile in unzGetGlobalInfo \n",err); 1789e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project printf(" Length Method Size Ratio Date Time CRC-32 Name\n"); 1799e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project printf(" ------ ------ ---- ----- ---- ---- ------ ----\n"); 1809e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project for (i=0;i<gi.number_entry;i++) 1819e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project { 1829e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project char filename_inzip[256]; 1839e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project unz_file_info file_info; 1849e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project uLong ratio=0; 1859e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project const char *string_method; 1869e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project char charCrypt=' '; 1879e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project err = unzGetCurrentFileInfo(uf,&file_info,filename_inzip,sizeof(filename_inzip),NULL,0,NULL,0); 1889e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (err!=UNZ_OK) 1899e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project { 1909e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project printf("error %d with zipfile in unzGetCurrentFileInfo\n",err); 1919e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project break; 1929e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project } 1939e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (file_info.uncompressed_size>0) 1949e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project ratio = (file_info.compressed_size*100)/file_info.uncompressed_size; 1959e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 1969e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project /* display a '*' if the file is crypted */ 1979e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if ((file_info.flag & 1) != 0) 1989e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project charCrypt='*'; 1999e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 2009e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (file_info.compression_method==0) 2019e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project string_method="Stored"; 2029e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project else 2039e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (file_info.compression_method==Z_DEFLATED) 2049e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project { 2059e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project uInt iLevel=(uInt)((file_info.flag & 0x6)/2); 2069e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (iLevel==0) 2079e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project string_method="Defl:N"; 2089e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project else if (iLevel==1) 2099e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project string_method="Defl:X"; 2109e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project else if ((iLevel==2) || (iLevel==3)) 2119e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project string_method="Defl:F"; /* 2:fast , 3 : extra fast*/ 2129e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project } 2139e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project else 2149e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project string_method="Unkn. "; 2159e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 2169e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project printf("%7lu %6s%c%7lu %3lu%% %2.2lu-%2.2lu-%2.2lu %2.2lu:%2.2lu %8.8lx %s\n", 2179e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project file_info.uncompressed_size,string_method, 2189e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project charCrypt, 2199e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project file_info.compressed_size, 2209e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project ratio, 2219e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project (uLong)file_info.tmu_date.tm_mon + 1, 2229e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project (uLong)file_info.tmu_date.tm_mday, 2239e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project (uLong)file_info.tmu_date.tm_year % 100, 2249e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project (uLong)file_info.tmu_date.tm_hour,(uLong)file_info.tmu_date.tm_min, 2259e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project (uLong)file_info.crc,filename_inzip); 2269e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if ((i+1)<gi.number_entry) 2279e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project { 2289e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project err = unzGoToNextFile(uf); 2299e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (err!=UNZ_OK) 2309e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project { 2319e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project printf("error %d with zipfile in unzGoToNextFile\n",err); 2329e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project break; 2339e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project } 2349e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project } 2359e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project } 2369e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 2379e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project return 0; 2389e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project} 2399e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 2409e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 2419e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectint do_extract_currentfile(uf,popt_extract_without_path,popt_overwrite,password) 2429e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project unzFile uf; 2439e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project const int* popt_extract_without_path; 2449e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project int* popt_overwrite; 2459e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project const char* password; 2469e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{ 2479e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project char filename_inzip[256]; 2489e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project char* filename_withoutpath; 2499e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project char* p; 2509e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project int err=UNZ_OK; 2519e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project FILE *fout=NULL; 2529e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project void* buf; 2539e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project uInt size_buf; 2549e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 2559e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project unz_file_info file_info; 2569e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project uLong ratio=0; 2579e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project err = unzGetCurrentFileInfo(uf,&file_info,filename_inzip,sizeof(filename_inzip),NULL,0,NULL,0); 2589e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 2599e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (err!=UNZ_OK) 2609e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project { 2619e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project printf("error %d with zipfile in unzGetCurrentFileInfo\n",err); 2629e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project return err; 2639e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project } 2649e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 2659e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project size_buf = WRITEBUFFERSIZE; 2669e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project buf = (void*)malloc(size_buf); 2679e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (buf==NULL) 2689e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project { 2699e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project printf("Error allocating memory\n"); 2709e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project return UNZ_INTERNALERROR; 2719e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project } 2729e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 2739e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project p = filename_withoutpath = filename_inzip; 2749e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project while ((*p) != '\0') 2759e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project { 2769e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (((*p)=='/') || ((*p)=='\\')) 2779e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project filename_withoutpath = p+1; 2789e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project p++; 2799e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project } 2809e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 2819e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if ((*filename_withoutpath)=='\0') 2829e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project { 2839e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if ((*popt_extract_without_path)==0) 2849e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project { 2859e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project printf("creating directory: %s\n",filename_inzip); 2869e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project mymkdir(filename_inzip); 2879e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project } 2889e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project } 2899e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project else 2909e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project { 2919e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project const char* write_filename; 2929e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project int skip=0; 2939e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 2949e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if ((*popt_extract_without_path)==0) 2959e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project write_filename = filename_inzip; 2969e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project else 2979e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project write_filename = filename_withoutpath; 2989e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 2999e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project err = unzOpenCurrentFilePassword(uf,password); 3009e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (err!=UNZ_OK) 3019e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project { 3029e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project printf("error %d with zipfile in unzOpenCurrentFilePassword\n",err); 3039e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project } 3049e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 3059e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (((*popt_overwrite)==0) && (err==UNZ_OK)) 3069e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project { 3079e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project char rep=0; 3089e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project FILE* ftestexist; 3099e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project ftestexist = fopen(write_filename,"rb"); 3109e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (ftestexist!=NULL) 3119e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project { 3129e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project fclose(ftestexist); 3139e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project do 3149e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project { 3159e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project char answer[128]; 3169e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project int ret; 3179e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 3189e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project printf("The file %s exists. Overwrite ? [y]es, [n]o, [A]ll: ",write_filename); 3199e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project ret = scanf("%1s",answer); 3209e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (ret != 1) 3219e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project { 3229e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project exit(EXIT_FAILURE); 3239e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project } 3249e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project rep = answer[0] ; 3259e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if ((rep>='a') && (rep<='z')) 3269e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project rep -= 0x20; 3279e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project } 3289e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project while ((rep!='Y') && (rep!='N') && (rep!='A')); 3299e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project } 3309e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 3319e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (rep == 'N') 3329e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project skip = 1; 3339e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 3349e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (rep == 'A') 3359e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project *popt_overwrite=1; 3369e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project } 3379e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 3389e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if ((skip==0) && (err==UNZ_OK)) 3399e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project { 3409e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project fout=fopen(write_filename,"wb"); 3419e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 3429e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project /* some zipfile don't contain directory alone before file */ 3439e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if ((fout==NULL) && ((*popt_extract_without_path)==0) && 3449e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project (filename_withoutpath!=(char*)filename_inzip)) 3459e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project { 3469e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project char c=*(filename_withoutpath-1); 3479e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project *(filename_withoutpath-1)='\0'; 3489e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project makedir(write_filename); 3499e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project *(filename_withoutpath-1)=c; 3509e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project fout=fopen(write_filename,"wb"); 3519e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project } 3529e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 3539e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (fout==NULL) 3549e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project { 3559e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project printf("error opening %s\n",write_filename); 3569e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project } 3579e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project } 3589e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 3599e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (fout!=NULL) 3609e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project { 3619e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project printf(" extracting: %s\n",write_filename); 3629e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 3639e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project do 3649e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project { 3659e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project err = unzReadCurrentFile(uf,buf,size_buf); 3669e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (err<0) 3679e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project { 3689e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project printf("error %d with zipfile in unzReadCurrentFile\n",err); 3699e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project break; 3709e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project } 3719e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (err>0) 3729e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (fwrite(buf,err,1,fout)!=1) 3739e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project { 3749e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project printf("error in writing extracted file\n"); 3759e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project err=UNZ_ERRNO; 3769e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project break; 3779e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project } 3789e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project } 3799e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project while (err>0); 3809e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (fout) 3819e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project fclose(fout); 3829e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 3839e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (err==0) 3849e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project change_file_date(write_filename,file_info.dosDate, 3859e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project file_info.tmu_date); 3869e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project } 3879e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 3889e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (err==UNZ_OK) 3899e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project { 3909e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project err = unzCloseCurrentFile (uf); 3919e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (err!=UNZ_OK) 3929e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project { 3939e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project printf("error %d with zipfile in unzCloseCurrentFile\n",err); 3949e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project } 3959e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project } 3969e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project else 3979e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project unzCloseCurrentFile(uf); /* don't lose the error */ 3989e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project } 3999e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 4009e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project free(buf); 4019e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project return err; 4029e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project} 4039e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 4049e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 4059e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectint do_extract(uf,opt_extract_without_path,opt_overwrite,password) 4069e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project unzFile uf; 4079e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project int opt_extract_without_path; 4089e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project int opt_overwrite; 4099e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project const char* password; 4109e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{ 4119e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project uLong i; 4129e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project unz_global_info gi; 4139e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project int err; 4149e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project FILE* fout=NULL; 4159e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 4169e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project err = unzGetGlobalInfo (uf,&gi); 4179e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (err!=UNZ_OK) 4189e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project printf("error %d with zipfile in unzGetGlobalInfo \n",err); 4199e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 4209e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project for (i=0;i<gi.number_entry;i++) 4219e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project { 4229e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (do_extract_currentfile(uf,&opt_extract_without_path, 4239e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project &opt_overwrite, 4249e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project password) != UNZ_OK) 4259e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project break; 4269e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 4279e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if ((i+1)<gi.number_entry) 4289e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project { 4299e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project err = unzGoToNextFile(uf); 4309e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (err!=UNZ_OK) 4319e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project { 4329e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project printf("error %d with zipfile in unzGoToNextFile\n",err); 4339e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project break; 4349e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project } 4359e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project } 4369e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project } 4379e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 4389e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project return 0; 4399e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project} 4409e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 4419e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectint do_extract_onefile(uf,filename,opt_extract_without_path,opt_overwrite,password) 4429e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project unzFile uf; 4439e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project const char* filename; 4449e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project int opt_extract_without_path; 4459e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project int opt_overwrite; 4469e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project const char* password; 4479e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{ 4489e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project int err = UNZ_OK; 4499e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (unzLocateFile(uf,filename,CASESENSITIVITY)!=UNZ_OK) 4509e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project { 4519e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project printf("file %s not found in the zipfile\n",filename); 4529e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project return 2; 4539e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project } 4549e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 4559e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (do_extract_currentfile(uf,&opt_extract_without_path, 4569e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project &opt_overwrite, 4579e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project password) == UNZ_OK) 4589e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project return 0; 4599e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project else 4609e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project return 1; 4619e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project} 4629e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 4639e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 4649e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectint main(argc,argv) 4659e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project int argc; 4669e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project char *argv[]; 4679e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{ 4689e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project const char *zipfilename=NULL; 4699e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project const char *filename_to_extract=NULL; 4709e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project const char *password=NULL; 4719e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project char filename_try[MAXFILENAME+16] = ""; 4729e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project int i; 4739e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project int opt_do_list=0; 4749e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project int opt_do_extract=1; 4759e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project int opt_do_extract_withoutpath=0; 4769e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project int opt_overwrite=0; 4779e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project int opt_extractdir=0; 4789e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project const char *dirname=NULL; 4799e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project unzFile uf=NULL; 4809e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 4819e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project do_banner(); 4829e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (argc==1) 4839e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project { 4849e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project do_help(); 4859e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project return 0; 4869e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project } 4879e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project else 4889e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project { 4899e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project for (i=1;i<argc;i++) 4909e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project { 4919e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if ((*argv[i])=='-') 4929e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project { 4939e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project const char *p=argv[i]+1; 4949e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 4959e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project while ((*p)!='\0') 4969e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project { 4979e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project char c=*(p++);; 4989e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if ((c=='l') || (c=='L')) 4999e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project opt_do_list = 1; 5009e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if ((c=='v') || (c=='V')) 5019e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project opt_do_list = 1; 5029e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if ((c=='x') || (c=='X')) 5039e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project opt_do_extract = 1; 5049e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if ((c=='e') || (c=='E')) 5059e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project opt_do_extract = opt_do_extract_withoutpath = 1; 5069e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if ((c=='o') || (c=='O')) 5079e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project opt_overwrite=1; 5089e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if ((c=='d') || (c=='D')) 5099e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project { 5109e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project opt_extractdir=1; 5119e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project dirname=argv[i+1]; 5129e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project } 5139e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 5149e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (((c=='p') || (c=='P')) && (i+1<argc)) 5159e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project { 5169e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project password=argv[i+1]; 5179e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project i++; 5189e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project } 5199e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project } 5209e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project } 5219e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project else 5229e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project { 5239e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (zipfilename == NULL) 5249e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project zipfilename = argv[i]; 5259e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project else if ((filename_to_extract==NULL) && (!opt_extractdir)) 5269e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project filename_to_extract = argv[i] ; 5279e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project } 5289e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project } 5299e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project } 5309e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 5319e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (zipfilename!=NULL) 5329e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project { 5339e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 5349e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project# ifdef USEWIN32IOAPI 5359e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project zlib_filefunc_def ffunc; 5369e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project# endif 5379e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 5389e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project strncpy(filename_try, zipfilename,MAXFILENAME-1); 5399e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project /* strncpy doesnt append the trailing NULL, of the string is too long. */ 5409e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project filename_try[ MAXFILENAME ] = '\0'; 5419e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 5429e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project# ifdef USEWIN32IOAPI 5439e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project fill_win32_filefunc(&ffunc); 5449e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project uf = unzOpen2(zipfilename,&ffunc); 5459e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project# else 5469e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project uf = unzOpen(zipfilename); 5479e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project# endif 5489e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (uf==NULL) 5499e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project { 5509e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project strcat(filename_try,".zip"); 5519e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project# ifdef USEWIN32IOAPI 5529e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project uf = unzOpen2(filename_try,&ffunc); 5539e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project# else 5549e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project uf = unzOpen(filename_try); 5559e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project# endif 5569e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project } 5579e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project } 5589e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 5599e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (uf==NULL) 5609e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project { 5619e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project printf("Cannot open %s or %s.zip\n",zipfilename,zipfilename); 5629e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project return 1; 5639e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project } 5649e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project printf("%s opened\n",filename_try); 5659e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 5669e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (opt_do_list==1) 5679e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project return do_list(uf); 5689e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project else if (opt_do_extract==1) 5699e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project { 5709e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (opt_extractdir && chdir(dirname)) 5719e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project { 5729e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project printf("Error changing into %s, aborting\n", dirname); 5739e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project exit(-1); 5749e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project } 5759e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 5769e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (filename_to_extract == NULL) 5779e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project return do_extract(uf,opt_do_extract_withoutpath,opt_overwrite,password); 5789e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project else 5799e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project return do_extract_onefile(uf,filename_to_extract, 5809e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project opt_do_extract_withoutpath,opt_overwrite,password); 5819e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project } 5829e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project unzCloseCurrentFile(uf); 5839e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 5849e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project return 0; 5859e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project} 586