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