From 0349c6d6572f59770898d3f40287ebdcd2f8ed30 Mon Sep 17 00:00:00 2001 From: Gentoo Date: Sat, 27 Mar 2021 10:36:05 +1100 Subject: initial commit --- source/unzip/miniunz.c | 323 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 323 insertions(+) create mode 100644 source/unzip/miniunz.c (limited to 'source/unzip/miniunz.c') diff --git a/source/unzip/miniunz.c b/source/unzip/miniunz.c new file mode 100644 index 0000000..83c61a9 --- /dev/null +++ b/source/unzip/miniunz.c @@ -0,0 +1,323 @@ +/* + miniunz.c + Version 1.01e, February 12th, 2005 + + Copyright (C) 1998-2005 Gilles Vollant +*/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "unzip.h" + +#define CASESENSITIVITY (0) +#define WRITEBUFFERSIZE (8192) +#define MAXFILENAME (256) + +int zip_size = 0; +long extract_part_size = 0; +long zip_progress = 0; +int unzip_file_counter = 0; +int unzip_file_count = 0; +char no_unzip_list[10][300]; +int no_unzip_count = 0; + +static int mymkdir(const char* dirname) +{ + return mkdir(dirname,0775); +} + +int makedir(char *newdir) +{ + char *buffer; + char *p; + int len = strlen(newdir); + + if (len <= 0){return 0;} + + buffer = malloc(len+1); + strcpy(buffer,newdir); + + if (buffer[len-1] == '/'){buffer[len-1] = '\0';} + if (mymkdir(buffer) == 0) + { + free(buffer); + return 1; + } + + p = buffer+1; + + while(1) + { + char hold; + + while(*p && *p != '\\' && *p != '/'){++p;} + hold = *p; + *p = 0; + if ((mymkdir(buffer) == -1) && (errno == ENOENT)) + { + printf("Couldn't create directory %s\n",buffer); + free(buffer); + return 0; + } + if (hold == 0){break;} + *p++ = hold; + } + +free(buffer); +return 1; +} + +static int do_extract_currentfile(unzFile uf,const int* popt_extract_without_path,int* popt_overwrite,const char* password) +{ + char filename_inzip[256]; + char *filename_withoutpath; + char *p; + int err = UNZ_OK; + FILE *fout = NULL; + void* buf; + uInt size_buf; + + unz_file_info file_info; + err = unzGetCurrentFileInfo(uf,&file_info,filename_inzip,sizeof(filename_inzip),NULL,0,NULL,0); + + if (err != UNZ_OK) + { + printf("Error %d with zipfile in unzGetCurrentFileInfo\n",err); + return err; + } + + size_buf = WRITEBUFFERSIZE; + buf = malloc(size_buf); + if (buf==NULL) + { + printf("Error allocating memory\n"); + return UNZ_INTERNALERROR; + } + + p = filename_withoutpath = filename_inzip; + while ((*p) != '\0') + { + if (((*p)=='/') || ((*p)=='\\')){filename_withoutpath = p+1;} + ++p; + } + + if ((*filename_withoutpath)=='\0') + { + if ((*popt_extract_without_path)==0) + { + printf("Creating directory: %s\n",filename_inzip); + mymkdir(filename_inzip); + } + } + else + { + char* write_filename; + int skip = 0; + + if ((*popt_extract_without_path)==0){write_filename = filename_inzip;} + else {write_filename = filename_withoutpath;} + + bool ok_to_unzip = true; + + int d; + for (d = 0; d < no_unzip_count; ++d) + { + //printf("SECOND = %s\n", no_unzip_list[d]); + if (strcmp(no_unzip_list[d], write_filename) == 0) + { + FILE *f = fopen(write_filename, "rb"); + if (f != NULL) + { + ok_to_unzip = false; + } + } + } + + if (ok_to_unzip) + { + err = unzOpenCurrentFilePassword(uf,password); + if (err!=UNZ_OK) + { + printf("Error %d with zipfile in unzOpenCurrentFilePassword\n",err); + } + + if (((*popt_overwrite)==0) && (err==UNZ_OK)) + { + char rep=0; + FILE* ftestexist; + ftestexist = fopen(write_filename,"rb"); + if (ftestexist!=NULL) + { + fclose(ftestexist); + } + + if (rep == 'A'){*popt_overwrite=1;}//default overwrite all + } + + if ((skip == 0) && (err==UNZ_OK)) + { + fout=fopen(write_filename,"wb"); + + /* some zipfiles don't contain directory alone before file */ + if ((fout==NULL) && ((*popt_extract_without_path)==0) && (filename_withoutpath!=(char*)filename_inzip)) + { + char c = *(filename_withoutpath-1); + *(filename_withoutpath-1)='\0'; + makedir(write_filename); + *(filename_withoutpath-1)=c; + fout=fopen(write_filename,"wb"); + } + + if (fout==NULL) + { + printf("Error opening %s\n", write_filename); + } + } + + if (fout!=NULL) + { + //printf(" extracting: %s\n",write_filename); + + int temp_size = 0; + do + { + err = unzReadCurrentFile(uf,buf,size_buf); + if (err<0) + { + printf("Error %d with zipfile in unzReadCurrentFile\n",err); + break; + } + + if (err) + { + if (fwrite(buf,err,1,fout)!=1) + { + printf("error in writing extracted file\n"); + err=UNZ_ERRNO; + break; + } + } + + zip_progress += size_buf; + temp_size += size_buf; + //updating_current_size += size_buf; + } + while (err); + + if (temp_size > file_info.uncompressed_size) + { + zip_progress -= temp_size; + zip_progress += file_info.uncompressed_size; + //updating_current_size -= temp_size; + //updating_current_size += file_info.uncompressed_size; + } + + if (fout){fclose(fout);} + } + + if (err==UNZ_OK) + { + err = unzCloseCurrentFile (uf); + if (err!=UNZ_OK) + { + printf("error %d with zipfile in unzCloseCurrentFile\n",err); + } + } + else {unzCloseCurrentFile(uf);} /* don't lose the error */ + } + } + + free(buf); + return err; +} + +int zipInfo(unzFile uf) +{ + uLong i; + unz_global_info gi; + int err; + uLong totalSize = 0; + unz_file_info file_info; + char filename_inzip[256]; + + err = unzGetGlobalInfo (uf,&gi); + + for (i=0;i