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