Ejemplo n.º 1
0
Archivo: miniunz.c Proyecto: jawi/celix
int do_extract_currentfile(unzFile uf, char * revisionRoot) {
    char filename_inzip[256];
    char* filename_withoutpath;
    char* p;
    int err=UNZ_OK;
    FILE *fout=NULL;
    void* buf;
    uInt size_buf;

    unz_file_info64 file_info;
    err = unzGetCurrentFileInfo64(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 = (void*)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') {
        char * dir;
        dir = (char *)malloc(strlen(revisionRoot) + strlen(filename_inzip) + 2);
        strcpy(dir, revisionRoot);
        strcat(dir, "/");
        strcat(dir, filename_inzip);
        mymkdir(dir);
        free(dir);
    }
    else
    {
        const char* write_filename;
        int skip=0;
        int length;
        char * fWFN;
        write_filename = filename_inzip;

        length = strlen(write_filename) + strlen(revisionRoot) + 2;
        fWFN = (char *)malloc(length);
        strcpy(fWFN, revisionRoot);
        strcat(fWFN, "/");
        strcat(fWFN, write_filename);

        err = unzOpenCurrentFile(uf);
        if (err!=UNZ_OK)
        {
            printf("error %d with zipfile in unzOpenCurrentFilePassword\n",err);
        }

        if ((skip==0) && (err==UNZ_OK))
        {
            fout=fopen64(fWFN,"wb");

            /* some zipfile don't contain directory alone before file */
            if ((fout==NULL) && (filename_withoutpath!=(char*)filename_inzip))
            {
                char * dir;
                int length;
                char c=*(filename_withoutpath-1);
                *(filename_withoutpath-1)='\0';
                length = strlen(write_filename) + strlen(revisionRoot) + 2;
                dir = (char *)malloc(length);
                strcpy(dir, revisionRoot);
                strcat(dir, "/");
                strcat(dir, write_filename);
                makedir(dir);
                *(filename_withoutpath-1)=c;
                free(dir);
                fout=fopen64(fWFN,"wb");
            }

            if (fout==NULL)
            {
                printf("error opening %s\n",write_filename);
            }
        }

        if (fout!=NULL)
        {
            do
            {
                err = unzReadCurrentFile(uf,buf,size_buf);
                if (err<0)
                {
                    printf("error %d with zipfile in unzReadCurrentFile\n",err);
                    break;
                }
                if (err>0)
                    if (fwrite(buf,err,1,fout)!=1)
                    {
                        printf("error in writing extracted file\n");
                        err=UNZ_ERRNO;
                        break;
                    }
            }
            while (err>0);
            if (fout)
                fclose(fout);

            if (err==0)
                change_file_date(fWFN,file_info.dosDate,
                                 file_info.tmu_date);
        }

        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(fWFN);
    }

    free(buf);
    return err;
}
Ejemplo n.º 2
0
  static int do_extract_currentfile( unzFile uf, const int* popt_extract_without_path, int* popt_overwrite, const char* password )
  {   	  
	char filename_inzipA[256];
	wchar_t filename_inzip[256];
    wchar_t* filename_withoutpath;
    wchar_t* p;
    int err=UNZ_OK;
	NSFile::CFileBinary oFile;
    FILE *fout=NULL;
    void* buf;
    uInt size_buf;

    unz_file_info file_info;
    uLong ratio=0;
    err = unzGetCurrentFileInfo(uf,&file_info,filename_inzipA,sizeof(filename_inzipA),NULL,0,NULL,0);

    std::wstring filenameW = codepage_issue_fixFromOEM(filename_inzipA);
	wcscpy(filename_inzip , filenameW.c_str());

    if (err!=UNZ_OK)
    {
      return err;
    }

    size_buf = WRITEBUFFERSIZE;
    buf = (void*)malloc(size_buf);
    if (buf==NULL)
    {
      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)
      {
        mymkdir(filename_inzip);
      }
    }
    else
    {
      const wchar_t* write_filename;
      int skip=0;

      if ((*popt_extract_without_path)==0)
        write_filename = filename_inzip;
      else
        write_filename = filename_withoutpath;

      err = unzOpenCurrentFilePassword(uf,password);
      if (((*popt_overwrite)==0) && (err==UNZ_OK))
      {
        char rep=0;
		NSFile::CFileBinary oFileTemp;
		if (oFileTemp.OpenFile(write_filename))
        {
			oFileTemp.CloseFile();
        }

        if (rep == 'N')
          skip = 1;

        if (rep == 'A')
          *popt_overwrite=1;
      }

      if ((skip==0) && (err==UNZ_OK))
      {
		  if(oFile.CreateFileW(write_filename))
			 fout = oFile.GetFileNative();

        // some zipfile don't contain directory alone before file 
        if ((fout==NULL) && ((*popt_extract_without_path)==0) &&
		    (filename_withoutpath!=(wchar_t*)filename_inzip))
        {
          char c=*(filename_withoutpath-1);
          *(filename_withoutpath-1)='\0';
          makedir(write_filename);
          *(filename_withoutpath-1)=c;
		  if(oFile.CreateFileW(write_filename))
			  fout = oFile.GetFileNative();
        }
      }

      if (fout!=NULL)
      {
        do
        {
          err = unzReadCurrentFile(uf, buf, size_buf);
          if (err<0)
          {
            break;
          }
          if (err>0)
            if (fwrite(buf,err,1,fout)!=1)
            {			  
              err=UNZ_ERRNO;
              break;
            }
        }
        while (err>0);
		//close вызовется в oFile
        //if (fout)
        //  fclose(fout);

        if (err==0)
          change_file_date(write_filename,file_info.dosDate,
                           file_info.tmu_date);
      }

      if (err==UNZ_OK)
      {
        err = unzCloseCurrentFile (uf);
      }
      else
        unzCloseCurrentFile(uf); // don't lose the error 
    }

    free(buf);
    return err;
  }
Ejemplo n.º 3
0
Archivo: miniunz.c Proyecto: pingicx/cx
int do_extract_currentfile(unzFile uf,
                           const int* popt_extract_without_path,
                           int* popt_overwrite,const char* password)
{
    char filename_inzip[MAXFILENAME];
    char* filename_withoutpath;
    char* p;
    int err=UNZ_OK;
    FILE *fout=NULL;
    void* buf;
    uInt size_buf;

    unz_file_info64 file_info;
    uLong ratio=0;
    char filename_inzip_t[MAXFILENAME];
    err = unzGetCurrentFileInfo64(uf,&file_info,filename_inzip_t,sizeof(filename_inzip_t),NULL,0,NULL,0);

    char cwd[1024];
    if (getcwd(cwd, sizeof(cwd)) != NULL)
        strcat(filename_inzip,cwd);
    else
        strcat(filename_inzip,__DIR__);
    strcat(filename_inzip,"/");
    strcat(filename_inzip,filename_inzip_t);

    if (err!=UNZ_OK)
    {
        printf("error %d with zipfile in unzGetCurrentFileInfo\n",err);
        return err;
    }

    size_buf = WRITEBUFFERSIZE;
    buf = (void*)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
    {
        const char* write_filename;
        int skip=0;

        if ((*popt_extract_without_path)==0)
            write_filename = filename_inzip;
        else
            write_filename = filename_withoutpath;

        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_FUNC(write_filename,"rb");
            if (ftestexist!=NULL)
            {
                fclose(ftestexist);
                do
                {
                    char answer[128];
                    int ret;

                    printf("The file %s exists. Overwrite ? [y]es, [n]o, [A]ll: ",write_filename);
                    ret = scanf("%1s",answer);
                    if (ret != 1)
                    {
                        exit(EXIT_FAILURE);
                    }
                    rep = answer[0] ;
                    if ((rep>='a') && (rep<='z'))
                        rep -= 0x20;
                }
                while ((rep!='Y') && (rep!='N') && (rep!='A'));
            }

            if (rep == 'N')
                skip = 1;

            if (rep == 'A')
                *popt_overwrite=1;
        }

        if ((skip==0) && (err==UNZ_OK))
        {
            fout=FOPEN_FUNC(write_filename,"wb");

            /* some zipfile 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_FUNC(write_filename,"wb");
            }

            if (fout==NULL)
            {
                printf("error opening %s\n",write_filename);
            }
        }

        if (fout!=NULL)
        {
            printf(" extracting: %s\n",write_filename);

            do
            {
                err = unzReadCurrentFile(uf,buf,size_buf);
                if (err<0)
                {
                    printf("error %d with zipfile in unzReadCurrentFile\n",err);
                    break;
                }
                if (err>0)
                    if (fwrite(buf,err,1,fout)!=1)
                    {
                        printf("error in writing extracted file\n");
                        err=UNZ_ERRNO;
                        break;
                    }
            }
            while (err>0);
            if (fout)
                fclose(fout);

            if (err==0)
                change_file_date(write_filename,file_info.dosDate,
                                 file_info.tmu_date);
        }

        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;
}
Ejemplo n.º 4
0
static int
do_extract_currentfile( unzFile uf,
		const int* popt_extract_without_path, int* popt_overwrite, const char* password,
		ZnkStr ermsg, ZnkZipProgressFuncT progress_func, void* param, size_t num_of_entry, size_t idx_of_entry )
{
	char  filename_inzip[256];
	char* filename_withoutpath; /* tail */
	char* p;
	int   err=UNZ_OK;
	FILE* fout=NULL;
	void* buf;
	uInt  size_buf;
	char  rep_buf[ 512 ] = "";
	
	unz_file_info file_info;

	err = unzGetCurrentFileInfo( uf,
			&file_info,
			filename_inzip, sizeof(filename_inzip),
			NULL, 0, /* extraField */
			NULL, 0  /* szComment */
	);
	
	if( err != UNZ_OK ){
		ZnkStr_addf( ermsg, "ZnkZip : Error : %d with zipfile in unzGetCurrentFileInfo\n", err );
		return err;
	}
	
	size_buf = WRITEBUFFERSIZE;
	buf = (void*)malloc(size_buf);
	if( buf == NULL ){
		Znk_printf_e( "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' ){
		/* tail is empty : thus, this is directory */
		if( (*popt_extract_without_path)==0 ){
			if( progress_func ){
				Znk_snprintf( rep_buf, sizeof(rep_buf), "creating directory: %s", filename_inzip );
				(*progress_func)( rep_buf, num_of_entry, idx_of_entry, param );
			}
			mymkdir(filename_inzip);
		}
	} else {
		const char* write_filename;
		int skip=0;
		
		if( (*popt_extract_without_path)==0 ){
			write_filename = filename_inzip;
		} else {
			write_filename = filename_withoutpath;
		}
		
		err = unzOpenCurrentFilePassword( uf, password );
		if( err != UNZ_OK ){
			ZnkStr_addf( ermsg, "ZnkZip : Error : %d with zipfile in unzOpenCurrentFilePassword.\n", err );
		}
		
#if 0
		if( ((*popt_overwrite)==0) && (err==UNZ_OK) ){
			char rep=0;
			FILE* ftestexist;
			ftestexist = fopen(write_filename,"rb");
			if( ftestexist != NULL ){
				fclose(ftestexist);
				do {
					char answer[128];
					int ret;
					
					Znk_printf("The file %s exists. Overwrite ? [y]es, [n]o, [A]ll: ",write_filename);
					ret = scanf("%1s",answer);
					if (ret != 1) {
						exit(EXIT_FAILURE);
					}
					rep = answer[0] ;
					if ((rep>='a') && (rep<='z'))
						rep -= 0x20;
				} while ((rep!='Y') && (rep!='N') && (rep!='A'));
			}
			
			if (rep == 'N') skip = 1;
			
			if (rep == 'A') *popt_overwrite=1;
		}
#else
		*popt_overwrite = 1; /* all-overwrite */
#endif
		
		if( (skip==0) && (err==UNZ_OK) ){
			fout = fopen( write_filename, "wb" );
			
			/* some zipfile 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 ){
				ZnkStr_addf( ermsg, "ZnkZip : Error : opening [%s].\n", write_filename );
			}
		}
		
		if( fout != NULL ){
			//Znk_printf(" extracting: %s\n",write_filename);
			if( progress_func ){
				Znk_snprintf( rep_buf, sizeof(rep_buf), "extracting: %s", write_filename );
				(*progress_func)( rep_buf, num_of_entry, idx_of_entry, param );
			}
			do{
				err = unzReadCurrentFile(uf,buf,size_buf);
				if( err < 0 ){
					ZnkStr_addf( ermsg, "ZnkZip : Error : %d with zipfile in unzReadCurrentFile\n", err );
				    break;
				} else if( err > 0 ){
				 	if( fwrite(buf,err,1,fout) != 1 ){
						ZnkStr_addf( ermsg, "ZnkZip : Error : in writing extracted file\n" );
						err=UNZ_ERRNO;
						break;
				 	}
				}
			} while( err>0 );

			if (fout)
				fclose(fout);
			
			if (err==0){
				change_file_date( write_filename,
						file_info.dosDate,
						file_info.tmu_date );
			}
		}
		
		if( err==UNZ_OK ){
			err = unzCloseCurrentFile (uf);
			if (err!=UNZ_OK){
				ZnkStr_addf( ermsg, "ZnkZip : Error : %d with zipfile in unzCloseCurrentFile\n", err );
			}
		} else {
			unzCloseCurrentFile(uf); /* don't lose the error */
		}
	}
	
	free(buf);
	return err;
}
Ejemplo n.º 5
0
int do_extract_currentfile(unzFile uf, const int* popt_extract_without_path, int*, const char* password)
{
	char  fn_inzip[256];
	QString filename_inzip;
	QString filename_withoutpath;
	int err=UNZ_OK;
	FILE *fout=NULL;
	void* buf;
	uInt size_buf;

	unz_file_info file_info;
	//uLong ratio=0;
	err = unzGetCurrentFileInfo(uf,&file_info,fn_inzip,sizeof(fn_inzip),NULL,0,NULL,0);

	if (err!=UNZ_OK)
		return err;

	size_buf = WRITEBUFFERSIZE;
	buf = (void*)malloc(size_buf);
	if (buf==NULL)
		return UNZ_INTERNALERROR;

	QChar p;
//	uint cIndex = 0;
	filename_inzip = QString::fromLocal8Bit(fn_inzip); 
	filename_withoutpath = filename_inzip;
	for (int i = 0; i < filename_inzip.length(); i++)
	{
		p = filename_inzip[i];
		if( (p == '/') || (p =='\\'))
			filename_withoutpath = filename_inzip.mid(i+1);
	}

	if (filename_withoutpath.isEmpty())
	{
		if ((*popt_extract_without_path)==0)
			mymkdir(filename_inzip);
	}
	else
    {
		QString write_filename;
		int skip=0;

		if ((*popt_extract_without_path)==0)
			write_filename = filename_inzip;
		else
			write_filename = filename_withoutpath;
		
		err = unzOpenCurrentFilePassword(uf,password);

		if ((skip==0) && (err==UNZ_OK))
		{
			fout = openfile(write_filename, "wb");
            /* some zipfile don't contain directory alone before file */
			if ((fout==NULL) && ((*popt_extract_without_path)==0) &&
								(filename_withoutpath != filename_inzip))
			{
				uint len = filename_inzip.length() - filename_withoutpath.length() - 1;
				QString write_dir = filename_inzip.left(len);
				makedir(write_dir);
				fout = openfile(write_filename, "wb");
			}
		}

		if (fout!=NULL)
		{
			do
			{
				err = unzReadCurrentFile(uf,buf,size_buf);
				if (err<0)
					break;
				if (err>0)
					if (fwrite(buf,err,1,fout)!=1)
					{
						err=UNZ_ERRNO;
						break;
					}
			}
			while (err>0);
			if (fout)
				fclose(fout);

			if (err==0)
				change_file_date(write_filename,file_info.dosDate,
									file_info.tmu_date);
		}

		if (err==UNZ_OK)
			err = unzCloseCurrentFile (uf);
		else
			unzCloseCurrentFile(uf); /* don't lose the error */
	}

	free(buf);
	return err;
}
Ejemplo n.º 6
0
int ExtractCurrentFile(HZIP hZip,bool bSkipPath)
{
    int r=-1;
    char filename_inzip[256];
    unz_file_info64 file_info;
    ZIPDECOMPRESSION *p=(ZIPDECOMPRESSION*)hZip;
    int err=unzGetCurrentFileInfo64(p->hZip,&file_info,filename_inzip,sizeof(filename_inzip),NULL,0,NULL,0);
    if (err == UNZ_OK)
    {
        bool bEncrypted=((file_info.flag & 1) != 0);
        if ((bEncrypted) && (!p->bEncrypted))
        {
            ArchSetLastError(ARCH_ZIP_IS_ENCRYPTED);
            return -1;
        }

        char *lpPassword=((bEncrypted) && (p->bEncrypted)) ? p->szPassword : 0;
        int err=unzOpenCurrentFilePassword(p->hZip,lpPassword);
        if (err == UNZ_OK)
        {
            void *buf=_alloc(INT_BUF_SIZE);
            if (buf)
            {
                if (p->bExctractToMem)
                {
                    p->lpMem=VirtualAlloc(NULL,file_info.uncompressed_size,MEM_COMMIT,PAGE_READWRITE);
                    p->dwSize=file_info.uncompressed_size;
                    byte *pMem=(byte*)p->lpMem;
                    if (p->lpMem)
                    {
                        do
                        {
                            err=unzReadCurrentFile(p->hZip,pMem,INT_BUF_SIZE);
                            if (err < 0)
                            {
                                VirtualFree(p->lpMem,file_info.uncompressed_size,MEM_DECOMMIT);
                                break;
                            }
                            pMem+=err;
                        }
                        while (err > 0);
                    }
                    else
                        ArchSetLastError(ARCH_NO_MEM);

                    if (!err)
                        r=1;
                }
                else
                {
                    WCHAR *unicode_filename_inzip=OemToUnicodeEx(filename_inzip,-1),
                          file_to_store[MAX_PATH],
                          destPath[MAX_PATH],
                          *filename=unicode_filename_inzip;
                    if (bSkipPath)
                    {
                        WCHAR *p,*filename_withoutpath;
                        p=filename_withoutpath=unicode_filename_inzip;
                        while ((*p) != '\0')
                        {
                            if ((*p == '/') || (*p == '\\'))
                                filename_withoutpath=p+1;
                            p++;
                        }
                        filename=filename_withoutpath;
                    }

                    int dwLen=wsprintfW(destPath,L"%s\\%s",p->strOutputDir,filename);
                    for (int i=0; i < dwLen; i++)
                    {
                        if (destPath[i] == '/')
                            destPath[i]='\\';
                    }
                    lstrcpyW(file_to_store,destPath);
                    if (PathRemoveFileSpecW(destPath) != FALSE)
                        CreateDirectoryTree(destPath);
                    MemFree(unicode_filename_inzip);

                    HANDLE fout=CreateFileW(file_to_store,GENERIC_WRITE,0,NULL,CREATE_ALWAYS,0,NULL);
                    do
                    {
                        DWORD dwSize;
                        err=unzReadCurrentFile(p->hZip,buf,INT_BUF_SIZE);
                        if (err < 0)
                            break;
                        if (!WriteFile(fout,buf,err,&dwSize,0))
                        {
                            err=-1;
                            break;
                        }
                    }
                    while (err > 0);
                    SysCloseHandle(fout);
                    if (!err)
                    {
                        change_file_date(file_to_store,file_info.dosDate,file_info.tmu_date);
                        r=1;
                    }
                    else
                        DeleteFileW(file_to_store);
                }
                MemFree(buf);
            }
            unzCloseCurrentFile(p->hZip);
        }
    }
    return r;
}