15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) miniunz.c 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Version 1.1, February 14h, 2010 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sample part of the MiniZip project - ( http://www.winimage.com/zLibDll/minizip.html ) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Copyright (C) 1998-2010 Gilles Vollant (minizip) ( http://www.winimage.com/zLibDll/minizip.html ) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Modifications of Unzip for Zip64 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Copyright (C) 2007-2008 Even Rouault 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Modifications for Zip64 support on both zip and unzip 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Copyright (C) 2009-2010 Mathias Svensson ( http://result42.com ) 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef _WIN32 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) #ifndef __USE_FILE_OFFSET64 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) #define __USE_FILE_OFFSET64 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) #endif 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) #ifndef __USE_LARGEFILE64 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) #define __USE_LARGEFILE64 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) #endif 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) #ifndef _LARGEFILE64_SOURCE 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) #define _LARGEFILE64_SOURCE 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) #endif 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) #ifndef _FILE_OFFSET_BIT 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) #define _FILE_OFFSET_BIT 64 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) #endif 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <stdio.h> 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <stdlib.h> 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string.h> 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <time.h> 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <errno.h> 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <fcntl.h> 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef unix 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# include <unistd.h> 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# include <utime.h> 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# include <direct.h> 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# include <io.h> 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "unzip.h" 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CASESENSITIVITY (0) 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define WRITEBUFFERSIZE (8192) 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAXFILENAME (256) 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef _WIN32 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define USEWIN32IOAPI 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "iowin32.h" 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mini unzip, demo of unzip package 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) usage : 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Usage : miniunz [-exvlo] file.zip [file_to_extract] [-d extractdir] 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) list the file in the zipfile, and print the content of FILE_ID.ZIP or README.TXT 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if it exists 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* change_file_date : change the date/time of a file 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) filename : the filename of the file where date/time must be modified 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dosdate : the new date at the MSDos format (4 bytes) 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tmu_date : the SAME new date at the tm_unz format */ 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void change_file_date(filename,dosdate,tmu_date) 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *filename; 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uLong dosdate; 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tm_unz tmu_date; 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef _WIN32 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HANDLE hFile; 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FILETIME ftm,ftLocal,ftCreate,ftLastAcc,ftLastWrite; 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hFile = CreateFileA(filename,GENERIC_READ | GENERIC_WRITE, 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0,NULL,OPEN_EXISTING,0,NULL); 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetFileTime(hFile,&ftCreate,&ftLastAcc,&ftLastWrite); 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DosDateTimeToFileTime((WORD)(dosdate>>16),(WORD)dosdate,&ftLocal); 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LocalFileTimeToFileTime(&ftLocal,&ftm); 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetFileTime(hFile,&ftm,&ftLastAcc,&ftm); 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CloseHandle(hFile); 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef unix 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct utimbuf ut; 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct tm newdate; 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) newdate.tm_sec = tmu_date.tm_sec; 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) newdate.tm_min=tmu_date.tm_min; 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) newdate.tm_hour=tmu_date.tm_hour; 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) newdate.tm_mday=tmu_date.tm_mday; 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) newdate.tm_mon=tmu_date.tm_mon; 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (tmu_date.tm_year > 1900) 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) newdate.tm_year=tmu_date.tm_year - 1900; 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) newdate.tm_year=tmu_date.tm_year ; 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) newdate.tm_isdst=-1; 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ut.actime=ut.modtime=mktime(&newdate); 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) utime(filename,&ut); 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* mymkdir and change_file_date are not 100 % portable 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) As I don't know well Unix, I wait feedback for the unix portion */ 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int mymkdir(dirname) 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* dirname; 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int ret=0; 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef _WIN32 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = _mkdir(dirname); 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef unix 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = mkdir (dirname,0775); 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ret; 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int makedir (newdir) 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char *newdir; 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char *buffer ; 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char *p; 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int len = (int)strlen(newdir); 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (len <= 0) 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) buffer = (char*)malloc(len+1); 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (buffer==NULL) 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printf("Error allocating memory\n"); 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return UNZ_INTERNALERROR; 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) strcpy(buffer,newdir); 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (buffer[len-1] == '/') { 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) buffer[len-1] = '\0'; 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (mymkdir(buffer) == 0) 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) free(buffer); 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 1; 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p = buffer+1; 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (1) 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char hold; 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while(*p && *p != '\\' && *p != '/') 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p++; 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hold = *p; 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *p = 0; 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((mymkdir(buffer) == -1) && (errno == ENOENT)) 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printf("couldn't create directory %s\n",buffer); 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) free(buffer); 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (hold == 0) 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *p++ = hold; 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) free(buffer); 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 1; 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void do_banner() 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printf("MiniUnz 1.01b, demo of zLib + Unz package written by Gilles Vollant\n"); 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printf("more info at http://www.winimage.com/zLibDll/unzip.html\n\n"); 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void do_help() 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printf("Usage : miniunz [-e] [-x] [-v] [-l] [-o] [-p password] file.zip [file_to_extr.] [-d extractdir]\n\n" \ 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " -e Extract without pathname (junk paths)\n" \ 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " -x Extract with pathname\n" \ 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " -v list files\n" \ 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " -l list files\n" \ 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " -d directory to extract into\n" \ 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " -o overwrite files without prompting\n" \ 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " -p extract crypted file using password\n\n"); 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Display64BitsSize(ZPOS64_T n, int size_char) 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* to avoid compatibility problem , we do here the conversion */ 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char number[21]; 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int offset=19; 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int pos_string = 19; 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) number[20]=0; 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (;;) { 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) number[offset]=(char)((n%10)+'0'); 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (number[offset] != '0') 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pos_string=offset; 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) n/=10; 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (offset==0) 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) offset--; 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int size_display_string = 19-pos_string; 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (size_char > size_display_string) 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_char--; 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printf(" "); 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printf("%s",&number[pos_string]); 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int do_list(uf) 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unzFile uf; 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uLong i; 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unz_global_info64 gi; 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int err; 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) err = unzGetGlobalInfo64(uf,&gi); 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (err!=UNZ_OK) 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printf("error %d with zipfile in unzGetGlobalInfo \n",err); 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printf(" Length Method Size Ratio Date Time CRC-32 Name\n"); 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printf(" ------ ------ ---- ----- ---- ---- ------ ----\n"); 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (i=0;i<gi.number_entry;i++) 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char filename_inzip[256]; 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unz_file_info64 file_info; 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uLong ratio=0; 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *string_method; 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char charCrypt=' '; 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) err = unzGetCurrentFileInfo64(uf,&file_info,filename_inzip,sizeof(filename_inzip),NULL,0,NULL,0); 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (err!=UNZ_OK) 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printf("error %d with zipfile in unzGetCurrentFileInfo\n",err); 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (file_info.uncompressed_size>0) 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ratio = (uLong)((file_info.compressed_size*100)/file_info.uncompressed_size); 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* display a '*' if the file is crypted */ 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((file_info.flag & 1) != 0) 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) charCrypt='*'; 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (file_info.compression_method==0) 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string_method="Stored"; 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (file_info.compression_method==Z_DEFLATED) 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uInt iLevel=(uInt)((file_info.flag & 0x6)/2); 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (iLevel==0) 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string_method="Defl:N"; 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (iLevel==1) 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string_method="Defl:X"; 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if ((iLevel==2) || (iLevel==3)) 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string_method="Defl:F"; /* 2:fast , 3 : extra fast*/ 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (file_info.compression_method==Z_BZIP2ED) 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string_method="BZip2 "; 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string_method="Unkn. "; 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Display64BitsSize(file_info.uncompressed_size,7); 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printf(" %6s%c",string_method,charCrypt); 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Display64BitsSize(file_info.compressed_size,7); 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printf(" %3lu%% %2.2lu-%2.2lu-%2.2lu %2.2lu:%2.2lu %8.8lx %s\n", 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ratio, 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (uLong)file_info.tmu_date.tm_mon + 1, 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (uLong)file_info.tmu_date.tm_mday, 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (uLong)file_info.tmu_date.tm_year % 100, 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (uLong)file_info.tmu_date.tm_hour,(uLong)file_info.tmu_date.tm_min, 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (uLong)file_info.crc,filename_inzip); 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((i+1)<gi.number_entry) 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) err = unzGoToNextFile(uf); 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (err!=UNZ_OK) 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printf("error %d with zipfile in unzGoToNextFile\n",err); 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int do_extract_currentfile(uf,popt_extract_without_path,popt_overwrite,password) 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unzFile uf; 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int* popt_extract_without_path; 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int* popt_overwrite; 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* password; 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char filename_inzip[256]; 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char* filename_withoutpath; 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char* p; 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int err=UNZ_OK; 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FILE *fout=NULL; 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void* buf; 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uInt size_buf; 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unz_file_info64 file_info; 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uLong ratio=0; 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) err = unzGetCurrentFileInfo64(uf,&file_info,filename_inzip,sizeof(filename_inzip),NULL,0,NULL,0); 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (err!=UNZ_OK) 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printf("error %d with zipfile in unzGetCurrentFileInfo\n",err); 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return err; 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_buf = WRITEBUFFERSIZE; 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) buf = (void*)malloc(size_buf); 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (buf==NULL) 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printf("Error allocating memory\n"); 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return UNZ_INTERNALERROR; 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p = filename_withoutpath = filename_inzip; 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while ((*p) != '\0') 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (((*p)=='/') || ((*p)=='\\')) 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) filename_withoutpath = p+1; 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p++; 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((*filename_withoutpath)=='\0') 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((*popt_extract_without_path)==0) 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printf("creating directory: %s\n",filename_inzip); 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mymkdir(filename_inzip); 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* write_filename; 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int skip=0; 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((*popt_extract_without_path)==0) 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) write_filename = filename_inzip; 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) write_filename = filename_withoutpath; 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) err = unzOpenCurrentFilePassword(uf,password); 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (err!=UNZ_OK) 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printf("error %d with zipfile in unzOpenCurrentFilePassword\n",err); 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (((*popt_overwrite)==0) && (err==UNZ_OK)) 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char rep=0; 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FILE* ftestexist; 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ftestexist = fopen64(write_filename,"rb"); 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ftestexist!=NULL) 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fclose(ftestexist); 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) do 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char answer[128]; 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int ret; 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printf("The file %s exists. Overwrite ? [y]es, [n]o, [A]ll: ",write_filename); 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = scanf("%1s",answer); 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret != 1) 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) exit(EXIT_FAILURE); 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rep = answer[0] ; 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((rep>='a') && (rep<='z')) 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rep -= 0x20; 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while ((rep!='Y') && (rep!='N') && (rep!='A')); 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (rep == 'N') 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) skip = 1; 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (rep == 'A') 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *popt_overwrite=1; 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((skip==0) && (err==UNZ_OK)) 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fout=fopen64(write_filename,"wb"); 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* some zipfile don't contain directory alone before file */ 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((fout==NULL) && ((*popt_extract_without_path)==0) && 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (filename_withoutpath!=(char*)filename_inzip)) 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char c=*(filename_withoutpath-1); 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *(filename_withoutpath-1)='\0'; 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) makedir(write_filename); 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *(filename_withoutpath-1)=c; 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fout=fopen64(write_filename,"wb"); 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (fout==NULL) 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printf("error opening %s\n",write_filename); 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (fout!=NULL) 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printf(" extracting: %s\n",write_filename); 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) do 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) err = unzReadCurrentFile(uf,buf,size_buf); 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (err<0) 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printf("error %d with zipfile in unzReadCurrentFile\n",err); 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (err>0) 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (fwrite(buf,err,1,fout)!=1) 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printf("error in writing extracted file\n"); 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) err=UNZ_ERRNO; 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (err>0); 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (fout) 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fclose(fout); 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (err==0) 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) change_file_date(write_filename,file_info.dosDate, 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) file_info.tmu_date); 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (err==UNZ_OK) 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) err = unzCloseCurrentFile (uf); 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (err!=UNZ_OK) 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printf("error %d with zipfile in unzCloseCurrentFile\n",err); 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unzCloseCurrentFile(uf); /* don't lose the error */ 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) free(buf); 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return err; 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int do_extract(uf,opt_extract_without_path,opt_overwrite,password) 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unzFile uf; 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int opt_extract_without_path; 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int opt_overwrite; 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* password; 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uLong i; 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unz_global_info64 gi; 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int err; 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FILE* fout=NULL; 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) err = unzGetGlobalInfo64(uf,&gi); 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (err!=UNZ_OK) 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printf("error %d with zipfile in unzGetGlobalInfo \n",err); 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (i=0;i<gi.number_entry;i++) 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (do_extract_currentfile(uf,&opt_extract_without_path, 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &opt_overwrite, 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) password) != UNZ_OK) 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((i+1)<gi.number_entry) 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) err = unzGoToNextFile(uf); 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (err!=UNZ_OK) 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printf("error %d with zipfile in unzGoToNextFile\n",err); 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int do_extract_onefile(uf,filename,opt_extract_without_path,opt_overwrite,password) 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unzFile uf; 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* filename; 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int opt_extract_without_path; 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int opt_overwrite; 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* password; 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int err = UNZ_OK; 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (unzLocateFile(uf,filename,CASESENSITIVITY)!=UNZ_OK) 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printf("file %s not found in the zipfile\n",filename); 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 2; 5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (do_extract_currentfile(uf,&opt_extract_without_path, 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &opt_overwrite, 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) password) == UNZ_OK) 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 1; 5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int main(argc,argv) 5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int argc; 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char *argv[]; 5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *zipfilename=NULL; 5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *filename_to_extract=NULL; 5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *password=NULL; 5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char filename_try[MAXFILENAME+16] = ""; 5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i; 5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int ret_value=0; 5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int opt_do_list=0; 5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int opt_do_extract=1; 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int opt_do_extract_withoutpath=0; 5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int opt_overwrite=0; 5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int opt_extractdir=0; 5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *dirname=NULL; 5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unzFile uf=NULL; 5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) do_banner(); 5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (argc==1) 5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) do_help(); 5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; 5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (i=1;i<argc;i++) 5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((*argv[i])=='-') 5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *p=argv[i]+1; 5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while ((*p)!='\0') 5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char c=*(p++);; 5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((c=='l') || (c=='L')) 5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) opt_do_list = 1; 5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((c=='v') || (c=='V')) 5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) opt_do_list = 1; 5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((c=='x') || (c=='X')) 5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) opt_do_extract = 1; 5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((c=='e') || (c=='E')) 5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) opt_do_extract = opt_do_extract_withoutpath = 1; 5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((c=='o') || (c=='O')) 5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) opt_overwrite=1; 5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((c=='d') || (c=='D')) 5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) opt_extractdir=1; 5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dirname=argv[i+1]; 5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (((c=='p') || (c=='P')) && (i+1<argc)) 5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) password=argv[i+1]; 5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) i++; 5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (zipfilename == NULL) 5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zipfilename = argv[i]; 5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if ((filename_to_extract==NULL) && (!opt_extractdir)) 5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) filename_to_extract = argv[i] ; 5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (zipfilename!=NULL) 5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# ifdef USEWIN32IOAPI 5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zlib_filefunc64_def ffunc; 5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# endif 5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) strncpy(filename_try, zipfilename,MAXFILENAME-1); 5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* strncpy doesnt append the trailing NULL, of the string is too long. */ 5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) filename_try[ MAXFILENAME ] = '\0'; 6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# ifdef USEWIN32IOAPI 6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fill_win32_filefunc64A(&ffunc); 6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uf = unzOpen2_64(zipfilename,&ffunc); 6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# else 6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uf = unzOpen64(zipfilename); 6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# endif 6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (uf==NULL) 6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) strcat(filename_try,".zip"); 6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# ifdef USEWIN32IOAPI 6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uf = unzOpen2_64(filename_try,&ffunc); 6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# else 6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uf = unzOpen64(filename_try); 6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# endif 6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (uf==NULL) 6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printf("Cannot open %s or %s.zip\n",zipfilename,zipfilename); 6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 1; 6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printf("%s opened\n",filename_try); 6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (opt_do_list==1) 6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret_value = do_list(uf); 6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (opt_do_extract==1) 6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef _WIN32 6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (opt_extractdir && _chdir(dirname)) 6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (opt_extractdir && chdir(dirname)) 6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printf("Error changing into %s, aborting\n", dirname); 6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) exit(-1); 6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (filename_to_extract == NULL) 6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret_value = do_extract(uf, opt_do_extract_withoutpath, opt_overwrite, password); 6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret_value = do_extract_onefile(uf, filename_to_extract, opt_do_extract_withoutpath, opt_overwrite, password); 6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unzClose(uf); 6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ret_value; 6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 649