yann300
10 years ago
23 changed files with 231 additions and 7526 deletions
@ -1,39 +0,0 @@ |
|||
cmake_policy(SET CMP0015 NEW) |
|||
# this policy was introduced in cmake 3.0 |
|||
# remove if, once 3.0 will be used on unix |
|||
if (${CMAKE_MAJOR_VERSION} GREATER 2) |
|||
# old policy do not use MACOSX_RPATH |
|||
cmake_policy(SET CMP0042 OLD) |
|||
endif() |
|||
set(CMAKE_AUTOMOC OFF) |
|||
|
|||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DSTATICLIB") |
|||
|
|||
aux_source_directory(. SRC_LIST) |
|||
|
|||
include_directories(${LEVELDB_INCLUDE_DIRS}) |
|||
include_directories(..) |
|||
|
|||
|
|||
file(GLOB HEADERS "*.h") |
|||
|
|||
if (ETH_STATIC) |
|||
add_library(${EXECUTABLE} STATIC ${SRC_LIST} ${HEADERS}) |
|||
else() |
|||
add_library(${EXECUTABLE} SHARED ${SRC_LIST} ${HEADERS}) |
|||
endif() |
|||
|
|||
|
|||
|
|||
target_link_libraries(${EXECUTABLE} ethereum) |
|||
target_link_libraries(${EXECUTABLE} evm) |
|||
target_link_libraries(${EXECUTABLE} lll) |
|||
target_link_libraries(${EXECUTABLE} whisper) |
|||
target_link_libraries(${EXECUTABLE} p2p) |
|||
target_link_libraries(${EXECUTABLE} ethcore) |
|||
target_link_libraries(${EXECUTABLE} devcrypto) |
|||
target_link_libraries(${EXECUTABLE} secp256k1) |
|||
|
|||
install( TARGETS ${EXECUTABLE} ARCHIVE DESTINATION lib LIBRARY DESTINATION lib ) |
|||
install( FILES ${HEADERS} DESTINATION include/${EXECUTABLE} ) |
|||
|
@ -1,131 +0,0 @@ |
|||
/* crypt.h -- base code for crypt/uncrypt ZIPfile
|
|||
|
|||
|
|||
Version 1.01e, February 12th, 2005 |
|||
|
|||
Copyright (C) 1998-2005 Gilles Vollant |
|||
|
|||
This code is a modified version of crypting code in Infozip distribution |
|||
|
|||
The encryption/decryption parts of this source code (as opposed to the |
|||
non-echoing password parts) were originally written in Europe. The |
|||
whole source package can be freely distributed, including from the USA. |
|||
(Prior to January 2000, re-export from the US was a violation of US law.) |
|||
|
|||
This encryption code is a direct transcription of the algorithm from |
|||
Roger Schlafly, described by Phil Katz in the file appnote.txt. This |
|||
file (appnote.txt) is distributed with the PKZIP program (even in the |
|||
version without encryption capabilities). |
|||
|
|||
If you don't need crypting in your application, just define symbols |
|||
NOCRYPT and NOUNCRYPT. |
|||
|
|||
This code support the "Traditional PKWARE Encryption". |
|||
|
|||
The new AES encryption added on Zip format by Winzip (see the page |
|||
http://www.winzip.com/aes_info.htm ) and PKWare PKZip 5.x Strong
|
|||
Encryption is not supported. |
|||
*/ |
|||
|
|||
#define CRC32(c, b) ((*(pcrc_32_tab+(((int)(c) ^ (b)) & 0xff))) ^ ((c) >> 8)) |
|||
|
|||
/***********************************************************************
|
|||
* Return the next byte in the pseudo-random sequence |
|||
*/ |
|||
static int decrypt_byte(unsigned long* pkeys, const unsigned long* pcrc_32_tab) |
|||
{ |
|||
unsigned temp; /* POTENTIAL BUG: temp*(temp^1) may overflow in an
|
|||
* unpredictable manner on 16-bit systems; not a problem |
|||
* with any known compiler so far, though */ |
|||
|
|||
temp = ((unsigned)(*(pkeys+2)) & 0xffff) | 2; |
|||
return (int)(((temp * (temp ^ 1)) >> 8) & 0xff); |
|||
} |
|||
|
|||
/***********************************************************************
|
|||
* Update the encryption keys with the next byte of plain text |
|||
*/ |
|||
static int update_keys(unsigned long* pkeys,const unsigned long* pcrc_32_tab,int c) |
|||
{ |
|||
(*(pkeys+0)) = CRC32((*(pkeys+0)), c); |
|||
(*(pkeys+1)) += (*(pkeys+0)) & 0xff; |
|||
(*(pkeys+1)) = (*(pkeys+1)) * 134775813L + 1; |
|||
{ |
|||
register int keyshift = (int)((*(pkeys+1)) >> 24); |
|||
(*(pkeys+2)) = CRC32((*(pkeys+2)), keyshift); |
|||
} |
|||
return c; |
|||
} |
|||
|
|||
|
|||
/***********************************************************************
|
|||
* Initialize the encryption keys and the random header according to |
|||
* the given password. |
|||
*/ |
|||
static void init_keys(const char* passwd,unsigned long* pkeys,const unsigned long* pcrc_32_tab) |
|||
{ |
|||
*(pkeys+0) = 305419896L; |
|||
*(pkeys+1) = 591751049L; |
|||
*(pkeys+2) = 878082192L; |
|||
while (*passwd != '\0') { |
|||
update_keys(pkeys,pcrc_32_tab,(int)*passwd); |
|||
passwd++; |
|||
} |
|||
} |
|||
|
|||
#define zdecode(pkeys,pcrc_32_tab,c) \ |
|||
(update_keys(pkeys,pcrc_32_tab,c ^= decrypt_byte(pkeys,pcrc_32_tab))) |
|||
|
|||
#define zencode(pkeys,pcrc_32_tab,c,t) \ |
|||
(t=decrypt_byte(pkeys,pcrc_32_tab), update_keys(pkeys,pcrc_32_tab,c), t^(c)) |
|||
|
|||
#ifdef INCLUDECRYPTINGCODE_IFCRYPTALLOWED |
|||
|
|||
#define RAND_HEAD_LEN 12 |
|||
/* "last resort" source for second part of crypt seed pattern */ |
|||
# ifndef ZCR_SEED2 |
|||
# define ZCR_SEED2 3141592654UL /* use PI as default pattern */ |
|||
# endif |
|||
|
|||
static int crypthead(const char* passwd, /* password string */ |
|||
unsigned char* buf, /* where to write header */ |
|||
int bufSize, |
|||
unsigned long* pkeys, |
|||
const unsigned long* pcrc_32_tab, |
|||
unsigned long crcForCrypting) |
|||
{ |
|||
int n; /* index in random header */ |
|||
int t; /* temporary */ |
|||
int c; /* random byte */ |
|||
unsigned char header[RAND_HEAD_LEN-2]; /* random header */ |
|||
static unsigned calls = 0; /* ensure different random header each time */ |
|||
|
|||
if (bufSize<RAND_HEAD_LEN) |
|||
return 0; |
|||
|
|||
/* First generate RAND_HEAD_LEN-2 random bytes. We encrypt the
|
|||
* output of rand() to get less predictability, since rand() is |
|||
* often poorly implemented. |
|||
*/ |
|||
if (++calls == 1) |
|||
{ |
|||
srand((unsigned)(time(NULL) ^ ZCR_SEED2)); |
|||
} |
|||
init_keys(passwd, pkeys, pcrc_32_tab); |
|||
for (n = 0; n < RAND_HEAD_LEN-2; n++) |
|||
{ |
|||
c = (rand() >> 7) & 0xff; |
|||
header[n] = (unsigned char)zencode(pkeys, pcrc_32_tab, c, t); |
|||
} |
|||
/* Encrypt random header (last two bytes is high word of crc) */ |
|||
init_keys(passwd, pkeys, pcrc_32_tab); |
|||
for (n = 0; n < RAND_HEAD_LEN-2; n++) |
|||
{ |
|||
buf[n] = (unsigned char)zencode(pkeys, pcrc_32_tab, header[n], t); |
|||
} |
|||
buf[n++] = (unsigned char)zencode(pkeys, pcrc_32_tab, (int)(crcForCrypting >> 16) & 0xff, t); |
|||
buf[n++] = (unsigned char)zencode(pkeys, pcrc_32_tab, (int)(crcForCrypting >> 24) & 0xff, t); |
|||
return n; |
|||
} |
|||
|
|||
#endif |
@ -1,235 +0,0 @@ |
|||
/* ioapi.h -- IO base function header for compress/uncompress .zip
|
|||
part of the MiniZip project - ( http://www.winimage.com/zLibDll/minizip.html )
|
|||
|
|||
Copyright (C) 1998-2010 Gilles Vollant (minizip) ( http://www.winimage.com/zLibDll/minizip.html )
|
|||
|
|||
Modifications for Zip64 support |
|||
Copyright (C) 2009-2010 Mathias Svensson ( http://result42.com )
|
|||
|
|||
For more info read MiniZip_info.txt |
|||
|
|||
*/ |
|||
|
|||
#if (defined(_WIN32)) |
|||
#define _CRT_SECURE_NO_WARNINGS |
|||
#endif |
|||
|
|||
#include "ioapi.h" |
|||
|
|||
voidpf call_zopen64 (const zlib_filefunc64_32_def* pfilefunc,const void*filename,int mode) |
|||
{ |
|||
if (pfilefunc->zfile_func64.zopen64_file != NULL) |
|||
return (*(pfilefunc->zfile_func64.zopen64_file)) (pfilefunc->zfile_func64.opaque,filename,mode); |
|||
else |
|||
{ |
|||
return (*(pfilefunc->zopen32_file))(pfilefunc->zfile_func64.opaque,(const char*)filename,mode); |
|||
} |
|||
} |
|||
|
|||
long call_zseek64 (const zlib_filefunc64_32_def* pfilefunc,voidpf filestream, ZPOS64_T offset, int origin) |
|||
{ |
|||
if (pfilefunc->zfile_func64.zseek64_file != NULL) |
|||
return (*(pfilefunc->zfile_func64.zseek64_file)) (pfilefunc->zfile_func64.opaque,filestream,offset,origin); |
|||
else |
|||
{ |
|||
uLong offsetTruncated = (uLong)offset; |
|||
if (offsetTruncated != offset) |
|||
return -1; |
|||
else |
|||
return (*(pfilefunc->zseek32_file))(pfilefunc->zfile_func64.opaque,filestream,offsetTruncated,origin); |
|||
} |
|||
} |
|||
|
|||
ZPOS64_T call_ztell64 (const zlib_filefunc64_32_def* pfilefunc,voidpf filestream) |
|||
{ |
|||
if (pfilefunc->zfile_func64.zseek64_file != NULL) |
|||
return (*(pfilefunc->zfile_func64.ztell64_file)) (pfilefunc->zfile_func64.opaque,filestream); |
|||
else |
|||
{ |
|||
uLong tell_uLong = (*(pfilefunc->ztell32_file))(pfilefunc->zfile_func64.opaque,filestream); |
|||
if ((tell_uLong) == ((uLong)-1)) |
|||
return (ZPOS64_T)-1; |
|||
else |
|||
return tell_uLong; |
|||
} |
|||
} |
|||
|
|||
void fill_zlib_filefunc64_32_def_from_filefunc32(zlib_filefunc64_32_def* p_filefunc64_32,const zlib_filefunc_def* p_filefunc32) |
|||
{ |
|||
p_filefunc64_32->zfile_func64.zopen64_file = NULL; |
|||
p_filefunc64_32->zopen32_file = p_filefunc32->zopen_file; |
|||
p_filefunc64_32->zfile_func64.zerror_file = p_filefunc32->zerror_file; |
|||
p_filefunc64_32->zfile_func64.zread_file = p_filefunc32->zread_file; |
|||
p_filefunc64_32->zfile_func64.zwrite_file = p_filefunc32->zwrite_file; |
|||
p_filefunc64_32->zfile_func64.ztell64_file = NULL; |
|||
p_filefunc64_32->zfile_func64.zseek64_file = NULL; |
|||
p_filefunc64_32->zfile_func64.zclose_file = p_filefunc32->zclose_file; |
|||
p_filefunc64_32->zfile_func64.zerror_file = p_filefunc32->zerror_file; |
|||
p_filefunc64_32->zfile_func64.opaque = p_filefunc32->opaque; |
|||
p_filefunc64_32->zseek32_file = p_filefunc32->zseek_file; |
|||
p_filefunc64_32->ztell32_file = p_filefunc32->ztell_file; |
|||
} |
|||
|
|||
|
|||
|
|||
static voidpf ZCALLBACK fopen_file_func OF((voidpf opaque, const char* filename, int mode)); |
|||
static uLong ZCALLBACK fread_file_func OF((voidpf opaque, voidpf stream, void* buf, uLong size)); |
|||
static uLong ZCALLBACK fwrite_file_func OF((voidpf opaque, voidpf stream, const void* buf,uLong size)); |
|||
static ZPOS64_T ZCALLBACK ftell64_file_func OF((voidpf opaque, voidpf stream)); |
|||
static long ZCALLBACK fseek64_file_func OF((voidpf opaque, voidpf stream, ZPOS64_T offset, int origin)); |
|||
static int ZCALLBACK fclose_file_func OF((voidpf opaque, voidpf stream)); |
|||
static int ZCALLBACK ferror_file_func OF((voidpf opaque, voidpf stream)); |
|||
|
|||
static voidpf ZCALLBACK fopen_file_func (voidpf opaque, const char* filename, int mode) |
|||
{ |
|||
FILE* file = NULL; |
|||
const char* mode_fopen = NULL; |
|||
if ((mode & ZLIB_FILEFUNC_MODE_READWRITEFILTER)==ZLIB_FILEFUNC_MODE_READ) |
|||
mode_fopen = "rb"; |
|||
else |
|||
if (mode & ZLIB_FILEFUNC_MODE_EXISTING) |
|||
mode_fopen = "r+b"; |
|||
else |
|||
if (mode & ZLIB_FILEFUNC_MODE_CREATE) |
|||
mode_fopen = "wb"; |
|||
|
|||
if ((filename!=NULL) && (mode_fopen != NULL)) |
|||
file = fopen(filename, mode_fopen); |
|||
return file; |
|||
} |
|||
|
|||
static voidpf ZCALLBACK fopen64_file_func (voidpf opaque, const void* filename, int mode) |
|||
{ |
|||
FILE* file = NULL; |
|||
const char* mode_fopen = NULL; |
|||
if ((mode & ZLIB_FILEFUNC_MODE_READWRITEFILTER)==ZLIB_FILEFUNC_MODE_READ) |
|||
mode_fopen = "rb"; |
|||
else |
|||
if (mode & ZLIB_FILEFUNC_MODE_EXISTING) |
|||
mode_fopen = "r+b"; |
|||
else |
|||
if (mode & ZLIB_FILEFUNC_MODE_CREATE) |
|||
mode_fopen = "wb"; |
|||
|
|||
if ((filename!=NULL) && (mode_fopen != NULL)) |
|||
file = fopen64((const char*)filename, mode_fopen); |
|||
return file; |
|||
} |
|||
|
|||
|
|||
static uLong ZCALLBACK fread_file_func (voidpf opaque, voidpf stream, void* buf, uLong size) |
|||
{ |
|||
uLong ret; |
|||
ret = (uLong)fread(buf, 1, (size_t)size, (FILE *)stream); |
|||
return ret; |
|||
} |
|||
|
|||
static uLong ZCALLBACK fwrite_file_func (voidpf opaque, voidpf stream, const void* buf, uLong size) |
|||
{ |
|||
uLong ret; |
|||
ret = (uLong)fwrite(buf, 1, (size_t)size, (FILE *)stream); |
|||
return ret; |
|||
} |
|||
|
|||
static long ZCALLBACK ftell_file_func (voidpf opaque, voidpf stream) |
|||
{ |
|||
long ret; |
|||
ret = ftell((FILE *)stream); |
|||
return ret; |
|||
} |
|||
|
|||
|
|||
static ZPOS64_T ZCALLBACK ftell64_file_func (voidpf opaque, voidpf stream) |
|||
{ |
|||
ZPOS64_T ret; |
|||
ret = ftello64((FILE *)stream); |
|||
return ret; |
|||
} |
|||
|
|||
static long ZCALLBACK fseek_file_func (voidpf opaque, voidpf stream, uLong offset, int origin) |
|||
{ |
|||
int fseek_origin=0; |
|||
long ret; |
|||
switch (origin) |
|||
{ |
|||
case ZLIB_FILEFUNC_SEEK_CUR : |
|||
fseek_origin = SEEK_CUR; |
|||
break; |
|||
case ZLIB_FILEFUNC_SEEK_END : |
|||
fseek_origin = SEEK_END; |
|||
break; |
|||
case ZLIB_FILEFUNC_SEEK_SET : |
|||
fseek_origin = SEEK_SET; |
|||
break; |
|||
default: return -1; |
|||
} |
|||
ret = 0; |
|||
if (fseek((FILE *)stream, offset, fseek_origin) != 0) |
|||
ret = -1; |
|||
return ret; |
|||
} |
|||
|
|||
static long ZCALLBACK fseek64_file_func (voidpf opaque, voidpf stream, ZPOS64_T offset, int origin) |
|||
{ |
|||
int fseek_origin=0; |
|||
long ret; |
|||
switch (origin) |
|||
{ |
|||
case ZLIB_FILEFUNC_SEEK_CUR : |
|||
fseek_origin = SEEK_CUR; |
|||
break; |
|||
case ZLIB_FILEFUNC_SEEK_END : |
|||
fseek_origin = SEEK_END; |
|||
break; |
|||
case ZLIB_FILEFUNC_SEEK_SET : |
|||
fseek_origin = SEEK_SET; |
|||
break; |
|||
default: return -1; |
|||
} |
|||
ret = 0; |
|||
|
|||
if(fseeko64((FILE *)stream, offset, fseek_origin) != 0) |
|||
ret = -1; |
|||
|
|||
return ret; |
|||
} |
|||
|
|||
|
|||
static int ZCALLBACK fclose_file_func (voidpf opaque, voidpf stream) |
|||
{ |
|||
int ret; |
|||
ret = fclose((FILE *)stream); |
|||
return ret; |
|||
} |
|||
|
|||
static int ZCALLBACK ferror_file_func (voidpf opaque, voidpf stream) |
|||
{ |
|||
int ret; |
|||
ret = ferror((FILE *)stream); |
|||
return ret; |
|||
} |
|||
|
|||
void fill_fopen_filefunc (pzlib_filefunc_def) |
|||
zlib_filefunc_def* pzlib_filefunc_def; |
|||
{ |
|||
pzlib_filefunc_def->zopen_file = fopen_file_func; |
|||
pzlib_filefunc_def->zread_file = fread_file_func; |
|||
pzlib_filefunc_def->zwrite_file = fwrite_file_func; |
|||
pzlib_filefunc_def->ztell_file = ftell_file_func; |
|||
pzlib_filefunc_def->zseek_file = fseek_file_func; |
|||
pzlib_filefunc_def->zclose_file = fclose_file_func; |
|||
pzlib_filefunc_def->zerror_file = ferror_file_func; |
|||
pzlib_filefunc_def->opaque = NULL; |
|||
} |
|||
|
|||
void fill_fopen64_filefunc (zlib_filefunc64_def* pzlib_filefunc_def) |
|||
{ |
|||
pzlib_filefunc_def->zopen64_file = fopen64_file_func; |
|||
pzlib_filefunc_def->zread_file = fread_file_func; |
|||
pzlib_filefunc_def->zwrite_file = fwrite_file_func; |
|||
pzlib_filefunc_def->ztell64_file = ftell64_file_func; |
|||
pzlib_filefunc_def->zseek64_file = fseek64_file_func; |
|||
pzlib_filefunc_def->zclose_file = fclose_file_func; |
|||
pzlib_filefunc_def->zerror_file = ferror_file_func; |
|||
pzlib_filefunc_def->opaque = NULL; |
|||
} |
@ -1,200 +0,0 @@ |
|||
/* ioapi.h -- IO base function header for compress/uncompress .zip
|
|||
part of the MiniZip project - ( http://www.winimage.com/zLibDll/minizip.html )
|
|||
|
|||
Copyright (C) 1998-2010 Gilles Vollant (minizip) ( http://www.winimage.com/zLibDll/minizip.html )
|
|||
|
|||
Modifications for Zip64 support |
|||
Copyright (C) 2009-2010 Mathias Svensson ( http://result42.com )
|
|||
|
|||
For more info read MiniZip_info.txt |
|||
|
|||
Changes |
|||
|
|||
Oct-2009 - Defined ZPOS64_T to fpos_t on windows and u_int64_t on linux. (might need to find a better why for this) |
|||
Oct-2009 - Change to fseeko64, ftello64 and fopen64 so large files would work on linux. |
|||
More if/def section may be needed to support other platforms |
|||
Oct-2009 - Defined fxxxx64 calls to normal fopen/ftell/fseek so they would compile on windows. |
|||
(but you should use iowin32.c for windows instead) |
|||
|
|||
*/ |
|||
|
|||
#ifndef _ZLIBIOAPI64_H |
|||
#define _ZLIBIOAPI64_H |
|||
|
|||
#if (!defined(_WIN32)) && (!defined(WIN32)) |
|||
|
|||
// Linux needs this to support file operation on files larger then 4+GB
|
|||
// But might need better if/def to select just the platforms that needs them.
|
|||
|
|||
#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 "zlib.h" |
|||
|
|||
#if defined(USE_FILE32API) |
|||
#define fopen64 fopen |
|||
#define ftello64 ftell |
|||
#define fseeko64 fseek |
|||
#else |
|||
#ifdef _MSC_VER |
|||
#define fopen64 fopen |
|||
#if (_MSC_VER >= 1400) && (!(defined(NO_MSCVER_FILE64_FUNC))) |
|||
#define ftello64 _ftelli64 |
|||
#define fseeko64 _fseeki64 |
|||
#else // old MSC
|
|||
#define ftello64 ftell |
|||
#define fseeko64 fseek |
|||
#endif |
|||
#endif |
|||
#endif |
|||
|
|||
/*
|
|||
#ifndef ZPOS64_T |
|||
#ifdef _WIN32 |
|||
#define ZPOS64_T fpos_t |
|||
#else |
|||
#include <stdint.h> |
|||
#define ZPOS64_T uint64_t |
|||
#endif |
|||
#endif |
|||
*/ |
|||
|
|||
#ifdef HAVE_MINIZIP64_CONF_H |
|||
#include "mz64conf.h" |
|||
#endif |
|||
|
|||
/* a type choosen by DEFINE */ |
|||
#ifdef HAVE_64BIT_INT_CUSTOM |
|||
typedef 64BIT_INT_CUSTOM_TYPE ZPOS64_T; |
|||
#else |
|||
#ifdef HAS_STDINT_H |
|||
#include "stdint.h" |
|||
typedef uint64_t ZPOS64_T; |
|||
#else |
|||
|
|||
|
|||
#if defined(_MSC_VER) || defined(__BORLANDC__) |
|||
typedef unsigned __int64 ZPOS64_T; |
|||
#else |
|||
typedef unsigned long long int ZPOS64_T; |
|||
#endif |
|||
#endif |
|||
#endif |
|||
|
|||
|
|||
|
|||
#ifdef __cplusplus |
|||
extern "C" { |
|||
#endif |
|||
|
|||
|
|||
#define ZLIB_FILEFUNC_SEEK_CUR (1) |
|||
#define ZLIB_FILEFUNC_SEEK_END (2) |
|||
#define ZLIB_FILEFUNC_SEEK_SET (0) |
|||
|
|||
#define ZLIB_FILEFUNC_MODE_READ (1) |
|||
#define ZLIB_FILEFUNC_MODE_WRITE (2) |
|||
#define ZLIB_FILEFUNC_MODE_READWRITEFILTER (3) |
|||
|
|||
#define ZLIB_FILEFUNC_MODE_EXISTING (4) |
|||
#define ZLIB_FILEFUNC_MODE_CREATE (8) |
|||
|
|||
|
|||
#ifndef ZCALLBACK |
|||
#if (defined(WIN32) || defined(_WIN32) || defined (WINDOWS) || defined (_WINDOWS)) && defined(CALLBACK) && defined (USEWINDOWS_CALLBACK) |
|||
#define ZCALLBACK CALLBACK |
|||
#else |
|||
#define ZCALLBACK |
|||
#endif |
|||
#endif |
|||
|
|||
|
|||
|
|||
|
|||
typedef voidpf (ZCALLBACK *open_file_func) OF((voidpf opaque, const char* filename, int mode)); |
|||
typedef uLong (ZCALLBACK *read_file_func) OF((voidpf opaque, voidpf stream, void* buf, uLong size)); |
|||
typedef uLong (ZCALLBACK *write_file_func) OF((voidpf opaque, voidpf stream, const void* buf, uLong size)); |
|||
typedef int (ZCALLBACK *close_file_func) OF((voidpf opaque, voidpf stream)); |
|||
typedef int (ZCALLBACK *testerror_file_func) OF((voidpf opaque, voidpf stream)); |
|||
|
|||
typedef long (ZCALLBACK *tell_file_func) OF((voidpf opaque, voidpf stream)); |
|||
typedef long (ZCALLBACK *seek_file_func) OF((voidpf opaque, voidpf stream, uLong offset, int origin)); |
|||
|
|||
|
|||
/* here is the "old" 32 bits structure structure */ |
|||
typedef struct zlib_filefunc_def_s |
|||
{ |
|||
open_file_func zopen_file; |
|||
read_file_func zread_file; |
|||
write_file_func zwrite_file; |
|||
tell_file_func ztell_file; |
|||
seek_file_func zseek_file; |
|||
close_file_func zclose_file; |
|||
testerror_file_func zerror_file; |
|||
voidpf opaque; |
|||
} zlib_filefunc_def; |
|||
|
|||
typedef ZPOS64_T (ZCALLBACK *tell64_file_func) OF((voidpf opaque, voidpf stream)); |
|||
typedef long (ZCALLBACK *seek64_file_func) OF((voidpf opaque, voidpf stream, ZPOS64_T offset, int origin)); |
|||
typedef voidpf (ZCALLBACK *open64_file_func) OF((voidpf opaque, const void* filename, int mode)); |
|||
|
|||
typedef struct zlib_filefunc64_def_s |
|||
{ |
|||
open64_file_func zopen64_file; |
|||
read_file_func zread_file; |
|||
write_file_func zwrite_file; |
|||
tell64_file_func ztell64_file; |
|||
seek64_file_func zseek64_file; |
|||
close_file_func zclose_file; |
|||
testerror_file_func zerror_file; |
|||
voidpf opaque; |
|||
} zlib_filefunc64_def; |
|||
|
|||
void fill_fopen64_filefunc OF((zlib_filefunc64_def* pzlib_filefunc_def)); |
|||
void fill_fopen_filefunc OF((zlib_filefunc_def* pzlib_filefunc_def)); |
|||
|
|||
/* now internal definition, only for zip.c and unzip.h */ |
|||
typedef struct zlib_filefunc64_32_def_s |
|||
{ |
|||
zlib_filefunc64_def zfile_func64; |
|||
open_file_func zopen32_file; |
|||
tell_file_func ztell32_file; |
|||
seek_file_func zseek32_file; |
|||
} zlib_filefunc64_32_def; |
|||
|
|||
|
|||
#define ZREAD64(filefunc,filestream,buf,size) ((*((filefunc).zfile_func64.zread_file)) ((filefunc).zfile_func64.opaque,filestream,buf,size)) |
|||
#define ZWRITE64(filefunc,filestream,buf,size) ((*((filefunc).zfile_func64.zwrite_file)) ((filefunc).zfile_func64.opaque,filestream,buf,size)) |
|||
//#define ZTELL64(filefunc,filestream) ((*((filefunc).ztell64_file)) ((filefunc).opaque,filestream))
|
|||
//#define ZSEEK64(filefunc,filestream,pos,mode) ((*((filefunc).zseek64_file)) ((filefunc).opaque,filestream,pos,mode))
|
|||
#define ZCLOSE64(filefunc,filestream) ((*((filefunc).zfile_func64.zclose_file)) ((filefunc).zfile_func64.opaque,filestream)) |
|||
#define ZERROR64(filefunc,filestream) ((*((filefunc).zfile_func64.zerror_file)) ((filefunc).zfile_func64.opaque,filestream)) |
|||
|
|||
voidpf call_zopen64 OF((const zlib_filefunc64_32_def* pfilefunc,const void*filename,int mode)); |
|||
long call_zseek64 OF((const zlib_filefunc64_32_def* pfilefunc,voidpf filestream, ZPOS64_T offset, int origin)); |
|||
ZPOS64_T call_ztell64 OF((const zlib_filefunc64_32_def* pfilefunc,voidpf filestream)); |
|||
|
|||
void fill_zlib_filefunc64_32_def_from_filefunc32(zlib_filefunc64_32_def* p_filefunc64_32,const zlib_filefunc_def* p_filefunc32); |
|||
|
|||
#define ZOPEN64(filefunc,filename,mode) (call_zopen64((&(filefunc)),(filename),(mode))) |
|||
#define ZTELL64(filefunc,filestream) (call_ztell64((&(filefunc)),(filestream))) |
|||
#define ZSEEK64(filefunc,filestream,pos,mode) (call_zseek64((&(filefunc)),(filestream),(pos),(mode))) |
|||
|
|||
#ifdef __cplusplus |
|||
} |
|||
#endif |
|||
|
|||
#endif |
@ -1,389 +0,0 @@ |
|||
/* iowin32.c -- IO base function header for compress/uncompress .zip
|
|||
Version 1.1, February 14h, 2010 |
|||
part of the MiniZip project - ( http://www.winimage.com/zLibDll/minizip.html )
|
|||
|
|||
Copyright (C) 1998-2010 Gilles Vollant (minizip) ( http://www.winimage.com/zLibDll/minizip.html )
|
|||
|
|||
Modifications for Zip64 support |
|||
Copyright (C) 2009-2010 Mathias Svensson ( http://result42.com )
|
|||
|
|||
For more info read MiniZip_info.txt |
|||
|
|||
*/ |
|||
|
|||
#include <stdlib.h> |
|||
|
|||
#include "zlib.h" |
|||
#include "ioapi.h" |
|||
#include "iowin32.h" |
|||
|
|||
#ifndef INVALID_HANDLE_VALUE |
|||
#define INVALID_HANDLE_VALUE (0xFFFFFFFF) |
|||
#endif |
|||
|
|||
#ifndef INVALID_SET_FILE_POINTER |
|||
#define INVALID_SET_FILE_POINTER ((DWORD)-1) |
|||
#endif |
|||
|
|||
voidpf ZCALLBACK win32_open_file_func OF((voidpf opaque, const char* filename, int mode)); |
|||
uLong ZCALLBACK win32_read_file_func OF((voidpf opaque, voidpf stream, void* buf, uLong size)); |
|||
uLong ZCALLBACK win32_write_file_func OF((voidpf opaque, voidpf stream, const void* buf, uLong size)); |
|||
ZPOS64_T ZCALLBACK win32_tell64_file_func OF((voidpf opaque, voidpf stream)); |
|||
long ZCALLBACK win32_seek64_file_func OF((voidpf opaque, voidpf stream, ZPOS64_T offset, int origin)); |
|||
int ZCALLBACK win32_close_file_func OF((voidpf opaque, voidpf stream)); |
|||
int ZCALLBACK win32_error_file_func OF((voidpf opaque, voidpf stream)); |
|||
|
|||
typedef struct |
|||
{ |
|||
HANDLE hf; |
|||
int error; |
|||
} WIN32FILE_IOWIN; |
|||
|
|||
|
|||
static void win32_translate_open_mode(int mode, |
|||
DWORD* lpdwDesiredAccess, |
|||
DWORD* lpdwCreationDisposition, |
|||
DWORD* lpdwShareMode, |
|||
DWORD* lpdwFlagsAndAttributes) |
|||
{ |
|||
*lpdwDesiredAccess = *lpdwShareMode = *lpdwFlagsAndAttributes = *lpdwCreationDisposition = 0; |
|||
|
|||
if ((mode & ZLIB_FILEFUNC_MODE_READWRITEFILTER)==ZLIB_FILEFUNC_MODE_READ) |
|||
{ |
|||
*lpdwDesiredAccess = GENERIC_READ; |
|||
*lpdwCreationDisposition = OPEN_EXISTING; |
|||
*lpdwShareMode = FILE_SHARE_READ; |
|||
} |
|||
else if (mode & ZLIB_FILEFUNC_MODE_EXISTING) |
|||
{ |
|||
*lpdwDesiredAccess = GENERIC_WRITE | GENERIC_READ; |
|||
*lpdwCreationDisposition = OPEN_EXISTING; |
|||
} |
|||
else if (mode & ZLIB_FILEFUNC_MODE_CREATE) |
|||
{ |
|||
*lpdwDesiredAccess = GENERIC_WRITE | GENERIC_READ; |
|||
*lpdwCreationDisposition = CREATE_ALWAYS; |
|||
} |
|||
} |
|||
|
|||
static voidpf win32_build_iowin(HANDLE hFile) |
|||
{ |
|||
voidpf ret=NULL; |
|||
|
|||
if ((hFile != NULL) && (hFile != INVALID_HANDLE_VALUE)) |
|||
{ |
|||
WIN32FILE_IOWIN w32fiow; |
|||
w32fiow.hf = hFile; |
|||
w32fiow.error = 0; |
|||
ret = malloc(sizeof(WIN32FILE_IOWIN)); |
|||
|
|||
if (ret==NULL) |
|||
CloseHandle(hFile); |
|||
else |
|||
*((WIN32FILE_IOWIN*)ret) = w32fiow; |
|||
} |
|||
return ret; |
|||
} |
|||
|
|||
voidpf ZCALLBACK win32_open64_file_func (voidpf opaque,const void* filename,int mode) |
|||
{ |
|||
const char* mode_fopen = NULL; |
|||
DWORD dwDesiredAccess,dwCreationDisposition,dwShareMode,dwFlagsAndAttributes ; |
|||
HANDLE hFile = NULL; |
|||
|
|||
win32_translate_open_mode(mode,&dwDesiredAccess,&dwCreationDisposition,&dwShareMode,&dwFlagsAndAttributes); |
|||
|
|||
if ((filename!=NULL) && (dwDesiredAccess != 0)) |
|||
hFile = CreateFile((LPCTSTR)filename, dwDesiredAccess, dwShareMode, NULL, dwCreationDisposition, dwFlagsAndAttributes, NULL); |
|||
|
|||
return win32_build_iowin(hFile); |
|||
} |
|||
|
|||
|
|||
voidpf ZCALLBACK win32_open64_file_funcA (voidpf opaque,const void* filename,int mode) |
|||
{ |
|||
const char* mode_fopen = NULL; |
|||
DWORD dwDesiredAccess,dwCreationDisposition,dwShareMode,dwFlagsAndAttributes ; |
|||
HANDLE hFile = NULL; |
|||
|
|||
win32_translate_open_mode(mode,&dwDesiredAccess,&dwCreationDisposition,&dwShareMode,&dwFlagsAndAttributes); |
|||
|
|||
if ((filename!=NULL) && (dwDesiredAccess != 0)) |
|||
hFile = CreateFileA((LPCSTR)filename, dwDesiredAccess, dwShareMode, NULL, dwCreationDisposition, dwFlagsAndAttributes, NULL); |
|||
|
|||
return win32_build_iowin(hFile); |
|||
} |
|||
|
|||
|
|||
voidpf ZCALLBACK win32_open64_file_funcW (voidpf opaque,const void* filename,int mode) |
|||
{ |
|||
const char* mode_fopen = NULL; |
|||
DWORD dwDesiredAccess,dwCreationDisposition,dwShareMode,dwFlagsAndAttributes ; |
|||
HANDLE hFile = NULL; |
|||
|
|||
win32_translate_open_mode(mode,&dwDesiredAccess,&dwCreationDisposition,&dwShareMode,&dwFlagsAndAttributes); |
|||
|
|||
if ((filename!=NULL) && (dwDesiredAccess != 0)) |
|||
hFile = CreateFileW((LPCWSTR)filename, dwDesiredAccess, dwShareMode, NULL, dwCreationDisposition, dwFlagsAndAttributes, NULL); |
|||
|
|||
return win32_build_iowin(hFile); |
|||
} |
|||
|
|||
|
|||
voidpf ZCALLBACK win32_open_file_func (voidpf opaque,const char* filename,int mode) |
|||
{ |
|||
const char* mode_fopen = NULL; |
|||
DWORD dwDesiredAccess,dwCreationDisposition,dwShareMode,dwFlagsAndAttributes ; |
|||
HANDLE hFile = NULL; |
|||
|
|||
win32_translate_open_mode(mode,&dwDesiredAccess,&dwCreationDisposition,&dwShareMode,&dwFlagsAndAttributes); |
|||
|
|||
if ((filename!=NULL) && (dwDesiredAccess != 0)) |
|||
hFile = CreateFile((LPCTSTR)filename, dwDesiredAccess, dwShareMode, NULL, dwCreationDisposition, dwFlagsAndAttributes, NULL); |
|||
|
|||
return win32_build_iowin(hFile); |
|||
} |
|||
|
|||
|
|||
uLong ZCALLBACK win32_read_file_func (voidpf opaque, voidpf stream, void* buf,uLong size) |
|||
{ |
|||
uLong ret=0; |
|||
HANDLE hFile = NULL; |
|||
if (stream!=NULL) |
|||
hFile = ((WIN32FILE_IOWIN*)stream) -> hf; |
|||
|
|||
if (hFile != NULL) |
|||
{ |
|||
if (!ReadFile(hFile, buf, size, &ret, NULL)) |
|||
{ |
|||
DWORD dwErr = GetLastError(); |
|||
if (dwErr == ERROR_HANDLE_EOF) |
|||
dwErr = 0; |
|||
((WIN32FILE_IOWIN*)stream) -> error=(int)dwErr; |
|||
} |
|||
} |
|||
|
|||
return ret; |
|||
} |
|||
|
|||
|
|||
uLong ZCALLBACK win32_write_file_func (voidpf opaque,voidpf stream,const void* buf,uLong size) |
|||
{ |
|||
uLong ret=0; |
|||
HANDLE hFile = NULL; |
|||
if (stream!=NULL) |
|||
hFile = ((WIN32FILE_IOWIN*)stream) -> hf; |
|||
|
|||
if (hFile != NULL) |
|||
{ |
|||
if (!WriteFile(hFile, buf, size, &ret, NULL)) |
|||
{ |
|||
DWORD dwErr = GetLastError(); |
|||
if (dwErr == ERROR_HANDLE_EOF) |
|||
dwErr = 0; |
|||
((WIN32FILE_IOWIN*)stream) -> error=(int)dwErr; |
|||
} |
|||
} |
|||
|
|||
return ret; |
|||
} |
|||
|
|||
long ZCALLBACK win32_tell_file_func (voidpf opaque,voidpf stream) |
|||
{ |
|||
long ret=-1; |
|||
HANDLE hFile = NULL; |
|||
if (stream!=NULL) |
|||
hFile = ((WIN32FILE_IOWIN*)stream) -> hf; |
|||
if (hFile != NULL) |
|||
{ |
|||
DWORD dwSet = SetFilePointer(hFile, 0, NULL, FILE_CURRENT); |
|||
if (dwSet == INVALID_SET_FILE_POINTER) |
|||
{ |
|||
DWORD dwErr = GetLastError(); |
|||
((WIN32FILE_IOWIN*)stream) -> error=(int)dwErr; |
|||
ret = -1; |
|||
} |
|||
else |
|||
ret=(long)dwSet; |
|||
} |
|||
return ret; |
|||
} |
|||
|
|||
ZPOS64_T ZCALLBACK win32_tell64_file_func (voidpf opaque, voidpf stream) |
|||
{ |
|||
ZPOS64_T ret= (ZPOS64_T)-1; |
|||
HANDLE hFile = NULL; |
|||
if (stream!=NULL) |
|||
hFile = ((WIN32FILE_IOWIN*)stream)->hf; |
|||
|
|||
if (hFile) |
|||
{ |
|||
LARGE_INTEGER li; |
|||
li.QuadPart = 0; |
|||
li.u.LowPart = SetFilePointer(hFile, li.u.LowPart, &li.u.HighPart, FILE_CURRENT); |
|||
if ( (li.LowPart == 0xFFFFFFFF) && (GetLastError() != NO_ERROR)) |
|||
{ |
|||
DWORD dwErr = GetLastError(); |
|||
((WIN32FILE_IOWIN*)stream) -> error=(int)dwErr; |
|||
ret = (ZPOS64_T)-1; |
|||
} |
|||
else |
|||
ret=li.QuadPart; |
|||
} |
|||
return ret; |
|||
} |
|||
|
|||
|
|||
long ZCALLBACK win32_seek_file_func (voidpf opaque,voidpf stream,uLong offset,int origin) |
|||
{ |
|||
DWORD dwMoveMethod=0xFFFFFFFF; |
|||
HANDLE hFile = NULL; |
|||
|
|||
long ret=-1; |
|||
if (stream!=NULL) |
|||
hFile = ((WIN32FILE_IOWIN*)stream) -> hf; |
|||
switch (origin) |
|||
{ |
|||
case ZLIB_FILEFUNC_SEEK_CUR : |
|||
dwMoveMethod = FILE_CURRENT; |
|||
break; |
|||
case ZLIB_FILEFUNC_SEEK_END : |
|||
dwMoveMethod = FILE_END; |
|||
break; |
|||
case ZLIB_FILEFUNC_SEEK_SET : |
|||
dwMoveMethod = FILE_BEGIN; |
|||
break; |
|||
default: return -1; |
|||
} |
|||
|
|||
if (hFile != NULL) |
|||
{ |
|||
DWORD dwSet = SetFilePointer(hFile, offset, NULL, dwMoveMethod); |
|||
if (dwSet == INVALID_SET_FILE_POINTER) |
|||
{ |
|||
DWORD dwErr = GetLastError(); |
|||
((WIN32FILE_IOWIN*)stream) -> error=(int)dwErr; |
|||
ret = -1; |
|||
} |
|||
else |
|||
ret=0; |
|||
} |
|||
return ret; |
|||
} |
|||
|
|||
long ZCALLBACK win32_seek64_file_func (voidpf opaque, voidpf stream,ZPOS64_T offset,int origin) |
|||
{ |
|||
DWORD dwMoveMethod=0xFFFFFFFF; |
|||
HANDLE hFile = NULL; |
|||
long ret=-1; |
|||
|
|||
if (stream!=NULL) |
|||
hFile = ((WIN32FILE_IOWIN*)stream)->hf; |
|||
|
|||
switch (origin) |
|||
{ |
|||
case ZLIB_FILEFUNC_SEEK_CUR : |
|||
dwMoveMethod = FILE_CURRENT; |
|||
break; |
|||
case ZLIB_FILEFUNC_SEEK_END : |
|||
dwMoveMethod = FILE_END; |
|||
break; |
|||
case ZLIB_FILEFUNC_SEEK_SET : |
|||
dwMoveMethod = FILE_BEGIN; |
|||
break; |
|||
default: return -1; |
|||
} |
|||
|
|||
if (hFile) |
|||
{ |
|||
LARGE_INTEGER* li = (LARGE_INTEGER*)&offset; |
|||
DWORD dwSet = SetFilePointer(hFile, li->u.LowPart, &li->u.HighPart, dwMoveMethod); |
|||
if (dwSet == INVALID_SET_FILE_POINTER) |
|||
{ |
|||
DWORD dwErr = GetLastError(); |
|||
((WIN32FILE_IOWIN*)stream) -> error=(int)dwErr; |
|||
ret = -1; |
|||
} |
|||
else |
|||
ret=0; |
|||
} |
|||
return ret; |
|||
} |
|||
|
|||
int ZCALLBACK win32_close_file_func (voidpf opaque, voidpf stream) |
|||
{ |
|||
int ret=-1; |
|||
|
|||
if (stream!=NULL) |
|||
{ |
|||
HANDLE hFile; |
|||
hFile = ((WIN32FILE_IOWIN*)stream) -> hf; |
|||
if (hFile != NULL) |
|||
{ |
|||
CloseHandle(hFile); |
|||
ret=0; |
|||
} |
|||
free(stream); |
|||
} |
|||
return ret; |
|||
} |
|||
|
|||
int ZCALLBACK win32_error_file_func (voidpf opaque,voidpf stream) |
|||
{ |
|||
int ret=-1; |
|||
if (stream!=NULL) |
|||
{ |
|||
ret = ((WIN32FILE_IOWIN*)stream) -> error; |
|||
} |
|||
return ret; |
|||
} |
|||
|
|||
void fill_win32_filefunc (zlib_filefunc_def* pzlib_filefunc_def) |
|||
{ |
|||
pzlib_filefunc_def->zopen_file = win32_open_file_func; |
|||
pzlib_filefunc_def->zread_file = win32_read_file_func; |
|||
pzlib_filefunc_def->zwrite_file = win32_write_file_func; |
|||
pzlib_filefunc_def->ztell_file = win32_tell_file_func; |
|||
pzlib_filefunc_def->zseek_file = win32_seek_file_func; |
|||
pzlib_filefunc_def->zclose_file = win32_close_file_func; |
|||
pzlib_filefunc_def->zerror_file = win32_error_file_func; |
|||
pzlib_filefunc_def->opaque = NULL; |
|||
} |
|||
|
|||
void fill_win32_filefunc64(zlib_filefunc64_def* pzlib_filefunc_def) |
|||
{ |
|||
pzlib_filefunc_def->zopen64_file = win32_open64_file_func; |
|||
pzlib_filefunc_def->zread_file = win32_read_file_func; |
|||
pzlib_filefunc_def->zwrite_file = win32_write_file_func; |
|||
pzlib_filefunc_def->ztell64_file = win32_tell64_file_func; |
|||
pzlib_filefunc_def->zseek64_file = win32_seek64_file_func; |
|||
pzlib_filefunc_def->zclose_file = win32_close_file_func; |
|||
pzlib_filefunc_def->zerror_file = win32_error_file_func; |
|||
pzlib_filefunc_def->opaque = NULL; |
|||
} |
|||
|
|||
|
|||
void fill_win32_filefunc64A(zlib_filefunc64_def* pzlib_filefunc_def) |
|||
{ |
|||
pzlib_filefunc_def->zopen64_file = win32_open64_file_funcA; |
|||
pzlib_filefunc_def->zread_file = win32_read_file_func; |
|||
pzlib_filefunc_def->zwrite_file = win32_write_file_func; |
|||
pzlib_filefunc_def->ztell64_file = win32_tell64_file_func; |
|||
pzlib_filefunc_def->zseek64_file = win32_seek64_file_func; |
|||
pzlib_filefunc_def->zclose_file = win32_close_file_func; |
|||
pzlib_filefunc_def->zerror_file = win32_error_file_func; |
|||
pzlib_filefunc_def->opaque = NULL; |
|||
} |
|||
|
|||
|
|||
void fill_win32_filefunc64W(zlib_filefunc64_def* pzlib_filefunc_def) |
|||
{ |
|||
pzlib_filefunc_def->zopen64_file = win32_open64_file_funcW; |
|||
pzlib_filefunc_def->zread_file = win32_read_file_func; |
|||
pzlib_filefunc_def->zwrite_file = win32_write_file_func; |
|||
pzlib_filefunc_def->ztell64_file = win32_tell64_file_func; |
|||
pzlib_filefunc_def->zseek64_file = win32_seek64_file_func; |
|||
pzlib_filefunc_def->zclose_file = win32_close_file_func; |
|||
pzlib_filefunc_def->zerror_file = win32_error_file_func; |
|||
pzlib_filefunc_def->opaque = NULL; |
|||
} |
@ -1,28 +0,0 @@ |
|||
/* iowin32.h -- IO base function header for compress/uncompress .zip
|
|||
Version 1.1, February 14h, 2010 |
|||
part of the MiniZip project - ( http://www.winimage.com/zLibDll/minizip.html )
|
|||
|
|||
Copyright (C) 1998-2010 Gilles Vollant (minizip) ( http://www.winimage.com/zLibDll/minizip.html )
|
|||
|
|||
Modifications for Zip64 support |
|||
Copyright (C) 2009-2010 Mathias Svensson ( http://result42.com )
|
|||
|
|||
For more info read MiniZip_info.txt |
|||
|
|||
*/ |
|||
|
|||
#include <windows.h> |
|||
|
|||
|
|||
#ifdef __cplusplus |
|||
extern "C" { |
|||
#endif |
|||
|
|||
void fill_win32_filefunc OF((zlib_filefunc_def* pzlib_filefunc_def)); |
|||
void fill_win32_filefunc64 OF((zlib_filefunc64_def* pzlib_filefunc_def)); |
|||
void fill_win32_filefunc64A OF((zlib_filefunc64_def* pzlib_filefunc_def)); |
|||
void fill_win32_filefunc64W OF((zlib_filefunc64_def* pzlib_filefunc_def)); |
|||
|
|||
#ifdef __cplusplus |
|||
} |
|||
#endif |
@ -1,648 +0,0 @@ |
|||
/*
|
|||
miniunz.c |
|||
Version 1.1, February 14h, 2010 |
|||
sample part of the MiniZip project - ( http://www.winimage.com/zLibDll/minizip.html )
|
|||
|
|||
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> |
|||
#include <time.h> |
|||
#include <errno.h> |
|||
#include <fcntl.h> |
|||
|
|||
#ifdef unix |
|||
# include <unistd.h> |
|||
# include <utime.h> |
|||
#else |
|||
# include <direct.h> |
|||
# include <io.h> |
|||
#endif |
|||
|
|||
#include "unzip.h" |
|||
|
|||
#define CASESENSITIVITY (0) |
|||
#define WRITEBUFFERSIZE (8192) |
|||
#define MAXFILENAME (256) |
|||
|
|||
#ifdef _WIN32 |
|||
#define USEWIN32IOAPI |
|||
#include "iowin32.h" |
|||
#endif |
|||
/*
|
|||
mini unzip, demo of unzip package |
|||
|
|||
usage : |
|||
Usage : miniunz [-exvlo] file.zip [file_to_extract] [-d extractdir] |
|||
|
|||
list the file in the zipfile, and print the content of FILE_ID.ZIP or README.TXT |
|||
if it exists |
|||
*/ |
|||
|
|||
|
|||
/* change_file_date : change the date/time of a file
|
|||
filename : the filename of the file where date/time must be modified |
|||
dosdate : the new date at the MSDos format (4 bytes) |
|||
tmu_date : the SAME new date at the tm_unz format */ |
|||
void change_file_date(filename,dosdate,tmu_date) |
|||
const char *filename; |
|||
uLong dosdate; |
|||
tm_unz tmu_date; |
|||
{ |
|||
#ifdef _WIN32 |
|||
HANDLE hFile; |
|||
FILETIME ftm,ftLocal,ftCreate,ftLastAcc,ftLastWrite; |
|||
|
|||
hFile = CreateFileA(filename,GENERIC_READ | GENERIC_WRITE, |
|||
0,NULL,OPEN_EXISTING,0,NULL); |
|||
GetFileTime(hFile,&ftCreate,&ftLastAcc,&ftLastWrite); |
|||
DosDateTimeToFileTime((WORD)(dosdate>>16),(WORD)dosdate,&ftLocal); |
|||
LocalFileTimeToFileTime(&ftLocal,&ftm); |
|||
SetFileTime(hFile,&ftm,&ftLastAcc,&ftm); |
|||
CloseHandle(hFile); |
|||
#else |
|||
#ifdef unix |
|||
struct utimbuf ut; |
|||
struct tm newdate; |
|||
newdate.tm_sec = tmu_date.tm_sec; |
|||
newdate.tm_min=tmu_date.tm_min; |
|||
newdate.tm_hour=tmu_date.tm_hour; |
|||
newdate.tm_mday=tmu_date.tm_mday; |
|||
newdate.tm_mon=tmu_date.tm_mon; |
|||
if (tmu_date.tm_year > 1900) |
|||
newdate.tm_year=tmu_date.tm_year - 1900; |
|||
else |
|||
newdate.tm_year=tmu_date.tm_year ; |
|||
newdate.tm_isdst=-1; |
|||
|
|||
ut.actime=ut.modtime=mktime(&newdate); |
|||
utime(filename,&ut); |
|||
#endif |
|||
#endif |
|||
} |
|||
|
|||
|
|||
/* mymkdir and change_file_date are not 100 % portable
|
|||
As I don't know well Unix, I wait feedback for the unix portion */ |
|||
|
|||
int mymkdir(dirname) |
|||
const char* dirname; |
|||
{ |
|||
int ret=0; |
|||
#ifdef _WIN32 |
|||
ret = _mkdir(dirname); |
|||
#else |
|||
#ifdef unix |
|||
ret = mkdir (dirname,0775); |
|||
#endif |
|||
#endif |
|||
return ret; |
|||
} |
|||
|
|||
int makedir (newdir) |
|||
char *newdir; |
|||
{ |
|||
char *buffer ; |
|||
char *p; |
|||
int len = (int)strlen(newdir); |
|||
|
|||
if (len <= 0) |
|||
return 0; |
|||
|
|||
buffer = (char*)malloc(len+1); |
|||
if (buffer==NULL) |
|||
{ |
|||
printf("Error allocating memory\n"); |
|||
return UNZ_INTERNALERROR; |
|||
} |
|||
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; |
|||
} |
|||
|
|||
void do_banner() |
|||
{ |
|||
printf("MiniUnz 1.01b, demo of zLib + Unz package written by Gilles Vollant\n"); |
|||
printf("more info at http://www.winimage.com/zLibDll/unzip.html\n\n"); |
|||
} |
|||
|
|||
void do_help() |
|||
{ |
|||
printf("Usage : miniunz [-e] [-x] [-v] [-l] [-o] [-p password] file.zip [file_to_extr.] [-d extractdir]\n\n" \ |
|||
" -e Extract without pathname (junk paths)\n" \ |
|||
" -x Extract with pathname\n" \ |
|||
" -v list files\n" \ |
|||
" -l list files\n" \ |
|||
" -d directory to extract into\n" \ |
|||
" -o overwrite files without prompting\n" \ |
|||
" -p extract crypted file using password\n\n"); |
|||
} |
|||
|
|||
void Display64BitsSize(ZPOS64_T n, int size_char) |
|||
{ |
|||
/* to avoid compatibility problem , we do here the conversion */ |
|||
char number[21]; |
|||
int offset=19; |
|||
int pos_string = 19; |
|||
number[20]=0; |
|||
for (;;) { |
|||
number[offset]=(char)((n%10)+'0'); |
|||
if (number[offset] != '0') |
|||
pos_string=offset; |
|||
n/=10; |
|||
if (offset==0) |
|||
break; |
|||
offset--; |
|||
} |
|||
{ |
|||
int size_display_string = 19-pos_string; |
|||
while (size_char > size_display_string) |
|||
{ |
|||
size_char--; |
|||
printf(" "); |
|||
} |
|||
} |
|||
|
|||
printf("%s",&number[pos_string]); |
|||
} |
|||
|
|||
int do_list(uf) |
|||
unzFile uf; |
|||
{ |
|||
uLong i; |
|||
unz_global_info64 gi; |
|||
int err; |
|||
|
|||
err = unzGetGlobalInfo64(uf,&gi); |
|||
if (err!=UNZ_OK) |
|||
printf("error %d with zipfile in unzGetGlobalInfo \n",err); |
|||
printf(" Length Method Size Ratio Date Time CRC-32 Name\n"); |
|||
printf(" ------ ------ ---- ----- ---- ---- ------ ----\n"); |
|||
for (i=0;i<gi.number_entry;i++) |
|||
{ |
|||
char filename_inzip[256]; |
|||
unz_file_info64 file_info; |
|||
uLong ratio=0; |
|||
const char *string_method; |
|||
char charCrypt=' '; |
|||
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); |
|||
break; |
|||
} |
|||
if (file_info.uncompressed_size>0) |
|||
ratio = (uLong)((file_info.compressed_size*100)/file_info.uncompressed_size); |
|||
|
|||
/* display a '*' if the file is crypted */ |
|||
if ((file_info.flag & 1) != 0) |
|||
charCrypt='*'; |
|||
|
|||
if (file_info.compression_method==0) |
|||
string_method="Stored"; |
|||
else |
|||
if (file_info.compression_method==Z_DEFLATED) |
|||
{ |
|||
uInt iLevel=(uInt)((file_info.flag & 0x6)/2); |
|||
if (iLevel==0) |
|||
string_method="Defl:N"; |
|||
else if (iLevel==1) |
|||
string_method="Defl:X"; |
|||
else if ((iLevel==2) || (iLevel==3)) |
|||
string_method="Defl:F"; /* 2:fast , 3 : extra fast*/ |
|||
} |
|||
else |
|||
if (file_info.compression_method==Z_BZIP2ED) |
|||
{ |
|||
string_method="BZip2 "; |
|||
} |
|||
else |
|||
string_method="Unkn. "; |
|||
|
|||
Display64BitsSize(file_info.uncompressed_size,7); |
|||
printf(" %6s%c",string_method,charCrypt); |
|||
Display64BitsSize(file_info.compressed_size,7); |
|||
printf(" %3lu%% %2.2lu-%2.2lu-%2.2lu %2.2lu:%2.2lu %8.8lx %s\n", |
|||
ratio, |
|||
(uLong)file_info.tmu_date.tm_mon + 1, |
|||
(uLong)file_info.tmu_date.tm_mday, |
|||
(uLong)file_info.tmu_date.tm_year % 100, |
|||
(uLong)file_info.tmu_date.tm_hour,(uLong)file_info.tmu_date.tm_min, |
|||
(uLong)file_info.crc,filename_inzip); |
|||
if ((i+1)<gi.number_entry) |
|||
{ |
|||
err = unzGoToNextFile(uf); |
|||
if (err!=UNZ_OK) |
|||
{ |
|||
printf("error %d with zipfile in unzGoToNextFile\n",err); |
|||
break; |
|||
} |
|||
} |
|||
} |
|||
|
|||
return 0; |
|||
} |
|||
|
|||
|
|||
int do_extract_currentfile(uf,popt_extract_without_path,popt_overwrite,password) |
|||
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_info64 file_info; |
|||
uLong ratio=0; |
|||
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') |
|||
{ |
|||
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 = fopen64(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=fopen64(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=fopen64(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; |
|||
} |
|||
|
|||
|
|||
int do_extract(uf,opt_extract_without_path,opt_overwrite,password) |
|||
unzFile uf; |
|||
int opt_extract_without_path; |
|||
int opt_overwrite; |
|||
const char* password; |
|||
{ |
|||
uLong i; |
|||
unz_global_info64 gi; |
|||
int err; |
|||
FILE* fout=NULL; |
|||
|
|||
err = unzGetGlobalInfo64(uf,&gi); |
|||
if (err!=UNZ_OK) |
|||
printf("error %d with zipfile in unzGetGlobalInfo \n",err); |
|||
|
|||
for (i=0;i<gi.number_entry;i++) |
|||
{ |
|||
if (do_extract_currentfile(uf,&opt_extract_without_path, |
|||
&opt_overwrite, |
|||
password) != UNZ_OK) |
|||
break; |
|||
|
|||
if ((i+1)<gi.number_entry) |
|||
{ |
|||
err = unzGoToNextFile(uf); |
|||
if (err!=UNZ_OK) |
|||
{ |
|||
printf("error %d with zipfile in unzGoToNextFile\n",err); |
|||
break; |
|||
} |
|||
} |
|||
} |
|||
|
|||
return 0; |
|||
} |
|||
|
|||
int do_extract_onefile(uf,filename,opt_extract_without_path,opt_overwrite,password) |
|||
unzFile uf; |
|||
const char* filename; |
|||
int opt_extract_without_path; |
|||
int opt_overwrite; |
|||
const char* password; |
|||
{ |
|||
int err = UNZ_OK; |
|||
if (unzLocateFile(uf,filename,CASESENSITIVITY)!=UNZ_OK) |
|||
{ |
|||
printf("file %s not found in the zipfile\n",filename); |
|||
return 2; |
|||
} |
|||
|
|||
if (do_extract_currentfile(uf,&opt_extract_without_path, |
|||
&opt_overwrite, |
|||
password) == UNZ_OK) |
|||
return 0; |
|||
else |
|||
return 1; |
|||
} |
|||
|
|||
|
|||
int main(argc,argv) |
|||
int argc; |
|||
char *argv[]; |
|||
{ |
|||
const char *zipfilename=NULL; |
|||
const char *filename_to_extract=NULL; |
|||
const char *password=NULL; |
|||
char filename_try[MAXFILENAME+16] = ""; |
|||
int i; |
|||
int ret_value=0; |
|||
int opt_do_list=0; |
|||
int opt_do_extract=1; |
|||
int opt_do_extract_withoutpath=0; |
|||
int opt_overwrite=0; |
|||
int opt_extractdir=0; |
|||
const char *dirname=NULL; |
|||
unzFile uf=NULL; |
|||
|
|||
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=='l') || (c=='L')) |
|||
opt_do_list = 1; |
|||
if ((c=='v') || (c=='V')) |
|||
opt_do_list = 1; |
|||
if ((c=='x') || (c=='X')) |
|||
opt_do_extract = 1; |
|||
if ((c=='e') || (c=='E')) |
|||
opt_do_extract = opt_do_extract_withoutpath = 1; |
|||
if ((c=='o') || (c=='O')) |
|||
opt_overwrite=1; |
|||
if ((c=='d') || (c=='D')) |
|||
{ |
|||
opt_extractdir=1; |
|||
dirname=argv[i+1]; |
|||
} |
|||
|
|||
if (((c=='p') || (c=='P')) && (i+1<argc)) |
|||
{ |
|||
password=argv[i+1]; |
|||
i++; |
|||
} |
|||
} |
|||
} |
|||
else |
|||
{ |
|||
if (zipfilename == NULL) |
|||
zipfilename = argv[i]; |
|||
else if ((filename_to_extract==NULL) && (!opt_extractdir)) |
|||
filename_to_extract = argv[i] ; |
|||
} |
|||
} |
|||
} |
|||
|
|||
if (zipfilename!=NULL) |
|||
{ |
|||
|
|||
# ifdef USEWIN32IOAPI |
|||
zlib_filefunc64_def ffunc; |
|||
# endif |
|||
|
|||
strncpy(filename_try, zipfilename,MAXFILENAME-1); |
|||
/* strncpy doesnt append the trailing NULL, of the string is too long. */ |
|||
filename_try[ MAXFILENAME ] = '\0'; |
|||
|
|||
# ifdef USEWIN32IOAPI |
|||
fill_win32_filefunc64A(&ffunc); |
|||
uf = unzOpen2_64(zipfilename,&ffunc); |
|||
# else |
|||
uf = unzOpen64(zipfilename); |
|||
# endif |
|||
if (uf==NULL) |
|||
{ |
|||
strcat(filename_try,".zip"); |
|||
# ifdef USEWIN32IOAPI |
|||
uf = unzOpen2_64(filename_try,&ffunc); |
|||
# else |
|||
uf = unzOpen64(filename_try); |
|||
# endif |
|||
} |
|||
} |
|||
|
|||
if (uf==NULL) |
|||
{ |
|||
printf("Cannot open %s or %s.zip\n",zipfilename,zipfilename); |
|||
return 1; |
|||
} |
|||
printf("%s opened\n",filename_try); |
|||
|
|||
if (opt_do_list==1) |
|||
ret_value = do_list(uf); |
|||
else if (opt_do_extract==1) |
|||
{ |
|||
#ifdef _WIN32 |
|||
if (opt_extractdir && _chdir(dirname)) |
|||
#else |
|||
if (opt_extractdir && chdir(dirname)) |
|||
#endif |
|||
{ |
|||
printf("Error changing into %s, aborting\n", dirname); |
|||
exit(-1); |
|||
} |
|||
|
|||
if (filename_to_extract == NULL) |
|||
ret_value = do_extract(uf, opt_do_extract_withoutpath, opt_overwrite, password); |
|||
else |
|||
ret_value = do_extract_onefile(uf, filename_to_extract, opt_do_extract_withoutpath, opt_overwrite, password); |
|||
} |
|||
|
|||
unzClose(uf); |
|||
|
|||
return ret_value; |
|||
} |
@ -1,507 +0,0 @@ |
|||
/*
|
|||
minizip.c |
|||
Version 1.1, February 14h, 2010 |
|||
sample part of the MiniZip project - ( http://www.winimage.com/zLibDll/minizip.html )
|
|||
|
|||
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> |
|||
#include <time.h> |
|||
#include <errno.h> |
|||
#include <fcntl.h> |
|||
|
|||
#ifdef unix |
|||
# include <unistd.h> |
|||
# include <utime.h> |
|||
# include <sys/types.h> |
|||
# include <sys/stat.h> |
|||
#else |
|||
# include <direct.h> |
|||
# include <io.h> |
|||
#endif |
|||
|
|||
#include "zip.h" |
|||
|
|||
#ifdef _WIN32 |
|||
#define USEWIN32IOAPI |
|||
#include "iowin32.h" |
|||
#endif |
|||
|
|||
|
|||
|
|||
#define WRITEBUFFERSIZE (16384) |
|||
#define MAXFILENAME (256) |
|||
|
|||
#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 */ |
|||
uLong *dt; /* dostime */ |
|||
{ |
|||
int ret = 0; |
|||
{ |
|||
FILETIME ftLocal; |
|||
HANDLE hFind; |
|||
WIN32_FIND_DATAA ff32; |
|||
|
|||
hFind = FindFirstFileA(f,&ff32); |
|||
if (hFind != INVALID_HANDLE_VALUE) |
|||
{ |
|||
FileTimeToLocalFileTime(&(ff32.ftLastWriteTime),&ftLocal); |
|||
FileTimeToDosDateTime(&ftLocal,((LPWORD)dt)+1,((LPWORD)dt)+0); |
|||
FindClose(hFind); |
|||
ret = 1; |
|||
} |
|||
} |
|||
return ret; |
|||
} |
|||
#else |
|||
#ifdef unix |
|||
uLong filetime(f, tmzip, dt) |
|||
char *f; /* name of file to get info on */ |
|||
tm_zip *tmzip; /* return value: access, modific. and creation times */ |
|||
uLong *dt; /* dostime */ |
|||
{ |
|||
int ret=0; |
|||
struct stat s; /* results of stat() */ |
|||
struct tm* filedate; |
|||
time_t tm_t=0; |
|||
|
|||
if (strcmp(f,"-")!=0) |
|||
{ |
|||
char name[MAXFILENAME+1]; |
|||
int len = strlen(f); |
|||
if (len > MAXFILENAME) |
|||
len = MAXFILENAME; |
|||
|
|||
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 */ |
|||
if (stat(name,&s)==0) |
|||
{ |
|||
tm_t = s.st_mtime; |
|||
ret = 1; |
|||
} |
|||
} |
|||
filedate = localtime(&tm_t); |
|||
|
|||
tmzip->tm_sec = filedate->tm_sec; |
|||
tmzip->tm_min = filedate->tm_min; |
|||
tmzip->tm_hour = filedate->tm_hour; |
|||
tmzip->tm_mday = filedate->tm_mday; |
|||
tmzip->tm_mon = filedate->tm_mon ; |
|||
tmzip->tm_year = filedate->tm_year; |
|||
|
|||
return ret; |
|||
} |
|||
#else |
|||
uLong filetime(f, tmzip, dt) |
|||
char *f; /* name of file to get info on */ |
|||
tm_zip *tmzip; /* return value: access, modific. and creation times */ |
|||
uLong *dt; /* dostime */ |
|||
{ |
|||
return 0; |
|||
} |
|||
#endif |
|||
#endif |
|||
|
|||
|
|||
|
|||
|
|||
int check_exist_file(filename) |
|||
const char* filename; |
|||
{ |
|||
FILE* ftestexist; |
|||
int ret = 1; |
|||
ftestexist = fopen64(filename,"rb"); |
|||
if (ftestexist==NULL) |
|||
ret = 0; |
|||
else |
|||
fclose(ftestexist); |
|||
return ret; |
|||
} |
|||
|
|||
void do_banner() |
|||
{ |
|||
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] [-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" \ |
|||
" -j exclude path. store only the file name.\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 = fopen64(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 %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[]; |
|||
{ |
|||
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; |
|||
int err=0; |
|||
int size_buf=0; |
|||
void* buf=NULL; |
|||
const char* password=NULL; |
|||
|
|||
|
|||
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; |
|||
if ((c=='a') || (c=='A')) |
|||
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)) |
|||
{ |
|||
password=argv[i+1]; |
|||
i++; |
|||
} |
|||
} |
|||
} |
|||
else |
|||
{ |
|||
if (zipfilenamearg == 0) |
|||
{ |
|||
zipfilenamearg = i ; |
|||
} |
|||
} |
|||
} |
|||
} |
|||
|
|||
size_buf = WRITEBUFFERSIZE; |
|||
buf = (void*)malloc(size_buf); |
|||
if (buf==NULL) |
|||
{ |
|||
printf("Error allocating memory\n"); |
|||
return ZIP_INTERNALERROR; |
|||
} |
|||
|
|||
if (zipfilenamearg==0) |
|||
{ |
|||
zipok=0; |
|||
} |
|||
else |
|||
{ |
|||
int i,len; |
|||
int dot_found=0; |
|||
|
|||
zipok = 1 ; |
|||
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; |
|||
|
|||
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=0; |
|||
do |
|||
{ |
|||
char answer[128]; |
|||
int ret; |
|||
printf("The file %s exists. Overwrite ? [y]es, [n]o, [a]ppend : ",filename_try); |
|||
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') |
|||
zipok = 0; |
|||
if (rep=='A') |
|||
opt_overwrite = 2; |
|||
} |
|||
} |
|||
|
|||
if (zipok==1) |
|||
{ |
|||
zipFile zf; |
|||
int errclose; |
|||
# ifdef USEWIN32IOAPI |
|||
zlib_filefunc64_def ffunc; |
|||
fill_win32_filefunc64A(&ffunc); |
|||
zf = zipOpen2_64(filename_try,(opt_overwrite==2) ? 2 : 0,NULL,&ffunc); |
|||
# else |
|||
zf = zipOpen64(filename_try,(opt_overwrite==2) ? 2 : 0); |
|||
# endif |
|||
|
|||
if (zf == NULL) |
|||
{ |
|||
printf("error opening %s\n",filename_try); |
|||
err= ZIP_ERRNO; |
|||
} |
|||
else |
|||
printf("creating %s\n",filename_try); |
|||
|
|||
for (i=zipfilenamearg+1;(i<argc) && (err==ZIP_OK);i++) |
|||
{ |
|||
if (!((((*(argv[i]))=='-') || ((*(argv[i]))=='/')) && |
|||
((argv[i][1]=='o') || (argv[i][1]=='O') || |
|||
(argv[i][1]=='a') || (argv[i][1]=='A') || |
|||
(argv[i][1]=='p') || (argv[i][1]=='P') || |
|||
((argv[i][1]>='0') || (argv[i][1]<='9'))) && |
|||
(strlen(argv[i]) == 2))) |
|||
{ |
|||
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; |
|||
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 * /, |
|||
(opt_compress_level != 0) ? Z_DEFLATED : 0, |
|||
opt_compress_level); |
|||
*/ |
|||
if ((password != NULL) && (err==ZIP_OK)) |
|||
err = getFileCrc(filenameinzip,buf,size_buf,&crcFile); |
|||
|
|||
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, zip64); |
|||
|
|||
if (err != ZIP_OK) |
|||
printf("error in opening %s in zipfile\n",filenameinzip); |
|||
else |
|||
{ |
|||
fin = fopen64(filenameinzip,"rb"); |
|||
if (fin==NULL) |
|||
{ |
|||
err=ZIP_ERRNO; |
|||
printf("error in opening %s for reading\n",filenameinzip); |
|||
} |
|||
} |
|||
|
|||
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) |
|||
{ |
|||
err = zipWriteInFileInZip (zf,buf,size_read); |
|||
if (err<0) |
|||
{ |
|||
printf("error in writing %s in the zipfile\n", |
|||
filenameinzip); |
|||
} |
|||
|
|||
} |
|||
} while ((err == ZIP_OK) && (size_read>0)); |
|||
|
|||
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", |
|||
filenameinzip); |
|||
} |
|||
} |
|||
} |
|||
errclose = zipClose(zf,NULL); |
|||
if (errclose != ZIP_OK) |
|||
printf("error in closing %s\n",filename_try); |
|||
} |
|||
else |
|||
{ |
|||
do_help(); |
|||
} |
|||
|
|||
free(buf); |
|||
return 0; |
|||
} |
@ -1,281 +0,0 @@ |
|||
/*
|
|||
Additional tools for Minizip |
|||
Code: Xavier Roche '2004 |
|||
License: Same as ZLIB (www.gzip.org) |
|||
*/ |
|||
|
|||
/* Code */ |
|||
#include <stdio.h> |
|||
#include <stdlib.h> |
|||
#include <string.h> |
|||
#include "zlib.h" |
|||
#include "unzip.h" |
|||
|
|||
#define READ_8(adr) ((unsigned char)*(adr)) |
|||
#define READ_16(adr) ( READ_8(adr) | (READ_8(adr+1) << 8) ) |
|||
#define READ_32(adr) ( READ_16(adr) | (READ_16((adr)+2) << 16) ) |
|||
|
|||
#define WRITE_8(buff, n) do { \ |
|||
*((unsigned char*)(buff)) = (unsigned char) ((n) & 0xff); \ |
|||
} while(0) |
|||
#define WRITE_16(buff, n) do { \ |
|||
WRITE_8((unsigned char*)(buff), n); \ |
|||
WRITE_8(((unsigned char*)(buff)) + 1, (n) >> 8); \ |
|||
} while(0) |
|||
#define WRITE_32(buff, n) do { \ |
|||
WRITE_16((unsigned char*)(buff), (n) & 0xffff); \ |
|||
WRITE_16((unsigned char*)(buff) + 2, (n) >> 16); \ |
|||
} while(0) |
|||
|
|||
extern int ZEXPORT unzRepair(file, fileOut, fileOutTmp, nRecovered, bytesRecovered) |
|||
const char* file; |
|||
const char* fileOut; |
|||
const char* fileOutTmp; |
|||
uLong* nRecovered; |
|||
uLong* bytesRecovered; |
|||
{ |
|||
int err = Z_OK; |
|||
FILE* fpZip = fopen(file, "rb"); |
|||
FILE* fpOut = fopen(fileOut, "wb"); |
|||
FILE* fpOutCD = fopen(fileOutTmp, "wb"); |
|||
if (fpZip != NULL && fpOut != NULL) { |
|||
int entries = 0; |
|||
uLong totalBytes = 0; |
|||
char header[30]; |
|||
char filename[256]; |
|||
char extra[1024]; |
|||
int offset = 0; |
|||
int offsetCD = 0; |
|||
while ( fread(header, 1, 30, fpZip) == 30 ) { |
|||
int currentOffset = offset; |
|||
|
|||
/* File entry */ |
|||
if (READ_32(header) == 0x04034b50) { |
|||
unsigned int version = READ_16(header + 4); |
|||
unsigned int gpflag = READ_16(header + 6); |
|||
unsigned int method = READ_16(header + 8); |
|||
unsigned int filetime = READ_16(header + 10); |
|||
unsigned int filedate = READ_16(header + 12); |
|||
unsigned int crc = READ_32(header + 14); /* crc */ |
|||
unsigned int cpsize = READ_32(header + 18); /* compressed size */ |
|||
unsigned int uncpsize = READ_32(header + 22); /* uncompressed sz */ |
|||
unsigned int fnsize = READ_16(header + 26); /* file name length */ |
|||
unsigned int extsize = READ_16(header + 28); /* extra field length */ |
|||
filename[0] = extra[0] = '\0'; |
|||
|
|||
/* Header */ |
|||
if (fwrite(header, 1, 30, fpOut) == 30) { |
|||
offset += 30; |
|||
} else { |
|||
err = Z_ERRNO; |
|||
break; |
|||
} |
|||
|
|||
/* Filename */ |
|||
if (fnsize > 0) { |
|||
if (fread(filename, 1, fnsize, fpZip) == fnsize) { |
|||
if (fwrite(filename, 1, fnsize, fpOut) == fnsize) { |
|||
offset += fnsize; |
|||
} else { |
|||
err = Z_ERRNO; |
|||
break; |
|||
} |
|||
} else { |
|||
err = Z_ERRNO; |
|||
break; |
|||
} |
|||
} else { |
|||
err = Z_STREAM_ERROR; |
|||
break; |
|||
} |
|||
|
|||
/* Extra field */ |
|||
if (extsize > 0) { |
|||
if (fread(extra, 1, extsize, fpZip) == extsize) { |
|||
if (fwrite(extra, 1, extsize, fpOut) == extsize) { |
|||
offset += extsize; |
|||
} else { |
|||
err = Z_ERRNO; |
|||
break; |
|||
} |
|||
} else { |
|||
err = Z_ERRNO; |
|||
break; |
|||
} |
|||
} |
|||
|
|||
/* Data */ |
|||
{ |
|||
int dataSize = cpsize; |
|||
if (dataSize == 0) { |
|||
dataSize = uncpsize; |
|||
} |
|||
if (dataSize > 0) { |
|||
char* data = malloc(dataSize); |
|||
if (data != NULL) { |
|||
if ((int)fread(data, 1, dataSize, fpZip) == dataSize) { |
|||
if ((int)fwrite(data, 1, dataSize, fpOut) == dataSize) { |
|||
offset += dataSize; |
|||
totalBytes += dataSize; |
|||
} else { |
|||
err = Z_ERRNO; |
|||
} |
|||
} else { |
|||
err = Z_ERRNO; |
|||
} |
|||
free(data); |
|||
if (err != Z_OK) { |
|||
break; |
|||
} |
|||
} else { |
|||
err = Z_MEM_ERROR; |
|||
break; |
|||
} |
|||
} |
|||
} |
|||
|
|||
/* Central directory entry */ |
|||
{ |
|||
char header[46]; |
|||
char* comment = ""; |
|||
int comsize = (int) strlen(comment); |
|||
WRITE_32(header, 0x02014b50); |
|||
WRITE_16(header + 4, version); |
|||
WRITE_16(header + 6, version); |
|||
WRITE_16(header + 8, gpflag); |
|||
WRITE_16(header + 10, method); |
|||
WRITE_16(header + 12, filetime); |
|||
WRITE_16(header + 14, filedate); |
|||
WRITE_32(header + 16, crc); |
|||
WRITE_32(header + 20, cpsize); |
|||
WRITE_32(header + 24, uncpsize); |
|||
WRITE_16(header + 28, fnsize); |
|||
WRITE_16(header + 30, extsize); |
|||
WRITE_16(header + 32, comsize); |
|||
WRITE_16(header + 34, 0); /* disk # */ |
|||
WRITE_16(header + 36, 0); /* int attrb */ |
|||
WRITE_32(header + 38, 0); /* ext attrb */ |
|||
WRITE_32(header + 42, currentOffset); |
|||
/* Header */ |
|||
if (fwrite(header, 1, 46, fpOutCD) == 46) { |
|||
offsetCD += 46; |
|||
|
|||
/* Filename */ |
|||
if (fnsize > 0) { |
|||
if (fwrite(filename, 1, fnsize, fpOutCD) == fnsize) { |
|||
offsetCD += fnsize; |
|||
} else { |
|||
err = Z_ERRNO; |
|||
break; |
|||
} |
|||
} else { |
|||
err = Z_STREAM_ERROR; |
|||
break; |
|||
} |
|||
|
|||
/* Extra field */ |
|||
if (extsize > 0) { |
|||
if (fwrite(extra, 1, extsize, fpOutCD) == extsize) { |
|||
offsetCD += extsize; |
|||
} else { |
|||
err = Z_ERRNO; |
|||
break; |
|||
} |
|||
} |
|||
|
|||
/* Comment field */ |
|||
if (comsize > 0) { |
|||
if ((int)fwrite(comment, 1, comsize, fpOutCD) == comsize) { |
|||
offsetCD += comsize; |
|||
} else { |
|||
err = Z_ERRNO; |
|||
break; |
|||
} |
|||
} |
|||
|
|||
|
|||
} else { |
|||
err = Z_ERRNO; |
|||
break; |
|||
} |
|||
} |
|||
|
|||
/* Success */ |
|||
entries++; |
|||
|
|||
} else { |
|||
break; |
|||
} |
|||
} |
|||
|
|||
/* Final central directory */ |
|||
{ |
|||
int entriesZip = entries; |
|||
char header[22]; |
|||
char* comment = ""; // "ZIP File recovered by zlib/minizip/mztools";
|
|||
int comsize = (int) strlen(comment); |
|||
if (entriesZip > 0xffff) { |
|||
entriesZip = 0xffff; |
|||
} |
|||
WRITE_32(header, 0x06054b50); |
|||
WRITE_16(header + 4, 0); /* disk # */ |
|||
WRITE_16(header + 6, 0); /* disk # */ |
|||
WRITE_16(header + 8, entriesZip); /* hack */ |
|||
WRITE_16(header + 10, entriesZip); /* hack */ |
|||
WRITE_32(header + 12, offsetCD); /* size of CD */ |
|||
WRITE_32(header + 16, offset); /* offset to CD */ |
|||
WRITE_16(header + 20, comsize); /* comment */ |
|||
|
|||
/* Header */ |
|||
if (fwrite(header, 1, 22, fpOutCD) == 22) { |
|||
|
|||
/* Comment field */ |
|||
if (comsize > 0) { |
|||
if ((int)fwrite(comment, 1, comsize, fpOutCD) != comsize) { |
|||
err = Z_ERRNO; |
|||
} |
|||
} |
|||
|
|||
} else { |
|||
err = Z_ERRNO; |
|||
} |
|||
} |
|||
|
|||
/* Final merge (file + central directory) */ |
|||
fclose(fpOutCD); |
|||
if (err == Z_OK) { |
|||
fpOutCD = fopen(fileOutTmp, "rb"); |
|||
if (fpOutCD != NULL) { |
|||
int nRead; |
|||
char buffer[8192]; |
|||
while ( (nRead = (int)fread(buffer, 1, sizeof(buffer), fpOutCD)) > 0) { |
|||
if ((int)fwrite(buffer, 1, nRead, fpOut) != nRead) { |
|||
err = Z_ERRNO; |
|||
break; |
|||
} |
|||
} |
|||
fclose(fpOutCD); |
|||
} |
|||
} |
|||
|
|||
/* Close */ |
|||
fclose(fpZip); |
|||
fclose(fpOut); |
|||
|
|||
/* Wipe temporary file */ |
|||
(void)remove(fileOutTmp); |
|||
|
|||
/* Number of recovered entries */ |
|||
if (err == Z_OK) { |
|||
if (nRecovered != NULL) { |
|||
*nRecovered = entries; |
|||
} |
|||
if (bytesRecovered != NULL) { |
|||
*bytesRecovered = totalBytes; |
|||
} |
|||
} |
|||
} else { |
|||
err = Z_STREAM_ERROR; |
|||
} |
|||
return err; |
|||
} |
@ -1,31 +0,0 @@ |
|||
/*
|
|||
Additional tools for Minizip |
|||
Code: Xavier Roche '2004 |
|||
License: Same as ZLIB (www.gzip.org) |
|||
*/ |
|||
|
|||
#ifndef _zip_tools_H |
|||
#define _zip_tools_H |
|||
|
|||
#ifdef __cplusplus |
|||
extern "C" { |
|||
#endif |
|||
|
|||
#ifndef _ZLIB_H |
|||
#include "zlib.h" |
|||
#endif |
|||
|
|||
#include "unzip.h" |
|||
|
|||
/* Repair a ZIP file (missing central directory)
|
|||
file: file to recover |
|||
fileOut: output file after recovery |
|||
fileOutTmp: temporary file name used for recovery |
|||
*/ |
|||
extern int ZEXPORT unzRepair(const char* file, |
|||
const char* fileOut, |
|||
const char* fileOutTmp, |
|||
uLong* nRecovered, |
|||
uLong* bytesRecovered); |
|||
|
|||
#endif |
File diff suppressed because it is too large
@ -1,437 +0,0 @@ |
|||
/* unzip.h -- IO for uncompress .zip files using zlib
|
|||
Version 1.1, February 14h, 2010 |
|||
part of the MiniZip project - ( http://www.winimage.com/zLibDll/minizip.html )
|
|||
|
|||
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 )
|
|||
|
|||
For more info read MiniZip_info.txt |
|||
|
|||
--------------------------------------------------------------------------------- |
|||
|
|||
Condition of use and distribution are the same than zlib : |
|||
|
|||
This software is provided 'as-is', without any express or implied |
|||
warranty. In no event will the authors be held liable for any damages |
|||
arising from the use of this software. |
|||
|
|||
Permission is granted to anyone to use this software for any purpose, |
|||
including commercial applications, and to alter it and redistribute it |
|||
freely, subject to the following restrictions: |
|||
|
|||
1. The origin of this software must not be misrepresented; you must not |
|||
claim that you wrote the original software. If you use this software |
|||
in a product, an acknowledgment in the product documentation would be |
|||
appreciated but is not required. |
|||
2. Altered source versions must be plainly marked as such, and must not be |
|||
misrepresented as being the original software. |
|||
3. This notice may not be removed or altered from any source distribution. |
|||
|
|||
--------------------------------------------------------------------------------- |
|||
|
|||
Changes |
|||
|
|||
See header of unzip64.c |
|||
|
|||
*/ |
|||
|
|||
#ifndef _unz64_H |
|||
#define _unz64_H |
|||
|
|||
#ifdef __cplusplus |
|||
extern "C" { |
|||
#endif |
|||
|
|||
#ifndef _ZLIB_H |
|||
#include "zlib.h" |
|||
#endif |
|||
|
|||
#ifndef _ZLIBIOAPI_H |
|||
#include "ioapi.h" |
|||
#endif |
|||
|
|||
#ifdef HAVE_BZIP2 |
|||
#include "bzlib.h" |
|||
#endif |
|||
|
|||
#define Z_BZIP2ED 12 |
|||
|
|||
#if defined(STRICTUNZIP) || defined(STRICTZIPUNZIP) |
|||
/* like the STRICT of WIN32, we define a pointer that cannot be converted
|
|||
from (void*) without cast */ |
|||
typedef struct TagunzFile__ { int unused; } unzFile__; |
|||
typedef unzFile__ *unzFile; |
|||
#else |
|||
typedef voidp unzFile; |
|||
#endif |
|||
|
|||
|
|||
#define UNZ_OK (0) |
|||
#define UNZ_END_OF_LIST_OF_FILE (-100) |
|||
#define UNZ_ERRNO (Z_ERRNO) |
|||
#define UNZ_EOF (0) |
|||
#define UNZ_PARAMERROR (-102) |
|||
#define UNZ_BADZIPFILE (-103) |
|||
#define UNZ_INTERNALERROR (-104) |
|||
#define UNZ_CRCERROR (-105) |
|||
|
|||
/* tm_unz contain date/time info */ |
|||
typedef struct tm_unz_s |
|||
{ |
|||
uInt tm_sec; /* seconds after the minute - [0,59] */ |
|||
uInt tm_min; /* minutes after the hour - [0,59] */ |
|||
uInt tm_hour; /* hours since midnight - [0,23] */ |
|||
uInt tm_mday; /* day of the month - [1,31] */ |
|||
uInt tm_mon; /* months since January - [0,11] */ |
|||
uInt tm_year; /* years - [1980..2044] */ |
|||
} tm_unz; |
|||
|
|||
/* unz_global_info structure contain global data about the ZIPfile
|
|||
These data comes from the end of central dir */ |
|||
typedef struct unz_global_info64_s |
|||
{ |
|||
ZPOS64_T number_entry; /* total number of entries in
|
|||
the central dir on this disk */ |
|||
uLong size_comment; /* size of the global comment of the zipfile */ |
|||
} unz_global_info64; |
|||
|
|||
typedef struct unz_global_info_s |
|||
{ |
|||
uLong number_entry; /* total number of entries in
|
|||
the central dir on this disk */ |
|||
uLong size_comment; /* size of the global comment of the zipfile */ |
|||
} unz_global_info; |
|||
|
|||
/* unz_file_info contain information about a file in the zipfile */ |
|||
typedef struct unz_file_info64_s |
|||
{ |
|||
uLong version; /* version made by 2 bytes */ |
|||
uLong version_needed; /* version needed to extract 2 bytes */ |
|||
uLong flag; /* general purpose bit flag 2 bytes */ |
|||
uLong compression_method; /* compression method 2 bytes */ |
|||
uLong dosDate; /* last mod file date in Dos fmt 4 bytes */ |
|||
uLong crc; /* crc-32 4 bytes */ |
|||
ZPOS64_T compressed_size; /* compressed size 8 bytes */ |
|||
ZPOS64_T uncompressed_size; /* uncompressed size 8 bytes */ |
|||
uLong size_filename; /* filename length 2 bytes */ |
|||
uLong size_file_extra; /* extra field length 2 bytes */ |
|||
uLong size_file_comment; /* file comment length 2 bytes */ |
|||
|
|||
uLong disk_num_start; /* disk number start 2 bytes */ |
|||
uLong internal_fa; /* internal file attributes 2 bytes */ |
|||
uLong external_fa; /* external file attributes 4 bytes */ |
|||
|
|||
tm_unz tmu_date; |
|||
} unz_file_info64; |
|||
|
|||
typedef struct unz_file_info_s |
|||
{ |
|||
uLong version; /* version made by 2 bytes */ |
|||
uLong version_needed; /* version needed to extract 2 bytes */ |
|||
uLong flag; /* general purpose bit flag 2 bytes */ |
|||
uLong compression_method; /* compression method 2 bytes */ |
|||
uLong dosDate; /* last mod file date in Dos fmt 4 bytes */ |
|||
uLong crc; /* crc-32 4 bytes */ |
|||
uLong compressed_size; /* compressed size 4 bytes */ |
|||
uLong uncompressed_size; /* uncompressed size 4 bytes */ |
|||
uLong size_filename; /* filename length 2 bytes */ |
|||
uLong size_file_extra; /* extra field length 2 bytes */ |
|||
uLong size_file_comment; /* file comment length 2 bytes */ |
|||
|
|||
uLong disk_num_start; /* disk number start 2 bytes */ |
|||
uLong internal_fa; /* internal file attributes 2 bytes */ |
|||
uLong external_fa; /* external file attributes 4 bytes */ |
|||
|
|||
tm_unz tmu_date; |
|||
} unz_file_info; |
|||
|
|||
extern int ZEXPORT unzStringFileNameCompare OF ((const char* fileName1, |
|||
const char* fileName2, |
|||
int iCaseSensitivity)); |
|||
/*
|
|||
Compare two filename (fileName1,fileName2). |
|||
If iCaseSenisivity = 1, comparision is case sensitivity (like strcmp) |
|||
If iCaseSenisivity = 2, comparision is not case sensitivity (like strcmpi |
|||
or strcasecmp) |
|||
If iCaseSenisivity = 0, case sensitivity is defaut of your operating system |
|||
(like 1 on Unix, 2 on Windows) |
|||
*/ |
|||
|
|||
|
|||
extern unzFile ZEXPORT unzOpen OF((const char *path)); |
|||
extern unzFile ZEXPORT unzOpen64 OF((const void *path)); |
|||
/*
|
|||
Open a Zip file. path contain the full pathname (by example, |
|||
on a Windows XP computer "c:\\zlib\\zlib113.zip" or on an Unix computer |
|||
"zlib/zlib113.zip". |
|||
If the zipfile cannot be opened (file don't exist or in not valid), the |
|||
return value is NULL. |
|||
Else, the return value is a unzFile Handle, usable with other function |
|||
of this unzip package. |
|||
the "64" function take a const void* pointer, because the path is just the |
|||
value passed to the open64_file_func callback. |
|||
Under Windows, if UNICODE is defined, using fill_fopen64_filefunc, the path |
|||
is a pointer to a wide unicode string (LPCTSTR is LPCWSTR), so const char* |
|||
does not describe the reality |
|||
*/ |
|||
|
|||
|
|||
extern unzFile ZEXPORT unzOpen2 OF((const char *path, |
|||
zlib_filefunc_def* pzlib_filefunc_def)); |
|||
/*
|
|||
Open a Zip file, like unzOpen, but provide a set of file low level API |
|||
for read/write the zip file (see ioapi.h) |
|||
*/ |
|||
|
|||
extern unzFile ZEXPORT unzOpen2_64 OF((const void *path, |
|||
zlib_filefunc64_def* pzlib_filefunc_def)); |
|||
/*
|
|||
Open a Zip file, like unz64Open, but provide a set of file low level API |
|||
for read/write the zip file (see ioapi.h) |
|||
*/ |
|||
|
|||
extern int ZEXPORT unzClose OF((unzFile file)); |
|||
/*
|
|||
Close a ZipFile opened with unzipOpen. |
|||
If there is files inside the .Zip opened with unzOpenCurrentFile (see later), |
|||
these files MUST be closed with unzipCloseCurrentFile before call unzipClose. |
|||
return UNZ_OK if there is no problem. */ |
|||
|
|||
extern int ZEXPORT unzGetGlobalInfo OF((unzFile file, |
|||
unz_global_info *pglobal_info)); |
|||
|
|||
extern int ZEXPORT unzGetGlobalInfo64 OF((unzFile file, |
|||
unz_global_info64 *pglobal_info)); |
|||
/*
|
|||
Write info about the ZipFile in the *pglobal_info structure. |
|||
No preparation of the structure is needed |
|||
return UNZ_OK if there is no problem. */ |
|||
|
|||
|
|||
extern int ZEXPORT unzGetGlobalComment OF((unzFile file, |
|||
char *szComment, |
|||
uLong uSizeBuf)); |
|||
/*
|
|||
Get the global comment string of the ZipFile, in the szComment buffer. |
|||
uSizeBuf is the size of the szComment buffer. |
|||
return the number of byte copied or an error code <0 |
|||
*/ |
|||
|
|||
|
|||
/***************************************************************************/ |
|||
/* Unzip package allow you browse the directory of the zipfile */ |
|||
|
|||
extern int ZEXPORT unzGoToFirstFile OF((unzFile file)); |
|||
/*
|
|||
Set the current file of the zipfile to the first file. |
|||
return UNZ_OK if there is no problem |
|||
*/ |
|||
|
|||
extern int ZEXPORT unzGoToNextFile OF((unzFile file)); |
|||
/*
|
|||
Set the current file of the zipfile to the next file. |
|||
return UNZ_OK if there is no problem |
|||
return UNZ_END_OF_LIST_OF_FILE if the actual file was the latest. |
|||
*/ |
|||
|
|||
extern int ZEXPORT unzLocateFile OF((unzFile file, |
|||
const char *szFileName, |
|||
int iCaseSensitivity)); |
|||
/*
|
|||
Try locate the file szFileName in the zipfile. |
|||
For the iCaseSensitivity signification, see unzStringFileNameCompare |
|||
|
|||
return value : |
|||
UNZ_OK if the file is found. It becomes the current file. |
|||
UNZ_END_OF_LIST_OF_FILE if the file is not found |
|||
*/ |
|||
|
|||
|
|||
/* ****************************************** */ |
|||
/* Ryan supplied functions */ |
|||
/* unz_file_info contain information about a file in the zipfile */ |
|||
typedef struct unz_file_pos_s |
|||
{ |
|||
uLong pos_in_zip_directory; /* offset in zip file directory */ |
|||
uLong num_of_file; /* # of file */ |
|||
} unz_file_pos; |
|||
|
|||
extern int ZEXPORT unzGetFilePos( |
|||
unzFile file, |
|||
unz_file_pos* file_pos); |
|||
|
|||
extern int ZEXPORT unzGoToFilePos( |
|||
unzFile file, |
|||
unz_file_pos* file_pos); |
|||
|
|||
typedef struct unz64_file_pos_s |
|||
{ |
|||
ZPOS64_T pos_in_zip_directory; /* offset in zip file directory */ |
|||
ZPOS64_T num_of_file; /* # of file */ |
|||
} unz64_file_pos; |
|||
|
|||
extern int ZEXPORT unzGetFilePos64( |
|||
unzFile file, |
|||
unz64_file_pos* file_pos); |
|||
|
|||
extern int ZEXPORT unzGoToFilePos64( |
|||
unzFile file, |
|||
const unz64_file_pos* file_pos); |
|||
|
|||
/* ****************************************** */ |
|||
|
|||
extern int ZEXPORT unzGetCurrentFileInfo64 OF((unzFile file, |
|||
unz_file_info64 *pfile_info, |
|||
char *szFileName, |
|||
uLong fileNameBufferSize, |
|||
void *extraField, |
|||
uLong extraFieldBufferSize, |
|||
char *szComment, |
|||
uLong commentBufferSize)); |
|||
|
|||
extern int ZEXPORT unzGetCurrentFileInfo OF((unzFile file, |
|||
unz_file_info *pfile_info, |
|||
char *szFileName, |
|||
uLong fileNameBufferSize, |
|||
void *extraField, |
|||
uLong extraFieldBufferSize, |
|||
char *szComment, |
|||
uLong commentBufferSize)); |
|||
/*
|
|||
Get Info about the current file |
|||
if pfile_info!=NULL, the *pfile_info structure will contain somes info about |
|||
the current file |
|||
if szFileName!=NULL, the filemane string will be copied in szFileName |
|||
(fileNameBufferSize is the size of the buffer) |
|||
if extraField!=NULL, the extra field information will be copied in extraField |
|||
(extraFieldBufferSize is the size of the buffer). |
|||
This is the Central-header version of the extra field |
|||
if szComment!=NULL, the comment string of the file will be copied in szComment |
|||
(commentBufferSize is the size of the buffer) |
|||
*/ |
|||
|
|||
|
|||
/** Addition for GDAL : START */ |
|||
|
|||
extern ZPOS64_T ZEXPORT unzGetCurrentFileZStreamPos64 OF((unzFile file)); |
|||
|
|||
/** Addition for GDAL : END */ |
|||
|
|||
|
|||
/***************************************************************************/ |
|||
/* for reading the content of the current zipfile, you can open it, read data
|
|||
from it, and close it (you can close it before reading all the file) |
|||
*/ |
|||
|
|||
extern int ZEXPORT unzOpenCurrentFile OF((unzFile file)); |
|||
/*
|
|||
Open for reading data the current file in the zipfile. |
|||
If there is no error, the return value is UNZ_OK. |
|||
*/ |
|||
|
|||
extern int ZEXPORT unzOpenCurrentFilePassword OF((unzFile file, |
|||
const char* password)); |
|||
/*
|
|||
Open for reading data the current file in the zipfile. |
|||
password is a crypting password |
|||
If there is no error, the return value is UNZ_OK. |
|||
*/ |
|||
|
|||
extern int ZEXPORT unzOpenCurrentFile2 OF((unzFile file, |
|||
int* method, |
|||
int* level, |
|||
int raw)); |
|||
/*
|
|||
Same than unzOpenCurrentFile, but open for read raw the file (not uncompress) |
|||
if raw==1 |
|||
*method will receive method of compression, *level will receive level of |
|||
compression |
|||
note : you can set level parameter as NULL (if you did not want known level, |
|||
but you CANNOT set method parameter as NULL |
|||
*/ |
|||
|
|||
extern int ZEXPORT unzOpenCurrentFile3 OF((unzFile file, |
|||
int* method, |
|||
int* level, |
|||
int raw, |
|||
const char* password)); |
|||
/*
|
|||
Same than unzOpenCurrentFile, but open for read raw the file (not uncompress) |
|||
if raw==1 |
|||
*method will receive method of compression, *level will receive level of |
|||
compression |
|||
note : you can set level parameter as NULL (if you did not want known level, |
|||
but you CANNOT set method parameter as NULL |
|||
*/ |
|||
|
|||
|
|||
extern int ZEXPORT unzCloseCurrentFile OF((unzFile file)); |
|||
/*
|
|||
Close the file in zip opened with unzOpenCurrentFile |
|||
Return UNZ_CRCERROR if all the file was read but the CRC is not good |
|||
*/ |
|||
|
|||
extern int ZEXPORT unzReadCurrentFile OF((unzFile file, |
|||
voidp buf, |
|||
unsigned len)); |
|||
/*
|
|||
Read bytes from the current file (opened by unzOpenCurrentFile) |
|||
buf contain buffer where data must be copied |
|||
len the size of buf. |
|||
|
|||
return the number of byte copied if somes bytes are copied |
|||
return 0 if the end of file was reached |
|||
return <0 with error code if there is an error |
|||
(UNZ_ERRNO for IO error, or zLib error for uncompress error) |
|||
*/ |
|||
|
|||
extern z_off_t ZEXPORT unztell OF((unzFile file)); |
|||
|
|||
extern ZPOS64_T ZEXPORT unztell64 OF((unzFile file)); |
|||
/*
|
|||
Give the current position in uncompressed data |
|||
*/ |
|||
|
|||
extern int ZEXPORT unzeof OF((unzFile file)); |
|||
/*
|
|||
return 1 if the end of file was reached, 0 elsewhere |
|||
*/ |
|||
|
|||
extern int ZEXPORT unzGetLocalExtrafield OF((unzFile file, |
|||
voidp buf, |
|||
unsigned len)); |
|||
/*
|
|||
Read extra field from the current file (opened by unzOpenCurrentFile) |
|||
This is the local-header version of the extra field (sometimes, there is |
|||
more info in the local-header version than in the central-header) |
|||
|
|||
if buf==NULL, it return the size of the local extra field |
|||
|
|||
if buf!=NULL, len is the size of the buffer, the extra header is copied in |
|||
buf. |
|||
the return value is the number of bytes copied in buf, or (if <0) |
|||
the error code |
|||
*/ |
|||
|
|||
/***************************************************************************/ |
|||
|
|||
/* Get the current file offset */ |
|||
extern ZPOS64_T ZEXPORT unzGetOffset64 (unzFile file); |
|||
extern uLong ZEXPORT unzGetOffset (unzFile file); |
|||
|
|||
/* Set the current file offset */ |
|||
extern int ZEXPORT unzSetOffset64 (unzFile file, ZPOS64_T pos); |
|||
extern int ZEXPORT unzSetOffset (unzFile file, uLong pos); |
|||
|
|||
|
|||
|
|||
#ifdef __cplusplus |
|||
} |
|||
#endif |
|||
|
|||
#endif /* _unz64_H */ |
File diff suppressed because it is too large
@ -1,362 +0,0 @@ |
|||
/* zip.h -- IO on .zip files using zlib
|
|||
Version 1.1, February 14h, 2010 |
|||
part of the MiniZip project - ( http://www.winimage.com/zLibDll/minizip.html )
|
|||
|
|||
Copyright (C) 1998-2010 Gilles Vollant (minizip) ( http://www.winimage.com/zLibDll/minizip.html )
|
|||
|
|||
Modifications for Zip64 support |
|||
Copyright (C) 2009-2010 Mathias Svensson ( http://result42.com )
|
|||
|
|||
For more info read MiniZip_info.txt |
|||
|
|||
--------------------------------------------------------------------------- |
|||
|
|||
Condition of use and distribution are the same than zlib : |
|||
|
|||
This software is provided 'as-is', without any express or implied |
|||
warranty. In no event will the authors be held liable for any damages |
|||
arising from the use of this software. |
|||
|
|||
Permission is granted to anyone to use this software for any purpose, |
|||
including commercial applications, and to alter it and redistribute it |
|||
freely, subject to the following restrictions: |
|||
|
|||
1. The origin of this software must not be misrepresented; you must not |
|||
claim that you wrote the original software. If you use this software |
|||
in a product, an acknowledgment in the product documentation would be |
|||
appreciated but is not required. |
|||
2. Altered source versions must be plainly marked as such, and must not be |
|||
misrepresented as being the original software. |
|||
3. This notice may not be removed or altered from any source distribution. |
|||
|
|||
--------------------------------------------------------------------------- |
|||
|
|||
Changes |
|||
|
|||
See header of zip.h |
|||
|
|||
*/ |
|||
|
|||
#ifndef _zip12_H |
|||
#define _zip12_H |
|||
|
|||
#ifdef __cplusplus |
|||
extern "C" { |
|||
#endif |
|||
|
|||
//#define HAVE_BZIP2
|
|||
|
|||
#ifndef _ZLIB_H |
|||
#include "zlib/zlib.h" |
|||
#endif |
|||
|
|||
#ifndef _ZLIBIOAPI_H |
|||
#include "ioapi.h" |
|||
#endif |
|||
|
|||
#ifdef HAVE_BZIP2 |
|||
#include "bzlib.h" |
|||
#endif |
|||
|
|||
#define Z_BZIP2ED 12 |
|||
|
|||
#if defined(STRICTZIP) || defined(STRICTZIPUNZIP) |
|||
/* like the STRICT of WIN32, we define a pointer that cannot be converted
|
|||
from (void*) without cast */ |
|||
typedef struct TagzipFile__ { int unused; } zipFile__; |
|||
typedef zipFile__ *zipFile; |
|||
#else |
|||
typedef voidp zipFile; |
|||
#endif |
|||
|
|||
#define ZIP_OK (0) |
|||
#define ZIP_EOF (0) |
|||
#define ZIP_ERRNO (Z_ERRNO) |
|||
#define ZIP_PARAMERROR (-102) |
|||
#define ZIP_BADZIPFILE (-103) |
|||
#define ZIP_INTERNALERROR (-104) |
|||
|
|||
#ifndef DEF_MEM_LEVEL |
|||
# if MAX_MEM_LEVEL >= 8 |
|||
# define DEF_MEM_LEVEL 8 |
|||
# else |
|||
# define DEF_MEM_LEVEL MAX_MEM_LEVEL |
|||
# endif |
|||
#endif |
|||
/* default memLevel */ |
|||
|
|||
/* tm_zip contain date/time info */ |
|||
typedef struct tm_zip_s |
|||
{ |
|||
uInt tm_sec; /* seconds after the minute - [0,59] */ |
|||
uInt tm_min; /* minutes after the hour - [0,59] */ |
|||
uInt tm_hour; /* hours since midnight - [0,23] */ |
|||
uInt tm_mday; /* day of the month - [1,31] */ |
|||
uInt tm_mon; /* months since January - [0,11] */ |
|||
uInt tm_year; /* years - [1980..2044] */ |
|||
} tm_zip; |
|||
|
|||
typedef struct |
|||
{ |
|||
tm_zip tmz_date; /* date in understandable format */ |
|||
uLong dosDate; /* if dos_date == 0, tmu_date is used */ |
|||
/* uLong flag; */ /* general purpose bit flag 2 bytes */ |
|||
|
|||
uLong internal_fa; /* internal file attributes 2 bytes */ |
|||
uLong external_fa; /* external file attributes 4 bytes */ |
|||
} zip_fileinfo; |
|||
|
|||
typedef const char* zipcharpc; |
|||
|
|||
|
|||
#define APPEND_STATUS_CREATE (0) |
|||
#define APPEND_STATUS_CREATEAFTER (1) |
|||
#define APPEND_STATUS_ADDINZIP (2) |
|||
|
|||
extern zipFile ZEXPORT zipOpen OF((const char *pathname, int append)); |
|||
extern zipFile ZEXPORT zipOpen64 OF((const void *pathname, int append)); |
|||
/*
|
|||
Create a zipfile. |
|||
pathname contain on Windows XP a filename like "c:\\zlib\\zlib113.zip" or on |
|||
an Unix computer "zlib/zlib113.zip". |
|||
if the file pathname exist and append==APPEND_STATUS_CREATEAFTER, the zip |
|||
will be created at the end of the file. |
|||
(useful if the file contain a self extractor code) |
|||
if the file pathname exist and append==APPEND_STATUS_ADDINZIP, we will |
|||
add files in existing zip (be sure you don't add file that doesn't exist) |
|||
If the zipfile cannot be opened, the return value is NULL. |
|||
Else, the return value is a zipFile Handle, usable with other function |
|||
of this zip package. |
|||
*/ |
|||
|
|||
/* Note : there is no delete function into a zipfile.
|
|||
If you want delete file into a zipfile, you must open a zipfile, and create another |
|||
Of couse, you can use RAW reading and writing to copy the file you did not want delte |
|||
*/ |
|||
|
|||
extern zipFile ZEXPORT zipOpen2 OF((const char *pathname, |
|||
int append, |
|||
zipcharpc* globalcomment, |
|||
zlib_filefunc_def* pzlib_filefunc_def)); |
|||
|
|||
extern zipFile ZEXPORT zipOpen2_64 OF((const void *pathname, |
|||
int append, |
|||
zipcharpc* globalcomment, |
|||
zlib_filefunc64_def* pzlib_filefunc_def)); |
|||
|
|||
extern int ZEXPORT zipOpenNewFileInZip OF((zipFile file, |
|||
const char* filename, |
|||
const zip_fileinfo* zipfi, |
|||
const void* extrafield_local, |
|||
uInt size_extrafield_local, |
|||
const void* extrafield_global, |
|||
uInt size_extrafield_global, |
|||
const char* comment, |
|||
int method, |
|||
int level)); |
|||
|
|||
extern int ZEXPORT zipOpenNewFileInZip64 OF((zipFile file, |
|||
const char* filename, |
|||
const zip_fileinfo* zipfi, |
|||
const void* extrafield_local, |
|||
uInt size_extrafield_local, |
|||
const void* extrafield_global, |
|||
uInt size_extrafield_global, |
|||
const char* comment, |
|||
int method, |
|||
int level, |
|||
int zip64)); |
|||
|
|||
/*
|
|||
Open a file in the ZIP for writing. |
|||
filename : the filename in zip (if NULL, '-' without quote will be used |
|||
*zipfi contain supplemental information |
|||
if extrafield_local!=NULL and size_extrafield_local>0, extrafield_local |
|||
contains the extrafield data the the local header |
|||
if extrafield_global!=NULL and size_extrafield_global>0, extrafield_global |
|||
contains the extrafield data the the local header |
|||
if comment != NULL, comment contain the comment string |
|||
method contain the compression method (0 for store, Z_DEFLATED for deflate) |
|||
level contain the level of compression (can be Z_DEFAULT_COMPRESSION) |
|||
zip64 is set to 1 if a zip64 extended information block should be added to the local file header. |
|||
this MUST be '1' if the uncompressed size is >= 0xffffffff. |
|||
|
|||
*/ |
|||
|
|||
|
|||
extern int ZEXPORT zipOpenNewFileInZip2 OF((zipFile file, |
|||
const char* filename, |
|||
const zip_fileinfo* zipfi, |
|||
const void* extrafield_local, |
|||
uInt size_extrafield_local, |
|||
const void* extrafield_global, |
|||
uInt size_extrafield_global, |
|||
const char* comment, |
|||
int method, |
|||
int level, |
|||
int raw)); |
|||
|
|||
|
|||
extern int ZEXPORT zipOpenNewFileInZip2_64 OF((zipFile file, |
|||
const char* filename, |
|||
const zip_fileinfo* zipfi, |
|||
const void* extrafield_local, |
|||
uInt size_extrafield_local, |
|||
const void* extrafield_global, |
|||
uInt size_extrafield_global, |
|||
const char* comment, |
|||
int method, |
|||
int level, |
|||
int raw, |
|||
int zip64)); |
|||
/*
|
|||
Same than zipOpenNewFileInZip, except if raw=1, we write raw file |
|||
*/ |
|||
|
|||
extern int ZEXPORT zipOpenNewFileInZip3 OF((zipFile file, |
|||
const char* filename, |
|||
const zip_fileinfo* zipfi, |
|||
const void* extrafield_local, |
|||
uInt size_extrafield_local, |
|||
const void* extrafield_global, |
|||
uInt size_extrafield_global, |
|||
const char* comment, |
|||
int method, |
|||
int level, |
|||
int raw, |
|||
int windowBits, |
|||
int memLevel, |
|||
int strategy, |
|||
const char* password, |
|||
uLong crcForCrypting)); |
|||
|
|||
extern int ZEXPORT zipOpenNewFileInZip3_64 OF((zipFile file, |
|||
const char* filename, |
|||
const zip_fileinfo* zipfi, |
|||
const void* extrafield_local, |
|||
uInt size_extrafield_local, |
|||
const void* extrafield_global, |
|||
uInt size_extrafield_global, |
|||
const char* comment, |
|||
int method, |
|||
int level, |
|||
int raw, |
|||
int windowBits, |
|||
int memLevel, |
|||
int strategy, |
|||
const char* password, |
|||
uLong crcForCrypting, |
|||
int zip64 |
|||
)); |
|||
|
|||
/*
|
|||
Same than zipOpenNewFileInZip2, except |
|||
windowBits,memLevel,,strategy : see parameter strategy in deflateInit2 |
|||
password : crypting password (NULL for no crypting) |
|||
crcForCrypting : crc of file to compress (needed for crypting) |
|||
*/ |
|||
|
|||
extern int ZEXPORT zipOpenNewFileInZip4 OF((zipFile file, |
|||
const char* filename, |
|||
const zip_fileinfo* zipfi, |
|||
const void* extrafield_local, |
|||
uInt size_extrafield_local, |
|||
const void* extrafield_global, |
|||
uInt size_extrafield_global, |
|||
const char* comment, |
|||
int method, |
|||
int level, |
|||
int raw, |
|||
int windowBits, |
|||
int memLevel, |
|||
int strategy, |
|||
const char* password, |
|||
uLong crcForCrypting, |
|||
uLong versionMadeBy, |
|||
uLong flagBase |
|||
)); |
|||
|
|||
|
|||
extern int ZEXPORT zipOpenNewFileInZip4_64 OF((zipFile file, |
|||
const char* filename, |
|||
const zip_fileinfo* zipfi, |
|||
const void* extrafield_local, |
|||
uInt size_extrafield_local, |
|||
const void* extrafield_global, |
|||
uInt size_extrafield_global, |
|||
const char* comment, |
|||
int method, |
|||
int level, |
|||
int raw, |
|||
int windowBits, |
|||
int memLevel, |
|||
int strategy, |
|||
const char* password, |
|||
uLong crcForCrypting, |
|||
uLong versionMadeBy, |
|||
uLong flagBase, |
|||
int zip64 |
|||
)); |
|||
/*
|
|||
Same than zipOpenNewFileInZip4, except |
|||
versionMadeBy : value for Version made by field |
|||
flag : value for flag field (compression level info will be added) |
|||
*/ |
|||
|
|||
|
|||
extern int ZEXPORT zipWriteInFileInZip OF((zipFile file, |
|||
const void* buf, |
|||
unsigned len)); |
|||
/*
|
|||
Write data in the zipfile |
|||
*/ |
|||
|
|||
extern int ZEXPORT zipCloseFileInZip OF((zipFile file)); |
|||
/*
|
|||
Close the current file in the zipfile |
|||
*/ |
|||
|
|||
extern int ZEXPORT zipCloseFileInZipRaw OF((zipFile file, |
|||
uLong uncompressed_size, |
|||
uLong crc32)); |
|||
|
|||
extern int ZEXPORT zipCloseFileInZipRaw64 OF((zipFile file, |
|||
ZPOS64_T uncompressed_size, |
|||
uLong crc32)); |
|||
|
|||
/*
|
|||
Close the current file in the zipfile, for file opened with |
|||
parameter raw=1 in zipOpenNewFileInZip2 |
|||
uncompressed_size and crc32 are value for the uncompressed size |
|||
*/ |
|||
|
|||
extern int ZEXPORT zipClose OF((zipFile file, |
|||
const char* global_comment)); |
|||
/*
|
|||
Close the zipfile |
|||
*/ |
|||
|
|||
|
|||
extern int ZEXPORT zipRemoveExtraInfoBlock OF((char* pData, int* dataLen, short sHeader)); |
|||
/*
|
|||
zipRemoveExtraInfoBlock - Added by Mathias Svensson |
|||
|
|||
Remove extra information block from a extra information data for the local file header or central directory header |
|||
|
|||
It is needed to remove ZIP64 extra information blocks when before data is written if using RAW mode. |
|||
|
|||
0x0001 is the signature header for the ZIP64 extra information blocks |
|||
|
|||
usage. |
|||
Remove ZIP64 Extra information from a central director extra field data |
|||
zipRemoveExtraInfoBlock(pCenDirExtraFieldData, &nCenDirExtraFieldDataLen, 0x0001); |
|||
|
|||
Remove ZIP64 Extra information from a Local File Header extra field data |
|||
zipRemoveExtraInfoBlock(pLocalHeaderExtraFieldData, &nLocalHeaderExtraFieldDataLen, 0x0001); |
|||
*/ |
|||
|
|||
#ifdef __cplusplus |
|||
} |
|||
#endif |
|||
|
|||
#endif /* _zip64_H */ |
Loading…
Reference in new issue