diff options
Diffstat (limited to 'contrib/minizip/minizip.c')
-rw-r--r-- | contrib/minizip/minizip.c | 230 |
1 files changed, 160 insertions, 70 deletions
diff --git a/contrib/minizip/minizip.c b/contrib/minizip/minizip.c index 5e492d2..5792a1e 100644 --- a/contrib/minizip/minizip.c +++ b/contrib/minizip/minizip.c @@ -17,6 +17,12 @@ #include "zip.h" +#ifdef WIN32 +#define USEWIN32IOAPI +#include "iowin32.h" +#endif + + #define WRITEBUFFERSIZE (16384) #define MAXFILENAME (256) @@ -55,12 +61,16 @@ uLong filetime(f, tmzip, dt) struct stat s; /* results of stat() */ struct tm* filedate; time_t tm_t=0; - + if (strcmp(f,"-")!=0) { - char name[MAXFILENAME]; + char name[MAXFILENAME+1]; int len = strlen(f); - strcpy(name, f); + + strncpy(name, f,MAXFILENAME-1); + /* strncpy doesnt append the trailing NULL, of the string is too long. */ + name[ MAXFILENAME ] = '\0'; + if (name[len - 1] == '/') name[len - 1] = '\0'; /* not all systems allow stat'ing a file with / appended */ @@ -98,10 +108,10 @@ uLong filetime(f, tmzip, dt) int check_exist_file(filename) const char* filename; { - FILE* ftestexist; + FILE* ftestexist; int ret = 1; - ftestexist = fopen(filename,"rb"); - if (ftestexist==NULL) + ftestexist = fopen(filename,"rb"); + if (ftestexist==NULL) ret = 0; else fclose(ftestexist); @@ -110,59 +120,107 @@ int check_exist_file(filename) void do_banner() { - printf("MiniZip 0.15, demo of zLib + Zip package written by Gilles Vollant\n"); - printf("more info at http://wwww.winimage/zLibDll/unzip.htm\n\n"); + printf("MiniZip 0.15, demo of zLib + Zip package written by Gilles Vollant\n"); + printf("more info at http://www.winimage.com/zLibDll/unzip.html\n\n"); } void do_help() -{ - printf("Usage : minizip [-o] file.zip [files_to_add]\n\n") ; +{ + printf("Usage : minizip [-o] file.zip [files_to_add]\n\n") ; +} + +/* calculate the CRC32 of a file, + because to encrypt a file, we need known the CRC32 of the file before */ +int getFileCrc(const char* filenameinzip,void*buf,unsigned long size_buf,unsigned long* result_crc) +{ + unsigned long calculate_crc=0; + int err=ZIP_OK; + FILE * fin = fopen(filenameinzip,"rb"); + unsigned long size_read = 0; + unsigned long total_read = 0; + if (fin==NULL) + { + err = ZIP_ERRNO; + } + + if (err == ZIP_OK) + do + { + err = ZIP_OK; + size_read = (int)fread(buf,1,size_buf,fin); + if (size_read < size_buf) + if (feof(fin)==0) + { + printf("error in reading %s\n",filenameinzip); + err = ZIP_ERRNO; + } + + if (size_read>0) + calculate_crc = crc32(calculate_crc,buf,size_read); + total_read += size_read; + + } while ((err == ZIP_OK) && (size_read>0)); + + if (fin) + fclose(fin); + + *result_crc=calculate_crc; + printf("file %s crc %x\n",filenameinzip,calculate_crc); + return err; } int main(argc,argv) - int argc; - char *argv[]; + int argc; + char *argv[]; { - int i; - int opt_overwrite=0; + int i; + int opt_overwrite=0; int opt_compress_level=Z_DEFAULT_COMPRESSION; int zipfilenamearg = 0; - char filename_try[MAXFILENAME]; + char filename_try[MAXFILENAME+16]; int zipok; int err=0; int size_buf=0; - void* buf=NULL, + void* buf=NULL; + const char* password=NULL; - do_banner(); - if (argc==1) - { - do_help(); - exit(0); + do_banner(); + if (argc==1) + { + do_help(); return 0; - } - else - { - for (i=1;i<argc;i++) - { - if ((*argv[i])=='-') - { - const char *p=argv[i]+1; - - while ((*p)!='\0') - { - char c=*(p++);; - if ((c=='o') || (c=='O')) - opt_overwrite = 1; + } + else + { + for (i=1;i<argc;i++) + { + if ((*argv[i])=='-') + { + const char *p=argv[i]+1; + + while ((*p)!='\0') + { + char c=*(p++);; + if ((c=='o') || (c=='O')) + opt_overwrite = 1; + if ((c=='a') || (c=='A')) + opt_overwrite = 2; if ((c>='0') && (c<='9')) opt_compress_level = c-'0'; - } - } - else - if (zipfilenamearg == 0) + + if (((c=='p') || (c=='P')) && (i+1<argc)) + { + password=argv[i+1]; + i++; + } + } + } + else + if (zipfilenamearg == 0) zipfilenamearg = i ; - } - } + } + } size_buf = WRITEBUFFERSIZE; buf = (void*)malloc(size_buf); @@ -172,16 +230,19 @@ int main(argc,argv) return ZIP_INTERNALERROR; } - if (zipfilenamearg==0) + if (zipfilenamearg==0) zipok=0; else - { + { int i,len; int dot_found=0; zipok = 1 ; - strcpy(filename_try,argv[zipfilenamearg]); - len=strlen(filename_try); + strncpy(filename_try, argv[zipfilenamearg],MAXFILENAME-1); + /* strncpy doesnt append the trailing NULL, of the string is too long. */ + filename_try[ MAXFILENAME ] = '\0'; + + len=(int)strlen(filename_try); for (i=0;i<len;i++) if (filename_try[i]=='.') dot_found=1; @@ -189,36 +250,52 @@ int main(argc,argv) if (dot_found==0) strcat(filename_try,".zip"); + if (opt_overwrite==2) + { + /* if the file don't exist, we not append file */ + if (check_exist_file(filename_try)==0) + opt_overwrite=1; + } + else if (opt_overwrite==0) if (check_exist_file(filename_try)!=0) - { - char rep; - do - { - char answer[128]; - printf("The file %s exist. Overwrite ? [y]es, [n]o : ",filename_try); - scanf("%1s",answer); - rep = answer[0] ; - if ((rep>='a') && (rep<='z')) - rep -= 0x20; - } - while ((rep!='Y') && (rep!='N')); + { + char rep=0; + do + { + char answer[128]; + printf("The file %s exist. Overwrite ? [y]es, [n]o, [a]ppend : ",filename_try); + scanf("%1s",answer); + rep = answer[0] ; + if ((rep>='a') && (rep<='z')) + rep -= 0x20; + } + while ((rep!='Y') && (rep!='N') && (rep!='A')); if (rep=='N') zipok = 0; - } + if (rep=='A') + opt_overwrite = 2; + } } if (zipok==1) { zipFile zf; int errclose; - zf = zipOpen(filename_try,0); + #ifdef USEWIN32IOAPI + zlib_filefunc_def ffunc; + fill_win32_filefunc(&ffunc); + zf = zipOpen2(filename_try,(opt_overwrite==2) ? 2 : 0,NULL,&ffunc); + #else + zf = zipOpen(filename_try,(opt_overwrite==2) ? 2 : 0); + #endif + if (zf == NULL) { printf("error opening %s\n",filename_try); err= ZIP_ERRNO; } - else + else printf("creating %s\n",filename_try); for (i=zipfilenamearg+1;(i<argc) && (err==ZIP_OK);i++) @@ -229,19 +306,31 @@ int main(argc,argv) int size_read; const char* filenameinzip = argv[i]; zip_fileinfo zi; + unsigned long crcFile=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_min = zi.tmz_date.tm_year = 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; zi.dosDate = 0; zi.internal_fa = 0; zi.external_fa = 0; filetime(filenameinzip,&zi.tmz_date,&zi.dosDate); - +/* err = zipOpenNewFileInZip(zf,filenameinzip,&zi, - NULL,0,NULL,0,NULL /* comment*/, + NULL,0,NULL,0,NULL / * comment * /, (opt_compress_level != 0) ? Z_DEFLATED : 0, opt_compress_level); +*/ + if ((password != NULL) && (err==ZIP_OK)) + err = getFileCrc(filenameinzip,buf,size_buf,&crcFile); + + err = zipOpenNewFileInZip3(zf,filenameinzip,&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); if (err != ZIP_OK) printf("error in opening %s in zipfile\n",filenameinzip); @@ -259,7 +348,7 @@ int main(argc,argv) do { err = ZIP_OK; - size_read = fread(buf,1,size_buf,fin); + size_read = (int)fread(buf,1,size_buf,fin); if (size_read < size_buf) if (feof(fin)==0) { @@ -275,15 +364,17 @@ int main(argc,argv) printf("error in writing %s in the zipfile\n", filenameinzip); } - + } } while ((err == ZIP_OK) && (size_read>0)); - fclose(fin); + if (fin) + fclose(fin); + if (err<0) err=ZIP_ERRNO; else - { + { err = zipCloseFileInZip(zf); if (err!=ZIP_OK) printf("error in closing %s in the zipfile\n", @@ -297,6 +388,5 @@ int main(argc,argv) } free(buf); - exit(0); - return 0; /* to avoid warning */ + return 0; } |