19e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project/* 29e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project miniunz.c 3381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes Version 1.1, February 14h, 2010 4381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes sample part of the MiniZip project - ( http://www.winimage.com/zLibDll/minizip.html ) 59e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 6381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes Copyright (C) 1998-2010 Gilles Vollant (minizip) ( http://www.winimage.com/zLibDll/minizip.html ) 7381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes 8381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes Modifications of Unzip for Zip64 9381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes Copyright (C) 2007-2008 Even Rouault 10381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes 11381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes Modifications for Zip64 support on both zip and unzip 12381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes Copyright (C) 2009-2010 Mathias Svensson ( http://result42.com ) 139e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project*/ 149e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 15ee9e11d0d4e3361533860bf04896abb86a291bfbElliott Hughes#if (!defined(_WIN32)) && (!defined(WIN32)) && (!defined(__APPLE__)) 16381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes #ifndef __USE_FILE_OFFSET64 17381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes #define __USE_FILE_OFFSET64 18381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes #endif 19381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes #ifndef __USE_LARGEFILE64 20381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes #define __USE_LARGEFILE64 21381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes #endif 22381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes #ifndef _LARGEFILE64_SOURCE 23381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes #define _LARGEFILE64_SOURCE 24381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes #endif 25381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes #ifndef _FILE_OFFSET_BIT 26381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes #define _FILE_OFFSET_BIT 64 27381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes #endif 28381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes#endif 299e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 30ee9e11d0d4e3361533860bf04896abb86a291bfbElliott Hughes#ifdef __APPLE__ 31ee9e11d0d4e3361533860bf04896abb86a291bfbElliott Hughes// In darwin and perhaps other BSD variants off_t is a 64 bit value, hence no need for specific 64 bit functions 32ee9e11d0d4e3361533860bf04896abb86a291bfbElliott Hughes#define FOPEN_FUNC(filename, mode) fopen(filename, mode) 33ee9e11d0d4e3361533860bf04896abb86a291bfbElliott Hughes#define FTELLO_FUNC(stream) ftello(stream) 34ee9e11d0d4e3361533860bf04896abb86a291bfbElliott Hughes#define FSEEKO_FUNC(stream, offset, origin) fseeko(stream, offset, origin) 35ee9e11d0d4e3361533860bf04896abb86a291bfbElliott Hughes#else 36ee9e11d0d4e3361533860bf04896abb86a291bfbElliott Hughes#define FOPEN_FUNC(filename, mode) fopen64(filename, mode) 37ee9e11d0d4e3361533860bf04896abb86a291bfbElliott Hughes#define FTELLO_FUNC(stream) ftello64(stream) 38ee9e11d0d4e3361533860bf04896abb86a291bfbElliott Hughes#define FSEEKO_FUNC(stream, offset, origin) fseeko64(stream, offset, origin) 39ee9e11d0d4e3361533860bf04896abb86a291bfbElliott Hughes#endif 40ee9e11d0d4e3361533860bf04896abb86a291bfbElliott Hughes 41ee9e11d0d4e3361533860bf04896abb86a291bfbElliott Hughes 429e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#include <stdio.h> 439e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#include <stdlib.h> 449e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#include <string.h> 459e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#include <time.h> 469e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#include <errno.h> 479e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#include <fcntl.h> 489e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 49ee9e11d0d4e3361533860bf04896abb86a291bfbElliott Hughes#ifdef _WIN32 509e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project# include <direct.h> 519e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project# include <io.h> 52ee9e11d0d4e3361533860bf04896abb86a291bfbElliott Hughes#else 53ee9e11d0d4e3361533860bf04896abb86a291bfbElliott Hughes# include <unistd.h> 54ee9e11d0d4e3361533860bf04896abb86a291bfbElliott Hughes# include <utime.h> 559e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#endif 569e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 57ee9e11d0d4e3361533860bf04896abb86a291bfbElliott Hughes 589e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#include "unzip.h" 599e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 609e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#define CASESENSITIVITY (0) 619e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#define WRITEBUFFERSIZE (8192) 629e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#define MAXFILENAME (256) 639e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 64381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes#ifdef _WIN32 659e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#define USEWIN32IOAPI 669e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#include "iowin32.h" 679e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#endif 689e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project/* 699e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project mini unzip, demo of unzip package 709e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 719e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project usage : 729e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project Usage : miniunz [-exvlo] file.zip [file_to_extract] [-d extractdir] 739e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 749e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project list the file in the zipfile, and print the content of FILE_ID.ZIP or README.TXT 759e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if it exists 769e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project*/ 779e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 789e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 799e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project/* change_file_date : change the date/time of a file 809e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project filename : the filename of the file where date/time must be modified 819e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project dosdate : the new date at the MSDos format (4 bytes) 829e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project tmu_date : the SAME new date at the tm_unz format */ 839e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectvoid change_file_date(filename,dosdate,tmu_date) 849e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project const char *filename; 859e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project uLong dosdate; 869e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project tm_unz tmu_date; 879e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{ 88381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes#ifdef _WIN32 899e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project HANDLE hFile; 909e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project FILETIME ftm,ftLocal,ftCreate,ftLastAcc,ftLastWrite; 919e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 92381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes hFile = CreateFileA(filename,GENERIC_READ | GENERIC_WRITE, 939e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 0,NULL,OPEN_EXISTING,0,NULL); 949e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project GetFileTime(hFile,&ftCreate,&ftLastAcc,&ftLastWrite); 959e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project DosDateTimeToFileTime((WORD)(dosdate>>16),(WORD)dosdate,&ftLocal); 969e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project LocalFileTimeToFileTime(&ftLocal,&ftm); 979e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project SetFileTime(hFile,&ftm,&ftLastAcc,&ftm); 989e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project CloseHandle(hFile); 999e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#else 100ee9e11d0d4e3361533860bf04896abb86a291bfbElliott Hughes#ifdef unix || __APPLE__ 1019e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project struct utimbuf ut; 1029e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project struct tm newdate; 1039e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project newdate.tm_sec = tmu_date.tm_sec; 1049e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project newdate.tm_min=tmu_date.tm_min; 1059e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project newdate.tm_hour=tmu_date.tm_hour; 1069e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project newdate.tm_mday=tmu_date.tm_mday; 1079e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project newdate.tm_mon=tmu_date.tm_mon; 1089e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (tmu_date.tm_year > 1900) 1099e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project newdate.tm_year=tmu_date.tm_year - 1900; 1109e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project else 1119e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project newdate.tm_year=tmu_date.tm_year ; 1129e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project newdate.tm_isdst=-1; 1139e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 1149e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project ut.actime=ut.modtime=mktime(&newdate); 1159e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project utime(filename,&ut); 1169e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#endif 1179e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#endif 1189e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project} 1199e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 1209e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 1219e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project/* mymkdir and change_file_date are not 100 % portable 1229e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project As I don't know well Unix, I wait feedback for the unix portion */ 1239e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 1249e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectint mymkdir(dirname) 1259e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project const char* dirname; 1269e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{ 1279e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project int ret=0; 128381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes#ifdef _WIN32 129381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes ret = _mkdir(dirname); 130ee9e11d0d4e3361533860bf04896abb86a291bfbElliott Hughes#elif unix 131ee9e11d0d4e3361533860bf04896abb86a291bfbElliott Hughes ret = mkdir (dirname,0775); 132ee9e11d0d4e3361533860bf04896abb86a291bfbElliott Hughes#elif __APPLE__ 1339e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project ret = mkdir (dirname,0775); 1349e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#endif 1359e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project return ret; 1369e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project} 1379e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 1389e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectint makedir (newdir) 1399e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project char *newdir; 1409e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{ 1419e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project char *buffer ; 1429e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project char *p; 1439e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project int len = (int)strlen(newdir); 1449e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 1459e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (len <= 0) 1469e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project return 0; 1479e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 1489e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project buffer = (char*)malloc(len+1); 149381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes if (buffer==NULL) 150381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes { 151381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes printf("Error allocating memory\n"); 152381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes return UNZ_INTERNALERROR; 153381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes } 1549e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project strcpy(buffer,newdir); 1559e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 1569e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (buffer[len-1] == '/') { 1579e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project buffer[len-1] = '\0'; 1589e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project } 1599e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (mymkdir(buffer) == 0) 1609e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project { 1619e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project free(buffer); 1629e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project return 1; 1639e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project } 1649e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 1659e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project p = buffer+1; 1669e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project while (1) 1679e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project { 1689e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project char hold; 1699e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 1709e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project while(*p && *p != '\\' && *p != '/') 1719e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project p++; 1729e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project hold = *p; 1739e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project *p = 0; 1749e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if ((mymkdir(buffer) == -1) && (errno == ENOENT)) 1759e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project { 1769e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project printf("couldn't create directory %s\n",buffer); 1779e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project free(buffer); 1789e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project return 0; 1799e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project } 1809e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (hold == 0) 1819e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project break; 1829e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project *p++ = hold; 1839e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project } 1849e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project free(buffer); 1859e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project return 1; 1869e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project} 1879e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 1889e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectvoid do_banner() 1899e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{ 1909e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project printf("MiniUnz 1.01b, demo of zLib + Unz package written by Gilles Vollant\n"); 1919e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project printf("more info at http://www.winimage.com/zLibDll/unzip.html\n\n"); 1929e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project} 1939e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 1949e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectvoid do_help() 1959e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{ 1969e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project printf("Usage : miniunz [-e] [-x] [-v] [-l] [-o] [-p password] file.zip [file_to_extr.] [-d extractdir]\n\n" \ 1979e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project " -e Extract without pathname (junk paths)\n" \ 1989e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project " -x Extract with pathname\n" \ 1999e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project " -v list files\n" \ 2009e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project " -l list files\n" \ 2019e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project " -d directory to extract into\n" \ 2029e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project " -o overwrite files without prompting\n" \ 2039e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project " -p extract crypted file using password\n\n"); 2049e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project} 2059e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 206381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughesvoid Display64BitsSize(ZPOS64_T n, int size_char) 207381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes{ 208381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes /* to avoid compatibility problem , we do here the conversion */ 209381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes char number[21]; 210381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes int offset=19; 211381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes int pos_string = 19; 212381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes number[20]=0; 213381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes for (;;) { 214381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes number[offset]=(char)((n%10)+'0'); 215381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes if (number[offset] != '0') 216381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes pos_string=offset; 217381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes n/=10; 218381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes if (offset==0) 219381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes break; 220381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes offset--; 221381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes } 222381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes { 223381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes int size_display_string = 19-pos_string; 224381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes while (size_char > size_display_string) 225381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes { 226381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes size_char--; 227381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes printf(" "); 228381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes } 229381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes } 230381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes 231381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes printf("%s",&number[pos_string]); 232381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes} 2339e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 2349e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectint do_list(uf) 2359e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project unzFile uf; 2369e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{ 2379e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project uLong i; 238381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes unz_global_info64 gi; 2399e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project int err; 2409e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 241381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes err = unzGetGlobalInfo64(uf,&gi); 2429e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (err!=UNZ_OK) 2439e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project printf("error %d with zipfile in unzGetGlobalInfo \n",err); 244381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes printf(" Length Method Size Ratio Date Time CRC-32 Name\n"); 245381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes printf(" ------ ------ ---- ----- ---- ---- ------ ----\n"); 2469e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project for (i=0;i<gi.number_entry;i++) 2479e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project { 2489e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project char filename_inzip[256]; 249381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes unz_file_info64 file_info; 2509e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project uLong ratio=0; 2519e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project const char *string_method; 2529e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project char charCrypt=' '; 253381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes err = unzGetCurrentFileInfo64(uf,&file_info,filename_inzip,sizeof(filename_inzip),NULL,0,NULL,0); 2549e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (err!=UNZ_OK) 2559e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project { 2569e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project printf("error %d with zipfile in unzGetCurrentFileInfo\n",err); 2579e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project break; 2589e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project } 2599e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (file_info.uncompressed_size>0) 260381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes ratio = (uLong)((file_info.compressed_size*100)/file_info.uncompressed_size); 2619e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 2629e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project /* display a '*' if the file is crypted */ 2639e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if ((file_info.flag & 1) != 0) 2649e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project charCrypt='*'; 2659e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 2669e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (file_info.compression_method==0) 2679e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project string_method="Stored"; 2689e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project else 2699e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (file_info.compression_method==Z_DEFLATED) 2709e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project { 2719e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project uInt iLevel=(uInt)((file_info.flag & 0x6)/2); 2729e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (iLevel==0) 2739e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project string_method="Defl:N"; 2749e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project else if (iLevel==1) 2759e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project string_method="Defl:X"; 2769e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project else if ((iLevel==2) || (iLevel==3)) 2779e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project string_method="Defl:F"; /* 2:fast , 3 : extra fast*/ 2789e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project } 2799e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project else 280381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes if (file_info.compression_method==Z_BZIP2ED) 281381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes { 282381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes string_method="BZip2 "; 283381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes } 284381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes else 2859e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project string_method="Unkn. "; 2869e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 287381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes Display64BitsSize(file_info.uncompressed_size,7); 288381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes printf(" %6s%c",string_method,charCrypt); 289381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes Display64BitsSize(file_info.compressed_size,7); 290381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes printf(" %3lu%% %2.2lu-%2.2lu-%2.2lu %2.2lu:%2.2lu %8.8lx %s\n", 2919e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project ratio, 2929e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project (uLong)file_info.tmu_date.tm_mon + 1, 2939e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project (uLong)file_info.tmu_date.tm_mday, 2949e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project (uLong)file_info.tmu_date.tm_year % 100, 2959e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project (uLong)file_info.tmu_date.tm_hour,(uLong)file_info.tmu_date.tm_min, 2969e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project (uLong)file_info.crc,filename_inzip); 2979e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if ((i+1)<gi.number_entry) 2989e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project { 2999e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project err = unzGoToNextFile(uf); 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 unzGoToNextFile\n",err); 3039e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project break; 3049e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project } 3059e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project } 3069e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project } 3079e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 3089e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project return 0; 3099e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project} 3109e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 3119e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 3129e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectint do_extract_currentfile(uf,popt_extract_without_path,popt_overwrite,password) 3139e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project unzFile uf; 3149e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project const int* popt_extract_without_path; 3159e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project int* popt_overwrite; 3169e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project const char* password; 3179e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{ 3189e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project char filename_inzip[256]; 3199e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project char* filename_withoutpath; 3209e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project char* p; 3219e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project int err=UNZ_OK; 3229e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project FILE *fout=NULL; 3239e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project void* buf; 3249e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project uInt size_buf; 3259e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 326381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes unz_file_info64 file_info; 3279e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project uLong ratio=0; 328381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes err = unzGetCurrentFileInfo64(uf,&file_info,filename_inzip,sizeof(filename_inzip),NULL,0,NULL,0); 3299e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 3309e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (err!=UNZ_OK) 3319e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project { 3329e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project printf("error %d with zipfile in unzGetCurrentFileInfo\n",err); 3339e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project return err; 3349e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project } 3359e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 3369e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project size_buf = WRITEBUFFERSIZE; 3379e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project buf = (void*)malloc(size_buf); 3389e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (buf==NULL) 3399e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project { 3409e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project printf("Error allocating memory\n"); 3419e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project return UNZ_INTERNALERROR; 3429e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project } 3439e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 3449e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project p = filename_withoutpath = filename_inzip; 3459e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project while ((*p) != '\0') 3469e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project { 3479e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (((*p)=='/') || ((*p)=='\\')) 3489e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project filename_withoutpath = p+1; 3499e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project p++; 3509e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project } 3519e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 3529e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if ((*filename_withoutpath)=='\0') 3539e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project { 3549e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if ((*popt_extract_without_path)==0) 3559e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project { 3569e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project printf("creating directory: %s\n",filename_inzip); 3579e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project mymkdir(filename_inzip); 3589e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project } 3599e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project } 3609e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project else 3619e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project { 3629e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project const char* write_filename; 3639e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project int skip=0; 3649e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 3659e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if ((*popt_extract_without_path)==0) 3669e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project write_filename = filename_inzip; 3679e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project else 3689e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project write_filename = filename_withoutpath; 3699e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 3709e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project err = unzOpenCurrentFilePassword(uf,password); 3719e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (err!=UNZ_OK) 3729e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project { 3739e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project printf("error %d with zipfile in unzOpenCurrentFilePassword\n",err); 3749e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project } 3759e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 3769e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (((*popt_overwrite)==0) && (err==UNZ_OK)) 3779e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project { 3789e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project char rep=0; 3799e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project FILE* ftestexist; 380ee9e11d0d4e3361533860bf04896abb86a291bfbElliott Hughes ftestexist = FOPEN_FUNC(write_filename,"rb"); 3819e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (ftestexist!=NULL) 3829e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project { 3839e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project fclose(ftestexist); 3849e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project do 3859e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project { 3869e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project char answer[128]; 3879e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project int ret; 3889e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 3899e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project printf("The file %s exists. Overwrite ? [y]es, [n]o, [A]ll: ",write_filename); 3909e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project ret = scanf("%1s",answer); 391381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes if (ret != 1) 3929e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project { 3939e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project exit(EXIT_FAILURE); 3949e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project } 3959e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project rep = answer[0] ; 3969e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if ((rep>='a') && (rep<='z')) 3979e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project rep -= 0x20; 3989e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project } 3999e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project while ((rep!='Y') && (rep!='N') && (rep!='A')); 4009e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project } 4019e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 4029e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (rep == 'N') 4039e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project skip = 1; 4049e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 4059e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (rep == 'A') 4069e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project *popt_overwrite=1; 4079e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project } 4089e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 4099e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if ((skip==0) && (err==UNZ_OK)) 4109e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project { 411ee9e11d0d4e3361533860bf04896abb86a291bfbElliott Hughes fout=FOPEN_FUNC(write_filename,"wb"); 4129e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project /* some zipfile don't contain directory alone before file */ 4139e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if ((fout==NULL) && ((*popt_extract_without_path)==0) && 4149e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project (filename_withoutpath!=(char*)filename_inzip)) 4159e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project { 4169e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project char c=*(filename_withoutpath-1); 4179e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project *(filename_withoutpath-1)='\0'; 4189e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project makedir(write_filename); 4199e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project *(filename_withoutpath-1)=c; 420ee9e11d0d4e3361533860bf04896abb86a291bfbElliott Hughes fout=FOPEN_FUNC(write_filename,"wb"); 4219e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project } 4229e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 4239e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (fout==NULL) 4249e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project { 4259e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project printf("error opening %s\n",write_filename); 4269e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project } 4279e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project } 4289e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 4299e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (fout!=NULL) 4309e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project { 4319e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project printf(" extracting: %s\n",write_filename); 4329e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 4339e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project do 4349e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project { 4359e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project err = unzReadCurrentFile(uf,buf,size_buf); 4369e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (err<0) 4379e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project { 4389e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project printf("error %d with zipfile in unzReadCurrentFile\n",err); 4399e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project break; 4409e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project } 4419e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (err>0) 4429e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (fwrite(buf,err,1,fout)!=1) 4439e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project { 4449e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project printf("error in writing extracted file\n"); 4459e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project err=UNZ_ERRNO; 4469e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project break; 4479e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project } 4489e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project } 4499e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project while (err>0); 4509e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (fout) 4519e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project fclose(fout); 4529e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 4539e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (err==0) 4549e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project change_file_date(write_filename,file_info.dosDate, 4559e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project file_info.tmu_date); 4569e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project } 4579e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 4589e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (err==UNZ_OK) 4599e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project { 4609e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project err = unzCloseCurrentFile (uf); 4619e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (err!=UNZ_OK) 4629e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project { 4639e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project printf("error %d with zipfile in unzCloseCurrentFile\n",err); 4649e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project } 4659e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project } 4669e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project else 4679e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project unzCloseCurrentFile(uf); /* don't lose the error */ 4689e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project } 4699e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 4709e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project free(buf); 4719e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project return err; 4729e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project} 4739e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 4749e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 4759e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectint do_extract(uf,opt_extract_without_path,opt_overwrite,password) 4769e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project unzFile uf; 4779e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project int opt_extract_without_path; 4789e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project int opt_overwrite; 4799e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project const char* password; 4809e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{ 4819e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project uLong i; 482381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes unz_global_info64 gi; 4839e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project int err; 4849e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project FILE* fout=NULL; 4859e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 486381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes err = unzGetGlobalInfo64(uf,&gi); 4879e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (err!=UNZ_OK) 4889e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project printf("error %d with zipfile in unzGetGlobalInfo \n",err); 4899e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 4909e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project for (i=0;i<gi.number_entry;i++) 4919e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project { 4929e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (do_extract_currentfile(uf,&opt_extract_without_path, 4939e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project &opt_overwrite, 4949e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project password) != UNZ_OK) 4959e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project break; 4969e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 4979e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if ((i+1)<gi.number_entry) 4989e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project { 4999e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project err = unzGoToNextFile(uf); 5009e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (err!=UNZ_OK) 5019e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project { 5029e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project printf("error %d with zipfile in unzGoToNextFile\n",err); 5039e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project break; 5049e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project } 5059e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project } 5069e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project } 5079e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 5089e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project return 0; 5099e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project} 5109e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 5119e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectint do_extract_onefile(uf,filename,opt_extract_without_path,opt_overwrite,password) 5129e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project unzFile uf; 5139e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project const char* filename; 5149e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project int opt_extract_without_path; 5159e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project int opt_overwrite; 5169e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project const char* password; 5179e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{ 5189e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project int err = UNZ_OK; 5199e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (unzLocateFile(uf,filename,CASESENSITIVITY)!=UNZ_OK) 5209e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project { 5219e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project printf("file %s not found in the zipfile\n",filename); 5229e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project return 2; 5239e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project } 5249e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 5259e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (do_extract_currentfile(uf,&opt_extract_without_path, 5269e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project &opt_overwrite, 5279e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project password) == UNZ_OK) 5289e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project return 0; 5299e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project else 5309e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project return 1; 5319e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project} 5329e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 5339e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 5349e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectint main(argc,argv) 5359e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project int argc; 5369e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project char *argv[]; 5379e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{ 5389e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project const char *zipfilename=NULL; 5399e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project const char *filename_to_extract=NULL; 5409e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project const char *password=NULL; 5419e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project char filename_try[MAXFILENAME+16] = ""; 5429e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project int i; 543381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes int ret_value=0; 5449e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project int opt_do_list=0; 5459e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project int opt_do_extract=1; 5469e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project int opt_do_extract_withoutpath=0; 5479e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project int opt_overwrite=0; 5489e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project int opt_extractdir=0; 5499e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project const char *dirname=NULL; 5509e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project unzFile uf=NULL; 5519e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 5529e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project do_banner(); 5539e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (argc==1) 5549e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project { 5559e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project do_help(); 5569e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project return 0; 5579e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project } 5589e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project else 5599e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project { 5609e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project for (i=1;i<argc;i++) 5619e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project { 5629e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if ((*argv[i])=='-') 5639e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project { 5649e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project const char *p=argv[i]+1; 5659e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 5669e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project while ((*p)!='\0') 5679e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project { 5689e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project char c=*(p++);; 5699e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if ((c=='l') || (c=='L')) 5709e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project opt_do_list = 1; 5719e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if ((c=='v') || (c=='V')) 5729e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project opt_do_list = 1; 5739e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if ((c=='x') || (c=='X')) 5749e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project opt_do_extract = 1; 5759e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if ((c=='e') || (c=='E')) 5769e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project opt_do_extract = opt_do_extract_withoutpath = 1; 5779e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if ((c=='o') || (c=='O')) 5789e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project opt_overwrite=1; 5799e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if ((c=='d') || (c=='D')) 5809e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project { 5819e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project opt_extractdir=1; 5829e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project dirname=argv[i+1]; 5839e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project } 5849e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 5859e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (((c=='p') || (c=='P')) && (i+1<argc)) 5869e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project { 5879e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project password=argv[i+1]; 5889e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project i++; 5899e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project } 5909e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project } 5919e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project } 5929e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project else 5939e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project { 5949e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (zipfilename == NULL) 5959e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project zipfilename = argv[i]; 5969e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project else if ((filename_to_extract==NULL) && (!opt_extractdir)) 5979e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project filename_to_extract = argv[i] ; 5989e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project } 5999e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project } 6009e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project } 6019e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 6029e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (zipfilename!=NULL) 6039e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project { 6049e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 6059e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project# ifdef USEWIN32IOAPI 606381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes zlib_filefunc64_def ffunc; 6079e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project# endif 6089e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 6099e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project strncpy(filename_try, zipfilename,MAXFILENAME-1); 6109e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project /* strncpy doesnt append the trailing NULL, of the string is too long. */ 6119e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project filename_try[ MAXFILENAME ] = '\0'; 6129e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 6139e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project# ifdef USEWIN32IOAPI 614381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes fill_win32_filefunc64A(&ffunc); 615381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes uf = unzOpen2_64(zipfilename,&ffunc); 6169e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project# else 617381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes uf = unzOpen64(zipfilename); 6189e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project# endif 6199e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (uf==NULL) 6209e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project { 6219e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project strcat(filename_try,".zip"); 6229e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project# ifdef USEWIN32IOAPI 623381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes uf = unzOpen2_64(filename_try,&ffunc); 6249e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project# else 625381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes uf = unzOpen64(filename_try); 6269e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project# endif 6279e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project } 6289e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project } 6299e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 6309e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (uf==NULL) 6319e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project { 6329e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project printf("Cannot open %s or %s.zip\n",zipfilename,zipfilename); 6339e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project return 1; 6349e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project } 6359e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project printf("%s opened\n",filename_try); 6369e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 6379e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (opt_do_list==1) 638381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes ret_value = do_list(uf); 6399e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project else if (opt_do_extract==1) 6409e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project { 641381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes#ifdef _WIN32 642381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes if (opt_extractdir && _chdir(dirname)) 643381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes#else 644381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes if (opt_extractdir && chdir(dirname)) 645381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes#endif 6469e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project { 6479e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project printf("Error changing into %s, aborting\n", dirname); 6489e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project exit(-1); 6499e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project } 6509e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 6519e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (filename_to_extract == NULL) 652381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes ret_value = do_extract(uf, opt_do_extract_withoutpath, opt_overwrite, password); 6539e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project else 654381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes ret_value = do_extract_onefile(uf, filename_to_extract, opt_do_extract_withoutpath, opt_overwrite, password); 6559e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project } 6569e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 657381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes unzClose(uf); 658381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes 659381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes return ret_value; 6609e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project} 661