Index: third_party/zlib/contrib/minizip/minizip.c |
=================================================================== |
--- third_party/zlib/contrib/minizip/minizip.c (revision 113739) |
+++ third_party/zlib/contrib/minizip/minizip.c (working copy) |
@@ -1,10 +1,33 @@ |
/* |
minizip.c |
- Version 1.01e, February 12th, 2005 |
+ Version 1.1, February 14h, 2010 |
+ sample part of the MiniZip project - ( http://www.winimage.com/zLibDll/minizip.html ) |
- Copyright (C) 1998-2005 Gilles Vollant |
+ Copyright (C) 1998-2010 Gilles Vollant (minizip) ( http://www.winimage.com/zLibDll/minizip.html ) |
+ |
+ Modifications of Unzip for Zip64 |
+ Copyright (C) 2007-2008 Even Rouault |
+ |
+ Modifications for Zip64 support on both zip and unzip |
+ Copyright (C) 2009-2010 Mathias Svensson ( http://result42.com ) |
*/ |
+ |
+#ifndef _WIN32 |
+ #ifndef __USE_FILE_OFFSET64 |
+ #define __USE_FILE_OFFSET64 |
+ #endif |
+ #ifndef __USE_LARGEFILE64 |
+ #define __USE_LARGEFILE64 |
+ #endif |
+ #ifndef _LARGEFILE64_SOURCE |
+ #define _LARGEFILE64_SOURCE |
+ #endif |
+ #ifndef _FILE_OFFSET_BIT |
+ #define _FILE_OFFSET_BIT 64 |
+ #endif |
+#endif |
+ |
#include <stdio.h> |
#include <stdlib.h> |
#include <string.h> |
@@ -24,9 +47,9 @@ |
#include "zip.h" |
-#ifdef WIN32 |
-#define USEWIN32IOAPI |
-#include "iowin32.h" |
+#ifdef _WIN32 |
+ #define USEWIN32IOAPI |
+ #include "iowin32.h" |
#endif |
@@ -34,7 +57,7 @@ |
#define WRITEBUFFERSIZE (16384) |
#define MAXFILENAME (256) |
-#ifdef WIN32 |
+#ifdef _WIN32 |
uLong filetime(f, tmzip, dt) |
char *f; /* name of file to get info on */ |
tm_zip *tmzip; /* return value: access, modific. and creation times */ |
@@ -44,9 +67,9 @@ |
{ |
FILETIME ftLocal; |
HANDLE hFind; |
- WIN32_FIND_DATA ff32; |
+ WIN32_FIND_DATAA ff32; |
- hFind = FindFirstFile(f,&ff32); |
+ hFind = FindFirstFileA(f,&ff32); |
if (hFind != INVALID_HANDLE_VALUE) |
{ |
FileTimeToLocalFileTime(&(ff32.ftLastWriteTime),&ftLocal); |
@@ -119,7 +142,7 @@ |
{ |
FILE* ftestexist; |
int ret = 1; |
- ftestexist = fopen(filename,"rb"); |
+ ftestexist = fopen64(filename,"rb"); |
if (ftestexist==NULL) |
ret = 0; |
else |
@@ -129,18 +152,19 @@ |
void do_banner() |
{ |
- printf("MiniZip 1.01b, demo of zLib + Zip package written by Gilles Vollant\n"); |
- printf("more info at http://www.winimage.com/zLibDll/unzip.html\n\n"); |
+ printf("MiniZip 1.1, demo of zLib + MiniZip64 package, written by Gilles Vollant\n"); |
+ printf("more info on MiniZip at http://www.winimage.com/zLibDll/minizip.html\n\n"); |
} |
void do_help() |
{ |
- printf("Usage : minizip [-o] [-a] [-0 to -9] [-p password] file.zip [files_to_add]\n\n" \ |
+ printf("Usage : minizip [-o] [-a] [-0 to -9] [-p password] [-j] file.zip [files_to_add]\n\n" \ |
" -o Overwrite existing file.zip\n" \ |
" -a Append to existing file.zip\n" \ |
" -0 Store only\n" \ |
" -1 Compress faster\n" \ |
- " -9 Compress better\n\n"); |
+ " -9 Compress better\n\n" \ |
+ " -j exclude path. store only the file name.\n\n"); |
} |
/* calculate the CRC32 of a file, |
@@ -149,7 +173,7 @@ |
{ |
unsigned long calculate_crc=0; |
int err=ZIP_OK; |
- FILE * fin = fopen(filenameinzip,"rb"); |
+ FILE * fin = fopen64(filenameinzip,"rb"); |
unsigned long size_read = 0; |
unsigned long total_read = 0; |
if (fin==NULL) |
@@ -179,10 +203,33 @@ |
fclose(fin); |
*result_crc=calculate_crc; |
- printf("file %s crc %x\n",filenameinzip,calculate_crc); |
+ printf("file %s crc %lx\n", filenameinzip, calculate_crc); |
return err; |
} |
+int isLargeFile(const char* filename) |
+{ |
+ int largeFile = 0; |
+ ZPOS64_T pos = 0; |
+ FILE* pFile = fopen64(filename, "rb"); |
+ |
+ if(pFile != NULL) |
+ { |
+ int n = fseeko64(pFile, 0, SEEK_END); |
+ |
+ pos = ftello64(pFile); |
+ |
+ printf("File : %s is %lld bytes\n", filename, pos); |
+ |
+ if(pos >= 0xffffffff) |
+ largeFile = 1; |
+ |
+ fclose(pFile); |
+ } |
+ |
+ return largeFile; |
+} |
+ |
int main(argc,argv) |
int argc; |
char *argv[]; |
@@ -190,6 +237,7 @@ |
int i; |
int opt_overwrite=0; |
int opt_compress_level=Z_DEFAULT_COMPRESSION; |
+ int opt_exclude_path=0; |
int zipfilenamearg = 0; |
char filename_try[MAXFILENAME+16]; |
int zipok; |
@@ -222,6 +270,8 @@ |
opt_overwrite = 2; |
if ((c>='0') && (c<='9')) |
opt_compress_level = c-'0'; |
+ if ((c=='j') || (c=='J')) |
+ opt_exclude_path = 1; |
if (((c=='p') || (c=='P')) && (i+1<argc)) |
{ |
@@ -231,8 +281,12 @@ |
} |
} |
else |
+ { |
if (zipfilenamearg == 0) |
+ { |
zipfilenamearg = i ; |
+ } |
+ } |
} |
} |
@@ -245,7 +299,9 @@ |
} |
if (zipfilenamearg==0) |
+ { |
zipok=0; |
+ } |
else |
{ |
int i,len; |
@@ -302,11 +358,11 @@ |
zipFile zf; |
int errclose; |
# ifdef USEWIN32IOAPI |
- zlib_filefunc_def ffunc; |
- fill_win32_filefunc(&ffunc); |
- zf = zipOpen2(filename_try,(opt_overwrite==2) ? 2 : 0,NULL,&ffunc); |
+ zlib_filefunc64_def ffunc; |
+ fill_win32_filefunc64A(&ffunc); |
+ zf = zipOpen2_64(filename_try,(opt_overwrite==2) ? 2 : 0,NULL,&ffunc); |
# else |
- zf = zipOpen(filename_try,(opt_overwrite==2) ? 2 : 0); |
+ zf = zipOpen64(filename_try,(opt_overwrite==2) ? 2 : 0); |
# endif |
if (zf == NULL) |
@@ -329,8 +385,10 @@ |
FILE * fin; |
int size_read; |
const char* filenameinzip = argv[i]; |
+ const char *savefilenameinzip; |
zip_fileinfo zi; |
unsigned long crcFile=0; |
+ int zip64 = 0; |
zi.tmz_date.tm_sec = zi.tmz_date.tm_min = zi.tmz_date.tm_hour = |
zi.tmz_date.tm_mday = zi.tmz_date.tm_mon = zi.tmz_date.tm_year = 0; |
@@ -348,19 +406,48 @@ |
if ((password != NULL) && (err==ZIP_OK)) |
err = getFileCrc(filenameinzip,buf,size_buf,&crcFile); |
- err = zipOpenNewFileInZip3(zf,filenameinzip,&zi, |
+ zip64 = isLargeFile(filenameinzip); |
+ |
+ /* The path name saved, should not include a leading slash. */ |
+ /*if it did, windows/xp and dynazip couldn't read the zip file. */ |
+ savefilenameinzip = filenameinzip; |
+ while( savefilenameinzip[0] == '\\' || savefilenameinzip[0] == '/' ) |
+ { |
+ savefilenameinzip++; |
+ } |
+ |
+ /*should the zip file contain any path at all?*/ |
+ if( opt_exclude_path ) |
+ { |
+ const char *tmpptr; |
+ const char *lastslash = 0; |
+ for( tmpptr = savefilenameinzip; *tmpptr; tmpptr++) |
+ { |
+ if( *tmpptr == '\\' || *tmpptr == '/') |
+ { |
+ lastslash = tmpptr; |
+ } |
+ } |
+ if( lastslash != NULL ) |
+ { |
+ savefilenameinzip = lastslash+1; // base filename follows last slash. |
+ } |
+ } |
+ |
+ /**/ |
+ err = zipOpenNewFileInZip3_64(zf,savefilenameinzip,&zi, |
NULL,0,NULL,0,NULL /* comment*/, |
(opt_compress_level != 0) ? Z_DEFLATED : 0, |
opt_compress_level,0, |
/* -MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY, */ |
-MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY, |
- password,crcFile); |
+ password,crcFile, zip64); |
if (err != ZIP_OK) |
printf("error in opening %s in zipfile\n",filenameinzip); |
else |
{ |
- fin = fopen(filenameinzip,"rb"); |
+ fin = fopen64(filenameinzip,"rb"); |
if (fin==NULL) |
{ |
err=ZIP_ERRNO; |