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