mirror of
https://github.com/SpartanJ/eepp.git
synced 2026-08-13 04:42:12 +03:00
Fixed compilation with MSVC++.
This commit is contained in:
@@ -17,7 +17,7 @@
|
||||
<kdevcustomproject>
|
||||
<run>
|
||||
<directoryradio>executable</directoryradio>
|
||||
<mainprogram>eeiv</mainprogram>
|
||||
<mainprogram>eetest</mainprogram>
|
||||
<programargs/>
|
||||
<globaldebugarguments/>
|
||||
<globalcwd>./</globalcwd>
|
||||
|
||||
61
ee.linux.cbp
61
ee.linux.cbp
@@ -246,6 +246,9 @@
|
||||
<Unit filename="src/helper/libzip/zip_fclose.c">
|
||||
<Option compilerVar="CC" />
|
||||
</Unit>
|
||||
<Unit filename="src/helper/libzip/zip_fdopen.c">
|
||||
<Option compilerVar="CC" />
|
||||
</Unit>
|
||||
<Unit filename="src/helper/libzip/zip_file_error_clear.c">
|
||||
<Option compilerVar="CC" />
|
||||
</Unit>
|
||||
@@ -264,9 +267,15 @@
|
||||
<Unit filename="src/helper/libzip/zip_fopen.c">
|
||||
<Option compilerVar="CC" />
|
||||
</Unit>
|
||||
<Unit filename="src/helper/libzip/zip_fopen_encrypted.c">
|
||||
<Option compilerVar="CC" />
|
||||
</Unit>
|
||||
<Unit filename="src/helper/libzip/zip_fopen_index.c">
|
||||
<Option compilerVar="CC" />
|
||||
</Unit>
|
||||
<Unit filename="src/helper/libzip/zip_fopen_index_encrypted.c">
|
||||
<Option compilerVar="CC" />
|
||||
</Unit>
|
||||
<Unit filename="src/helper/libzip/zip_fread.c">
|
||||
<Option compilerVar="CC" />
|
||||
</Unit>
|
||||
@@ -279,6 +288,12 @@
|
||||
<Unit filename="src/helper/libzip/zip_get_archive_flag.c">
|
||||
<Option compilerVar="CC" />
|
||||
</Unit>
|
||||
<Unit filename="src/helper/libzip/zip_get_compression_implementation.c">
|
||||
<Option compilerVar="CC" />
|
||||
</Unit>
|
||||
<Unit filename="src/helper/libzip/zip_get_encryption_implementation.c">
|
||||
<Option compilerVar="CC" />
|
||||
</Unit>
|
||||
<Unit filename="src/helper/libzip/zip_get_file_comment.c">
|
||||
<Option compilerVar="CC" />
|
||||
</Unit>
|
||||
@@ -312,6 +327,9 @@
|
||||
<Unit filename="src/helper/libzip/zip_set_archive_flag.c">
|
||||
<Option compilerVar="CC" />
|
||||
</Unit>
|
||||
<Unit filename="src/helper/libzip/zip_set_default_password.c">
|
||||
<Option compilerVar="CC" />
|
||||
</Unit>
|
||||
<Unit filename="src/helper/libzip/zip_set_file_comment.c">
|
||||
<Option compilerVar="CC" />
|
||||
</Unit>
|
||||
@@ -321,6 +339,18 @@
|
||||
<Unit filename="src/helper/libzip/zip_source_buffer.c">
|
||||
<Option compilerVar="CC" />
|
||||
</Unit>
|
||||
<Unit filename="src/helper/libzip/zip_source_close.c">
|
||||
<Option compilerVar="CC" />
|
||||
</Unit>
|
||||
<Unit filename="src/helper/libzip/zip_source_crc.c">
|
||||
<Option compilerVar="CC" />
|
||||
</Unit>
|
||||
<Unit filename="src/helper/libzip/zip_source_deflate.c">
|
||||
<Option compilerVar="CC" />
|
||||
</Unit>
|
||||
<Unit filename="src/helper/libzip/zip_source_error.c">
|
||||
<Option compilerVar="CC" />
|
||||
</Unit>
|
||||
<Unit filename="src/helper/libzip/zip_source_file.c">
|
||||
<Option compilerVar="CC" />
|
||||
</Unit>
|
||||
@@ -333,6 +363,24 @@
|
||||
<Unit filename="src/helper/libzip/zip_source_function.c">
|
||||
<Option compilerVar="CC" />
|
||||
</Unit>
|
||||
<Unit filename="src/helper/libzip/zip_source_layered.c">
|
||||
<Option compilerVar="CC" />
|
||||
</Unit>
|
||||
<Unit filename="src/helper/libzip/zip_source_open.c">
|
||||
<Option compilerVar="CC" />
|
||||
</Unit>
|
||||
<Unit filename="src/helper/libzip/zip_source_pkware.c">
|
||||
<Option compilerVar="CC" />
|
||||
</Unit>
|
||||
<Unit filename="src/helper/libzip/zip_source_pop.c">
|
||||
<Option compilerVar="CC" />
|
||||
</Unit>
|
||||
<Unit filename="src/helper/libzip/zip_source_read.c">
|
||||
<Option compilerVar="CC" />
|
||||
</Unit>
|
||||
<Unit filename="src/helper/libzip/zip_source_stat.c">
|
||||
<Option compilerVar="CC" />
|
||||
</Unit>
|
||||
<Unit filename="src/helper/libzip/zip_source_zip.c">
|
||||
<Option compilerVar="CC" />
|
||||
</Unit>
|
||||
@@ -360,6 +408,7 @@
|
||||
<Unit filename="src/helper/libzip/zip_unchange_data.c">
|
||||
<Option compilerVar="CC" />
|
||||
</Unit>
|
||||
<Unit filename="src/helper/libzip/zipconf.h" />
|
||||
<Unit filename="src/helper/libzip/zipint.h" />
|
||||
<Unit filename="src/helper/stb_vorbis/stb_vorbis.c">
|
||||
<Option compilerVar="CC" />
|
||||
@@ -379,19 +428,7 @@
|
||||
<Option compilerVar="CC" />
|
||||
</Unit>
|
||||
<Unit filename="src/helper/zlib/deflate.h" />
|
||||
<Unit filename="src/helper/zlib/gzclose.c">
|
||||
<Option compilerVar="CC" />
|
||||
</Unit>
|
||||
<Unit filename="src/helper/zlib/gzguts.h" />
|
||||
<Unit filename="src/helper/zlib/gzlib.c">
|
||||
<Option compilerVar="CC" />
|
||||
</Unit>
|
||||
<Unit filename="src/helper/zlib/gzread.c">
|
||||
<Option compilerVar="CC" />
|
||||
</Unit>
|
||||
<Unit filename="src/helper/zlib/gzwrite.c">
|
||||
<Option compilerVar="CC" />
|
||||
</Unit>
|
||||
<Unit filename="src/helper/zlib/infback.c">
|
||||
<Option compilerVar="CC" />
|
||||
</Unit>
|
||||
|
||||
62
ee.win.cbp
62
ee.win.cbp
@@ -15,6 +15,7 @@
|
||||
<Add option="-Wall" />
|
||||
<Add option="-g" />
|
||||
<Add option="-DEE_DEBUG" />
|
||||
<Add option="-DEE_MEMORY_MANAGER" />
|
||||
</Compiler>
|
||||
</Target>
|
||||
<Target title="Release">
|
||||
@@ -248,6 +249,9 @@
|
||||
<Unit filename="src\helper\libzip\zip_fclose.c">
|
||||
<Option compilerVar="CC" />
|
||||
</Unit>
|
||||
<Unit filename="src\helper\libzip\zip_fdopen.c">
|
||||
<Option compilerVar="CC" />
|
||||
</Unit>
|
||||
<Unit filename="src\helper\libzip\zip_file_error_clear.c">
|
||||
<Option compilerVar="CC" />
|
||||
</Unit>
|
||||
@@ -266,9 +270,15 @@
|
||||
<Unit filename="src\helper\libzip\zip_fopen.c">
|
||||
<Option compilerVar="CC" />
|
||||
</Unit>
|
||||
<Unit filename="src\helper\libzip\zip_fopen_encrypted.c">
|
||||
<Option compilerVar="CC" />
|
||||
</Unit>
|
||||
<Unit filename="src\helper\libzip\zip_fopen_index.c">
|
||||
<Option compilerVar="CC" />
|
||||
</Unit>
|
||||
<Unit filename="src\helper\libzip\zip_fopen_index_encrypted.c">
|
||||
<Option compilerVar="CC" />
|
||||
</Unit>
|
||||
<Unit filename="src\helper\libzip\zip_fread.c">
|
||||
<Option compilerVar="CC" />
|
||||
</Unit>
|
||||
@@ -281,6 +291,12 @@
|
||||
<Unit filename="src\helper\libzip\zip_get_archive_flag.c">
|
||||
<Option compilerVar="CC" />
|
||||
</Unit>
|
||||
<Unit filename="src\helper\libzip\zip_get_compression_implementation.c">
|
||||
<Option compilerVar="CC" />
|
||||
</Unit>
|
||||
<Unit filename="src\helper\libzip\zip_get_encryption_implementation.c">
|
||||
<Option compilerVar="CC" />
|
||||
</Unit>
|
||||
<Unit filename="src\helper\libzip\zip_get_file_comment.c">
|
||||
<Option compilerVar="CC" />
|
||||
</Unit>
|
||||
@@ -314,6 +330,9 @@
|
||||
<Unit filename="src\helper\libzip\zip_set_archive_flag.c">
|
||||
<Option compilerVar="CC" />
|
||||
</Unit>
|
||||
<Unit filename="src\helper\libzip\zip_set_default_password.c">
|
||||
<Option compilerVar="CC" />
|
||||
</Unit>
|
||||
<Unit filename="src\helper\libzip\zip_set_file_comment.c">
|
||||
<Option compilerVar="CC" />
|
||||
</Unit>
|
||||
@@ -323,6 +342,18 @@
|
||||
<Unit filename="src\helper\libzip\zip_source_buffer.c">
|
||||
<Option compilerVar="CC" />
|
||||
</Unit>
|
||||
<Unit filename="src\helper\libzip\zip_source_close.c">
|
||||
<Option compilerVar="CC" />
|
||||
</Unit>
|
||||
<Unit filename="src\helper\libzip\zip_source_crc.c">
|
||||
<Option compilerVar="CC" />
|
||||
</Unit>
|
||||
<Unit filename="src\helper\libzip\zip_source_deflate.c">
|
||||
<Option compilerVar="CC" />
|
||||
</Unit>
|
||||
<Unit filename="src\helper\libzip\zip_source_error.c">
|
||||
<Option compilerVar="CC" />
|
||||
</Unit>
|
||||
<Unit filename="src\helper\libzip\zip_source_file.c">
|
||||
<Option compilerVar="CC" />
|
||||
</Unit>
|
||||
@@ -335,6 +366,24 @@
|
||||
<Unit filename="src\helper\libzip\zip_source_function.c">
|
||||
<Option compilerVar="CC" />
|
||||
</Unit>
|
||||
<Unit filename="src\helper\libzip\zip_source_layered.c">
|
||||
<Option compilerVar="CC" />
|
||||
</Unit>
|
||||
<Unit filename="src\helper\libzip\zip_source_open.c">
|
||||
<Option compilerVar="CC" />
|
||||
</Unit>
|
||||
<Unit filename="src\helper\libzip\zip_source_pkware.c">
|
||||
<Option compilerVar="CC" />
|
||||
</Unit>
|
||||
<Unit filename="src\helper\libzip\zip_source_pop.c">
|
||||
<Option compilerVar="CC" />
|
||||
</Unit>
|
||||
<Unit filename="src\helper\libzip\zip_source_read.c">
|
||||
<Option compilerVar="CC" />
|
||||
</Unit>
|
||||
<Unit filename="src\helper\libzip\zip_source_stat.c">
|
||||
<Option compilerVar="CC" />
|
||||
</Unit>
|
||||
<Unit filename="src\helper\libzip\zip_source_zip.c">
|
||||
<Option compilerVar="CC" />
|
||||
</Unit>
|
||||
@@ -362,6 +411,7 @@
|
||||
<Unit filename="src\helper\libzip\zip_unchange_data.c">
|
||||
<Option compilerVar="CC" />
|
||||
</Unit>
|
||||
<Unit filename="src\helper\libzip\zipconf.h" />
|
||||
<Unit filename="src\helper\libzip\zipint.h" />
|
||||
<Unit filename="src\helper\stb_vorbis\stb_vorbis.c">
|
||||
<Option compilerVar="CC" />
|
||||
@@ -381,19 +431,7 @@
|
||||
<Option compilerVar="CC" />
|
||||
</Unit>
|
||||
<Unit filename="src\helper\zlib\deflate.h" />
|
||||
<Unit filename="src\helper\zlib\gzclose.c">
|
||||
<Option compilerVar="CC" />
|
||||
</Unit>
|
||||
<Unit filename="src\helper\zlib\gzguts.h" />
|
||||
<Unit filename="src\helper\zlib\gzlib.c">
|
||||
<Option compilerVar="CC" />
|
||||
</Unit>
|
||||
<Unit filename="src\helper\zlib\gzread.c">
|
||||
<Option compilerVar="CC" />
|
||||
</Unit>
|
||||
<Unit filename="src\helper\zlib\gzwrite.c">
|
||||
<Option compilerVar="CC" />
|
||||
</Unit>
|
||||
<Unit filename="src\helper\zlib\infback.c">
|
||||
<Option compilerVar="CC" />
|
||||
</Unit>
|
||||
|
||||
@@ -247,7 +247,7 @@ void cFont::Draw( cTextCache& TextCache, const eeFloat& X, const eeFloat& Y, con
|
||||
|
||||
TextCache.CachedCoords( true );
|
||||
} else {
|
||||
numvert = TextCache.Text().size() * 4;
|
||||
numvert = (eeUint)TextCache.Text().size() * 4;
|
||||
}
|
||||
|
||||
#ifndef EE_GLES
|
||||
|
||||
@@ -44,7 +44,7 @@ cShader::cShader( const Uint32& Type, cPack * Pack, const std::string& Filename
|
||||
|
||||
Pack->ExtractFileToMemory( Filename, TempData );
|
||||
|
||||
SetSource( reinterpret_cast<Uint8*> ( &TempData[0] ), TempData.size() );
|
||||
SetSource( reinterpret_cast<Uint8*> ( &TempData[0] ), (Uint32)TempData.size() );
|
||||
}
|
||||
|
||||
Compile();
|
||||
|
||||
@@ -400,11 +400,11 @@ void cTexture::Grabed( const bool& isGrabed ) {
|
||||
}
|
||||
|
||||
bool cTexture::Grabed() const {
|
||||
return mFlags & TEX_FLAG_GRABED;
|
||||
return 0 != ( mFlags & TEX_FLAG_GRABED );
|
||||
}
|
||||
|
||||
bool cTexture::Compressed() const {
|
||||
return mFlags & TEX_FLAG_COMPRESSED;
|
||||
return 0 != ( mFlags & TEX_FLAG_COMPRESSED );
|
||||
}
|
||||
|
||||
void cTexture::Draw( const eeFloat &x, const eeFloat &y, const eeFloat &Angle, const eeFloat &Scale, const eeColorA& Color, const EE_PRE_BLEND_FUNC &blend, const EE_RENDERTYPE &Effect, const bool &ScaleCentered, const eeRecti& texSector) {
|
||||
|
||||
@@ -136,13 +136,17 @@ void cTextureFactory::UnloadTextures() {
|
||||
}
|
||||
}
|
||||
|
||||
bool cTextureFactory::Remove( const Uint32& TexId ) {
|
||||
bool cTextureFactory::Remove( Uint32 TexId ) {
|
||||
if ( TexId < mTextures.size() && NULL != mTextures[ TexId ] ) {
|
||||
cTexture * Tex = mTextures[ TexId ];
|
||||
|
||||
mMemSize -= GetTexMemSize( TexId );
|
||||
|
||||
GLint glTexId = mTextures[ TexId ]->Handle();
|
||||
GLint glTexId = Tex->Handle();
|
||||
|
||||
eeSAFE_DELETE( mTextures[ TexId ] );
|
||||
eeDelete( Tex );
|
||||
|
||||
mTextures[ TexId ] = NULL;
|
||||
|
||||
for ( Uint32 i = 0; i < EE_MAX_TEXTURE_UNITS; i++ ) {
|
||||
if ( mCurrentTexture[ i ] == (Int32)glTexId )
|
||||
|
||||
@@ -81,7 +81,7 @@ class EE_API cTextureFactory: public tSingleton<cTextureFactory>, protected cMut
|
||||
* @param TexId
|
||||
* @return True if was removed
|
||||
*/
|
||||
bool Remove( const Uint32& TexId );
|
||||
bool Remove( Uint32 TexId );
|
||||
|
||||
/** Reload all loaded textures to recover the OpenGL context */
|
||||
void ReloadAllTextures();
|
||||
|
||||
@@ -108,7 +108,7 @@ void cTextureGroupLoader::LoadFromPack( cPack * Pack, const std::string& FilePac
|
||||
|
||||
Pack->ExtractFileToMemory( FilePackPath, TempData );
|
||||
|
||||
LoadFromMemory( reinterpret_cast<const Uint8*> ( &TempData[0] ), TempData.size(), FilePackPath );
|
||||
LoadFromMemory( reinterpret_cast<const Uint8*> ( &TempData[0] ), (Uint32)TempData.size(), FilePackPath );
|
||||
}
|
||||
}
|
||||
|
||||
@@ -194,7 +194,7 @@ void cTextureGroupLoader::CreateShapes() {
|
||||
|
||||
eeRecti tRect( tSh->X, tSh->Y, tSh->X + tSh->Width, tSh->Y + tSh->Height );
|
||||
|
||||
cShape * tShape = eeNew( cShape, ( tTex->Id(), tRect, tSh->DestWidth, tSh->DestHeight, tSh->OffsetX, tSh->OffsetY, ShapeName ) );
|
||||
cShape * tShape = eeNew( cShape, ( tTex->Id(), tRect, (eeFloat)tSh->DestWidth, (eeFloat)tSh->DestHeight, (eeFloat)tSh->OffsetX, (eeFloat)tSh->OffsetY, ShapeName ) );
|
||||
|
||||
//if ( tSh->Flags & HDR_SHAPE_FLAG_FLIPED )
|
||||
// Should rotate the shape, but.. shape rotation is not stored.
|
||||
@@ -300,7 +300,7 @@ bool cTextureGroupLoader::UpdateTextureAtlas( std::string TextureAtlasPath, std:
|
||||
std::string tapath( FileRemoveExtension( TextureAtlasPath ) + "." + SaveTypeToExtension( mTexGrHdr.Format ) );
|
||||
|
||||
if ( 2 == NeedUpdate ) {
|
||||
cTexturePacker tp( mTexGrHdr.Width, mTexGrHdr.Height, mTexGrHdr.Flags & HDR_TEXTURE_GROUP_POW_OF_TWO, mTexGrHdr.PixelBorder, mTexGrHdr.Flags & HDR_TEXTURE_GROUP_ALLOW_FLIPPING );
|
||||
cTexturePacker tp( mTexGrHdr.Width, mTexGrHdr.Height, 0 != ( mTexGrHdr.Flags & HDR_TEXTURE_GROUP_POW_OF_TWO ), mTexGrHdr.PixelBorder, mTexGrHdr.Flags & HDR_TEXTURE_GROUP_ALLOW_FLIPPING );
|
||||
|
||||
tp.AddTexturesPath( ImagesPath );
|
||||
|
||||
|
||||
@@ -416,7 +416,7 @@ Int32 cTexturePacker::PackTextures() { // pack the textures, the return code is
|
||||
|
||||
NewFree( 0, 0, mWidth, mHeight );
|
||||
|
||||
mCount = mTextures.size();
|
||||
mCount = (Int32)mTextures.size();
|
||||
|
||||
// We must place each texture
|
||||
std::list<cTexturePackerTex>::iterator it;
|
||||
@@ -571,7 +571,8 @@ void cTexturePacker::SaveShapes() {
|
||||
if ( mForcePowOfTwo )
|
||||
TexGrHdr.Flags |= HDR_TEXTURE_GROUP_POW_OF_TWO;
|
||||
|
||||
sTextureHdr TexHdr[ TexGrHdr.TextureCount ];
|
||||
std::vector<sTextureHdr> TexHdr( TexGrHdr.TextureCount );
|
||||
//sTextureHdr TexHdr[ ];
|
||||
|
||||
TexHdr[ 0 ] = CreateTextureHdr( this );
|
||||
|
||||
@@ -597,7 +598,7 @@ void cTexturePacker::SaveShapes() {
|
||||
CreateShapesHdr( this, tShapesHdr, &fs );
|
||||
|
||||
if ( tShapesHdr.size() )
|
||||
fs.write( reinterpret_cast<const char*> (&tShapesHdr[ 0 ]), sizeof(sShapeHdr) * tShapesHdr.size() );
|
||||
fs.write( reinterpret_cast<const char*> (&tShapesHdr[ 0 ]), sizeof(sShapeHdr) * (std::streamsize)tShapesHdr.size() );
|
||||
|
||||
Int32 HdrPos = 1;
|
||||
cTexturePacker * Child = mChild;
|
||||
@@ -608,7 +609,7 @@ void cTexturePacker::SaveShapes() {
|
||||
CreateShapesHdr( Child, tShapesHdr, &fs );
|
||||
|
||||
if ( tShapesHdr.size() )
|
||||
fs.write( reinterpret_cast<const char*> (&tShapesHdr[ 0 ]), sizeof(sShapeHdr) * tShapesHdr.size() );
|
||||
fs.write( reinterpret_cast<const char*> (&tShapesHdr[ 0 ]), sizeof(sShapeHdr) * (std::streamsize)tShapesHdr.size() );
|
||||
|
||||
Child = Child->GetChild();
|
||||
|
||||
|
||||
@@ -101,11 +101,11 @@ Uint32 * cVertexBuffer::GetIndices() {
|
||||
}
|
||||
|
||||
Uint32 cVertexBuffer::GetVertexCount() {
|
||||
return mVertexArray[ VERTEX_FLAG_POSITION ].size() / eeVertexElements[ VERTEX_FLAG_POSITION ];
|
||||
return (Uint32)mVertexArray[ VERTEX_FLAG_POSITION ].size() / eeVertexElements[ VERTEX_FLAG_POSITION ];
|
||||
}
|
||||
|
||||
Uint32 cVertexBuffer::GetIndexCount() {
|
||||
return mIndexArray.size();
|
||||
return (Uint32)mIndexArray.size();
|
||||
}
|
||||
|
||||
eeVector2f cVertexBuffer::GetVector2( const Uint32& Type, const Uint32& Index ) {
|
||||
|
||||
@@ -513,7 +513,7 @@ static void start_mem(stbi *s, uint8 const *buffer, int len)
|
||||
#ifndef STBI_NO_STDIO
|
||||
static void refill_buffer(stbi *s)
|
||||
{
|
||||
int n = fread(s->buffer_start, 1, s->buflen, s->img_file);
|
||||
int n = (int)fread(s->buffer_start, 1, s->buflen, s->img_file);
|
||||
if (n == 0) {
|
||||
s->from_file = 0;
|
||||
s->img_buffer = s->img_buffer_end-1;
|
||||
@@ -560,7 +560,7 @@ static void skip(stbi *s, int n)
|
||||
{
|
||||
#ifndef STBI_NO_STDIO
|
||||
if (s->img_file) {
|
||||
int blen = s->img_buffer_end - s->img_buffer;
|
||||
int blen = (int)( s->img_buffer_end - s->img_buffer );
|
||||
if (blen < n) {
|
||||
s->img_buffer = s->img_buffer_end;
|
||||
fseek(s->img_file, n - blen, SEEK_CUR);
|
||||
@@ -575,7 +575,7 @@ static int getn(stbi *s, stbi_uc *buffer, int n)
|
||||
{
|
||||
#ifndef STBI_NO_STDIO
|
||||
if (s->img_file) {
|
||||
int blen = s->img_buffer_end - s->img_buffer;
|
||||
int blen = (int)(s->img_buffer_end - s->img_buffer);
|
||||
if (blen < n) {
|
||||
int res;
|
||||
memcpy(buffer, s->img_buffer, blen);
|
||||
@@ -4683,6 +4683,9 @@ int stbi_psd_info_from_file(FILE *f, int *x, int *y, int *comp)
|
||||
|
||||
static int pic_info(stbi *s, int *x, int *y, int *comp)
|
||||
{
|
||||
int act_comp=0,num_packets=0,chained;
|
||||
pic_packet_t packets[10];
|
||||
|
||||
skip(s, 92);
|
||||
|
||||
*x = get16(s);
|
||||
@@ -4692,9 +4695,6 @@ static int pic_info(stbi *s, int *x, int *y, int *comp)
|
||||
|
||||
skip(s, 8);
|
||||
|
||||
int act_comp=0,num_packets=0,chained;
|
||||
pic_packet_t packets[10];
|
||||
|
||||
do {
|
||||
pic_packet_t *packet;
|
||||
|
||||
|
||||
@@ -278,7 +278,7 @@ void stbi_decode_DXT_color_block(
|
||||
}
|
||||
|
||||
static int dds_get_info( stbi *s, int *x, int *y, int *comp, int *iscompressed ) {
|
||||
int flags;
|
||||
int flags,is_compressed,has_alpha;
|
||||
DDS_header header;
|
||||
|
||||
if( sizeof( DDS_header ) != 128 )
|
||||
@@ -297,8 +297,8 @@ static int dds_get_info( stbi *s, int *x, int *y, int *comp, int *iscompressed )
|
||||
if( (header.sPixelFormat.dwFlags & flags) == 0 ) return 0;
|
||||
if( (header.sCaps.dwCaps1 & DDSCAPS_TEXTURE) == 0 ) return 0;
|
||||
|
||||
int is_compressed = (header.sPixelFormat.dwFlags & DDPF_FOURCC) / DDPF_FOURCC;
|
||||
int has_alpha = (header.sPixelFormat.dwFlags & DDPF_ALPHAPIXELS) / DDPF_ALPHAPIXELS;
|
||||
is_compressed = (header.sPixelFormat.dwFlags & DDPF_FOURCC) / DDPF_FOURCC;
|
||||
has_alpha = (header.sPixelFormat.dwFlags & DDPF_ALPHAPIXELS) / DDPF_ALPHAPIXELS;
|
||||
|
||||
*x = header.dwWidth;
|
||||
*y = header.dwHeight;
|
||||
|
||||
@@ -1,102 +1,18 @@
|
||||
/* config.h. Generated from config.h.in by configure. */
|
||||
/* config.h.in. Generated from configure.ac by autoheader. */
|
||||
#ifndef HAD_CONFIG_H
|
||||
#define HAD_CONFIG_H
|
||||
|
||||
/* Define to 1 if you have the declaration of `tzname', and to 0 if you don't.
|
||||
*/
|
||||
/* #undef HAVE_DECL_TZNAME */
|
||||
|
||||
/* Define to 1 if you have the <dlfcn.h> header file. */
|
||||
#define HAVE_DLFCN_H 1
|
||||
|
||||
#if !defined( __WIN32__ ) && !defined( _WIN32 )
|
||||
/* Define to 1 if you have the `fseeko' function. */
|
||||
#define HAVE_FSEEKO 1
|
||||
|
||||
/* Define to 1 if you have the `ftello' function. */
|
||||
#define HAVE_FTELLO 1
|
||||
|
||||
/* Define to 1 if `tm_zone' is a member of `struct tm'. */
|
||||
#define HAVE_STRUCT_TM_TM_ZONE 1
|
||||
|
||||
/* Define to 1 if you have the `mkstemp' function. */
|
||||
#define HAVE_MKSTEMP 1
|
||||
#define HAVE_FSEEKO
|
||||
#define HAVE_FTELLO
|
||||
#define HAVE_UNISTD_H
|
||||
|
||||
#endif
|
||||
#if (!defined (_MSCVER) && !defined (_MSC_VER))
|
||||
#define HAVE_MKSTEMP
|
||||
#endif
|
||||
|
||||
/* Define to 1 if you have the <inttypes.h> header file. */
|
||||
#define HAVE_INTTYPES_H 1
|
||||
#endif
|
||||
|
||||
/* Define to 1 if you have the `z' library (-lz). */
|
||||
#define HAVE_LIBZ 1
|
||||
|
||||
/* Define to 1 if you have the <memory.h> header file. */
|
||||
#define HAVE_MEMORY_H 1
|
||||
|
||||
/* Define to 1 if you have the `MoveFileExA' function. */
|
||||
/* #undef HAVE_MOVEFILEEXA */
|
||||
|
||||
/* Define to 1 if you have the <stdint.h> header file. */
|
||||
#define HAVE_STDINT_H 1
|
||||
|
||||
/* Define to 1 if you have the <stdlib.h> header file. */
|
||||
#define HAVE_STDLIB_H 1
|
||||
|
||||
/* Define to 1 if you have the <strings.h> header file. */
|
||||
#define HAVE_STRINGS_H 1
|
||||
|
||||
/* Define to 1 if you have the <string.h> header file. */
|
||||
#define HAVE_STRING_H 1
|
||||
|
||||
/* Define to 1 if you have the <sys/stat.h> header file. */
|
||||
#define HAVE_SYS_STAT_H 1
|
||||
|
||||
/* Define to 1 if you have the <sys/types.h> header file. */
|
||||
#define HAVE_SYS_TYPES_H 1
|
||||
|
||||
/* Define to 1 if your `struct tm' has `tm_zone'. Deprecated, use
|
||||
`HAVE_STRUCT_TM_TM_ZONE' instead. */
|
||||
#define HAVE_TM_ZONE 1
|
||||
|
||||
/* Define to 1 if you don't have `tm_zone' but do have the external array
|
||||
`tzname'. */
|
||||
/* #undef HAVE_TZNAME */
|
||||
|
||||
/* Define to 1 if you have the <unistd.h> header file. */
|
||||
#define HAVE_UNISTD_H 1
|
||||
|
||||
/* Define to the sub-directory in which libtool stores uninstalled libraries.
|
||||
*/
|
||||
#define LT_OBJDIR ".libs/"
|
||||
|
||||
/* Define to 1 if your C compiler doesn't accept -c and -o together. */
|
||||
/* #undef NO_MINUS_C_MINUS_O */
|
||||
|
||||
/* Name of package */
|
||||
#define PACKAGE "libzip"
|
||||
|
||||
/* Define to the address where bug reports for this package should be sent. */
|
||||
#define PACKAGE_BUGREPORT "libzip@nih.at"
|
||||
|
||||
/* Define to the full name of this package. */
|
||||
#define PACKAGE_NAME "libzip"
|
||||
|
||||
/* Define to the full name and version of this package. */
|
||||
#define PACKAGE_STRING "libzip 0.9.3"
|
||||
|
||||
/* Define to the one symbol short name of this package. */
|
||||
#define PACKAGE_TARNAME "libzip"
|
||||
|
||||
/* Define to the home page for this package. */
|
||||
#define PACKAGE_URL ""
|
||||
|
||||
/* Define to the version of this package. */
|
||||
#define PACKAGE_VERSION "0.9.3"
|
||||
|
||||
/* Define to 1 if you have the ANSI C header files. */
|
||||
#define STDC_HEADERS 1
|
||||
|
||||
/* Define to 1 if your <sys/time.h> declares `struct tm'. */
|
||||
/* #undef TM_IN_SYS_TIME */
|
||||
|
||||
/* Version number of package */
|
||||
#define VERSION "0.9.3"
|
||||
#define VERSION "0.9.3a"
|
||||
#endif /* HAD_CONFIG_H */
|
||||
|
||||
305
src/helper/libzip/inttypes.h
Normal file
305
src/helper/libzip/inttypes.h
Normal file
@@ -0,0 +1,305 @@
|
||||
// ISO C9x compliant inttypes.h for Microsoft Visual Studio
|
||||
// Based on ISO/IEC 9899:TC2 Committee draft (May 6, 2005) WG14/N1124
|
||||
//
|
||||
// Copyright (c) 2006 Alexander Chemeris
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are met:
|
||||
//
|
||||
// 1. Redistributions of source code must retain the above copyright notice,
|
||||
// this list of conditions and the following disclaimer.
|
||||
//
|
||||
// 2. Redistributions in binary form must reproduce the above copyright
|
||||
// notice, this list of conditions and the following disclaimer in the
|
||||
// documentation and/or other materials provided with the distribution.
|
||||
//
|
||||
// 3. The name of the author may be used to endorse or promote products
|
||||
// derived from this software without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
|
||||
// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
|
||||
// EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
||||
// OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||
// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
||||
// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||
// ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#ifndef _MSC_VER // [
|
||||
#error "Use this header only with Microsoft Visual C++ compilers!"
|
||||
#endif // _MSC_VER ]
|
||||
|
||||
#ifndef _MSC_INTTYPES_H_ // [
|
||||
#define _MSC_INTTYPES_H_
|
||||
|
||||
#if _MSC_VER > 1000
|
||||
#pragma once
|
||||
#endif
|
||||
|
||||
#include "stdint.h"
|
||||
|
||||
// 7.8 Format conversion of integer types
|
||||
|
||||
typedef struct {
|
||||
intmax_t quot;
|
||||
intmax_t rem;
|
||||
} imaxdiv_t;
|
||||
|
||||
// 7.8.1 Macros for format specifiers
|
||||
|
||||
#if !defined(__cplusplus) || defined(__STDC_FORMAT_MACROS) // [ See footnote 185 at page 198
|
||||
|
||||
// The fprintf macros for signed integers are:
|
||||
#define PRId8 "d"
|
||||
#define PRIi8 "i"
|
||||
#define PRIdLEAST8 "d"
|
||||
#define PRIiLEAST8 "i"
|
||||
#define PRIdFAST8 "d"
|
||||
#define PRIiFAST8 "i"
|
||||
|
||||
#define PRId16 "hd"
|
||||
#define PRIi16 "hi"
|
||||
#define PRIdLEAST16 "hd"
|
||||
#define PRIiLEAST16 "hi"
|
||||
#define PRIdFAST16 "hd"
|
||||
#define PRIiFAST16 "hi"
|
||||
|
||||
#define PRId32 "I32d"
|
||||
#define PRIi32 "I32i"
|
||||
#define PRIdLEAST32 "I32d"
|
||||
#define PRIiLEAST32 "I32i"
|
||||
#define PRIdFAST32 "I32d"
|
||||
#define PRIiFAST32 "I32i"
|
||||
|
||||
#define PRId64 "I64d"
|
||||
#define PRIi64 "I64i"
|
||||
#define PRIdLEAST64 "I64d"
|
||||
#define PRIiLEAST64 "I64i"
|
||||
#define PRIdFAST64 "I64d"
|
||||
#define PRIiFAST64 "I64i"
|
||||
|
||||
#define PRIdMAX "I64d"
|
||||
#define PRIiMAX "I64i"
|
||||
|
||||
#define PRIdPTR "Id"
|
||||
#define PRIiPTR "Ii"
|
||||
|
||||
// The fprintf macros for unsigned integers are:
|
||||
#define PRIo8 "o"
|
||||
#define PRIu8 "u"
|
||||
#define PRIx8 "x"
|
||||
#define PRIX8 "X"
|
||||
#define PRIoLEAST8 "o"
|
||||
#define PRIuLEAST8 "u"
|
||||
#define PRIxLEAST8 "x"
|
||||
#define PRIXLEAST8 "X"
|
||||
#define PRIoFAST8 "o"
|
||||
#define PRIuFAST8 "u"
|
||||
#define PRIxFAST8 "x"
|
||||
#define PRIXFAST8 "X"
|
||||
|
||||
#define PRIo16 "ho"
|
||||
#define PRIu16 "hu"
|
||||
#define PRIx16 "hx"
|
||||
#define PRIX16 "hX"
|
||||
#define PRIoLEAST16 "ho"
|
||||
#define PRIuLEAST16 "hu"
|
||||
#define PRIxLEAST16 "hx"
|
||||
#define PRIXLEAST16 "hX"
|
||||
#define PRIoFAST16 "ho"
|
||||
#define PRIuFAST16 "hu"
|
||||
#define PRIxFAST16 "hx"
|
||||
#define PRIXFAST16 "hX"
|
||||
|
||||
#define PRIo32 "I32o"
|
||||
#define PRIu32 "I32u"
|
||||
#define PRIx32 "I32x"
|
||||
#define PRIX32 "I32X"
|
||||
#define PRIoLEAST32 "I32o"
|
||||
#define PRIuLEAST32 "I32u"
|
||||
#define PRIxLEAST32 "I32x"
|
||||
#define PRIXLEAST32 "I32X"
|
||||
#define PRIoFAST32 "I32o"
|
||||
#define PRIuFAST32 "I32u"
|
||||
#define PRIxFAST32 "I32x"
|
||||
#define PRIXFAST32 "I32X"
|
||||
|
||||
#define PRIo64 "I64o"
|
||||
#define PRIu64 "I64u"
|
||||
#define PRIx64 "I64x"
|
||||
#define PRIX64 "I64X"
|
||||
#define PRIoLEAST64 "I64o"
|
||||
#define PRIuLEAST64 "I64u"
|
||||
#define PRIxLEAST64 "I64x"
|
||||
#define PRIXLEAST64 "I64X"
|
||||
#define PRIoFAST64 "I64o"
|
||||
#define PRIuFAST64 "I64u"
|
||||
#define PRIxFAST64 "I64x"
|
||||
#define PRIXFAST64 "I64X"
|
||||
|
||||
#define PRIoMAX "I64o"
|
||||
#define PRIuMAX "I64u"
|
||||
#define PRIxMAX "I64x"
|
||||
#define PRIXMAX "I64X"
|
||||
|
||||
#define PRIoPTR "Io"
|
||||
#define PRIuPTR "Iu"
|
||||
#define PRIxPTR "Ix"
|
||||
#define PRIXPTR "IX"
|
||||
|
||||
// The fscanf macros for signed integers are:
|
||||
#define SCNd8 "d"
|
||||
#define SCNi8 "i"
|
||||
#define SCNdLEAST8 "d"
|
||||
#define SCNiLEAST8 "i"
|
||||
#define SCNdFAST8 "d"
|
||||
#define SCNiFAST8 "i"
|
||||
|
||||
#define SCNd16 "hd"
|
||||
#define SCNi16 "hi"
|
||||
#define SCNdLEAST16 "hd"
|
||||
#define SCNiLEAST16 "hi"
|
||||
#define SCNdFAST16 "hd"
|
||||
#define SCNiFAST16 "hi"
|
||||
|
||||
#define SCNd32 "ld"
|
||||
#define SCNi32 "li"
|
||||
#define SCNdLEAST32 "ld"
|
||||
#define SCNiLEAST32 "li"
|
||||
#define SCNdFAST32 "ld"
|
||||
#define SCNiFAST32 "li"
|
||||
|
||||
#define SCNd64 "I64d"
|
||||
#define SCNi64 "I64i"
|
||||
#define SCNdLEAST64 "I64d"
|
||||
#define SCNiLEAST64 "I64i"
|
||||
#define SCNdFAST64 "I64d"
|
||||
#define SCNiFAST64 "I64i"
|
||||
|
||||
#define SCNdMAX "I64d"
|
||||
#define SCNiMAX "I64i"
|
||||
|
||||
#ifdef _WIN64 // [
|
||||
# define SCNdPTR "I64d"
|
||||
# define SCNiPTR "I64i"
|
||||
#else // _WIN64 ][
|
||||
# define SCNdPTR "ld"
|
||||
# define SCNiPTR "li"
|
||||
#endif // _WIN64 ]
|
||||
|
||||
// The fscanf macros for unsigned integers are:
|
||||
#define SCNo8 "o"
|
||||
#define SCNu8 "u"
|
||||
#define SCNx8 "x"
|
||||
#define SCNX8 "X"
|
||||
#define SCNoLEAST8 "o"
|
||||
#define SCNuLEAST8 "u"
|
||||
#define SCNxLEAST8 "x"
|
||||
#define SCNXLEAST8 "X"
|
||||
#define SCNoFAST8 "o"
|
||||
#define SCNuFAST8 "u"
|
||||
#define SCNxFAST8 "x"
|
||||
#define SCNXFAST8 "X"
|
||||
|
||||
#define SCNo16 "ho"
|
||||
#define SCNu16 "hu"
|
||||
#define SCNx16 "hx"
|
||||
#define SCNX16 "hX"
|
||||
#define SCNoLEAST16 "ho"
|
||||
#define SCNuLEAST16 "hu"
|
||||
#define SCNxLEAST16 "hx"
|
||||
#define SCNXLEAST16 "hX"
|
||||
#define SCNoFAST16 "ho"
|
||||
#define SCNuFAST16 "hu"
|
||||
#define SCNxFAST16 "hx"
|
||||
#define SCNXFAST16 "hX"
|
||||
|
||||
#define SCNo32 "lo"
|
||||
#define SCNu32 "lu"
|
||||
#define SCNx32 "lx"
|
||||
#define SCNX32 "lX"
|
||||
#define SCNoLEAST32 "lo"
|
||||
#define SCNuLEAST32 "lu"
|
||||
#define SCNxLEAST32 "lx"
|
||||
#define SCNXLEAST32 "lX"
|
||||
#define SCNoFAST32 "lo"
|
||||
#define SCNuFAST32 "lu"
|
||||
#define SCNxFAST32 "lx"
|
||||
#define SCNXFAST32 "lX"
|
||||
|
||||
#define SCNo64 "I64o"
|
||||
#define SCNu64 "I64u"
|
||||
#define SCNx64 "I64x"
|
||||
#define SCNX64 "I64X"
|
||||
#define SCNoLEAST64 "I64o"
|
||||
#define SCNuLEAST64 "I64u"
|
||||
#define SCNxLEAST64 "I64x"
|
||||
#define SCNXLEAST64 "I64X"
|
||||
#define SCNoFAST64 "I64o"
|
||||
#define SCNuFAST64 "I64u"
|
||||
#define SCNxFAST64 "I64x"
|
||||
#define SCNXFAST64 "I64X"
|
||||
|
||||
#define SCNoMAX "I64o"
|
||||
#define SCNuMAX "I64u"
|
||||
#define SCNxMAX "I64x"
|
||||
#define SCNXMAX "I64X"
|
||||
|
||||
#ifdef _WIN64 // [
|
||||
# define SCNoPTR "I64o"
|
||||
# define SCNuPTR "I64u"
|
||||
# define SCNxPTR "I64x"
|
||||
# define SCNXPTR "I64X"
|
||||
#else // _WIN64 ][
|
||||
# define SCNoPTR "lo"
|
||||
# define SCNuPTR "lu"
|
||||
# define SCNxPTR "lx"
|
||||
# define SCNXPTR "lX"
|
||||
#endif // _WIN64 ]
|
||||
|
||||
#endif // __STDC_FORMAT_MACROS ]
|
||||
|
||||
// 7.8.2 Functions for greatest-width integer types
|
||||
|
||||
// 7.8.2.1 The imaxabs function
|
||||
#define imaxabs _abs64
|
||||
|
||||
// 7.8.2.2 The imaxdiv function
|
||||
|
||||
// This is modified version of div() function from Microsoft's div.c found
|
||||
// in %MSVC.NET%\crt\src\div.c
|
||||
#ifdef STATIC_IMAXDIV // [
|
||||
static
|
||||
#else // STATIC_IMAXDIV ][
|
||||
_inline
|
||||
#endif // STATIC_IMAXDIV ]
|
||||
imaxdiv_t __cdecl imaxdiv(intmax_t numer, intmax_t denom)
|
||||
{
|
||||
imaxdiv_t result;
|
||||
|
||||
result.quot = numer / denom;
|
||||
result.rem = numer % denom;
|
||||
|
||||
if (numer < 0 && result.rem > 0) {
|
||||
// did division wrong; must fix up
|
||||
++result.quot;
|
||||
result.rem -= denom;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
// 7.8.2.3 The strtoimax and strtoumax functions
|
||||
#define strtoimax _strtoi64
|
||||
#define strtoumax _strtoui64
|
||||
|
||||
// 7.8.2.4 The wcstoimax and wcstoumax functions
|
||||
#define wcstoimax _wcstoi64
|
||||
#define wcstoumax _wcstoui64
|
||||
|
||||
|
||||
#endif // _MSC_INTTYPES_H_ ]
|
||||
@@ -1,5 +1,3 @@
|
||||
/* $NiH: mkstemp.c,v 1.3 2006/04/23 14:51:45 wiz Exp $ */
|
||||
|
||||
/* Adapted from NetBSB libc by Dieter Baron */
|
||||
|
||||
/* NetBSD: gettemp.c,v 1.13 2003/12/05 00:57:36 uebayasi Exp */
|
||||
@@ -32,7 +30,6 @@
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
|
||||
@@ -42,12 +39,23 @@
|
||||
#include <fcntl.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#ifndef O_BINARY
|
||||
#define O_BINARY 0
|
||||
#endif
|
||||
|
||||
#if ( defined (_MSCVER) || defined (_MSC_VER) )
|
||||
typedef int pid_t;
|
||||
|
||||
# define _IFMT 0170000 // type of file
|
||||
# define _IFDIR 0040000 // directory
|
||||
# define S_ISDIR(m) (((m)&_IFMT) == _IFDIR)
|
||||
#endif
|
||||
|
||||
#if !defined( __WIN32__ ) && !defined( _WIN32 )
|
||||
#include <unistd.h>
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
int
|
||||
@@ -117,7 +125,11 @@ _zip_mkstemp(char *path)
|
||||
}
|
||||
|
||||
for (;;) {
|
||||
if ((fd=open(path, O_CREAT|O_EXCL|O_RDWR|O_BINARY, 0600)) >= 0)
|
||||
#if ( defined (_MSCVER) || defined (_MSC_VER) )
|
||||
if ((fd=_open(path, O_CREAT|O_EXCL|O_RDWR|O_BINARY)) >= 0)
|
||||
#else
|
||||
if ((fd=open(path, O_CREAT|O_EXCL|O_RDWR|O_BINARY, 0600)) >= 0)
|
||||
#endif
|
||||
return (fd);
|
||||
if (errno != EEXIST)
|
||||
return (0);
|
||||
|
||||
247
src/helper/libzip/stdint.h
Normal file
247
src/helper/libzip/stdint.h
Normal file
@@ -0,0 +1,247 @@
|
||||
// ISO C9x compliant stdint.h for Microsoft Visual Studio
|
||||
// Based on ISO/IEC 9899:TC2 Committee draft (May 6, 2005) WG14/N1124
|
||||
//
|
||||
// Copyright (c) 2006-2008 Alexander Chemeris
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are met:
|
||||
//
|
||||
// 1. Redistributions of source code must retain the above copyright notice,
|
||||
// this list of conditions and the following disclaimer.
|
||||
//
|
||||
// 2. Redistributions in binary form must reproduce the above copyright
|
||||
// notice, this list of conditions and the following disclaimer in the
|
||||
// documentation and/or other materials provided with the distribution.
|
||||
//
|
||||
// 3. The name of the author may be used to endorse or promote products
|
||||
// derived from this software without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
|
||||
// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
|
||||
// EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
||||
// OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||
// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
||||
// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||
// ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#ifndef _MSC_VER // [
|
||||
#error "Use this header only with Microsoft Visual C++ compilers!"
|
||||
#endif // _MSC_VER ]
|
||||
|
||||
#ifndef _MSC_STDINT_H_ // [
|
||||
#define _MSC_STDINT_H_
|
||||
|
||||
#if _MSC_VER > 1000
|
||||
#pragma once
|
||||
#endif
|
||||
|
||||
#include <limits.h>
|
||||
|
||||
// For Visual Studio 6 in C++ mode and for many Visual Studio versions when
|
||||
// compiling for ARM we should wrap <wchar.h> include with 'extern "C++" {}'
|
||||
// or compiler give many errors like this:
|
||||
// error C2733: second C linkage of overloaded function 'wmemchr' not allowed
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
# include <wchar.h>
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
// Define _W64 macros to mark types changing their size, like intptr_t.
|
||||
#ifndef _W64
|
||||
# if !defined(__midl) && (defined(_X86_) || defined(_M_IX86)) && _MSC_VER >= 1300
|
||||
# define _W64 __w64
|
||||
# else
|
||||
# define _W64
|
||||
# endif
|
||||
#endif
|
||||
|
||||
|
||||
// 7.18.1 Integer types
|
||||
|
||||
// 7.18.1.1 Exact-width integer types
|
||||
|
||||
// Visual Studio 6 and Embedded Visual C++ 4 doesn't
|
||||
// realize that, e.g. char has the same size as __int8
|
||||
// so we give up on __intX for them.
|
||||
#if (_MSC_VER < 1300)
|
||||
typedef signed char int8_t;
|
||||
typedef signed short int16_t;
|
||||
typedef signed int int32_t;
|
||||
typedef unsigned char uint8_t;
|
||||
typedef unsigned short uint16_t;
|
||||
typedef unsigned int uint32_t;
|
||||
#else
|
||||
typedef signed __int8 int8_t;
|
||||
typedef signed __int16 int16_t;
|
||||
typedef signed __int32 int32_t;
|
||||
typedef unsigned __int8 uint8_t;
|
||||
typedef unsigned __int16 uint16_t;
|
||||
typedef unsigned __int32 uint32_t;
|
||||
#endif
|
||||
typedef signed __int64 int64_t;
|
||||
typedef unsigned __int64 uint64_t;
|
||||
|
||||
|
||||
// 7.18.1.2 Minimum-width integer types
|
||||
typedef int8_t int_least8_t;
|
||||
typedef int16_t int_least16_t;
|
||||
typedef int32_t int_least32_t;
|
||||
typedef int64_t int_least64_t;
|
||||
typedef uint8_t uint_least8_t;
|
||||
typedef uint16_t uint_least16_t;
|
||||
typedef uint32_t uint_least32_t;
|
||||
typedef uint64_t uint_least64_t;
|
||||
|
||||
// 7.18.1.3 Fastest minimum-width integer types
|
||||
typedef int8_t int_fast8_t;
|
||||
typedef int16_t int_fast16_t;
|
||||
typedef int32_t int_fast32_t;
|
||||
typedef int64_t int_fast64_t;
|
||||
typedef uint8_t uint_fast8_t;
|
||||
typedef uint16_t uint_fast16_t;
|
||||
typedef uint32_t uint_fast32_t;
|
||||
typedef uint64_t uint_fast64_t;
|
||||
|
||||
// 7.18.1.4 Integer types capable of holding object pointers
|
||||
#ifdef _WIN64 // [
|
||||
typedef signed __int64 intptr_t;
|
||||
typedef unsigned __int64 uintptr_t;
|
||||
#else // _WIN64 ][
|
||||
typedef _W64 signed int intptr_t;
|
||||
typedef _W64 unsigned int uintptr_t;
|
||||
#endif // _WIN64 ]
|
||||
|
||||
// 7.18.1.5 Greatest-width integer types
|
||||
typedef int64_t intmax_t;
|
||||
typedef uint64_t uintmax_t;
|
||||
|
||||
|
||||
// 7.18.2 Limits of specified-width integer types
|
||||
|
||||
#if !defined(__cplusplus) || defined(__STDC_LIMIT_MACROS) // [ See footnote 220 at page 257 and footnote 221 at page 259
|
||||
|
||||
// 7.18.2.1 Limits of exact-width integer types
|
||||
#define INT8_MIN ((int8_t)_I8_MIN)
|
||||
#define INT8_MAX _I8_MAX
|
||||
#define INT16_MIN ((int16_t)_I16_MIN)
|
||||
#define INT16_MAX _I16_MAX
|
||||
#define INT32_MIN ((int32_t)_I32_MIN)
|
||||
#define INT32_MAX _I32_MAX
|
||||
#define INT64_MIN ((int64_t)_I64_MIN)
|
||||
#define INT64_MAX _I64_MAX
|
||||
#define UINT8_MAX _UI8_MAX
|
||||
#define UINT16_MAX _UI16_MAX
|
||||
#define UINT32_MAX _UI32_MAX
|
||||
#define UINT64_MAX _UI64_MAX
|
||||
|
||||
// 7.18.2.2 Limits of minimum-width integer types
|
||||
#define INT_LEAST8_MIN INT8_MIN
|
||||
#define INT_LEAST8_MAX INT8_MAX
|
||||
#define INT_LEAST16_MIN INT16_MIN
|
||||
#define INT_LEAST16_MAX INT16_MAX
|
||||
#define INT_LEAST32_MIN INT32_MIN
|
||||
#define INT_LEAST32_MAX INT32_MAX
|
||||
#define INT_LEAST64_MIN INT64_MIN
|
||||
#define INT_LEAST64_MAX INT64_MAX
|
||||
#define UINT_LEAST8_MAX UINT8_MAX
|
||||
#define UINT_LEAST16_MAX UINT16_MAX
|
||||
#define UINT_LEAST32_MAX UINT32_MAX
|
||||
#define UINT_LEAST64_MAX UINT64_MAX
|
||||
|
||||
// 7.18.2.3 Limits of fastest minimum-width integer types
|
||||
#define INT_FAST8_MIN INT8_MIN
|
||||
#define INT_FAST8_MAX INT8_MAX
|
||||
#define INT_FAST16_MIN INT16_MIN
|
||||
#define INT_FAST16_MAX INT16_MAX
|
||||
#define INT_FAST32_MIN INT32_MIN
|
||||
#define INT_FAST32_MAX INT32_MAX
|
||||
#define INT_FAST64_MIN INT64_MIN
|
||||
#define INT_FAST64_MAX INT64_MAX
|
||||
#define UINT_FAST8_MAX UINT8_MAX
|
||||
#define UINT_FAST16_MAX UINT16_MAX
|
||||
#define UINT_FAST32_MAX UINT32_MAX
|
||||
#define UINT_FAST64_MAX UINT64_MAX
|
||||
|
||||
// 7.18.2.4 Limits of integer types capable of holding object pointers
|
||||
#ifdef _WIN64 // [
|
||||
# define INTPTR_MIN INT64_MIN
|
||||
# define INTPTR_MAX INT64_MAX
|
||||
# define UINTPTR_MAX UINT64_MAX
|
||||
#else // _WIN64 ][
|
||||
# define INTPTR_MIN INT32_MIN
|
||||
# define INTPTR_MAX INT32_MAX
|
||||
# define UINTPTR_MAX UINT32_MAX
|
||||
#endif // _WIN64 ]
|
||||
|
||||
// 7.18.2.5 Limits of greatest-width integer types
|
||||
#define INTMAX_MIN INT64_MIN
|
||||
#define INTMAX_MAX INT64_MAX
|
||||
#define UINTMAX_MAX UINT64_MAX
|
||||
|
||||
// 7.18.3 Limits of other integer types
|
||||
|
||||
#ifdef _WIN64 // [
|
||||
# define PTRDIFF_MIN _I64_MIN
|
||||
# define PTRDIFF_MAX _I64_MAX
|
||||
#else // _WIN64 ][
|
||||
# define PTRDIFF_MIN _I32_MIN
|
||||
# define PTRDIFF_MAX _I32_MAX
|
||||
#endif // _WIN64 ]
|
||||
|
||||
#define SIG_ATOMIC_MIN INT_MIN
|
||||
#define SIG_ATOMIC_MAX INT_MAX
|
||||
|
||||
#ifndef SIZE_MAX // [
|
||||
# ifdef _WIN64 // [
|
||||
# define SIZE_MAX _UI64_MAX
|
||||
# else // _WIN64 ][
|
||||
# define SIZE_MAX _UI32_MAX
|
||||
# endif // _WIN64 ]
|
||||
#endif // SIZE_MAX ]
|
||||
|
||||
// WCHAR_MIN and WCHAR_MAX are also defined in <wchar.h>
|
||||
#ifndef WCHAR_MIN // [
|
||||
# define WCHAR_MIN 0
|
||||
#endif // WCHAR_MIN ]
|
||||
#ifndef WCHAR_MAX // [
|
||||
# define WCHAR_MAX _UI16_MAX
|
||||
#endif // WCHAR_MAX ]
|
||||
|
||||
#define WINT_MIN 0
|
||||
#define WINT_MAX _UI16_MAX
|
||||
|
||||
#endif // __STDC_LIMIT_MACROS ]
|
||||
|
||||
|
||||
// 7.18.4 Limits of other integer types
|
||||
|
||||
#if !defined(__cplusplus) || defined(__STDC_CONSTANT_MACROS) // [ See footnote 224 at page 260
|
||||
|
||||
// 7.18.4.1 Macros for minimum-width integer constants
|
||||
|
||||
#define INT8_C(val) val##i8
|
||||
#define INT16_C(val) val##i16
|
||||
#define INT32_C(val) val##i32
|
||||
#define INT64_C(val) val##i64
|
||||
|
||||
#define UINT8_C(val) val##ui8
|
||||
#define UINT16_C(val) val##ui16
|
||||
#define UINT32_C(val) val##ui32
|
||||
#define UINT64_C(val) val##ui64
|
||||
|
||||
// 7.18.4.2 Macros for greatest-width integer constants
|
||||
#define INTMAX_C INT64_C
|
||||
#define UINTMAX_C UINT64_C
|
||||
|
||||
#endif // __STDC_CONSTANT_MACROS ]
|
||||
|
||||
|
||||
#endif // _MSC_STDINT_H_ ]
|
||||
@@ -3,7 +3,7 @@
|
||||
|
||||
/*
|
||||
zip.h -- exported declarations.
|
||||
Copyright (C) 1999-2008 Dieter Baron and Thomas Klausner
|
||||
Copyright (C) 1999-2010 Dieter Baron and Thomas Klausner
|
||||
|
||||
This file is part of libzip, a library to manipulate ZIP archives.
|
||||
The authors can be contacted at <libzip@nih.at>
|
||||
@@ -20,7 +20,7 @@
|
||||
3. The names of the authors may not be used to endorse or promote
|
||||
products derived from this software without specific prior
|
||||
written permission.
|
||||
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
|
||||
OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
@@ -37,17 +37,19 @@
|
||||
|
||||
|
||||
#ifndef ZIP_EXTERN
|
||||
#ifdef _MSC_VER
|
||||
#define ZIP_EXTERN __declspec(dllexport)
|
||||
#else
|
||||
/*#ifdef _WIN32
|
||||
#define ZIP_EXTERN __declspec(dllimport)
|
||||
#else*/
|
||||
#define ZIP_EXTERN
|
||||
#endif
|
||||
//#endif
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include "zipconf.h"
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <stdio.h>
|
||||
#include <time.h>
|
||||
@@ -66,10 +68,19 @@ extern "C" {
|
||||
#define ZIP_FL_COMPRESSED 4 /* read compressed data */
|
||||
#define ZIP_FL_UNCHANGED 8 /* use original data, ignoring changes */
|
||||
#define ZIP_FL_RECOMPRESS 16 /* force recompression of data */
|
||||
#define ZIP_FL_ENCRYPTED 32 /* read encrypted data
|
||||
(implies ZIP_FL_COMPRESSED) */
|
||||
|
||||
/* archive global flags flags */
|
||||
|
||||
#define ZIP_AFL_TORRENT 1 /* torrent zipped */
|
||||
#define ZIP_AFL_RDONLY 2 /* read only -- cannot be cleared */
|
||||
|
||||
|
||||
/* flags for compression and encryption sources */
|
||||
|
||||
#define ZIP_CODEC_ENCODE 1 /* compress/encrypt */
|
||||
|
||||
|
||||
/* libzip error codes */
|
||||
|
||||
@@ -97,7 +108,10 @@ extern "C" {
|
||||
#define ZIP_ER_INCONS 21 /* N Zip archive inconsistent */
|
||||
#define ZIP_ER_REMOVE 22 /* S Can't remove file */
|
||||
#define ZIP_ER_DELETED 23 /* N Entry has been deleted */
|
||||
|
||||
#define ZIP_ER_ENCRNOTSUPP 24 /* N Encryption method not supported */
|
||||
#define ZIP_ER_RDONLY 25 /* N Read-only archive */
|
||||
#define ZIP_ER_NOPASSWD 26 /* N No password provided */
|
||||
#define ZIP_ER_WRONGPASSWD 27 /* N Wrong password provided */
|
||||
|
||||
/* type of system error value */
|
||||
|
||||
@@ -154,72 +168,131 @@ enum zip_source_cmd {
|
||||
ZIP_SOURCE_CLOSE, /* reading is done */
|
||||
ZIP_SOURCE_STAT, /* get meta information */
|
||||
ZIP_SOURCE_ERROR, /* get error information */
|
||||
ZIP_SOURCE_FREE /* cleanup and free resources */
|
||||
ZIP_SOURCE_FREE, /* cleanup and free resources */
|
||||
};
|
||||
|
||||
typedef ssize_t (*zip_source_callback)(void *state, void *data,
|
||||
size_t len, enum zip_source_cmd cmd);
|
||||
#define ZIP_SOURCE_ERR_LOWER -2
|
||||
|
||||
#define ZIP_STAT_NAME 0x0001
|
||||
#define ZIP_STAT_INDEX 0x0002
|
||||
#define ZIP_STAT_SIZE 0x0004
|
||||
#define ZIP_STAT_COMP_SIZE 0x0008
|
||||
#define ZIP_STAT_MTIME 0x0010
|
||||
#define ZIP_STAT_CRC 0x0020
|
||||
#define ZIP_STAT_COMP_METHOD 0x0040
|
||||
#define ZIP_STAT_ENCRYPTION_METHOD 0x0080
|
||||
#define ZIP_STAT_FLAGS 0x0100
|
||||
|
||||
struct zip_stat {
|
||||
zip_uint64_t valid; /* which fields have valid values */
|
||||
const char *name; /* name of the file */
|
||||
int index; /* index within archive */
|
||||
unsigned int crc; /* crc of file data */
|
||||
zip_uint64_t index; /* index within archive */
|
||||
zip_uint64_t size; /* size of file (uncompressed) */
|
||||
zip_uint64_t comp_size; /* size of file (compressed) */
|
||||
time_t mtime; /* modification time */
|
||||
off_t size; /* size of file (uncompressed) */
|
||||
off_t comp_size; /* size of file (compressed) */
|
||||
unsigned short comp_method; /* compression method used */
|
||||
unsigned short encryption_method; /* encryption method used */
|
||||
zip_uint32_t crc; /* crc of file data */
|
||||
zip_uint16_t comp_method; /* compression method used */
|
||||
zip_uint16_t encryption_method; /* encryption method used */
|
||||
zip_uint32_t flags; /* reserved for future use */
|
||||
};
|
||||
|
||||
struct zip;
|
||||
struct zip_file;
|
||||
struct zip_source;
|
||||
|
||||
typedef zip_int64_t (*zip_source_callback)(void *, void *, zip_uint64_t,
|
||||
enum zip_source_cmd);
|
||||
typedef zip_int64_t (*zip_source_layered_callback)(struct zip_source *, void *,
|
||||
void *, zip_uint64_t,
|
||||
enum zip_source_cmd);
|
||||
typedef struct zip_source *(*zip_compression_implementation)(struct zip *,
|
||||
struct zip_source *,
|
||||
zip_uint16_t, int);
|
||||
typedef struct zip_source *(*zip_encryption_implementation)(struct zip *,
|
||||
struct zip_source *,
|
||||
zip_uint16_t, int,
|
||||
const char *);
|
||||
|
||||
|
||||
|
||||
ZIP_EXTERN int zip_add(struct zip *, const char *, struct zip_source *);
|
||||
ZIP_EXTERN int zip_add_dir(struct zip *, const char *);
|
||||
ZIP_EXTERN zip_int64_t zip_add(struct zip *, const char *, struct zip_source *);
|
||||
ZIP_EXTERN zip_int64_t zip_add_dir(struct zip *, const char *);
|
||||
ZIP_EXTERN int zip_close(struct zip *);
|
||||
ZIP_EXTERN int zip_delete(struct zip *, int);
|
||||
ZIP_EXTERN int zip_delete(struct zip *, zip_uint64_t);
|
||||
ZIP_EXTERN void zip_error_clear(struct zip *);
|
||||
ZIP_EXTERN void zip_error_get(struct zip *, int *, int *);
|
||||
ZIP_EXTERN int zip_error_get_sys_type(int);
|
||||
ZIP_EXTERN int zip_error_to_str(char *, size_t, int, int);
|
||||
ZIP_EXTERN int zip_error_to_str(char *, zip_uint64_t, int, int);
|
||||
ZIP_EXTERN int zip_fclose(struct zip_file *);
|
||||
ZIP_EXTERN struct zip *zip_fdopen(int, int, int *);
|
||||
ZIP_EXTERN void zip_file_error_clear(struct zip_file *);
|
||||
ZIP_EXTERN void zip_file_error_get(struct zip_file *, int *, int *);
|
||||
ZIP_EXTERN const char *zip_file_strerror(struct zip_file *);
|
||||
ZIP_EXTERN struct zip_file *zip_fopen(struct zip *, const char *, int);
|
||||
ZIP_EXTERN struct zip_file *zip_fopen_index(struct zip *, int, int);
|
||||
ZIP_EXTERN ssize_t zip_fread(struct zip_file *, void *, size_t);
|
||||
ZIP_EXTERN struct zip_file *zip_fopen_encrypted(struct zip *, const char *,
|
||||
int, const char *);
|
||||
ZIP_EXTERN struct zip_file *zip_fopen_index(struct zip *, zip_uint64_t, int);
|
||||
ZIP_EXTERN struct zip_file *zip_fopen_index_encrypted(struct zip *,
|
||||
zip_uint64_t, int,
|
||||
const char *);
|
||||
ZIP_EXTERN zip_int64_t zip_fread(struct zip_file *, void *, zip_uint64_t);
|
||||
ZIP_EXTERN const char *zip_get_archive_comment(struct zip *, int *, int);
|
||||
ZIP_EXTERN int zip_get_archive_flag(struct zip *, int, int);
|
||||
ZIP_EXTERN const char *zip_get_file_comment(struct zip *, int, int *, int);
|
||||
ZIP_EXTERN const char *zip_get_name(struct zip *, int, int);
|
||||
ZIP_EXTERN zip_compression_implementation zip_get_compression_implementation(
|
||||
zip_uint16_t);
|
||||
ZIP_EXTERN zip_encryption_implementation zip_get_encryption_implementation(
|
||||
zip_uint16_t);
|
||||
ZIP_EXTERN const char *zip_get_file_comment(struct zip *, zip_uint64_t,
|
||||
int *, int);
|
||||
ZIP_EXTERN const char *zip_get_name(struct zip *, zip_uint64_t, int);
|
||||
ZIP_EXTERN int zip_get_num_files(struct zip *);
|
||||
ZIP_EXTERN int zip_name_locate(struct zip *, const char *, int);
|
||||
ZIP_EXTERN struct zip *zip_open(const char *, int, int *);
|
||||
ZIP_EXTERN int zip_rename(struct zip *, int, const char *);
|
||||
ZIP_EXTERN int zip_replace(struct zip *, int, struct zip_source *);
|
||||
ZIP_EXTERN int zip_rename(struct zip *, zip_uint64_t, const char *);
|
||||
ZIP_EXTERN int zip_replace(struct zip *, zip_uint64_t, struct zip_source *);
|
||||
ZIP_EXTERN int zip_set_archive_comment(struct zip *, const char *, int);
|
||||
ZIP_EXTERN int zip_set_archive_flag(struct zip *, int, int);
|
||||
ZIP_EXTERN int zip_set_file_comment(struct zip *, int, const char *, int);
|
||||
ZIP_EXTERN int zip_set_default_password(struct zip *, const char *);
|
||||
ZIP_EXTERN int zip_set_file_comment(struct zip *, zip_uint64_t,
|
||||
const char *, int);
|
||||
ZIP_EXTERN struct zip_source *zip_source_buffer(struct zip *, const void *,
|
||||
off_t, int);
|
||||
zip_uint64_t, int);
|
||||
ZIP_EXTERN void zip_source_close(struct zip_source *);
|
||||
ZIP_EXTERN struct zip_source *zip_source_crc(struct zip *, struct zip_source *,
|
||||
int);
|
||||
ZIP_EXTERN struct zip_source *zip_source_deflate(struct zip *,
|
||||
struct zip_source *,
|
||||
zip_uint16_t, int);
|
||||
ZIP_EXTERN void zip_source_error(struct zip_source *, int *, int *);
|
||||
ZIP_EXTERN struct zip_source *zip_source_file(struct zip *, const char *,
|
||||
off_t, off_t);
|
||||
zip_uint64_t, zip_int64_t);
|
||||
ZIP_EXTERN struct zip_source *zip_source_filep(struct zip *, FILE *,
|
||||
off_t, off_t);
|
||||
zip_uint64_t, zip_int64_t);
|
||||
ZIP_EXTERN void zip_source_free(struct zip_source *);
|
||||
ZIP_EXTERN struct zip_source *zip_source_function(struct zip *,
|
||||
zip_source_callback, void *);
|
||||
ZIP_EXTERN struct zip_source *zip_source_layered(struct zip *,
|
||||
struct zip_source *,
|
||||
zip_source_layered_callback,
|
||||
void *);
|
||||
ZIP_EXTERN int zip_source_open(struct zip_source *);
|
||||
ZIP_EXTERN struct zip_source *zip_source_pkware(struct zip *,
|
||||
struct zip_source *,
|
||||
zip_uint16_t, int,
|
||||
const char *);
|
||||
ZIP_EXTERN struct zip_source *zip_source_pop(struct zip_source *);
|
||||
ZIP_EXTERN zip_int64_t zip_source_read(struct zip_source *, void *,
|
||||
zip_uint64_t);
|
||||
ZIP_EXTERN int zip_source_stat(struct zip_source *, struct zip_stat *);
|
||||
ZIP_EXTERN struct zip_source *zip_source_zip(struct zip *, struct zip *,
|
||||
int, int, off_t, off_t);
|
||||
zip_uint64_t, int,
|
||||
zip_uint64_t, zip_int64_t);
|
||||
ZIP_EXTERN int zip_stat(struct zip *, const char *, int, struct zip_stat *);
|
||||
ZIP_EXTERN int zip_stat_index(struct zip *, int, int, struct zip_stat *);
|
||||
ZIP_EXTERN int zip_stat_index(struct zip *, zip_uint64_t, int,
|
||||
struct zip_stat *);
|
||||
ZIP_EXTERN void zip_stat_init(struct zip_stat *);
|
||||
ZIP_EXTERN const char *zip_strerror(struct zip *);
|
||||
ZIP_EXTERN int zip_unchange(struct zip *, int);
|
||||
ZIP_EXTERN int zip_unchange(struct zip *, zip_uint64_t);
|
||||
ZIP_EXTERN int zip_unchange_all(struct zip *);
|
||||
ZIP_EXTERN int zip_unchange_archive(struct zip *);
|
||||
|
||||
|
||||
@@ -37,7 +37,14 @@
|
||||
|
||||
|
||||
|
||||
ZIP_EXTERN int
|
||||
/*
|
||||
NOTE: Return type is signed so we can return -1 on error.
|
||||
The index can not be larger than ZIP_INT64_MAX since the size
|
||||
of the central directory cannot be larger than
|
||||
ZIP_UINT64_MAX, and each entry is larger than 2 bytes.
|
||||
*/
|
||||
|
||||
ZIP_EXTERN zip_int64_t
|
||||
zip_add(struct zip *za, const char *name, struct zip_source *source)
|
||||
{
|
||||
if (name == NULL || source == NULL) {
|
||||
@@ -45,5 +52,5 @@ zip_add(struct zip *za, const char *name, struct zip_source *source)
|
||||
return -1;
|
||||
}
|
||||
|
||||
return _zip_replace(za, -1, name, source);
|
||||
return _zip_replace(za, ZIP_UINT64_MAX, name, source);
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
zip_add_dir.c -- add directory
|
||||
Copyright (C) 1999-2007 Dieter Baron and Thomas Klausner
|
||||
Copyright (C) 1999-2009 Dieter Baron and Thomas Klausner
|
||||
|
||||
This file is part of libzip, a library to manipulate ZIP archives.
|
||||
The authors can be contacted at <libzip@nih.at>
|
||||
@@ -40,13 +40,21 @@
|
||||
|
||||
|
||||
|
||||
ZIP_EXTERN int
|
||||
/* NOTE: Signed due to -1 on error. See zip_add.c for more details. */
|
||||
|
||||
ZIP_EXTERN zip_int64_t
|
||||
zip_add_dir(struct zip *za, const char *name)
|
||||
{
|
||||
int len, ret;
|
||||
int len;
|
||||
zip_int64_t ret;
|
||||
char *s;
|
||||
struct zip_source *source;
|
||||
|
||||
if (ZIP_IS_RDONLY(za)) {
|
||||
_zip_error_set(&za->error, ZIP_ER_RDONLY, 0);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (name == NULL) {
|
||||
_zip_error_set(&za->error, ZIP_ER_INVAL, 0);
|
||||
return -1;
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
zip_close.c -- close zip archive and update changes
|
||||
Copyright (C) 1999-2008 Dieter Baron and Thomas Klausner
|
||||
Copyright (C) 1999-2009 Dieter Baron and Thomas Klausner
|
||||
|
||||
This file is part of libzip, a library to manipulate ZIP archives.
|
||||
The authors can be contacted at <libzip@nih.at>
|
||||
@@ -38,21 +38,23 @@
|
||||
#include <string.h>
|
||||
#include <errno.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/stat.h>
|
||||
|
||||
#ifdef _WIN32
|
||||
#include <fcntl.h>
|
||||
#endif
|
||||
|
||||
#include "zipint.h"
|
||||
#ifdef HAVE_UNISTD_H
|
||||
#include <unistd.h>
|
||||
#endif
|
||||
|
||||
static int add_data(struct zip *, struct zip_source *, struct zip_dirent *,
|
||||
FILE *);
|
||||
static int add_data_comp(zip_source_callback, void *, struct zip_stat *,
|
||||
FILE *, struct zip_error *);
|
||||
static int add_data_uncomp(struct zip *, zip_source_callback, void *,
|
||||
struct zip_stat *, FILE *);
|
||||
static void ch_set_error(struct zip_error *, zip_source_callback, void *);
|
||||
static int copy_data(FILE *, off_t, FILE *, struct zip_error *);
|
||||
static int copy_source(struct zip *, struct zip_source *, FILE *);
|
||||
static int write_cdir(struct zip *, struct zip_cdir *, FILE *);
|
||||
static int _zip_cdir_set_comment(struct zip_cdir *, struct zip *);
|
||||
static int _zip_changed(struct zip *, int *);
|
||||
static char *_zip_create_temp_output(struct zip *, FILE **);
|
||||
static int _zip_torrentzip_cmp(const void *, const void *);
|
||||
|
||||
@@ -242,8 +244,13 @@ zip_close(struct zip *za)
|
||||
|
||||
if (add_data(za, zs ? zs : za->entry[i].source, &de, out) < 0) {
|
||||
error = 1;
|
||||
if (zs)
|
||||
zip_source_free(zs);
|
||||
break;
|
||||
}
|
||||
if (zs)
|
||||
zip_source_free(zs);
|
||||
|
||||
cd->entry[j].last_mod = de.last_mod;
|
||||
cd->entry[j].comp_method = de.comp_method;
|
||||
cd->entry[j].comp_size = de.comp_size;
|
||||
@@ -320,23 +327,17 @@ zip_close(struct zip *za)
|
||||
|
||||
|
||||
static int
|
||||
add_data(struct zip *za, struct zip_source *zs, struct zip_dirent *de, FILE *ft)
|
||||
add_data(struct zip *za, struct zip_source *src, struct zip_dirent *de,
|
||||
FILE *ft)
|
||||
{
|
||||
off_t offstart, offend;
|
||||
zip_source_callback cb;
|
||||
void *ud;
|
||||
off_t offstart, offdata, offend;
|
||||
struct zip_stat st;
|
||||
struct zip_source *s2;
|
||||
zip_compression_implementation comp_impl;
|
||||
int ret;
|
||||
|
||||
cb = zs->f;
|
||||
ud = zs->ud;
|
||||
|
||||
if (cb(ud, &st, sizeof(st), ZIP_SOURCE_STAT) < (ssize_t)sizeof(st)) {
|
||||
ch_set_error(&za->error, cb, ud);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (cb(ud, NULL, 0, ZIP_SOURCE_OPEN) < 0) {
|
||||
ch_set_error(&za->error, cb, ud);
|
||||
if (zip_source_stat(src, &st) < 0) {
|
||||
_zip_error_set_from_source(&za->error, src);
|
||||
return -1;
|
||||
}
|
||||
|
||||
@@ -345,20 +346,50 @@ add_data(struct zip *za, struct zip_source *zs, struct zip_dirent *de, FILE *ft)
|
||||
if (_zip_dirent_write(de, ft, 1, &za->error) < 0)
|
||||
return -1;
|
||||
|
||||
if (st.comp_method != ZIP_CM_STORE) {
|
||||
if (add_data_comp(cb, ud, &st, ft, &za->error) < 0)
|
||||
return -1;
|
||||
}
|
||||
else {
|
||||
if (add_data_uncomp(za, cb, ud, &st, ft) < 0)
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (cb(ud, NULL, 0, ZIP_SOURCE_CLOSE) < 0) {
|
||||
ch_set_error(&za->error, cb, ud);
|
||||
if ((s2=zip_source_crc(za, src, 0)) == NULL) {
|
||||
zip_source_pop(s2);
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* XXX: deflate 0-byte files for torrentzip? */
|
||||
if (((st.valid & ZIP_STAT_COMP_METHOD) == 0
|
||||
|| st.comp_method == ZIP_CM_STORE)
|
||||
&& ((st.valid & ZIP_STAT_SIZE) == 0 || st.size != 0)) {
|
||||
comp_impl = NULL;
|
||||
if ((comp_impl=zip_get_compression_implementation(ZIP_CM_DEFLATE))
|
||||
== NULL) {
|
||||
_zip_error_set(&za->error, ZIP_ER_COMPNOTSUPP, 0);
|
||||
zip_source_pop(s2);
|
||||
return -1;
|
||||
}
|
||||
if ((s2=comp_impl(za, s2, ZIP_CM_DEFLATE, ZIP_CODEC_ENCODE))
|
||||
== NULL) {
|
||||
/* XXX: set error? */
|
||||
zip_source_pop(s2);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
else
|
||||
s2 = src;
|
||||
|
||||
offdata = ftello(ft);
|
||||
|
||||
ret = copy_source(za, s2, ft);
|
||||
|
||||
if (zip_source_stat(s2, &st) < 0)
|
||||
ret = -1;
|
||||
|
||||
while (s2 != src) {
|
||||
if ((s2=zip_source_pop(s2)) == NULL) {
|
||||
/* XXX: set erorr */
|
||||
ret = -1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (ret < 0)
|
||||
return -1;
|
||||
|
||||
offend = ftello(ft);
|
||||
|
||||
if (fseeko(ft, offstart, SEEK_SET) < 0) {
|
||||
@@ -366,12 +397,11 @@ add_data(struct zip *za, struct zip_source *zs, struct zip_dirent *de, FILE *ft)
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
de->last_mod = st.mtime;
|
||||
de->comp_method = st.comp_method;
|
||||
de->crc = st.crc;
|
||||
de->uncomp_size = st.size;
|
||||
de->comp_size = st.comp_size;
|
||||
de->comp_size = offend - offdata;
|
||||
|
||||
if (zip_get_archive_flag(za, ZIP_AFL_TORRENT, 0))
|
||||
_zip_dirent_torrent_normalize(de);
|
||||
@@ -389,133 +419,6 @@ add_data(struct zip *za, struct zip_source *zs, struct zip_dirent *de, FILE *ft)
|
||||
|
||||
|
||||
|
||||
static int
|
||||
add_data_comp(zip_source_callback cb, void *ud, struct zip_stat *st,FILE *ft,
|
||||
struct zip_error *error)
|
||||
{
|
||||
char buf[BUFSIZE];
|
||||
ssize_t n;
|
||||
|
||||
st->comp_size = 0;
|
||||
while ((n=cb(ud, buf, sizeof(buf), ZIP_SOURCE_READ)) > 0) {
|
||||
if (fwrite(buf, 1, n, ft) != (size_t)n) {
|
||||
_zip_error_set(error, ZIP_ER_WRITE, errno);
|
||||
return -1;
|
||||
}
|
||||
|
||||
st->comp_size += n;
|
||||
}
|
||||
if (n < 0) {
|
||||
ch_set_error(error, cb, ud);
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
static int
|
||||
add_data_uncomp(struct zip *za, zip_source_callback cb, void *ud,
|
||||
struct zip_stat *st, FILE *ft)
|
||||
{
|
||||
char b1[BUFSIZE], b2[BUFSIZE];
|
||||
int end, flush, ret;
|
||||
ssize_t n;
|
||||
size_t n2;
|
||||
z_stream zstr;
|
||||
int mem_level;
|
||||
|
||||
st->comp_method = ZIP_CM_DEFLATE;
|
||||
st->comp_size = st->size = 0;
|
||||
st->crc = crc32(0, NULL, 0);
|
||||
|
||||
zstr.zalloc = Z_NULL;
|
||||
zstr.zfree = Z_NULL;
|
||||
zstr.opaque = NULL;
|
||||
zstr.avail_in = 0;
|
||||
zstr.avail_out = 0;
|
||||
|
||||
if (zip_get_archive_flag(za, ZIP_AFL_TORRENT, 0))
|
||||
mem_level = TORRENT_MEM_LEVEL;
|
||||
else
|
||||
mem_level = MAX_MEM_LEVEL;
|
||||
|
||||
/* -MAX_WBITS: undocumented feature of zlib to _not_ write a zlib header */
|
||||
deflateInit2(&zstr, Z_BEST_COMPRESSION, Z_DEFLATED, -MAX_WBITS, mem_level,
|
||||
Z_DEFAULT_STRATEGY);
|
||||
|
||||
zstr.next_out = (Bytef *)b2;
|
||||
zstr.avail_out = sizeof(b2);
|
||||
zstr.next_in = NULL;
|
||||
zstr.avail_in = 0;
|
||||
|
||||
flush = 0;
|
||||
end = 0;
|
||||
while (!end) {
|
||||
if (zstr.avail_in == 0 && !flush) {
|
||||
if ((n=cb(ud, b1, sizeof(b1), ZIP_SOURCE_READ)) < 0) {
|
||||
ch_set_error(&za->error, cb, ud);
|
||||
deflateEnd(&zstr);
|
||||
return -1;
|
||||
}
|
||||
if (n > 0) {
|
||||
zstr.avail_in = n;
|
||||
zstr.next_in = (Bytef *)b1;
|
||||
st->size += n;
|
||||
st->crc = crc32(st->crc, (Bytef *)b1, n);
|
||||
}
|
||||
else
|
||||
flush = Z_FINISH;
|
||||
}
|
||||
|
||||
ret = deflate(&zstr, flush);
|
||||
if (ret != Z_OK && ret != Z_STREAM_END) {
|
||||
_zip_error_set(&za->error, ZIP_ER_ZLIB, ret);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (zstr.avail_out != sizeof(b2)) {
|
||||
n2 = sizeof(b2) - zstr.avail_out;
|
||||
|
||||
if (fwrite(b2, 1, n2, ft) != n2) {
|
||||
_zip_error_set(&za->error, ZIP_ER_WRITE, errno);
|
||||
return -1;
|
||||
}
|
||||
|
||||
zstr.next_out = (Bytef *)b2;
|
||||
zstr.avail_out = sizeof(b2);
|
||||
st->comp_size += n2;
|
||||
}
|
||||
|
||||
if (ret == Z_STREAM_END) {
|
||||
deflateEnd(&zstr);
|
||||
end = 1;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
static void
|
||||
ch_set_error(struct zip_error *error, zip_source_callback cb, void *ud)
|
||||
{
|
||||
int e[2];
|
||||
|
||||
if ((cb(ud, e, sizeof(e), ZIP_SOURCE_ERROR)) < (ssize_t)sizeof(e)) {
|
||||
error->zip_err = ZIP_ER_INTERNAL;
|
||||
error->sys_err = 0;
|
||||
}
|
||||
else {
|
||||
error->zip_err = e[0];
|
||||
error->sys_err = e[1];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
static int
|
||||
copy_data(FILE *fs, off_t len, FILE *ft, struct zip_error *error)
|
||||
{
|
||||
@@ -549,6 +452,40 @@ copy_data(FILE *fs, off_t len, FILE *ft, struct zip_error *error)
|
||||
|
||||
|
||||
|
||||
static int
|
||||
copy_source(struct zip *za, struct zip_source *src, FILE *ft)
|
||||
{
|
||||
char buf[BUFSIZE];
|
||||
zip_int64_t n;
|
||||
int ret;
|
||||
|
||||
if (zip_source_open(src) < 0) {
|
||||
_zip_error_set_from_source(&za->error, src);
|
||||
return -1;
|
||||
}
|
||||
|
||||
ret = 0;
|
||||
while ((n=zip_source_read(src, buf, sizeof(buf))) > 0) {
|
||||
if (fwrite(buf, 1, n, ft) != (size_t)n) {
|
||||
_zip_error_set(&za->error, ZIP_ER_WRITE, errno);
|
||||
ret = -1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (n < 0) {
|
||||
if (ret == 0)
|
||||
_zip_error_set_from_source(&za->error, src);
|
||||
ret = -1;
|
||||
}
|
||||
|
||||
zip_source_close(src);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
|
||||
static int
|
||||
write_cdir(struct zip *za, struct zip_cdir *cd, FILE *out)
|
||||
{
|
||||
@@ -611,7 +548,7 @@ _zip_cdir_set_comment(struct zip_cdir *dest, struct zip *src)
|
||||
|
||||
|
||||
|
||||
static int
|
||||
int
|
||||
_zip_changed(struct zip *za, int *survivorsp)
|
||||
{
|
||||
int changed, i, survivors;
|
||||
@@ -630,7 +567,8 @@ _zip_changed(struct zip *za, int *survivorsp)
|
||||
survivors++;
|
||||
}
|
||||
|
||||
*survivorsp = survivors;
|
||||
if (survivorsp)
|
||||
*survivorsp = survivors;
|
||||
|
||||
return changed;
|
||||
}
|
||||
@@ -665,6 +603,14 @@ _zip_create_temp_output(struct zip *za, FILE **outp)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
#ifdef _WIN32
|
||||
/*
|
||||
According to Pierre Joye, Windows in some environments per
|
||||
default creates text files, so force binary mode.
|
||||
*/
|
||||
_setmode(_fileno(tfp), _O_BINARY );
|
||||
#endif
|
||||
|
||||
*outp = tfp;
|
||||
return temp;
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
zip_delete.c -- delete file from zip archive
|
||||
Copyright (C) 1999-2007 Dieter Baron and Thomas Klausner
|
||||
Copyright (C) 1999-2009 Dieter Baron and Thomas Klausner
|
||||
|
||||
This file is part of libzip, a library to manipulate ZIP archives.
|
||||
The authors can be contacted at <libzip@nih.at>
|
||||
@@ -38,13 +38,18 @@
|
||||
|
||||
|
||||
ZIP_EXTERN int
|
||||
zip_delete(struct zip *za, int idx)
|
||||
zip_delete(struct zip *za, zip_uint64_t idx)
|
||||
{
|
||||
if (idx < 0 || idx >= za->nentry) {
|
||||
if (idx >= za->nentry) {
|
||||
_zip_error_set(&za->error, ZIP_ER_INVAL, 0);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (ZIP_IS_RDONLY(za)) {
|
||||
_zip_error_set(&za->error, ZIP_ER_RDONLY, 0);
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* allow duplicate file names, because the file will
|
||||
* be removed directly afterwards */
|
||||
if (_zip_unchange(za, idx, 1) != 0)
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
zip_dirent.c -- read directory entry (local or central), clean dirent
|
||||
Copyright (C) 1999-2008 Dieter Baron and Thomas Klausner
|
||||
Copyright (C) 1999-2009 Dieter Baron and Thomas Klausner
|
||||
|
||||
This file is part of libzip, a library to manipulate ZIP archives.
|
||||
The authors can be contacted at <libzip@nih.at>
|
||||
@@ -45,7 +45,6 @@
|
||||
static time_t _zip_d2u_time(int, int);
|
||||
static char *_zip_readfpstr(FILE *, unsigned int, int, struct zip_error *);
|
||||
static char *_zip_readstr(unsigned char **, int, int, struct zip_error *);
|
||||
static void _zip_u2d_time(time_t, unsigned short *, unsigned short *);
|
||||
static void _zip_write2(unsigned short, FILE *);
|
||||
static void _zip_write4(unsigned int, FILE *);
|
||||
|
||||
@@ -213,13 +212,13 @@ _zip_dirent_init(struct zip_dirent *de)
|
||||
|
||||
int
|
||||
_zip_dirent_read(struct zip_dirent *zde, FILE *fp,
|
||||
unsigned char **bufp, unsigned int *leftp, int local,
|
||||
unsigned char **bufp, zip_uint32_t *leftp, int local,
|
||||
struct zip_error *error)
|
||||
{
|
||||
unsigned char buf[CDENTRYSIZE];
|
||||
unsigned char *cur;
|
||||
unsigned short dostime, dosdate;
|
||||
unsigned int size;
|
||||
zip_uint32_t size;
|
||||
|
||||
if (local)
|
||||
size = LENTRYSIZE;
|
||||
@@ -475,7 +474,7 @@ _zip_d2u_time(int dtime, int ddate)
|
||||
{
|
||||
struct tm tm;
|
||||
|
||||
memset(&tm, sizeof(tm), 0);
|
||||
memset(&tm, 0, sizeof(tm));
|
||||
|
||||
/* let mktime decide if DST is in effect */
|
||||
tm.tm_isdst = -1;
|
||||
@@ -600,7 +599,7 @@ _zip_write4(unsigned int i, FILE *fp)
|
||||
|
||||
|
||||
|
||||
static void
|
||||
void
|
||||
_zip_u2d_time(time_t time, unsigned short *dtime, unsigned short *ddate)
|
||||
{
|
||||
struct tm *tm;
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
zip_entry_new.c -- create and init struct zip_entry
|
||||
Copyright (C) 1999-2007 Dieter Baron and Thomas Klausner
|
||||
Copyright (C) 1999-2009 Dieter Baron and Thomas Klausner
|
||||
|
||||
This file is part of libzip, a library to manipulate ZIP archives.
|
||||
The authors can be contacted at <libzip@nih.at>
|
||||
@@ -51,7 +51,7 @@ _zip_entry_new(struct zip *za)
|
||||
}
|
||||
}
|
||||
else {
|
||||
if (za->nentry >= za->nentry_alloc-1) {
|
||||
if (za->nentry+1 >= za->nentry_alloc) {
|
||||
za->nentry_alloc += 16;
|
||||
za->entry = (struct zip_entry *)realloc(za->entry,
|
||||
sizeof(struct zip_entry)
|
||||
|
||||
@@ -32,6 +32,10 @@ const char * const _zip_err_str[] = {
|
||||
"Zip archive inconsistent",
|
||||
"Can't remove file",
|
||||
"Entry has been deleted",
|
||||
"Encryption method not supported",
|
||||
"Read-only archive",
|
||||
"No password provided",
|
||||
"Wrong password provided",
|
||||
};
|
||||
|
||||
const int _zip_nerr_str = sizeof(_zip_err_str)/sizeof(_zip_err_str[0]);
|
||||
@@ -65,4 +69,8 @@ const int _zip_err_type[] = {
|
||||
N,
|
||||
S,
|
||||
N,
|
||||
N,
|
||||
N,
|
||||
N,
|
||||
N,
|
||||
};
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
zip_error.c -- struct zip_error helper functions
|
||||
Copyright (C) 1999-2007 Dieter Baron and Thomas Klausner
|
||||
Copyright (C) 1999-2009 Dieter Baron and Thomas Klausner
|
||||
|
||||
This file is part of libzip, a library to manipulate ZIP archives.
|
||||
The authors can be contacted at <libzip@nih.at>
|
||||
@@ -99,3 +99,14 @@ _zip_error_set(struct zip_error *err, int ze, int se)
|
||||
err->sys_err = se;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
void
|
||||
_zip_error_set_from_source(struct zip_error *err, struct zip_source *src)
|
||||
{
|
||||
int ze, se;
|
||||
|
||||
zip_source_error(src, &ze, &se);
|
||||
_zip_error_set(err, ze, se);
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
zip_error_to_str.c -- get string representation of zip error code
|
||||
Copyright (C) 1999-2007 Dieter Baron and Thomas Klausner
|
||||
Copyright (C) 1999-2009 Dieter Baron and Thomas Klausner
|
||||
|
||||
This file is part of libzip, a library to manipulate ZIP archives.
|
||||
The authors can be contacted at <libzip@nih.at>
|
||||
@@ -43,7 +43,7 @@
|
||||
|
||||
|
||||
ZIP_EXTERN int
|
||||
zip_error_to_str(char *buf, size_t len, int ze, int se)
|
||||
zip_error_to_str(char *buf, zip_uint64_t len, int ze, int se)
|
||||
{
|
||||
const char *zs, *ss;
|
||||
|
||||
|
||||
@@ -44,10 +44,8 @@ zip_fclose(struct zip_file *zf)
|
||||
{
|
||||
int i, ret;
|
||||
|
||||
if (zf->zstr)
|
||||
inflateEnd(zf->zstr);
|
||||
free(zf->buffer);
|
||||
free(zf->zstr);
|
||||
if (zf->src)
|
||||
zip_source_free(zf->src);
|
||||
|
||||
for (i=0; i<zf->za->nfile; i++) {
|
||||
if (zf->za->file[i] == zf) {
|
||||
@@ -60,11 +58,6 @@ zip_fclose(struct zip_file *zf)
|
||||
ret = 0;
|
||||
if (zf->error.zip_err)
|
||||
ret = zf->error.zip_err;
|
||||
else if ((zf->flags & ZIP_ZF_CRC) && (zf->flags & ZIP_ZF_EOF)) {
|
||||
/* if EOF, compare CRC */
|
||||
if (zf->crc_orig != zf->crc)
|
||||
ret = ZIP_ER_CRC;
|
||||
}
|
||||
|
||||
free(zf);
|
||||
return ret;
|
||||
|
||||
65
src/helper/libzip/zip_fdopen.c
Normal file
65
src/helper/libzip/zip_fdopen.c
Normal file
@@ -0,0 +1,65 @@
|
||||
/*
|
||||
zip_fdopen.c -- open read-only archive from file descriptor
|
||||
Copyright (C) 2009-2010 Dieter Baron and Thomas Klausner
|
||||
|
||||
This file is part of libzip, a library to manipulate ZIP archives.
|
||||
The authors can be contacted at <libzip@nih.at>
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions
|
||||
are met:
|
||||
1. Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
2. Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in
|
||||
the documentation and/or other materials provided with the
|
||||
distribution.
|
||||
3. The names of the authors may not be used to endorse or promote
|
||||
products derived from this software without specific prior
|
||||
written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
|
||||
OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
|
||||
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
|
||||
GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
|
||||
IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
||||
OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
|
||||
IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
|
||||
|
||||
#include "zipint.h"
|
||||
#ifdef HAVE_UNISTD_H
|
||||
#include <unistd.h>
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
ZIP_EXTERN struct zip *
|
||||
zip_fdopen(int fd_orig, int flags, int *zep)
|
||||
{
|
||||
int fd;
|
||||
FILE *fp;
|
||||
|
||||
/* We dup() here to avoid messing with the passed in fd.
|
||||
We could not restore it to the original state in case of error. */
|
||||
|
||||
if ((fd=dup(fd_orig)) < 0) {
|
||||
*zep = ZIP_ER_OPEN;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if ((fp=fdopen(fd, "rb")) == NULL) {
|
||||
close(fd);
|
||||
*zep = ZIP_ER_OPEN;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
close(fd_orig);
|
||||
return _zip_open(NULL, fp, flags, ZIP_AFL_RDONLY, zep);
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
zip_fopen.c -- open file in zip archive for reading
|
||||
Copyright (C) 1999-2007 Dieter Baron and Thomas Klausner
|
||||
Copyright (C) 1999-2009 Dieter Baron and Thomas Klausner
|
||||
|
||||
This file is part of libzip, a library to manipulate ZIP archives.
|
||||
The authors can be contacted at <libzip@nih.at>
|
||||
@@ -45,5 +45,5 @@ zip_fopen(struct zip *za, const char *fname, int flags)
|
||||
if ((idx=zip_name_locate(za, fname, flags)) < 0)
|
||||
return NULL;
|
||||
|
||||
return zip_fopen_index(za, idx, flags);
|
||||
return zip_fopen_index_encrypted(za, idx, flags, za->default_password);
|
||||
}
|
||||
|
||||
50
src/helper/libzip/zip_fopen_encrypted.c
Normal file
50
src/helper/libzip/zip_fopen_encrypted.c
Normal file
@@ -0,0 +1,50 @@
|
||||
/*
|
||||
zip_fopen_encrypted.c -- open file for reading with password
|
||||
Copyright (C) 1999-2009 Dieter Baron and Thomas Klausner
|
||||
|
||||
This file is part of libzip, a library to manipulate ZIP archives.
|
||||
The authors can be contacted at <libzip@nih.at>
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions
|
||||
are met:
|
||||
1. Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
2. Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in
|
||||
the documentation and/or other materials provided with the
|
||||
distribution.
|
||||
3. The names of the authors may not be used to endorse or promote
|
||||
products derived from this software without specific prior
|
||||
written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
|
||||
OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
|
||||
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
|
||||
GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
|
||||
IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
||||
OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
|
||||
IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
|
||||
|
||||
#include "zipint.h"
|
||||
|
||||
|
||||
|
||||
ZIP_EXTERN struct zip_file *
|
||||
zip_fopen_encrypted(struct zip *za, const char *fname, int flags,
|
||||
const char *password)
|
||||
{
|
||||
int idx;
|
||||
|
||||
if ((idx=zip_name_locate(za, fname, flags)) < 0)
|
||||
return NULL;
|
||||
|
||||
return zip_fopen_index_encrypted(za, idx, flags, password);
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
zip_fopen_index.c -- open file in zip archive for reading by index
|
||||
Copyright (C) 1999-2007 Dieter Baron and Thomas Klausner
|
||||
Copyright (C) 1999-2009 Dieter Baron and Thomas Klausner
|
||||
|
||||
This file is part of libzip, a library to manipulate ZIP archives.
|
||||
The authors can be contacted at <libzip@nih.at>
|
||||
@@ -39,178 +39,10 @@
|
||||
|
||||
#include "zipint.h"
|
||||
|
||||
static struct zip_file *_zip_file_new(struct zip *za);
|
||||
|
||||
|
||||
|
||||
ZIP_EXTERN struct zip_file *
|
||||
zip_fopen_index(struct zip *za, int fileno, int flags)
|
||||
zip_fopen_index(struct zip *za, zip_uint64_t fileno, int flags)
|
||||
{
|
||||
int len, ret;
|
||||
int zfflags;
|
||||
struct zip_file *zf;
|
||||
|
||||
if ((fileno < 0) || (fileno >= za->nentry)) {
|
||||
_zip_error_set(&za->error, ZIP_ER_INVAL, 0);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if ((flags & ZIP_FL_UNCHANGED) == 0
|
||||
&& ZIP_ENTRY_DATA_CHANGED(za->entry+fileno)) {
|
||||
_zip_error_set(&za->error, ZIP_ER_CHANGED, 0);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (fileno >= za->cdir->nentry) {
|
||||
_zip_error_set(&za->error, ZIP_ER_INVAL, 0);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
zfflags = 0;
|
||||
switch (za->cdir->entry[fileno].comp_method) {
|
||||
case ZIP_CM_STORE:
|
||||
zfflags |= ZIP_ZF_CRC;
|
||||
break;
|
||||
|
||||
case ZIP_CM_DEFLATE:
|
||||
if ((flags & ZIP_FL_COMPRESSED) == 0)
|
||||
zfflags |= ZIP_ZF_CRC | ZIP_ZF_DECOMP;
|
||||
break;
|
||||
default:
|
||||
if ((flags & ZIP_FL_COMPRESSED) == 0) {
|
||||
_zip_error_set(&za->error, ZIP_ER_COMPNOTSUPP, 0);
|
||||
return NULL;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
zf = _zip_file_new(za);
|
||||
|
||||
zf->flags = zfflags;
|
||||
/* zf->name = za->cdir->entry[fileno].filename; */
|
||||
zf->method = za->cdir->entry[fileno].comp_method;
|
||||
zf->bytes_left = za->cdir->entry[fileno].uncomp_size;
|
||||
zf->cbytes_left = za->cdir->entry[fileno].comp_size;
|
||||
zf->crc_orig = za->cdir->entry[fileno].crc;
|
||||
|
||||
if ((zf->fpos=_zip_file_get_offset(za, fileno)) == 0) {
|
||||
zip_fclose(zf);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if ((zf->flags & ZIP_ZF_DECOMP) == 0)
|
||||
zf->bytes_left = zf->cbytes_left;
|
||||
else {
|
||||
if ((zf->buffer=(char *)malloc(BUFSIZE)) == NULL) {
|
||||
_zip_error_set(&za->error, ZIP_ER_MEMORY, 0);
|
||||
zip_fclose(zf);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
len = _zip_file_fillbuf(zf->buffer, BUFSIZE, zf);
|
||||
if (len <= 0) {
|
||||
_zip_error_copy(&za->error, &zf->error);
|
||||
zip_fclose(zf);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if ((zf->zstr = (z_stream *)malloc(sizeof(z_stream))) == NULL) {
|
||||
_zip_error_set(&za->error, ZIP_ER_MEMORY, 0);
|
||||
zip_fclose(zf);
|
||||
return NULL;
|
||||
}
|
||||
zf->zstr->zalloc = Z_NULL;
|
||||
zf->zstr->zfree = Z_NULL;
|
||||
zf->zstr->opaque = NULL;
|
||||
zf->zstr->next_in = (Bytef *)zf->buffer;
|
||||
zf->zstr->avail_in = len;
|
||||
|
||||
/* negative value to tell zlib that there is no header */
|
||||
if ((ret=inflateInit2(zf->zstr, -MAX_WBITS)) != Z_OK) {
|
||||
_zip_error_set(&za->error, ZIP_ER_ZLIB, ret);
|
||||
zip_fclose(zf);
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
return zf;
|
||||
}
|
||||
|
||||
|
||||
|
||||
int
|
||||
_zip_file_fillbuf(void *buf, size_t buflen, struct zip_file *zf)
|
||||
{
|
||||
int i, j;
|
||||
|
||||
if (zf->error.zip_err != ZIP_ER_OK)
|
||||
return -1;
|
||||
|
||||
if ((zf->flags & ZIP_ZF_EOF) || zf->cbytes_left <= 0 || buflen <= 0)
|
||||
return 0;
|
||||
|
||||
if (fseeko(zf->za->zp, zf->fpos, SEEK_SET) < 0) {
|
||||
_zip_error_set(&zf->error, ZIP_ER_SEEK, errno);
|
||||
return -1;
|
||||
}
|
||||
if (buflen < zf->cbytes_left)
|
||||
i = buflen;
|
||||
else
|
||||
i = zf->cbytes_left;
|
||||
|
||||
j = fread(buf, 1, i, zf->za->zp);
|
||||
if (j == 0) {
|
||||
_zip_error_set(&zf->error, ZIP_ER_EOF, 0);
|
||||
j = -1;
|
||||
}
|
||||
else if (j < 0)
|
||||
_zip_error_set(&zf->error, ZIP_ER_READ, errno);
|
||||
else {
|
||||
zf->fpos += j;
|
||||
zf->cbytes_left -= j;
|
||||
}
|
||||
|
||||
return j;
|
||||
}
|
||||
|
||||
|
||||
|
||||
static struct zip_file *
|
||||
_zip_file_new(struct zip *za)
|
||||
{
|
||||
struct zip_file *zf, **file;
|
||||
int n;
|
||||
|
||||
if ((zf=(struct zip_file *)malloc(sizeof(struct zip_file))) == NULL) {
|
||||
_zip_error_set(&za->error, ZIP_ER_MEMORY, 0);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (za->nfile >= za->nfile_alloc-1) {
|
||||
n = za->nfile_alloc + 10;
|
||||
file = (struct zip_file **)realloc(za->file,
|
||||
n*sizeof(struct zip_file *));
|
||||
if (file == NULL) {
|
||||
_zip_error_set(&za->error, ZIP_ER_MEMORY, 0);
|
||||
free(zf);
|
||||
return NULL;
|
||||
}
|
||||
za->nfile_alloc = n;
|
||||
za->file = file;
|
||||
}
|
||||
|
||||
za->file[za->nfile++] = zf;
|
||||
|
||||
zf->za = za;
|
||||
_zip_error_init(&zf->error);
|
||||
zf->flags = 0;
|
||||
zf->crc = crc32(0L, Z_NULL, 0);
|
||||
zf->crc_orig = 0;
|
||||
zf->method = -1;
|
||||
zf->bytes_left = zf->cbytes_left = 0;
|
||||
zf->fpos = 0;
|
||||
zf->buffer = NULL;
|
||||
zf->zstr = NULL;
|
||||
|
||||
return zf;
|
||||
return zip_fopen_index_encrypted(za, fileno, flags, za->default_password);
|
||||
}
|
||||
|
||||
191
src/helper/libzip/zip_fopen_index_encrypted.c
Normal file
191
src/helper/libzip/zip_fopen_index_encrypted.c
Normal file
@@ -0,0 +1,191 @@
|
||||
/*
|
||||
zip_fopen_index_encrypted.c -- open file for reading by index w/ password
|
||||
Copyright (C) 1999-2009 Dieter Baron and Thomas Klausner
|
||||
|
||||
This file is part of libzip, a library to manipulate ZIP archives.
|
||||
The authors can be contacted at <libzip@nih.at>
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions
|
||||
are met:
|
||||
1. Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
2. Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in
|
||||
the documentation and/or other materials provided with the
|
||||
distribution.
|
||||
3. The names of the authors may not be used to endorse or promote
|
||||
products derived from this software without specific prior
|
||||
written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
|
||||
OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
|
||||
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
|
||||
GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
|
||||
IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
||||
OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
|
||||
IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
|
||||
|
||||
#include <errno.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#include "zipint.h"
|
||||
|
||||
static struct zip_file *_zip_file_new(struct zip *za);
|
||||
|
||||
|
||||
|
||||
ZIP_EXTERN struct zip_file *
|
||||
zip_fopen_index_encrypted(struct zip *za, zip_uint64_t fileno, int flags,
|
||||
const char *password)
|
||||
{
|
||||
struct zip_file *zf;
|
||||
zip_compression_implementation comp_impl;
|
||||
zip_encryption_implementation enc_impl;
|
||||
struct zip_source *src, *s2;
|
||||
zip_uint64_t start;
|
||||
struct zip_stat st;
|
||||
|
||||
if (fileno >= za->nentry) {
|
||||
_zip_error_set(&za->error, ZIP_ER_INVAL, 0);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if ((flags & ZIP_FL_UNCHANGED) == 0
|
||||
&& ZIP_ENTRY_DATA_CHANGED(za->entry+fileno)) {
|
||||
_zip_error_set(&za->error, ZIP_ER_CHANGED, 0);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (fileno >= za->cdir->nentry) {
|
||||
_zip_error_set(&za->error, ZIP_ER_INVAL, 0);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (flags & ZIP_FL_ENCRYPTED)
|
||||
flags |= ZIP_FL_COMPRESSED;
|
||||
|
||||
zip_stat_index(za, fileno, flags, &st);
|
||||
|
||||
enc_impl = NULL;
|
||||
if ((flags & ZIP_FL_ENCRYPTED) == 0) {
|
||||
if (st.encryption_method != ZIP_EM_NONE) {
|
||||
if (password == NULL) {
|
||||
_zip_error_set(&za->error, ZIP_ER_NOPASSWD, 0);
|
||||
return NULL;
|
||||
}
|
||||
if ((enc_impl=zip_get_encryption_implementation(
|
||||
st.encryption_method)) == NULL) {
|
||||
_zip_error_set(&za->error, ZIP_ER_ENCRNOTSUPP, 0);
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
comp_impl = NULL;
|
||||
if ((flags & ZIP_FL_COMPRESSED) == 0) {
|
||||
if (st.comp_method != ZIP_CM_STORE) {
|
||||
if ((comp_impl=zip_get_compression_implementation(
|
||||
st.comp_method)) == NULL) {
|
||||
_zip_error_set(&za->error, ZIP_ER_COMPNOTSUPP, 0);
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ((start=_zip_file_get_offset(za, fileno)) == 0)
|
||||
return NULL;
|
||||
|
||||
if (st.comp_size == 0) {
|
||||
if ((src=zip_source_buffer(za, NULL, 0, 0)) == NULL)
|
||||
return NULL;
|
||||
}
|
||||
else {
|
||||
if ((src=_zip_source_file_or_p(za, NULL, za->zp, start, st.comp_size,
|
||||
0, &st)) == NULL)
|
||||
return NULL;
|
||||
if (enc_impl) {
|
||||
if ((s2=enc_impl(za, src, ZIP_EM_TRAD_PKWARE, 0,
|
||||
password)) == NULL) {
|
||||
zip_source_free(src);
|
||||
/* XXX: set error (how?) */
|
||||
return NULL;
|
||||
}
|
||||
src = s2;
|
||||
}
|
||||
if (comp_impl) {
|
||||
if ((s2=comp_impl(za, src, za->cdir->entry[fileno].comp_method,
|
||||
0)) == NULL) {
|
||||
zip_source_free(src);
|
||||
/* XXX: set error (how?) */
|
||||
return NULL;
|
||||
}
|
||||
src = s2;
|
||||
}
|
||||
if ((flags & ZIP_FL_COMPRESSED) == 0
|
||||
|| st.comp_method == ZIP_CM_STORE ) {
|
||||
if ((s2=zip_source_crc(za, src, 1)) == NULL) {
|
||||
zip_source_free(src);
|
||||
/* XXX: set error (how?) */
|
||||
return NULL;
|
||||
}
|
||||
src = s2;
|
||||
}
|
||||
}
|
||||
|
||||
if (zip_source_open(src) < 0) {
|
||||
_zip_error_set_from_source(&za->error, src);
|
||||
zip_source_free(src);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
zf = _zip_file_new(za);
|
||||
|
||||
zf->src = src;
|
||||
|
||||
return zf;
|
||||
}
|
||||
|
||||
|
||||
|
||||
static struct zip_file *
|
||||
_zip_file_new(struct zip *za)
|
||||
{
|
||||
struct zip_file *zf, **file;
|
||||
int n;
|
||||
|
||||
if ((zf=(struct zip_file *)malloc(sizeof(struct zip_file))) == NULL) {
|
||||
_zip_error_set(&za->error, ZIP_ER_MEMORY, 0);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (za->nfile >= za->nfile_alloc-1) {
|
||||
n = za->nfile_alloc + 10;
|
||||
file = (struct zip_file **)realloc(za->file,
|
||||
n*sizeof(struct zip_file *));
|
||||
if (file == NULL) {
|
||||
_zip_error_set(&za->error, ZIP_ER_MEMORY, 0);
|
||||
free(zf);
|
||||
return NULL;
|
||||
}
|
||||
za->nfile_alloc = n;
|
||||
za->file = file;
|
||||
}
|
||||
|
||||
za->file[za->nfile++] = zf;
|
||||
|
||||
zf->za = za;
|
||||
_zip_error_init(&zf->error);
|
||||
zf->eof = 0;
|
||||
zf->src = NULL;
|
||||
|
||||
return zf;
|
||||
}
|
||||
@@ -37,12 +37,10 @@
|
||||
|
||||
|
||||
|
||||
ZIP_EXTERN ssize_t
|
||||
zip_fread(struct zip_file *zf, void *outbuf, size_t toread)
|
||||
ZIP_EXTERN zip_int64_t
|
||||
zip_fread(struct zip_file *zf, void *outbuf, zip_uint64_t toread)
|
||||
{
|
||||
int ret;
|
||||
size_t out_before, len;
|
||||
int i;
|
||||
zip_int64_t n;
|
||||
|
||||
if (!zf)
|
||||
return -1;
|
||||
@@ -50,81 +48,18 @@ zip_fread(struct zip_file *zf, void *outbuf, size_t toread)
|
||||
if (zf->error.zip_err != 0)
|
||||
return -1;
|
||||
|
||||
if ((zf->flags & ZIP_ZF_EOF) || (toread == 0))
|
||||
if (toread > ZIP_INT64_MAX) {
|
||||
_zip_error_set(&zf->error, ZIP_ER_INVAL, 0);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if ((zf->eof) || (toread == 0))
|
||||
return 0;
|
||||
|
||||
if (zf->bytes_left == 0) {
|
||||
zf->flags |= ZIP_ZF_EOF;
|
||||
if (zf->flags & ZIP_ZF_CRC) {
|
||||
if (zf->crc != zf->crc_orig) {
|
||||
_zip_error_set(&zf->error, ZIP_ER_CRC, 0);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
if ((n=zip_source_read(zf->src, outbuf, toread)) < 0) {
|
||||
_zip_error_set_from_source(&zf->error, zf->src);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if ((zf->flags & ZIP_ZF_DECOMP) == 0) {
|
||||
ret = _zip_file_fillbuf(outbuf, toread, zf);
|
||||
if (ret > 0) {
|
||||
if (zf->flags & ZIP_ZF_CRC)
|
||||
zf->crc = crc32(zf->crc, (Bytef *)outbuf, ret);
|
||||
zf->bytes_left -= ret;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
zf->zstr->next_out = (Bytef *)outbuf;
|
||||
zf->zstr->avail_out = toread;
|
||||
out_before = zf->zstr->total_out;
|
||||
|
||||
/* endless loop until something has been accomplished */
|
||||
for (;;) {
|
||||
ret = inflate(zf->zstr, Z_SYNC_FLUSH);
|
||||
|
||||
switch (ret) {
|
||||
case Z_STREAM_END:
|
||||
if (zf->zstr->total_out == out_before) {
|
||||
if (zf->crc != zf->crc_orig) {
|
||||
_zip_error_set(&zf->error, ZIP_ER_CRC, 0);
|
||||
return -1;
|
||||
}
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* fallthrough */
|
||||
|
||||
case Z_OK:
|
||||
len = zf->zstr->total_out - out_before;
|
||||
if (len >= zf->bytes_left || len >= toread) {
|
||||
if (zf->flags & ZIP_ZF_CRC)
|
||||
zf->crc = crc32(zf->crc, (Bytef *)outbuf, len);
|
||||
zf->bytes_left -= len;
|
||||
return len;
|
||||
}
|
||||
break;
|
||||
|
||||
case Z_BUF_ERROR:
|
||||
if (zf->zstr->avail_in == 0) {
|
||||
i = _zip_file_fillbuf(zf->buffer, BUFSIZE, zf);
|
||||
if (i == 0) {
|
||||
_zip_error_set(&zf->error, ZIP_ER_INCONS, 0);
|
||||
return -1;
|
||||
}
|
||||
else if (i < 0)
|
||||
return -1;
|
||||
zf->zstr->next_in = (Bytef *)zf->buffer;
|
||||
zf->zstr->avail_in = i;
|
||||
continue;
|
||||
}
|
||||
/* fallthrough */
|
||||
case Z_NEED_DICT:
|
||||
case Z_DATA_ERROR:
|
||||
case Z_STREAM_ERROR:
|
||||
case Z_MEM_ERROR:
|
||||
_zip_error_set(&zf->error, ZIP_ER_ZLIB, ret);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
return n;
|
||||
}
|
||||
|
||||
@@ -57,7 +57,9 @@ _zip_free(struct zip *za)
|
||||
if (za->zp)
|
||||
fclose(za->zp);
|
||||
|
||||
free(za->default_password);
|
||||
_zip_cdir_free(za->cdir);
|
||||
free(za->ch_comment);
|
||||
|
||||
if (za->entry) {
|
||||
for (i=0; i<za->nentry; i++) {
|
||||
|
||||
46
src/helper/libzip/zip_get_compression_implementation.c
Normal file
46
src/helper/libzip/zip_get_compression_implementation.c
Normal file
@@ -0,0 +1,46 @@
|
||||
/*
|
||||
zip_get_compression_implementation.c -- get compression implementation
|
||||
Copyright (C) 2009 Dieter Baron and Thomas Klausner
|
||||
|
||||
This file is part of libzip, a library to manipulate ZIP archives.
|
||||
The authors can be contacted at <libzip@nih.at>
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions
|
||||
are met:
|
||||
1. Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
2. Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in
|
||||
the documentation and/or other materials provided with the
|
||||
distribution.
|
||||
3. The names of the authors may not be used to endorse or promote
|
||||
products derived from this software without specific prior
|
||||
written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
|
||||
OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
|
||||
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
|
||||
GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
|
||||
IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
||||
OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
|
||||
IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
|
||||
|
||||
#include "zipint.h"
|
||||
|
||||
|
||||
|
||||
ZIP_EXTERN zip_compression_implementation
|
||||
zip_get_compression_implementation(zip_uint16_t cm)
|
||||
{
|
||||
if (cm == ZIP_CM_DEFLATE)
|
||||
return zip_source_deflate;
|
||||
return NULL;
|
||||
}
|
||||
46
src/helper/libzip/zip_get_encryption_implementation.c
Normal file
46
src/helper/libzip/zip_get_encryption_implementation.c
Normal file
@@ -0,0 +1,46 @@
|
||||
/*
|
||||
zip_get_encryption_implementation.c -- get encryption implementation
|
||||
Copyright (C) 2009 Dieter Baron and Thomas Klausner
|
||||
|
||||
This file is part of libzip, a library to manipulate ZIP archives.
|
||||
The authors can be contacted at <libzip@nih.at>
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions
|
||||
are met:
|
||||
1. Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
2. Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in
|
||||
the documentation and/or other materials provided with the
|
||||
distribution.
|
||||
3. The names of the authors may not be used to endorse or promote
|
||||
products derived from this software without specific prior
|
||||
written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
|
||||
OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
|
||||
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
|
||||
GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
|
||||
IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
||||
OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
|
||||
IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
|
||||
|
||||
#include "zipint.h"
|
||||
|
||||
|
||||
|
||||
ZIP_EXTERN zip_encryption_implementation
|
||||
zip_get_encryption_implementation(zip_uint16_t em)
|
||||
{
|
||||
if (em == ZIP_EM_TRAD_PKWARE)
|
||||
return zip_source_pkware;
|
||||
return NULL;
|
||||
}
|
||||
@@ -38,9 +38,9 @@
|
||||
|
||||
|
||||
ZIP_EXTERN const char *
|
||||
zip_get_file_comment(struct zip *za, int idx, int *lenp, int flags)
|
||||
zip_get_file_comment(struct zip *za, zip_uint64_t idx, int *lenp, int flags)
|
||||
{
|
||||
if (idx < 0 || idx >= za->nentry) {
|
||||
if (idx >= za->nentry) {
|
||||
_zip_error_set(&za->error, ZIP_ER_INVAL, 0);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@@ -38,7 +38,7 @@
|
||||
|
||||
|
||||
ZIP_EXTERN const char *
|
||||
zip_get_name(struct zip *za, int idx, int flags)
|
||||
zip_get_name(struct zip *za, zip_uint64_t idx, int flags)
|
||||
{
|
||||
return _zip_get_name(za, idx, flags, &za->error);
|
||||
}
|
||||
@@ -46,9 +46,10 @@ zip_get_name(struct zip *za, int idx, int flags)
|
||||
|
||||
|
||||
const char *
|
||||
_zip_get_name(struct zip *za, int idx, int flags, struct zip_error *error)
|
||||
_zip_get_name(struct zip *za, zip_uint64_t idx, int flags,
|
||||
struct zip_error *error)
|
||||
{
|
||||
if (idx < 0 || idx >= za->nentry) {
|
||||
if (idx >= za->nentry) {
|
||||
_zip_error_set(error, ZIP_ER_INVAL, 0);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@@ -65,6 +65,7 @@ _zip_new(struct zip_error *error)
|
||||
za->nfile = za->nfile_alloc = 0;
|
||||
za->file = NULL;
|
||||
za->flags = za->ch_flags = 0;
|
||||
za->default_password = NULL;
|
||||
|
||||
return za;
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
zip_open.c -- open zip archive
|
||||
Copyright (C) 1999-2008 Dieter Baron and Thomas Klausner
|
||||
zip_open.c -- open zip archive by name
|
||||
Copyright (C) 1999-2009 Dieter Baron and Thomas Klausner
|
||||
|
||||
This file is part of libzip, a library to manipulate ZIP archives.
|
||||
The authors can be contacted at <libzip@nih.at>
|
||||
@@ -61,10 +61,6 @@ ZIP_EXTERN struct zip *
|
||||
zip_open(const char *fn, int flags, int *zep)
|
||||
{
|
||||
FILE *fp;
|
||||
struct zip *za;
|
||||
struct zip_cdir *cdir;
|
||||
int i;
|
||||
off_t len;
|
||||
|
||||
switch (_zip_file_exists(fn, flags, zep)) {
|
||||
case -1:
|
||||
@@ -80,7 +76,23 @@ zip_open(const char *fn, int flags, int *zep)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
fseeko(fp, 0, SEEK_END);
|
||||
return _zip_open(fn, fp, flags, 0, zep);
|
||||
}
|
||||
|
||||
|
||||
|
||||
struct zip *
|
||||
_zip_open(const char *fn, FILE *fp, int flags, int aflags, int *zep)
|
||||
{
|
||||
struct zip *za;
|
||||
struct zip_cdir *cdir;
|
||||
int i;
|
||||
off_t len;
|
||||
|
||||
if (fseeko(fp, 0, SEEK_END) < 0) {
|
||||
*zep = ZIP_ER_SEEK;
|
||||
return NULL;
|
||||
}
|
||||
len = ftello(fp);
|
||||
|
||||
/* treat empty files as empty archives */
|
||||
@@ -154,7 +166,7 @@ _zip_readcdir(FILE *fp, unsigned char *buf, unsigned char *eocd, int buflen,
|
||||
struct zip_cdir *cd;
|
||||
unsigned char *cdp, **bufp;
|
||||
int i, comlen, nentry;
|
||||
unsigned int left;
|
||||
zip_uint32_t left;
|
||||
|
||||
comlen = buf + buflen - eocd - EOCDLEN;
|
||||
if (comlen < 0) {
|
||||
@@ -190,12 +202,14 @@ _zip_readcdir(FILE *fp, unsigned char *buf, unsigned char *eocd, int buflen,
|
||||
|
||||
if ((comlen < cd->comment_len) || (cd->nentry != i)) {
|
||||
_zip_error_set(error, ZIP_ER_NOZIP, 0);
|
||||
free(cd);
|
||||
cd->nentry = 0;
|
||||
_zip_cdir_free(cd);
|
||||
return NULL;
|
||||
}
|
||||
if ((flags & ZIP_CHECKCONS) && comlen != cd->comment_len) {
|
||||
_zip_error_set(error, ZIP_ER_INCONS, 0);
|
||||
free(cd);
|
||||
cd->nentry = 0;
|
||||
_zip_cdir_free(cd);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@@ -203,7 +217,8 @@ _zip_readcdir(FILE *fp, unsigned char *buf, unsigned char *eocd, int buflen,
|
||||
if ((cd->comment=(char *)_zip_memdup(eocd+EOCDLEN,
|
||||
cd->comment_len, error))
|
||||
== NULL) {
|
||||
free(cd);
|
||||
cd->nentry = 0;
|
||||
_zip_cdir_free(cd);
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
@@ -226,7 +241,8 @@ _zip_readcdir(FILE *fp, unsigned char *buf, unsigned char *eocd, int buflen,
|
||||
_zip_error_set(error, ZIP_ER_SEEK, errno);
|
||||
else
|
||||
_zip_error_set(error, ZIP_ER_NOZIP, 0);
|
||||
free(cd);
|
||||
cd->nentry = 0;
|
||||
_zip_cdir_free(cd);
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
@@ -237,7 +253,7 @@ _zip_readcdir(FILE *fp, unsigned char *buf, unsigned char *eocd, int buflen,
|
||||
if (i == cd->nentry && left > 0) {
|
||||
/* Infozip extension for more than 64k entries:
|
||||
nentries wraps around, size indicates correct EOCD */
|
||||
_zip_cdir_grow(cd, cd->nentry+0x10000, error);
|
||||
_zip_cdir_grow(cd, cd->nentry+ZIP_UINT16_MAX, error);
|
||||
}
|
||||
|
||||
if ((_zip_dirent_read(cd->entry+i, fp, bufp, &left, 0, error)) < 0) {
|
||||
@@ -426,12 +442,16 @@ _zip_allocate_new(const char *fn, int *zep)
|
||||
set_error(zep, &error, 0);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
za->zn = strdup(fn);
|
||||
if (!za->zn) {
|
||||
_zip_free(za);
|
||||
set_error(zep, NULL, ZIP_ER_MEMORY);
|
||||
return NULL;
|
||||
|
||||
if (fn == NULL)
|
||||
za->zn = NULL;
|
||||
else {
|
||||
za->zn = strdup(fn);
|
||||
if (!za->zn) {
|
||||
_zip_free(za);
|
||||
set_error(zep, NULL, ZIP_ER_MEMORY);
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
return za;
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
zip_rename.c -- rename file in zip archive
|
||||
Copyright (C) 1999-2008 Dieter Baron and Thomas Klausner
|
||||
Copyright (C) 1999-2009 Dieter Baron and Thomas Klausner
|
||||
|
||||
This file is part of libzip, a library to manipulate ZIP archives.
|
||||
The authors can be contacted at <libzip@nih.at>
|
||||
@@ -40,16 +40,21 @@
|
||||
|
||||
|
||||
ZIP_EXTERN int
|
||||
zip_rename(struct zip *za, int idx, const char *name)
|
||||
zip_rename(struct zip *za, zip_uint64_t idx, const char *name)
|
||||
{
|
||||
const char *old_name;
|
||||
int old_is_dir, new_is_dir;
|
||||
|
||||
if (idx >= za->nentry || idx < 0 || name[0] == '\0') {
|
||||
if (idx >= za->nentry || name[0] == '\0') {
|
||||
_zip_error_set(&za->error, ZIP_ER_INVAL, 0);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (ZIP_IS_RDONLY(za)) {
|
||||
_zip_error_set(&za->error, ZIP_ER_RDONLY, 0);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if ((old_name=zip_get_name(za, idx, 0)) == NULL)
|
||||
return -1;
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
zip_replace.c -- replace file via callback function
|
||||
Copyright (C) 1999-2007 Dieter Baron and Thomas Klausner
|
||||
Copyright (C) 1999-2009 Dieter Baron and Thomas Klausner
|
||||
|
||||
This file is part of libzip, a library to manipulate ZIP archives.
|
||||
The authors can be contacted at <libzip@nih.at>
|
||||
@@ -38,9 +38,9 @@
|
||||
|
||||
|
||||
ZIP_EXTERN int
|
||||
zip_replace(struct zip *za, int idx, struct zip_source *source)
|
||||
zip_replace(struct zip *za, zip_uint64_t idx, struct zip_source *source)
|
||||
{
|
||||
if (idx < 0 || idx >= za->nentry || source == NULL) {
|
||||
if (idx >= za->nentry || source == NULL) {
|
||||
_zip_error_set(&za->error, ZIP_ER_INVAL, 0);
|
||||
return -1;
|
||||
}
|
||||
@@ -54,11 +54,18 @@ zip_replace(struct zip *za, int idx, struct zip_source *source)
|
||||
|
||||
|
||||
|
||||
int
|
||||
_zip_replace(struct zip *za, int idx, const char *name,
|
||||
/* NOTE: Signed due to -1 on error. See zip_add.c for more details. */
|
||||
|
||||
zip_int64_t
|
||||
_zip_replace(struct zip *za, zip_uint64_t idx, const char *name,
|
||||
struct zip_source *source)
|
||||
{
|
||||
if (idx == -1) {
|
||||
if (ZIP_IS_RDONLY(za)) {
|
||||
_zip_error_set(&za->error, ZIP_ER_RDONLY, 0);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (idx == ZIP_UINT64_MAX) {
|
||||
if (_zip_entry_new(za) == NULL)
|
||||
return -1;
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
zip_set_archive_comment.c -- set archive comment
|
||||
Copyright (C) 2006-2007 Dieter Baron and Thomas Klausner
|
||||
Copyright (C) 2006-2009 Dieter Baron and Thomas Klausner
|
||||
|
||||
This file is part of libzip, a library to manipulate ZIP archives.
|
||||
The authors can be contacted at <libzip@nih.at>
|
||||
@@ -50,6 +50,11 @@ zip_set_archive_comment(struct zip *za, const char *comment, int len)
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (ZIP_IS_RDONLY(za)) {
|
||||
_zip_error_set(&za->error, ZIP_ER_RDONLY, 0);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (len > 0) {
|
||||
if ((tmpcom=(char *)_zip_memdup(comment, len, &za->error)) == NULL)
|
||||
return -1;
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
zip_get_archive_flag.c -- set archive global flag
|
||||
Copyright (C) 2008 Dieter Baron and Thomas Klausner
|
||||
Copyright (C) 2008-2009 Dieter Baron and Thomas Klausner
|
||||
|
||||
This file is part of libzip, a library to manipulate ZIP archives.
|
||||
The authors can be contacted at <libzip@nih.at>
|
||||
@@ -40,10 +40,30 @@
|
||||
ZIP_EXTERN int
|
||||
zip_set_archive_flag(struct zip *za, int flag, int value)
|
||||
{
|
||||
unsigned int new_flags;
|
||||
|
||||
if (value)
|
||||
za->ch_flags |= flag;
|
||||
new_flags = za->ch_flags | flag;
|
||||
else
|
||||
za->ch_flags &= ~flag;
|
||||
new_flags = za->ch_flags & ~flag;
|
||||
|
||||
if (new_flags == za->ch_flags)
|
||||
return 0;
|
||||
|
||||
if (ZIP_IS_RDONLY(za)) {
|
||||
_zip_error_set(&za->error, ZIP_ER_RDONLY, 0);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if ((flag & ZIP_AFL_RDONLY) && value
|
||||
&& (za->ch_flags & ZIP_AFL_RDONLY) == 0) {
|
||||
if (_zip_changed(za, NULL)) {
|
||||
_zip_error_set(&za->error, ZIP_ER_CHANGED, 0);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
za->ch_flags = new_flags;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
59
src/helper/libzip/zip_set_default_password.c
Normal file
59
src/helper/libzip/zip_set_default_password.c
Normal file
@@ -0,0 +1,59 @@
|
||||
/*
|
||||
zip_set_default_password.c -- set default password for decryption
|
||||
Copyright (C) 2009 Dieter Baron and Thomas Klausner
|
||||
|
||||
This file is part of libzip, a library to manipulate ZIP archives.
|
||||
The authors can be contacted at <libzip@nih.at>
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions
|
||||
are met:
|
||||
1. Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
2. Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in
|
||||
the documentation and/or other materials provided with the
|
||||
distribution.
|
||||
3. The names of the authors may not be used to endorse or promote
|
||||
products derived from this software without specific prior
|
||||
written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
|
||||
OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
|
||||
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
|
||||
GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
|
||||
IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
||||
OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
|
||||
IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "zipint.h"
|
||||
|
||||
|
||||
|
||||
ZIP_EXTERN int
|
||||
zip_set_default_password(struct zip *za, const char *passwd)
|
||||
{
|
||||
if (za->default_password)
|
||||
free(za->default_password);
|
||||
|
||||
if (passwd) {
|
||||
if ((za->default_password=strdup(passwd)) == NULL) {
|
||||
_zip_error_set(&za->error, ZIP_ER_MEMORY, 0);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
else
|
||||
za->default_password = NULL;
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
zip_set_file_comment.c -- set comment for file in archive
|
||||
Copyright (C) 2006-2007 Dieter Baron and Thomas Klausner
|
||||
Copyright (C) 2006-2009 Dieter Baron and Thomas Klausner
|
||||
|
||||
This file is part of libzip, a library to manipulate ZIP archives.
|
||||
The authors can be contacted at <libzip@nih.at>
|
||||
@@ -40,17 +40,23 @@
|
||||
|
||||
|
||||
ZIP_EXTERN int
|
||||
zip_set_file_comment(struct zip *za, int idx, const char *comment, int len)
|
||||
zip_set_file_comment(struct zip *za, zip_uint64_t idx,
|
||||
const char *comment, int len)
|
||||
{
|
||||
char *tmpcom;
|
||||
|
||||
if (idx < 0 || idx >= za->nentry
|
||||
if (idx >= za->nentry
|
||||
|| len < 0 || len > MAXCOMLEN
|
||||
|| (len > 0 && comment == NULL)) {
|
||||
_zip_error_set(&za->error, ZIP_ER_INVAL, 0);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (ZIP_IS_RDONLY(za)) {
|
||||
_zip_error_set(&za->error, ZIP_ER_RDONLY, 0);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (len > 0) {
|
||||
if ((tmpcom=(char *)_zip_memdup(comment, len, &za->error)) == NULL)
|
||||
return -1;
|
||||
|
||||
@@ -41,12 +41,12 @@
|
||||
|
||||
|
||||
int
|
||||
_zip_set_name(struct zip *za, int idx, const char *name)
|
||||
_zip_set_name(struct zip *za, zip_uint64_t idx, const char *name)
|
||||
{
|
||||
char *s;
|
||||
int i;
|
||||
zip_int64_t i;
|
||||
|
||||
if (idx < 0 || idx >= za->nentry || name == NULL) {
|
||||
if (idx >= za->nentry || name == NULL) {
|
||||
_zip_error_set(&za->error, ZIP_ER_INVAL, 0);
|
||||
return -1;
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
zip_source_buffer.c -- create zip data source from buffer
|
||||
Copyright (C) 1999-2007 Dieter Baron and Thomas Klausner
|
||||
Copyright (C) 1999-2009 Dieter Baron and Thomas Klausner
|
||||
|
||||
This file is part of libzip, a library to manipulate ZIP archives.
|
||||
The authors can be contacted at <libzip@nih.at>
|
||||
@@ -44,13 +44,12 @@ struct read_data {
|
||||
int freep;
|
||||
};
|
||||
|
||||
static ssize_t read_data(void *state, void *data, size_t len,
|
||||
enum zip_source_cmd cmd);
|
||||
static zip_int64_t read_data(void *, void *, zip_uint64_t, enum zip_source_cmd);
|
||||
|
||||
|
||||
|
||||
ZIP_EXTERN struct zip_source *
|
||||
zip_source_buffer(struct zip *za, const void *data, off_t len, int freep)
|
||||
zip_source_buffer(struct zip *za, const void *data, zip_uint64_t len, int freep)
|
||||
{
|
||||
struct read_data *f;
|
||||
struct zip_source *zs;
|
||||
@@ -58,7 +57,7 @@ zip_source_buffer(struct zip *za, const void *data, off_t len, int freep)
|
||||
if (za == NULL)
|
||||
return NULL;
|
||||
|
||||
if (len < 0 || (data == NULL && len > 0)) {
|
||||
if (data == NULL && len > 0) {
|
||||
_zip_error_set(&za->error, ZIP_ER_INVAL, 0);
|
||||
return NULL;
|
||||
}
|
||||
@@ -83,12 +82,12 @@ zip_source_buffer(struct zip *za, const void *data, off_t len, int freep)
|
||||
|
||||
|
||||
|
||||
static ssize_t
|
||||
read_data(void *state, void *data, size_t len, enum zip_source_cmd cmd)
|
||||
static zip_int64_t
|
||||
read_data(void *state, void *data, zip_uint64_t len, enum zip_source_cmd cmd)
|
||||
{
|
||||
struct read_data *z;
|
||||
char *buf;
|
||||
size_t n;
|
||||
zip_uint64_t n;
|
||||
|
||||
z = (struct read_data *)state;
|
||||
buf = (char *)data;
|
||||
@@ -99,6 +98,8 @@ read_data(void *state, void *data, size_t len, enum zip_source_cmd cmd)
|
||||
return 0;
|
||||
|
||||
case ZIP_SOURCE_READ:
|
||||
/* XXX: return error if (len > ZIP_INT64_MAX) */
|
||||
|
||||
n = z->end - z->buf;
|
||||
if (n > len)
|
||||
n = len;
|
||||
@@ -125,6 +126,11 @@ read_data(void *state, void *data, size_t len, enum zip_source_cmd cmd)
|
||||
zip_stat_init(st);
|
||||
st->mtime = z->mtime;
|
||||
st->size = z->end - z->data;
|
||||
st->comp_size = st->size;
|
||||
st->comp_method = ZIP_CM_STORE;
|
||||
st->encryption_method = ZIP_EM_NONE;
|
||||
st->valid = ZIP_STAT_MTIME|ZIP_STAT_SIZE|ZIP_STAT_COMP_SIZE
|
||||
|ZIP_STAT_COMP_METHOD|ZIP_STAT_ENCRYPTION_METHOD;
|
||||
|
||||
return sizeof(*st);
|
||||
}
|
||||
|
||||
54
src/helper/libzip/zip_source_close.c
Normal file
54
src/helper/libzip/zip_source_close.c
Normal file
@@ -0,0 +1,54 @@
|
||||
/*
|
||||
zip_source_close.c -- close zip_source (stop reading)
|
||||
Copyright (C) 2009 Dieter Baron and Thomas Klausner
|
||||
|
||||
This file is part of libzip, a library to manipulate ZIP archives.
|
||||
The authors can be contacted at <libzip@nih.at>
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions
|
||||
are met:
|
||||
1. Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
2. Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in
|
||||
the documentation and/or other materials provided with the
|
||||
distribution.
|
||||
3. The names of the authors may not be used to endorse or promote
|
||||
products derived from this software without specific prior
|
||||
written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
|
||||
OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
|
||||
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
|
||||
GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
|
||||
IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
||||
OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
|
||||
IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
|
||||
|
||||
#include "zipint.h"
|
||||
|
||||
|
||||
|
||||
ZIP_EXTERN void
|
||||
zip_source_close(struct zip_source *src)
|
||||
{
|
||||
if (!src->is_open)
|
||||
return;
|
||||
|
||||
if (src->src == NULL)
|
||||
(void)src->cb.f(src->ud, NULL, 0, ZIP_SOURCE_CLOSE);
|
||||
else {
|
||||
(void)src->cb.l(src->src, src->ud, NULL, 0, ZIP_SOURCE_CLOSE);
|
||||
zip_source_close(src->src);
|
||||
}
|
||||
|
||||
src->is_open = 0;
|
||||
}
|
||||
159
src/helper/libzip/zip_source_crc.c
Normal file
159
src/helper/libzip/zip_source_crc.c
Normal file
@@ -0,0 +1,159 @@
|
||||
/*
|
||||
zip_source_crc.c -- pass-through source that calculates CRC32 and size
|
||||
Copyright (C) 2009 Dieter Baron and Thomas Klausner
|
||||
|
||||
This file is part of libzip, a library to manipulate ZIP archives.
|
||||
The authors can be contacted at <libzip@nih.at>
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions
|
||||
are met:
|
||||
1. Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
2. Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in
|
||||
the documentation and/or other materials provided with the
|
||||
distribution.
|
||||
3. The names of the authors may not be used to endorse or promote
|
||||
products derived from this software without specific prior
|
||||
written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
|
||||
OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
|
||||
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
|
||||
GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
|
||||
IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
||||
OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
|
||||
IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "zipint.h"
|
||||
|
||||
struct crc {
|
||||
int eof;
|
||||
int validate;
|
||||
int e[2];
|
||||
zip_uint64_t size;
|
||||
zip_uint32_t crc;
|
||||
};
|
||||
|
||||
static zip_int64_t crc_read(struct zip_source *, void *, void *
|
||||
, zip_uint64_t, enum zip_source_cmd);
|
||||
|
||||
|
||||
|
||||
ZIP_EXTERN struct zip_source *
|
||||
zip_source_crc(struct zip *za, struct zip_source *src, int validate)
|
||||
{
|
||||
struct crc *ctx;
|
||||
|
||||
if (src == NULL) {
|
||||
_zip_error_set(&za->error, ZIP_ER_INVAL, 0);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if ((ctx=(struct crc *)malloc(sizeof(*ctx))) == NULL) {
|
||||
_zip_error_set(&za->error, ZIP_ER_MEMORY, 0);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
ctx->validate = validate;
|
||||
|
||||
return zip_source_layered(za, src, crc_read, ctx);
|
||||
}
|
||||
|
||||
|
||||
|
||||
static zip_int64_t
|
||||
crc_read(struct zip_source *src, void *_ctx, void *data,
|
||||
zip_uint64_t len, enum zip_source_cmd cmd)
|
||||
{
|
||||
struct crc *ctx;
|
||||
zip_int64_t n;
|
||||
|
||||
ctx = (struct crc *)_ctx;
|
||||
|
||||
switch (cmd) {
|
||||
case ZIP_SOURCE_OPEN:
|
||||
ctx->eof = 0;
|
||||
ctx->crc = crc32(0, NULL, 0);
|
||||
ctx->size = 0;
|
||||
|
||||
return 0;
|
||||
|
||||
case ZIP_SOURCE_READ:
|
||||
if (ctx->eof || len == 0)
|
||||
return 0;
|
||||
|
||||
if ((n=zip_source_read(src, data, len)) < 0)
|
||||
return ZIP_SOURCE_ERR_LOWER;
|
||||
|
||||
if (n == 0) {
|
||||
ctx->eof = 1;
|
||||
if (ctx->validate) {
|
||||
struct zip_stat st;
|
||||
|
||||
if (zip_source_stat(src, &st) < 0)
|
||||
return ZIP_SOURCE_ERR_LOWER;
|
||||
|
||||
if ((st.valid & ZIP_STAT_CRC) && st.crc != ctx->crc) {
|
||||
ctx->e[0] = ZIP_ER_CRC;
|
||||
ctx->e[1] = 0;
|
||||
|
||||
return -1;
|
||||
}
|
||||
if ((st.valid & ZIP_STAT_SIZE) && st.size != ctx->size) {
|
||||
ctx->e[0] = ZIP_ER_INCONS;
|
||||
ctx->e[1] = 0;
|
||||
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
ctx->size += n;
|
||||
ctx->crc = crc32(ctx->crc, data, n);
|
||||
}
|
||||
return n;
|
||||
|
||||
case ZIP_SOURCE_CLOSE:
|
||||
return 0;
|
||||
|
||||
case ZIP_SOURCE_STAT:
|
||||
{
|
||||
struct zip_stat *st;
|
||||
|
||||
st = (struct zip_stat *)data;
|
||||
|
||||
if (ctx->eof) {
|
||||
/* XXX: Set comp_size, comp_method, encryption_method?
|
||||
After all, this only works for uncompressed data. */
|
||||
st->size = ctx->size;
|
||||
st->crc = ctx->crc;
|
||||
st->valid |= ZIP_STAT_SIZE|ZIP_STAT_CRC;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
|
||||
case ZIP_SOURCE_ERROR:
|
||||
memcpy(data, ctx->e, sizeof(ctx->e));
|
||||
return 0;
|
||||
|
||||
case ZIP_SOURCE_FREE:
|
||||
free(ctx);
|
||||
return 0;
|
||||
|
||||
default:
|
||||
return -1;
|
||||
}
|
||||
|
||||
}
|
||||
394
src/helper/libzip/zip_source_deflate.c
Normal file
394
src/helper/libzip/zip_source_deflate.c
Normal file
@@ -0,0 +1,394 @@
|
||||
/*
|
||||
zip_source_deflate.c -- deflate (de)compressoin routines
|
||||
Copyright (C) 2009 Dieter Baron and Thomas Klausner
|
||||
|
||||
This file is part of libzip, a library to manipulate ZIP archives.
|
||||
The authors can be contacted at <libzip@nih.at>
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions
|
||||
are met:
|
||||
1. Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
2. Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in
|
||||
the documentation and/or other materials provided with the
|
||||
distribution.
|
||||
3. The names of the authors may not be used to endorse or promote
|
||||
products derived from this software without specific prior
|
||||
written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
|
||||
OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
|
||||
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
|
||||
GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
|
||||
IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
||||
OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
|
||||
IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "zipint.h"
|
||||
|
||||
struct deflate {
|
||||
int e[2];
|
||||
|
||||
int eof;
|
||||
int mem_level;
|
||||
zip_uint64_t size;
|
||||
char buffer[BUFSIZE];
|
||||
z_stream zstr;
|
||||
};
|
||||
|
||||
static zip_int64_t compress_read(struct zip_source *, struct deflate *,
|
||||
void *, zip_uint64_t);
|
||||
static zip_int64_t decompress_read(struct zip_source *, struct deflate *,
|
||||
void *, zip_uint64_t);
|
||||
static zip_int64_t deflate_compress(struct zip_source *, void *, void *,
|
||||
zip_uint64_t, enum zip_source_cmd);
|
||||
static zip_int64_t deflate_decompress(struct zip_source *, void *, void *,
|
||||
zip_uint64_t, enum zip_source_cmd);
|
||||
static void deflate_free(struct deflate *);
|
||||
|
||||
|
||||
|
||||
ZIP_EXTERN struct zip_source *
|
||||
zip_source_deflate(struct zip *za, struct zip_source *src,
|
||||
zip_uint16_t cm, int flags)
|
||||
{
|
||||
struct deflate *ctx;
|
||||
struct zip_source *s2;
|
||||
|
||||
if (src == NULL || cm != ZIP_CM_DEFLATE) {
|
||||
_zip_error_set(&za->error, ZIP_ER_INVAL, 0);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if ((ctx=(struct deflate *)malloc(sizeof(*ctx))) == NULL) {
|
||||
_zip_error_set(&za->error, ZIP_ER_MEMORY, 0);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
ctx->e[0] = ctx->e[1] = 0;
|
||||
ctx->eof = 0;
|
||||
if (flags & ZIP_CODEC_ENCODE) {
|
||||
if (zip_get_archive_flag(za, ZIP_AFL_TORRENT, 0))
|
||||
ctx->mem_level = TORRENT_MEM_LEVEL;
|
||||
else
|
||||
ctx->mem_level = MAX_MEM_LEVEL;
|
||||
}
|
||||
|
||||
if ((s2=zip_source_layered(za, src,
|
||||
((flags & ZIP_CODEC_ENCODE)
|
||||
? deflate_compress : deflate_decompress),
|
||||
ctx)) == NULL) {
|
||||
deflate_free(ctx);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return s2;
|
||||
}
|
||||
|
||||
|
||||
|
||||
static zip_int64_t
|
||||
compress_read(struct zip_source *src, struct deflate *ctx,
|
||||
void *data, zip_uint64_t len)
|
||||
{
|
||||
int end, ret;
|
||||
zip_int64_t n;
|
||||
|
||||
if (ctx->e[0] != 0)
|
||||
return -1;
|
||||
|
||||
if (len == 0)
|
||||
return 0;
|
||||
|
||||
ctx->zstr.next_out = (Bytef *)data;
|
||||
ctx->zstr.avail_out = len;
|
||||
|
||||
end = 0;
|
||||
while (!end) {
|
||||
ret = deflate(&ctx->zstr, ctx->eof ? Z_FINISH : 0);
|
||||
|
||||
switch (ret) {
|
||||
case Z_OK:
|
||||
case Z_STREAM_END:
|
||||
/* all ok */
|
||||
|
||||
if (ctx->zstr.avail_out == 0
|
||||
|| (ctx->eof && ctx->zstr.avail_in == 0))
|
||||
end = 1;
|
||||
break;
|
||||
|
||||
case Z_BUF_ERROR:
|
||||
if (ctx->zstr.avail_in == 0) {
|
||||
if (ctx->eof) {
|
||||
end = 1;
|
||||
break;
|
||||
}
|
||||
|
||||
if ((n=zip_source_read(src, ctx->buffer,
|
||||
sizeof(ctx->buffer))) < 0) {
|
||||
zip_source_error(src, ctx->e, ctx->e+1);
|
||||
end = 1;
|
||||
break;
|
||||
}
|
||||
else if (n == 0) {
|
||||
ctx->eof = 1;
|
||||
ctx->size = ctx->zstr.total_in;
|
||||
/* XXX: check against stat of src? */
|
||||
}
|
||||
else {
|
||||
ctx->zstr.next_in = (Bytef *)ctx->buffer;
|
||||
ctx->zstr.avail_in = n;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
/* fallthrough */
|
||||
case Z_NEED_DICT:
|
||||
case Z_DATA_ERROR:
|
||||
case Z_STREAM_ERROR:
|
||||
case Z_MEM_ERROR:
|
||||
ctx->e[0] = ZIP_ER_ZLIB;
|
||||
ctx->e[1] = ret;
|
||||
|
||||
end = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (ctx->zstr.avail_out < len)
|
||||
return len - ctx->zstr.avail_out;
|
||||
|
||||
return (ctx->e[0] == 0) ? 0 : -1;
|
||||
}
|
||||
|
||||
|
||||
|
||||
static zip_int64_t
|
||||
decompress_read(struct zip_source *src, struct deflate *ctx,
|
||||
void *data, zip_uint64_t len)
|
||||
{
|
||||
int end, ret;
|
||||
zip_int64_t n;
|
||||
|
||||
if (ctx->e[0] != 0)
|
||||
return -1;
|
||||
|
||||
if (len == 0)
|
||||
return 0;
|
||||
|
||||
ctx->zstr.next_out = (Bytef *)data;
|
||||
ctx->zstr.avail_out = len;
|
||||
|
||||
end = 0;
|
||||
while (!end && ctx->zstr.avail_out) {
|
||||
ret = inflate(&ctx->zstr, Z_SYNC_FLUSH);
|
||||
|
||||
switch (ret) {
|
||||
case Z_OK:
|
||||
break;
|
||||
|
||||
case Z_STREAM_END:
|
||||
ctx->eof = 1;
|
||||
end = 1;
|
||||
break;
|
||||
|
||||
case Z_BUF_ERROR:
|
||||
if (ctx->zstr.avail_in == 0) {
|
||||
if (ctx->eof) {
|
||||
end = 1;
|
||||
break;
|
||||
}
|
||||
|
||||
if ((n=zip_source_read(src, ctx->buffer,
|
||||
sizeof(ctx->buffer))) < 0) {
|
||||
zip_source_error(src, ctx->e, ctx->e+1);
|
||||
end = 1;
|
||||
break;
|
||||
}
|
||||
else if (n == 0)
|
||||
ctx->eof = 1;
|
||||
else {
|
||||
ctx->zstr.next_in = (Bytef *)ctx->buffer;
|
||||
ctx->zstr.avail_in = n;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
/* fallthrough */
|
||||
case Z_NEED_DICT:
|
||||
case Z_DATA_ERROR:
|
||||
case Z_STREAM_ERROR:
|
||||
case Z_MEM_ERROR:
|
||||
ctx->e[0] = ZIP_ER_ZLIB;
|
||||
ctx->e[1] = ret;
|
||||
end = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (ctx->zstr.avail_out < len)
|
||||
return len - ctx->zstr.avail_out;
|
||||
|
||||
return (ctx->e[0] == 0) ? 0 : -1;
|
||||
}
|
||||
|
||||
|
||||
|
||||
static zip_int64_t
|
||||
deflate_compress(struct zip_source *src, void *ud, void *data,
|
||||
zip_uint64_t len, enum zip_source_cmd cmd)
|
||||
{
|
||||
struct deflate *ctx;
|
||||
int ret;
|
||||
|
||||
ctx = (struct deflate *)ud;
|
||||
|
||||
switch (cmd) {
|
||||
case ZIP_SOURCE_OPEN:
|
||||
ctx->zstr.zalloc = Z_NULL;
|
||||
ctx->zstr.zfree = Z_NULL;
|
||||
ctx->zstr.opaque = NULL;
|
||||
ctx->zstr.avail_in = 0;
|
||||
ctx->zstr.next_in = NULL;
|
||||
ctx->zstr.avail_out = 0;
|
||||
ctx->zstr.next_out = NULL;
|
||||
|
||||
/* negative value to tell zlib not to write a header */
|
||||
if ((ret=deflateInit2(&ctx->zstr, Z_BEST_COMPRESSION, Z_DEFLATED,
|
||||
-MAX_WBITS, ctx->mem_level,
|
||||
Z_DEFAULT_STRATEGY)) != Z_OK) {
|
||||
ctx->e[0] = ZIP_ER_ZLIB;
|
||||
ctx->e[1] = ret;
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
case ZIP_SOURCE_READ:
|
||||
return compress_read(src, ctx, data, len);
|
||||
|
||||
case ZIP_SOURCE_CLOSE:
|
||||
deflateEnd(&ctx->zstr);
|
||||
return 0;
|
||||
|
||||
case ZIP_SOURCE_STAT:
|
||||
{
|
||||
struct zip_stat *st;
|
||||
|
||||
st = (struct zip_stat *)data;
|
||||
|
||||
st->comp_method = ZIP_CM_DEFLATE;
|
||||
st->valid |= ZIP_STAT_COMP_METHOD;
|
||||
if (ctx->eof) {
|
||||
st->comp_size = ctx->size;
|
||||
st->valid |= ZIP_STAT_COMP_SIZE;
|
||||
}
|
||||
else
|
||||
st->valid &= ~ZIP_STAT_COMP_SIZE;
|
||||
}
|
||||
return 0;
|
||||
|
||||
case ZIP_SOURCE_ERROR:
|
||||
memcpy(data, ctx->e, sizeof(int)*2);
|
||||
return sizeof(int)*2;
|
||||
|
||||
case ZIP_SOURCE_FREE:
|
||||
deflate_free(ctx);
|
||||
return 0;
|
||||
|
||||
default:
|
||||
ctx->e[0] = ZIP_ER_INVAL;
|
||||
ctx->e[1] = 0;
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
static zip_int64_t
|
||||
deflate_decompress(struct zip_source *src, void *ud, void *data,
|
||||
zip_uint64_t len, enum zip_source_cmd cmd)
|
||||
{
|
||||
struct deflate *ctx;
|
||||
zip_int64_t n;
|
||||
int ret;
|
||||
|
||||
ctx = (struct deflate *)ud;
|
||||
|
||||
switch (cmd) {
|
||||
case ZIP_SOURCE_OPEN:
|
||||
if ((n=zip_source_read(src, ctx->buffer, sizeof(ctx->buffer))) < 0)
|
||||
return ZIP_SOURCE_ERR_LOWER;
|
||||
|
||||
ctx->zstr.zalloc = Z_NULL;
|
||||
ctx->zstr.zfree = Z_NULL;
|
||||
ctx->zstr.opaque = NULL;
|
||||
ctx->zstr.next_in = (Bytef *)ctx->buffer;
|
||||
ctx->zstr.avail_in = n;
|
||||
|
||||
/* negative value to tell zlib that there is no header */
|
||||
if ((ret=inflateInit2(&ctx->zstr, -MAX_WBITS)) != Z_OK) {
|
||||
ctx->e[0] = ZIP_ER_ZLIB;
|
||||
ctx->e[1] = ret;
|
||||
|
||||
return -1;
|
||||
}
|
||||
return 0;
|
||||
|
||||
case ZIP_SOURCE_READ:
|
||||
return decompress_read(src, ctx, data, len);
|
||||
|
||||
case ZIP_SOURCE_CLOSE:
|
||||
inflateEnd(&ctx->zstr);
|
||||
return 0;
|
||||
|
||||
case ZIP_SOURCE_STAT:
|
||||
{
|
||||
struct zip_stat *st;
|
||||
|
||||
st = (struct zip_stat *)data;
|
||||
|
||||
st->comp_method = ZIP_CM_STORE;
|
||||
if (st->comp_size > 0 && st->size > 0)
|
||||
st->comp_size = st->size;
|
||||
}
|
||||
return 0;
|
||||
|
||||
case ZIP_SOURCE_ERROR:
|
||||
if (len < sizeof(int)*2)
|
||||
return -1;
|
||||
|
||||
memcpy(data, ctx->e, sizeof(int)*2);
|
||||
return sizeof(int)*2;
|
||||
|
||||
case ZIP_SOURCE_FREE:
|
||||
/* XXX: inflateEnd if close was not called */
|
||||
free(ctx);
|
||||
return 0;
|
||||
|
||||
default:
|
||||
ctx->e[0] = ZIP_ER_INVAL;
|
||||
ctx->e[1] = 0;
|
||||
return -1;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
static void
|
||||
deflate_free(struct deflate *ctx)
|
||||
{
|
||||
/* XXX: deflateEnd if close was not called */
|
||||
free(ctx);
|
||||
}
|
||||
86
src/helper/libzip/zip_source_error.c
Normal file
86
src/helper/libzip/zip_source_error.c
Normal file
@@ -0,0 +1,86 @@
|
||||
/*
|
||||
zip_source_error.c -- get last error from zip_source
|
||||
Copyright (C) 2009 Dieter Baron and Thomas Klausner
|
||||
|
||||
This file is part of libzip, a library to manipulate ZIP archives.
|
||||
The authors can be contacted at <libzip@nih.at>
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions
|
||||
are met:
|
||||
1. Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
2. Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in
|
||||
the documentation and/or other materials provided with the
|
||||
distribution.
|
||||
3. The names of the authors may not be used to endorse or promote
|
||||
products derived from this software without specific prior
|
||||
written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
|
||||
OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
|
||||
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
|
||||
GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
|
||||
IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
||||
OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
|
||||
IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
|
||||
|
||||
#include "zipint.h"
|
||||
|
||||
|
||||
|
||||
ZIP_EXTERN void
|
||||
zip_source_error(struct zip_source *src, int *ze, int *se)
|
||||
{
|
||||
int e[2];
|
||||
|
||||
if (src->src == NULL) {
|
||||
}
|
||||
else {
|
||||
switch (src->error_source) {
|
||||
case ZIP_LES_NONE:
|
||||
if (src->src == NULL) {
|
||||
if (src->cb.f(src->ud, e, sizeof(e), ZIP_SOURCE_ERROR) < 0) {
|
||||
e[0] = ZIP_ER_INTERNAL;
|
||||
e[1] = 0;
|
||||
}
|
||||
}
|
||||
else
|
||||
e[0] = e[1] = 0;
|
||||
break;
|
||||
|
||||
case ZIP_LES_INVAL:
|
||||
e[0] = ZIP_ER_INVAL;
|
||||
e[1] = 0;
|
||||
break;
|
||||
|
||||
case ZIP_LES_LOWER:
|
||||
return zip_source_error(src->src, ze, se);
|
||||
|
||||
case ZIP_LES_UPPER:
|
||||
if (src->cb.l(src->src, src->ud, e, sizeof(e),
|
||||
ZIP_SOURCE_ERROR) < 0) {
|
||||
e[0] = ZIP_ER_INTERNAL;
|
||||
e[1] = 0;
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
e[0] = ZIP_ER_INTERNAL;
|
||||
e[1] = 0;
|
||||
}
|
||||
}
|
||||
|
||||
if (ze)
|
||||
*ze = e[0];
|
||||
if (se)
|
||||
*se = e[1];
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
zip_source_file.c -- create data source from file
|
||||
Copyright (C) 1999-2008 Dieter Baron and Thomas Klausner
|
||||
Copyright (C) 1999-2009 Dieter Baron and Thomas Klausner
|
||||
|
||||
This file is part of libzip, a library to manipulate ZIP archives.
|
||||
The authors can be contacted at <libzip@nih.at>
|
||||
@@ -41,15 +41,16 @@
|
||||
|
||||
|
||||
ZIP_EXTERN struct zip_source *
|
||||
zip_source_file(struct zip *za, const char *fname, off_t start, off_t len)
|
||||
zip_source_file(struct zip *za, const char *fname, zip_uint64_t start,
|
||||
zip_int64_t len)
|
||||
{
|
||||
if (za == NULL)
|
||||
return NULL;
|
||||
|
||||
if (fname == NULL || start < 0 || len < -1) {
|
||||
if (fname == NULL || len < -1) {
|
||||
_zip_error_set(&za->error, ZIP_ER_INVAL, 0);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return _zip_source_file_or_p(za, fname, NULL, start, len);
|
||||
return _zip_source_file_or_p(za, fname, NULL, start, len, 1, NULL);
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
zip_source_filep.c -- create data source from FILE *
|
||||
Copyright (C) 1999-2008 Dieter Baron and Thomas Klausner
|
||||
Copyright (C) 1999-2009 Dieter Baron and Thomas Klausner
|
||||
|
||||
This file is part of libzip, a library to manipulate ZIP archives.
|
||||
The authors can be contacted at <libzip@nih.at>
|
||||
@@ -44,19 +44,23 @@
|
||||
struct read_file {
|
||||
char *fname; /* name of file to copy from */
|
||||
FILE *f; /* file to copy from */
|
||||
off_t off; /* start offset of */
|
||||
off_t len; /* lengt of data to copy */
|
||||
off_t remain; /* bytes remaining to be copied */
|
||||
int closep; /* close f */
|
||||
struct zip_stat st; /* stat information passed in */
|
||||
|
||||
zip_uint64_t off; /* start offset of */
|
||||
zip_int64_t len; /* length of data to copy */
|
||||
zip_int64_t remain; /* bytes remaining to be copied */
|
||||
int e[2]; /* error codes */
|
||||
};
|
||||
|
||||
static ssize_t read_file(void *state, void *data, size_t len,
|
||||
static zip_int64_t read_file(void *state, void *data, zip_uint64_t len,
|
||||
enum zip_source_cmd cmd);
|
||||
|
||||
|
||||
|
||||
ZIP_EXTERN struct zip_source *
|
||||
zip_source_filep(struct zip *za, FILE *file, off_t start, off_t len)
|
||||
zip_source_filep(struct zip *za, FILE *file, zip_uint64_t start,
|
||||
zip_int64_t len)
|
||||
{
|
||||
if (za == NULL)
|
||||
return NULL;
|
||||
@@ -66,14 +70,15 @@ zip_source_filep(struct zip *za, FILE *file, off_t start, off_t len)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return _zip_source_file_or_p(za, NULL, file, start, len);
|
||||
return _zip_source_file_or_p(za, NULL, file, start, len, 1, NULL);
|
||||
}
|
||||
|
||||
|
||||
|
||||
struct zip_source *
|
||||
_zip_source_file_or_p(struct zip *za, const char *fname, FILE *file,
|
||||
off_t start, off_t len)
|
||||
zip_uint64_t start, zip_int64_t len, int closep,
|
||||
const struct zip_stat *st)
|
||||
{
|
||||
struct read_file *f;
|
||||
struct zip_source *zs;
|
||||
@@ -99,7 +104,12 @@ _zip_source_file_or_p(struct zip *za, const char *fname, FILE *file,
|
||||
f->f = file;
|
||||
f->off = start;
|
||||
f->len = (len ? len : -1);
|
||||
|
||||
f->closep = f->fname ? 1 : closep;
|
||||
if (st)
|
||||
memcpy(&f->st, st, sizeof(f->st));
|
||||
else
|
||||
zip_stat_init(&f->st);
|
||||
|
||||
if ((zs=zip_source_function(za, read_file, f)) == NULL) {
|
||||
free(f);
|
||||
return NULL;
|
||||
@@ -110,8 +120,8 @@ _zip_source_file_or_p(struct zip *za, const char *fname, FILE *file,
|
||||
|
||||
|
||||
|
||||
static ssize_t
|
||||
read_file(void *state, void *data, size_t len, enum zip_source_cmd cmd)
|
||||
static zip_int64_t
|
||||
read_file(void *state, void *data, zip_uint64_t len, enum zip_source_cmd cmd)
|
||||
{
|
||||
struct read_file *z;
|
||||
char *buf;
|
||||
@@ -130,20 +140,33 @@ read_file(void *state, void *data, size_t len, enum zip_source_cmd cmd)
|
||||
}
|
||||
}
|
||||
|
||||
if (fseeko(z->f, z->off, SEEK_SET) < 0) {
|
||||
z->e[0] = ZIP_ER_SEEK;
|
||||
z->e[1] = errno;
|
||||
return -1;
|
||||
if (z->closep) {
|
||||
if (fseeko(z->f, (off_t)z->off, SEEK_SET) < 0) {
|
||||
z->e[0] = ZIP_ER_SEEK;
|
||||
z->e[1] = errno;
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
z->remain = z->len;
|
||||
return 0;
|
||||
|
||||
case ZIP_SOURCE_READ:
|
||||
/* XXX: return INVAL if len > size_t max */
|
||||
if (z->remain != -1)
|
||||
n = len > z->remain ? z->remain : len;
|
||||
else
|
||||
n = len;
|
||||
|
||||
|
||||
if (!z->closep) {
|
||||
/* we might share this file with others, so let's be safe */
|
||||
if (fseeko(z->f, (off_t)(z->off + z->len-z->remain),
|
||||
SEEK_SET) < 0) {
|
||||
z->e[0] = ZIP_ER_SEEK;
|
||||
z->e[1] = errno;
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
if ((i=fread(buf, 1, n, z->f)) < 0) {
|
||||
z->e[0] = ZIP_ER_READ;
|
||||
z->e[1] = errno;
|
||||
@@ -164,34 +187,42 @@ read_file(void *state, void *data, size_t len, enum zip_source_cmd cmd)
|
||||
|
||||
case ZIP_SOURCE_STAT:
|
||||
{
|
||||
struct zip_stat *st;
|
||||
struct stat fst;
|
||||
int err;
|
||||
if (len < sizeof(z->st))
|
||||
return -1;
|
||||
|
||||
if (z->st.valid != 0)
|
||||
memcpy(data, &z->st, sizeof(z->st));
|
||||
else {
|
||||
struct zip_stat *st;
|
||||
struct stat fst;
|
||||
int err;
|
||||
|
||||
if (len < sizeof(*st))
|
||||
return -1;
|
||||
if (z->f)
|
||||
err = fstat(fileno(z->f), &fst);
|
||||
else
|
||||
err = stat(z->fname, &fst);
|
||||
|
||||
if (z->f)
|
||||
err = fstat(fileno(z->f), &fst);
|
||||
else
|
||||
err = stat(z->fname, &fst);
|
||||
if (err != 0) {
|
||||
z->e[0] = ZIP_ER_READ; /* best match */
|
||||
z->e[1] = errno;
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (err != 0) {
|
||||
z->e[0] = ZIP_ER_READ; /* best match */
|
||||
z->e[1] = errno;
|
||||
return -1;
|
||||
st = (struct zip_stat *)data;
|
||||
|
||||
zip_stat_init(st);
|
||||
st->mtime = fst.st_mtime;
|
||||
st->valid |= ZIP_STAT_MTIME;
|
||||
if (z->len != -1) {
|
||||
st->size = z->len;
|
||||
st->valid |= ZIP_STAT_SIZE;
|
||||
}
|
||||
else if ((fst.st_mode&S_IFMT) == S_IFREG) {
|
||||
st->size = fst.st_size;
|
||||
st->valid |= ZIP_STAT_SIZE;
|
||||
}
|
||||
}
|
||||
|
||||
st = (struct zip_stat *)data;
|
||||
|
||||
zip_stat_init(st);
|
||||
st->mtime = fst.st_mtime;
|
||||
if (z->len != -1)
|
||||
st->size = z->len;
|
||||
else if ((fst.st_mode&S_IFMT) == S_IFREG)
|
||||
st->size = fst.st_size;
|
||||
|
||||
return sizeof(*st);
|
||||
return sizeof(z->st);
|
||||
}
|
||||
|
||||
case ZIP_SOURCE_ERROR:
|
||||
@@ -203,7 +234,7 @@ read_file(void *state, void *data, size_t len, enum zip_source_cmd cmd)
|
||||
|
||||
case ZIP_SOURCE_FREE:
|
||||
free(z->fname);
|
||||
if (z->f)
|
||||
if (z->closep && z->f)
|
||||
fclose(z->f);
|
||||
free(z);
|
||||
return 0;
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
zip_source_free.c -- free zip data source
|
||||
Copyright (C) 1999-2007 Dieter Baron and Thomas Klausner
|
||||
Copyright (C) 1999-2009 Dieter Baron and Thomas Klausner
|
||||
|
||||
This file is part of libzip, a library to manipulate ZIP archives.
|
||||
The authors can be contacted at <libzip@nih.at>
|
||||
@@ -40,12 +40,20 @@
|
||||
|
||||
|
||||
ZIP_EXTERN void
|
||||
zip_source_free(struct zip_source *source)
|
||||
zip_source_free(struct zip_source *src)
|
||||
{
|
||||
if (source == NULL)
|
||||
if (src == NULL)
|
||||
return;
|
||||
|
||||
(void)source->f(source->ud, NULL, 0, ZIP_SOURCE_FREE);
|
||||
if (src->is_open)
|
||||
zip_source_close(src);
|
||||
|
||||
free(source);
|
||||
if (src->src == NULL)
|
||||
(void)src->cb.f(src->ud, NULL, 0, ZIP_SOURCE_FREE);
|
||||
else {
|
||||
(void)src->cb.l(src->src, src->ud, NULL, 0, ZIP_SOURCE_FREE);
|
||||
zip_source_free(src->src);
|
||||
}
|
||||
|
||||
free(src);
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
zip_source_function.c -- create zip data source from callback function
|
||||
Copyright (C) 1999-2007 Dieter Baron and Thomas Klausner
|
||||
Copyright (C) 1999-2009 Dieter Baron and Thomas Klausner
|
||||
|
||||
This file is part of libzip, a library to manipulate ZIP archives.
|
||||
The authors can be contacted at <libzip@nih.at>
|
||||
@@ -47,13 +47,32 @@ zip_source_function(struct zip *za, zip_source_callback zcb, void *ud)
|
||||
if (za == NULL)
|
||||
return NULL;
|
||||
|
||||
if ((zs=(struct zip_source *)malloc(sizeof(*zs))) == NULL) {
|
||||
_zip_error_set(&za->error, ZIP_ER_MEMORY, 0);
|
||||
if ((zs=_zip_source_new(za)) == NULL)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
zs->f = zcb;
|
||||
zs->cb.f = zcb;
|
||||
zs->ud = ud;
|
||||
|
||||
return zs;
|
||||
}
|
||||
|
||||
|
||||
|
||||
struct zip_source *
|
||||
_zip_source_new(struct zip *za)
|
||||
{
|
||||
struct zip_source *src;
|
||||
|
||||
if ((src=(struct zip_source *)malloc(sizeof(*src))) == NULL) {
|
||||
_zip_error_set(&za->error, ZIP_ER_MEMORY, 0);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
src->src = NULL;
|
||||
src->cb.f = NULL;
|
||||
src->ud = NULL;
|
||||
src->error_source = ZIP_LES_NONE;
|
||||
src->is_open = 0;
|
||||
|
||||
return src;
|
||||
}
|
||||
|
||||
59
src/helper/libzip/zip_source_layered.c
Normal file
59
src/helper/libzip/zip_source_layered.c
Normal file
@@ -0,0 +1,59 @@
|
||||
/*
|
||||
zip_source_layered.c -- create layered source
|
||||
Copyright (C) 2009 Dieter Baron and Thomas Klausner
|
||||
|
||||
This file is part of libzip, a library to manipulate ZIP archives.
|
||||
The authors can be contacted at <libzip@nih.at>
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions
|
||||
are met:
|
||||
1. Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
2. Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in
|
||||
the documentation and/or other materials provided with the
|
||||
distribution.
|
||||
3. The names of the authors may not be used to endorse or promote
|
||||
products derived from this software without specific prior
|
||||
written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
|
||||
OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
|
||||
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
|
||||
GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
|
||||
IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
||||
OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
|
||||
IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
|
||||
|
||||
#include <stdlib.h>
|
||||
|
||||
#include "zipint.h"
|
||||
|
||||
|
||||
|
||||
ZIP_EXTERN struct zip_source *
|
||||
zip_source_layered(struct zip *za, struct zip_source *src,
|
||||
zip_source_layered_callback cb, void *ud)
|
||||
{
|
||||
struct zip_source *zs;
|
||||
|
||||
if (za == NULL)
|
||||
return NULL;
|
||||
|
||||
if ((zs=_zip_source_new(za)) == NULL)
|
||||
return NULL;
|
||||
|
||||
zs->src = src;
|
||||
zs->cb.l = cb;
|
||||
zs->ud = ud;
|
||||
|
||||
return zs;
|
||||
}
|
||||
76
src/helper/libzip/zip_source_open.c
Normal file
76
src/helper/libzip/zip_source_open.c
Normal file
@@ -0,0 +1,76 @@
|
||||
/*
|
||||
zip_source_open.c -- open zip_source (prepare for reading)
|
||||
Copyright (C) 2009 Dieter Baron and Thomas Klausner
|
||||
|
||||
This file is part of libzip, a library to manipulate ZIP archives.
|
||||
The authors can be contacted at <libzip@nih.at>
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions
|
||||
are met:
|
||||
1. Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
2. Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in
|
||||
the documentation and/or other materials provided with the
|
||||
distribution.
|
||||
3. The names of the authors may not be used to endorse or promote
|
||||
products derived from this software without specific prior
|
||||
written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
|
||||
OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
|
||||
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
|
||||
GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
|
||||
IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
||||
OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
|
||||
IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
|
||||
|
||||
#include "zipint.h"
|
||||
|
||||
|
||||
|
||||
ZIP_EXTERN int
|
||||
zip_source_open(struct zip_source *src)
|
||||
{
|
||||
zip_int64_t ret;
|
||||
|
||||
if (src->is_open) {
|
||||
src->error_source = ZIP_LES_INVAL;
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (src->src == NULL) {
|
||||
if (src->cb.f(src->ud, NULL, 0, ZIP_SOURCE_OPEN) < 0)
|
||||
return -1;
|
||||
}
|
||||
else {
|
||||
if (zip_source_open(src->src) < 0) {
|
||||
src->error_source = ZIP_LES_LOWER;
|
||||
return -1;
|
||||
}
|
||||
|
||||
ret = src->cb.l(src->src, src->ud, NULL, 0, ZIP_SOURCE_OPEN);
|
||||
|
||||
if (ret < 0) {
|
||||
(void)zip_source_close(src->src);
|
||||
|
||||
if (ret == ZIP_SOURCE_ERR_LOWER)
|
||||
src->error_source = ZIP_LES_LOWER;
|
||||
else
|
||||
src->error_source = ZIP_LES_UPPER;
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
src->is_open = 1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
241
src/helper/libzip/zip_source_pkware.c
Normal file
241
src/helper/libzip/zip_source_pkware.c
Normal file
@@ -0,0 +1,241 @@
|
||||
/*
|
||||
zip_source_pkware.c -- Traditional PKWARE de/encryption routines
|
||||
Copyright (C) 2009 Dieter Baron and Thomas Klausner
|
||||
|
||||
This file is part of libzip, a library to manipulate ZIP archives.
|
||||
The authors can be contacted at <libzip@nih.at>
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions
|
||||
are met:
|
||||
1. Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
2. Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in
|
||||
the documentation and/or other materials provided with the
|
||||
distribution.
|
||||
3. The names of the authors may not be used to endorse or promote
|
||||
products derived from this software without specific prior
|
||||
written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
|
||||
OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
|
||||
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
|
||||
GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
|
||||
IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
||||
OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
|
||||
IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "zipint.h"
|
||||
|
||||
struct trad_pkware {
|
||||
int e[2];
|
||||
|
||||
zip_uint32_t key[3];
|
||||
};
|
||||
|
||||
#define HEADERLEN 12
|
||||
#define KEY0 305419896
|
||||
#define KEY1 591751049
|
||||
#define KEY2 878082192
|
||||
|
||||
static const uLongf *crc = NULL;
|
||||
|
||||
#define CRC32(c, b) (crc[((c) ^ (b)) & 0xff] ^ ((c) >> 8))
|
||||
|
||||
|
||||
|
||||
static void decrypt(struct trad_pkware *, zip_uint8_t *,
|
||||
const zip_uint8_t *, zip_uint64_t, int);
|
||||
static int decrypt_header(struct zip_source *, struct trad_pkware *);
|
||||
static zip_int64_t pkware_decrypt(struct zip_source *, void *, void *,
|
||||
zip_uint64_t, enum zip_source_cmd);
|
||||
static void pkware_free(struct trad_pkware *);
|
||||
|
||||
|
||||
|
||||
ZIP_EXTERN struct zip_source *
|
||||
zip_source_pkware(struct zip *za, struct zip_source *src,
|
||||
zip_uint16_t em, int flags, const char *password)
|
||||
{
|
||||
struct trad_pkware *ctx;
|
||||
struct zip_source *s2;
|
||||
|
||||
if (password == NULL || src == NULL || em != ZIP_EM_TRAD_PKWARE) {
|
||||
_zip_error_set(&za->error, ZIP_ER_INVAL, 0);
|
||||
return NULL;
|
||||
}
|
||||
if (flags & ZIP_CODEC_ENCODE) {
|
||||
_zip_error_set(&za->error, ZIP_ER_ENCRNOTSUPP, 0);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (crc == NULL)
|
||||
crc = get_crc_table();
|
||||
|
||||
if ((ctx=(struct trad_pkware *)malloc(sizeof(*ctx))) == NULL) {
|
||||
_zip_error_set(&za->error, ZIP_ER_MEMORY, 0);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
ctx->e[0] = ctx->e[1] = 0;
|
||||
|
||||
ctx->key[0] = KEY0;
|
||||
ctx->key[1] = KEY1;
|
||||
ctx->key[2] = KEY2;
|
||||
decrypt(ctx, NULL, (const zip_uint8_t *)password, strlen(password), 1);
|
||||
|
||||
if ((s2=zip_source_layered(za, src, pkware_decrypt, ctx)) == NULL) {
|
||||
pkware_free(ctx);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return s2;
|
||||
}
|
||||
|
||||
|
||||
|
||||
static void
|
||||
decrypt(struct trad_pkware *ctx, zip_uint8_t *out, const zip_uint8_t *in,
|
||||
zip_uint64_t len, int update_only)
|
||||
{
|
||||
zip_uint16_t tmp;
|
||||
zip_uint64_t i;
|
||||
Bytef b;
|
||||
|
||||
for (i=0; i<len; i++) {
|
||||
b = in[i];
|
||||
|
||||
if (!update_only) {
|
||||
/* decrypt next byte */
|
||||
tmp = ctx->key[2] | 2;
|
||||
tmp = (tmp * (tmp ^ 1)) >> 8;
|
||||
b ^= tmp;
|
||||
}
|
||||
|
||||
/* store cleartext */
|
||||
if (out)
|
||||
out[i] = b;
|
||||
|
||||
/* update keys */
|
||||
ctx->key[0] = CRC32(ctx->key[0], b);
|
||||
ctx->key[1] = (ctx->key[1] + (ctx->key[0] & 0xff)) * 134775813 + 1;
|
||||
b = ctx->key[1] >> 24;
|
||||
ctx->key[2] = CRC32(ctx->key[2], b);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
static int
|
||||
decrypt_header(struct zip_source *src, struct trad_pkware *ctx)
|
||||
{
|
||||
zip_uint8_t header[HEADERLEN];
|
||||
struct zip_stat st;
|
||||
zip_int64_t n;
|
||||
unsigned short dostime, dosdate;
|
||||
|
||||
if ((n=zip_source_read(src, header, HEADERLEN)) < 0) {
|
||||
zip_source_error(src, ctx->e, ctx->e+1);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (n != HEADERLEN) {
|
||||
ctx->e[0] = ZIP_ER_EOF;
|
||||
ctx->e[1] = 0;
|
||||
return -1;
|
||||
}
|
||||
|
||||
decrypt(ctx, header, header, HEADERLEN, 0);
|
||||
|
||||
if (zip_source_stat(src, &st) < 0) {
|
||||
/* stat failed, skip password validation */
|
||||
return 0;
|
||||
}
|
||||
|
||||
_zip_u2d_time(st.mtime, &dostime, &dosdate);
|
||||
|
||||
if (header[HEADERLEN-1] != st.crc>>24
|
||||
&& header[HEADERLEN-1] != dostime>>8) {
|
||||
ctx->e[0] = ZIP_ER_WRONGPASSWD;
|
||||
ctx->e[1] = 0;
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
static zip_int64_t
|
||||
pkware_decrypt(struct zip_source *src, void *ud, void *data,
|
||||
zip_uint64_t len, enum zip_source_cmd cmd)
|
||||
{
|
||||
struct trad_pkware *ctx;
|
||||
zip_int64_t n;
|
||||
|
||||
ctx = (struct trad_pkware *)ud;
|
||||
|
||||
switch (cmd) {
|
||||
case ZIP_SOURCE_OPEN:
|
||||
if (decrypt_header(src, ctx) < 0)
|
||||
return -1;
|
||||
return 0;
|
||||
|
||||
case ZIP_SOURCE_READ:
|
||||
if ((n=zip_source_read(src, data, len)) < 0)
|
||||
return ZIP_SOURCE_ERR_LOWER;
|
||||
|
||||
decrypt(ud, (zip_uint8_t *)data, (zip_uint8_t *)data, (zip_uint64_t)n,
|
||||
0);
|
||||
return n;
|
||||
|
||||
case ZIP_SOURCE_CLOSE:
|
||||
return 0;
|
||||
|
||||
case ZIP_SOURCE_STAT:
|
||||
{
|
||||
struct zip_stat *st;
|
||||
|
||||
st = (struct zip_stat *)data;
|
||||
|
||||
st->encryption_method = ZIP_EM_NONE;
|
||||
st->valid |= ZIP_STAT_ENCRYPTION_METHOD;
|
||||
/* XXX: deduce HEADERLEN from size for uncompressed */
|
||||
if (st->valid & ZIP_STAT_COMP_SIZE)
|
||||
st->comp_size -= HEADERLEN;
|
||||
}
|
||||
return 0;
|
||||
|
||||
case ZIP_SOURCE_ERROR:
|
||||
memcpy(data, ctx->e, sizeof(int)*2);
|
||||
return sizeof(int)*2;
|
||||
|
||||
case ZIP_SOURCE_FREE:
|
||||
pkware_free(ctx);
|
||||
return 0;
|
||||
|
||||
default:
|
||||
ctx->e[0] = ZIP_ER_INVAL;
|
||||
ctx->e[1] = 0;
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
static void
|
||||
pkware_free(struct trad_pkware *ctx)
|
||||
{
|
||||
free(ctx);
|
||||
}
|
||||
63
src/helper/libzip/zip_source_pop.c
Normal file
63
src/helper/libzip/zip_source_pop.c
Normal file
@@ -0,0 +1,63 @@
|
||||
/*
|
||||
zip_source_pop.c -- pop top layer from zip data source
|
||||
Copyright (C) 2009 Dieter Baron and Thomas Klausner
|
||||
|
||||
This file is part of libzip, a library to manipulate ZIP archives.
|
||||
The authors can be contacted at <libzip@nih.at>
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions
|
||||
are met:
|
||||
1. Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
2. Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in
|
||||
the documentation and/or other materials provided with the
|
||||
distribution.
|
||||
3. The names of the authors may not be used to endorse or promote
|
||||
products derived from this software without specific prior
|
||||
written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
|
||||
OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
|
||||
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
|
||||
GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
|
||||
IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
||||
OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
|
||||
IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
|
||||
|
||||
#include <stdlib.h>
|
||||
|
||||
#include "zipint.h"
|
||||
|
||||
|
||||
|
||||
ZIP_EXTERN struct zip_source *
|
||||
zip_source_pop(struct zip_source *src)
|
||||
{
|
||||
struct zip_source *lower;
|
||||
|
||||
if (src == NULL)
|
||||
return NULL;
|
||||
|
||||
lower = src->src;
|
||||
|
||||
if (lower == NULL)
|
||||
zip_source_free(src);
|
||||
else {
|
||||
if (src->is_open)
|
||||
(void)src->cb.l(src, src->ud, NULL, 0, ZIP_SOURCE_CLOSE);
|
||||
(void)src->cb.l(src, src->ud, NULL, 0, ZIP_SOURCE_FREE);
|
||||
|
||||
free(src);
|
||||
}
|
||||
|
||||
return lower;
|
||||
}
|
||||
64
src/helper/libzip/zip_source_read.c
Normal file
64
src/helper/libzip/zip_source_read.c
Normal file
@@ -0,0 +1,64 @@
|
||||
/*
|
||||
zip_source_read.c -- read data from zip_source
|
||||
Copyright (C) 2009 Dieter Baron and Thomas Klausner
|
||||
|
||||
This file is part of libzip, a library to manipulate ZIP archives.
|
||||
The authors can be contacted at <libzip@nih.at>
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions
|
||||
are met:
|
||||
1. Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
2. Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in
|
||||
the documentation and/or other materials provided with the
|
||||
distribution.
|
||||
3. The names of the authors may not be used to endorse or promote
|
||||
products derived from this software without specific prior
|
||||
written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
|
||||
OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
|
||||
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
|
||||
GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
|
||||
IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
||||
OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
|
||||
IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
|
||||
|
||||
#include "zipint.h"
|
||||
|
||||
|
||||
|
||||
ZIP_EXTERN zip_int64_t
|
||||
zip_source_read(struct zip_source *src, void *data, zip_uint64_t len)
|
||||
{
|
||||
zip_int64_t ret;
|
||||
|
||||
if (!src->is_open || len > ZIP_INT64_MAX || (len > 0 && data == NULL)) {
|
||||
src->error_source = ZIP_LES_INVAL;
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (src->src == NULL)
|
||||
return src->cb.f(src->ud, data, len, ZIP_SOURCE_READ);
|
||||
|
||||
ret = src->cb.l(src->src, src->ud, data, len, ZIP_SOURCE_READ);
|
||||
|
||||
if (ret < 0) {
|
||||
if (ret == ZIP_SOURCE_ERR_LOWER)
|
||||
src->error_source = ZIP_LES_LOWER;
|
||||
else
|
||||
src->error_source = ZIP_LES_UPPER;
|
||||
return -1;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
72
src/helper/libzip/zip_source_stat.c
Normal file
72
src/helper/libzip/zip_source_stat.c
Normal file
@@ -0,0 +1,72 @@
|
||||
/*
|
||||
zip_source_stat.c -- get meta information from zip_source
|
||||
Copyright (C) 2009 Dieter Baron and Thomas Klausner
|
||||
|
||||
This file is part of libzip, a library to manipulate ZIP archives.
|
||||
The authors can be contacted at <libzip@nih.at>
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions
|
||||
are met:
|
||||
1. Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
2. Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in
|
||||
the documentation and/or other materials provided with the
|
||||
distribution.
|
||||
3. The names of the authors may not be used to endorse or promote
|
||||
products derived from this software without specific prior
|
||||
written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
|
||||
OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
|
||||
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
|
||||
GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
|
||||
IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
||||
OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
|
||||
IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
|
||||
|
||||
#include "zipint.h"
|
||||
|
||||
|
||||
|
||||
ZIP_EXTERN int
|
||||
zip_source_stat(struct zip_source *src, struct zip_stat *st)
|
||||
{
|
||||
zip_int64_t ret;
|
||||
|
||||
if (st == NULL) {
|
||||
src->error_source = ZIP_LES_INVAL;
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (src->src == NULL) {
|
||||
if (src->cb.f(src->ud, st, sizeof(*st), ZIP_SOURCE_STAT) < 0)
|
||||
return -1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (zip_source_stat(src->src, st) < 0) {
|
||||
src->error_source = ZIP_LES_LOWER;
|
||||
return -1;
|
||||
}
|
||||
|
||||
ret = src->cb.l(src->src, src->ud, st, sizeof(*st), ZIP_SOURCE_STAT);
|
||||
|
||||
if (ret < 0) {
|
||||
if (ret == ZIP_SOURCE_ERR_LOWER)
|
||||
src->error_source = ZIP_LES_LOWER;
|
||||
else
|
||||
src->error_source = ZIP_LES_UPPER;
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
zip_source_zip.c -- create data source from zip file
|
||||
Copyright (C) 1999-2008 Dieter Baron and Thomas Klausner
|
||||
Copyright (C) 1999-2009 Dieter Baron and Thomas Klausner
|
||||
|
||||
This file is part of libzip, a library to manipulate ZIP archives.
|
||||
The authors can be contacted at <libzip@nih.at>
|
||||
@@ -41,17 +41,18 @@
|
||||
struct read_zip {
|
||||
struct zip_file *zf;
|
||||
struct zip_stat st;
|
||||
off_t off, len;
|
||||
zip_uint64_t off;
|
||||
zip_int64_t len;
|
||||
};
|
||||
|
||||
static ssize_t read_zip(void *st, void *data, size_t len,
|
||||
static zip_int64_t read_zip(void *st, void *data, zip_uint64_t len,
|
||||
enum zip_source_cmd cmd);
|
||||
|
||||
|
||||
|
||||
ZIP_EXTERN struct zip_source *
|
||||
zip_source_zip(struct zip *za, struct zip *srcza, int srcidx, int flags,
|
||||
off_t start, off_t len)
|
||||
zip_source_zip(struct zip *za, struct zip *srcza, zip_uint64_t srcidx,
|
||||
int flags, zip_uint64_t start, zip_int64_t len)
|
||||
{
|
||||
struct zip_error error;
|
||||
struct zip_source *zs;
|
||||
@@ -62,7 +63,7 @@ zip_source_zip(struct zip *za, struct zip *srcza, int srcidx, int flags,
|
||||
if (za == NULL)
|
||||
return NULL;
|
||||
|
||||
if (srcza == NULL || start < 0 || len < -1 || srcidx < 0 || srcidx >= srcza->nentry) {
|
||||
if (srcza == NULL || len < -1 || srcidx < 0 || srcidx >= srcza->nentry) {
|
||||
_zip_error_set(&za->error, ZIP_ER_INVAL, 0);
|
||||
return NULL;
|
||||
}
|
||||
@@ -115,12 +116,13 @@ zip_source_zip(struct zip *za, struct zip *srcza, int srcidx, int flags,
|
||||
|
||||
|
||||
|
||||
static ssize_t
|
||||
read_zip(void *state, void *data, size_t len, enum zip_source_cmd cmd)
|
||||
static zip_int64_t
|
||||
read_zip(void *state, void *data, zip_uint64_t len, enum zip_source_cmd cmd)
|
||||
{
|
||||
struct read_zip *z;
|
||||
char b[8192], *buf;
|
||||
int i, n;
|
||||
int i;
|
||||
zip_uint64_t n;
|
||||
|
||||
z = (struct read_zip *)state;
|
||||
buf = (char *)data;
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
zip_stat_index.c -- get information about file by index
|
||||
Copyright (C) 1999-2007 Dieter Baron and Thomas Klausner
|
||||
Copyright (C) 1999-2009 Dieter Baron and Thomas Klausner
|
||||
|
||||
This file is part of libzip, a library to manipulate ZIP archives.
|
||||
The authors can be contacted at <libzip@nih.at>
|
||||
@@ -38,11 +38,12 @@
|
||||
|
||||
|
||||
ZIP_EXTERN int
|
||||
zip_stat_index(struct zip *za, int index, int flags, struct zip_stat *st)
|
||||
zip_stat_index(struct zip *za, zip_uint64_t index, int flags,
|
||||
struct zip_stat *st)
|
||||
{
|
||||
const char *name;
|
||||
|
||||
if (index < 0 || index >= za->nentry) {
|
||||
if (index >= za->nentry) {
|
||||
_zip_error_set(&za->error, ZIP_ER_INVAL, 0);
|
||||
return -1;
|
||||
}
|
||||
@@ -53,8 +54,7 @@ zip_stat_index(struct zip *za, int index, int flags, struct zip_stat *st)
|
||||
|
||||
if ((flags & ZIP_FL_UNCHANGED) == 0
|
||||
&& ZIP_ENTRY_DATA_CHANGED(za->entry+index)) {
|
||||
if (za->entry[index].source->f(za->entry[index].source->ud,
|
||||
st, sizeof(*st), ZIP_SOURCE_STAT) < 0) {
|
||||
if (zip_source_stat(za->entry[index].source, st) < 0) {
|
||||
_zip_error_set(&za->error, ZIP_ER_CHANGED, 0);
|
||||
return -1;
|
||||
}
|
||||
@@ -64,7 +64,9 @@ zip_stat_index(struct zip *za, int index, int flags, struct zip_stat *st)
|
||||
_zip_error_set(&za->error, ZIP_ER_INVAL, 0);
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
zip_stat_init(st);
|
||||
|
||||
st->crc = za->cdir->entry[index].crc;
|
||||
st->size = za->cdir->entry[index].uncomp_size;
|
||||
st->mtime = za->cdir->entry[index].last_mod;
|
||||
@@ -80,11 +82,13 @@ zip_stat_index(struct zip *za, int index, int flags, struct zip_stat *st)
|
||||
}
|
||||
else
|
||||
st->encryption_method = ZIP_EM_NONE;
|
||||
/* st->bitflags = za->cdir->entry[index].bitflags; */
|
||||
st->valid = ZIP_STAT_CRC|ZIP_STAT_SIZE|ZIP_STAT_MTIME
|
||||
|ZIP_STAT_COMP_SIZE|ZIP_STAT_COMP_METHOD|ZIP_STAT_ENCRYPTION_METHOD;
|
||||
}
|
||||
|
||||
st->index = index;
|
||||
st->name = name;
|
||||
st->valid |= ZIP_STAT_INDEX|ZIP_STAT_NAME;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
zip_stat_init.c -- initialize struct zip_stat.
|
||||
Copyright (C) 2006-2007 Dieter Baron and Thomas Klausner
|
||||
Copyright (C) 2006-2009 Dieter Baron and Thomas Klausner
|
||||
|
||||
This file is part of libzip, a library to manipulate ZIP archives.
|
||||
The authors can be contacted at <libzip@nih.at>
|
||||
@@ -40,12 +40,13 @@
|
||||
ZIP_EXTERN void
|
||||
zip_stat_init(struct zip_stat *st)
|
||||
{
|
||||
st->valid = 0;
|
||||
st->name = NULL;
|
||||
st->index = -1;
|
||||
st->index = ZIP_UINT64_MAX;
|
||||
st->crc = 0;
|
||||
st->mtime = (time_t)-1;
|
||||
st->size = -1;
|
||||
st->comp_size = -1;
|
||||
st->size = 0;
|
||||
st->comp_size = 0;
|
||||
st->comp_method = ZIP_CM_STORE;
|
||||
st->encryption_method = ZIP_EM_NONE;
|
||||
}
|
||||
|
||||
@@ -40,7 +40,7 @@
|
||||
|
||||
|
||||
ZIP_EXTERN int
|
||||
zip_unchange(struct zip *za, int idx)
|
||||
zip_unchange(struct zip *za, zip_uint64_t idx)
|
||||
{
|
||||
return _zip_unchange(za, idx, 0);
|
||||
}
|
||||
@@ -48,11 +48,11 @@ zip_unchange(struct zip *za, int idx)
|
||||
|
||||
|
||||
int
|
||||
_zip_unchange(struct zip *za, int idx, int allow_duplicates)
|
||||
_zip_unchange(struct zip *za, zip_uint64_t idx, int allow_duplicates)
|
||||
{
|
||||
int i;
|
||||
|
||||
if (idx < 0 || idx >= za->nentry) {
|
||||
if (idx >= za->nentry) {
|
||||
_zip_error_set(&za->error, ZIP_ER_INVAL, 0);
|
||||
return -1;
|
||||
}
|
||||
|
||||
@@ -1,6 +1,4 @@
|
||||
/*
|
||||
$NiH: zip_unchange_data.c,v 1.14 2004/11/30 23:02:47 wiz Exp $
|
||||
|
||||
zip_unchange_data.c -- undo helper function
|
||||
Copyright (C) 1999, 2004 Dieter Baron and Thomas Klausner
|
||||
|
||||
@@ -43,8 +41,7 @@ void
|
||||
_zip_unchange_data(struct zip_entry *ze)
|
||||
{
|
||||
if (ze->source) {
|
||||
(void)ze->source->f(ze->source->ud, NULL, 0, ZIP_SOURCE_FREE);
|
||||
free(ze->source);
|
||||
zip_source_free(ze->source);
|
||||
ze->source = NULL;
|
||||
}
|
||||
|
||||
|
||||
110
src/helper/libzip/zipconf.h
Normal file
110
src/helper/libzip/zipconf.h
Normal file
@@ -0,0 +1,110 @@
|
||||
#ifndef _HAD_ZIPCONF_H
|
||||
#define _HAD_ZIPCONF_H
|
||||
|
||||
/*
|
||||
zipconf.h -- platform specific include file
|
||||
|
||||
This file was generated automatically by CMake
|
||||
based on ../cmake-zipconf.h.
|
||||
*/
|
||||
|
||||
#define HAVE_INTTYPES_H_LIBZIP
|
||||
#define HAVE_SYS_TYPES_H_LIBZIP
|
||||
#define HAVE_INT8_T_LIBZIP
|
||||
#define HAVE_UINT8_T_LIBZIP
|
||||
#define HAVE_INT16_T_LIBZIP
|
||||
#define HAVE_UINT16_T_LIBZIP
|
||||
#define HAVE_INT32_T_LIBZIP
|
||||
#define HAVE_UINT32_T_LIBZIP
|
||||
#define HAVE_INT64_T_LIBZIP
|
||||
#define HAVE_UINT64_T_LIBZIP
|
||||
#define SHORT_LIBZIP 2
|
||||
#define INT_LIBZIP 4
|
||||
#define LONG_LIBZIP 4
|
||||
#define LONGLONG_LIBZIP 8
|
||||
|
||||
#if defined(HAVE_INTTYPES_H_LIBZIP)
|
||||
|
||||
#if (!defined (_MSCVER) && !defined (_MSC_VER))
|
||||
#include <inttypes.h>
|
||||
#else
|
||||
|
||||
#include "inttypes.h"
|
||||
|
||||
typedef int mode_t;
|
||||
|
||||
#define strcasecmp _strcmpi
|
||||
#define snprintf _snprintf
|
||||
|
||||
#endif
|
||||
|
||||
#elif defined(HAVE_SYS_TYPES_H_LIBZIP)
|
||||
#include <sys/types.h>
|
||||
#endif
|
||||
|
||||
#if defined(HAVE_INT8_T_LIBZIP)
|
||||
typedef int8_t zip_int8_t;
|
||||
#else
|
||||
typedef signed char zip_int8_t;
|
||||
#endif
|
||||
#if defined(HAVE_UINT8_T_LIBZIP)
|
||||
typedef uint8_t zip_uint8_t;
|
||||
#else
|
||||
typedef unsigned char zip_uint8_t;
|
||||
#endif
|
||||
#if defined(HAVE_INT16_T_LIBZIP)
|
||||
typedef int16_t zip_int16_t;
|
||||
#elif defined(SHORT_LIBZIP) && SHORT_LIBZIP == 2
|
||||
typedef signed short zip_int16_t;
|
||||
#endif
|
||||
#if defined(HAVE_UINT16_T_LIBZIP)
|
||||
typedef uint16_t zip_uint16_t;
|
||||
#elif defined(SHORT_LIBZIP) && SHORT_LIBZIP == 2
|
||||
typedef unsigned short zip_uint16_t;
|
||||
#endif
|
||||
#if defined(HAVE_INT32_T_LIBZIP)
|
||||
typedef int32_t zip_int32_t;
|
||||
#elif defined(INT_LIBZIP) && INT_LIBZIP == 4
|
||||
typedef signed int zip_int32_t;
|
||||
#elif defined(LONG_LIBZIP) && LONG_LIBZIP == 4
|
||||
typedef signed long zip_int32_t;
|
||||
#endif
|
||||
#if defined(HAVE_UINT32_T_LIBZIP)
|
||||
typedef uint32_t zip_uint32_t;
|
||||
#elif defined(INT_LIBZIP) && INT_LIBZIP == 4
|
||||
typedef unsigned int zip_uint32_t;
|
||||
#elif defined(LONG_LIBZIP) && LONG_LIBZIP == 4
|
||||
typedef unsigned long zip_uint32_t;
|
||||
#endif
|
||||
#if defined(HAVE_INT64_T_LIBZIP)
|
||||
typedef int64_t zip_int64_t;
|
||||
#elif defined(LONG_LIBZIP) && LONG_LIBZIP == 8
|
||||
typedef signed long zip_int64_t;
|
||||
#elif defined(LONGLONG_LIBZIP) && LONGLONG_LIBZIP == 8
|
||||
typedef signed long long zip_int64_t;
|
||||
#endif
|
||||
#if defined(HAVE_UINT64_T_LIBZIP)
|
||||
typedef uint64_t zip_uint64_t;
|
||||
#elif defined(LONG_LIBZIP) && LONGLONG_LIBZIP == 8
|
||||
typedef unsigned long zip_uint64_t;
|
||||
#elif defined(LONGLONG_LIBZIP) && LONGLONG_LIBZIP == 8
|
||||
typedef unsigned long long zip_uint64_t;
|
||||
#endif
|
||||
|
||||
#define ZIP_INT8_MIN -0x80
|
||||
#define ZIP_INT8_MAX 0x7f
|
||||
#define ZIP_UINT8_MAX 0xff
|
||||
|
||||
#define ZIP_INT16_MIN -0x8000
|
||||
#define ZIP_INT16_MAX 0x7fff
|
||||
#define ZIP_UINT16_MAX 0xffff
|
||||
|
||||
#define ZIP_INT32_MIN -0x80000000L
|
||||
#define ZIP_INT32_MAX 0x7fffffffL
|
||||
#define ZIP_UINT32_MAX 0xffffffffLU
|
||||
|
||||
#define ZIP_INT64_MIN -0x8000000000000000LL
|
||||
#define ZIP_INT64_MAX 0x7fffffffffffffffLL
|
||||
#define ZIP_UINT64_MAX 0xffffffffffffffffULL
|
||||
|
||||
#endif /* zipconf.h */
|
||||
@@ -3,7 +3,7 @@
|
||||
|
||||
/*
|
||||
zipint.h -- internal declarations.
|
||||
Copyright (C) 1999-2008 Dieter Baron and Thomas Klausner
|
||||
Copyright (C) 1999-2010 Dieter Baron and Thomas Klausner
|
||||
|
||||
This file is part of libzip, a library to manipulate ZIP archives.
|
||||
The authors can be contacted at <libzip@nih.at>
|
||||
@@ -20,7 +20,7 @@
|
||||
3. The names of the authors may not be used to endorse or promote
|
||||
products derived from this software without specific prior
|
||||
written permission.
|
||||
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
|
||||
OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
@@ -36,13 +36,17 @@
|
||||
|
||||
#include "../zlib/zlib.h"
|
||||
|
||||
#ifdef _MSC_VER
|
||||
#define ZIP_EXTERN __declspec(dllimport)
|
||||
#endif
|
||||
|
||||
#include "zip.h"
|
||||
#include "config.h"
|
||||
|
||||
#ifndef HAVE_FSEEKO
|
||||
#define fseeko(s, o, w) (fseek((s), (long int)(o), (w)))
|
||||
#endif
|
||||
|
||||
#ifndef HAVE_FTELLO
|
||||
#define ftello(s) ((long)ftell((s)))
|
||||
#endif
|
||||
|
||||
#ifndef HAVE_MKSTEMP
|
||||
int _zip_mkstemp(char *);
|
||||
#define mkstemp _zip_mkstemp
|
||||
@@ -57,11 +61,29 @@ int _zip_mkstemp(char *);
|
||||
#define _zip_rename rename
|
||||
#endif
|
||||
|
||||
#ifndef HAVE_FSEEKO
|
||||
#define fseeko(s, o, w) (fseek((s), (long int)(o), (w)))
|
||||
/* Windows' open() doesn't understand Unix permissions */
|
||||
#if !defined(HAVE_OPEN)
|
||||
#if defined(HAVE__OPEN)
|
||||
#define open(a, b, c) _open((a), (b))
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if !defined(HAVE_SNPRINTF)
|
||||
#if defined(HAVE__SNPRINTF)
|
||||
#define snprintf _snprintf
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if !defined(HAVE_STRCASECMP)
|
||||
#if defined(HAVE__STRCMPI)
|
||||
#define strcasecmp _strcmpi
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if !defined(HAVE_STRDUP)
|
||||
#if defined(HAVE__STRDUP)
|
||||
#define strdup _strdup
|
||||
#endif
|
||||
#ifndef HAVE_FTELLO
|
||||
#define ftello(s) ((long)ftell((s)))
|
||||
#endif
|
||||
|
||||
|
||||
@@ -88,11 +110,9 @@ int _zip_mkstemp(char *);
|
||||
enum zip_state { ZIP_ST_UNCHANGED, ZIP_ST_DELETED, ZIP_ST_REPLACED,
|
||||
ZIP_ST_ADDED, ZIP_ST_RENAMED };
|
||||
|
||||
/* constants for struct zip_file's member flags */
|
||||
/* error source for layered sources */
|
||||
|
||||
#define ZIP_ZF_EOF 1 /* EOF reached */
|
||||
#define ZIP_ZF_DECOMP 2 /* decompress data */
|
||||
#define ZIP_ZF_CRC 4 /* compute and compare CRC */
|
||||
enum zip_les { ZIP_LES_NONE, ZIP_LES_UPPER, ZIP_LES_LOWER, ZIP_LES_INVAL };
|
||||
|
||||
/* directory entry: general purpose bit flags */
|
||||
|
||||
@@ -118,12 +138,14 @@ struct zip {
|
||||
unsigned int flags; /* archive global flags */
|
||||
unsigned int ch_flags; /* changed archive global flags */
|
||||
|
||||
char *default_password; /* password used when no other supplied */
|
||||
|
||||
struct zip_cdir *cdir; /* central directory */
|
||||
char *ch_comment; /* changed archive comment */
|
||||
int ch_comment_len; /* length of changed zip archive
|
||||
* comment, -1 if unchanged */
|
||||
int nentry; /* number of entries */
|
||||
int nentry_alloc; /* number of entries allocated */
|
||||
zip_uint64_t nentry; /* number of entries */
|
||||
zip_uint64_t nentry_alloc; /* number of entries allocated */
|
||||
struct zip_entry *entry; /* entries */
|
||||
int nfile; /* number of opened files within archive */
|
||||
int nfile_alloc; /* number of files allocated */
|
||||
@@ -135,18 +157,8 @@ struct zip {
|
||||
struct zip_file {
|
||||
struct zip *za; /* zip archive containing this file */
|
||||
struct zip_error error; /* error information */
|
||||
int flags; /* -1: eof, >0: error */
|
||||
|
||||
int method; /* compression method */
|
||||
off_t fpos; /* position within zip file (fread/fwrite) */
|
||||
unsigned long bytes_left; /* number of bytes left to read */
|
||||
unsigned long cbytes_left; /* number of bytes of compressed data left */
|
||||
|
||||
unsigned long crc; /* CRC so far */
|
||||
unsigned long crc_orig; /* CRC recorded in archive */
|
||||
|
||||
char *buffer;
|
||||
z_stream *zstr;
|
||||
int eof;
|
||||
struct zip_source *src; /* data source */
|
||||
};
|
||||
|
||||
/* zip archive directory entry (central or local) */
|
||||
@@ -187,8 +199,14 @@ struct zip_cdir {
|
||||
|
||||
|
||||
struct zip_source {
|
||||
zip_source_callback f;
|
||||
struct zip_source *src;
|
||||
union {
|
||||
zip_source_callback f;
|
||||
zip_source_layered_callback l;
|
||||
} cb;
|
||||
void *ud;
|
||||
enum zip_les error_source;
|
||||
int is_open;
|
||||
};
|
||||
|
||||
/* entry in zip archive directory */
|
||||
@@ -213,6 +231,8 @@ extern const int _zip_err_type[];
|
||||
((x)->state == ZIP_ST_REPLACED \
|
||||
|| (x)->state == ZIP_ST_ADDED)
|
||||
|
||||
#define ZIP_IS_RDONLY(za) ((za)->ch_flags & ZIP_AFL_RDONLY)
|
||||
|
||||
|
||||
|
||||
int _zip_cdir_compute_crc(struct zip *, uLong *);
|
||||
@@ -224,7 +244,7 @@ int _zip_cdir_write(struct zip_cdir *, FILE *, struct zip_error *);
|
||||
void _zip_dirent_finalize(struct zip_dirent *);
|
||||
void _zip_dirent_init(struct zip_dirent *);
|
||||
int _zip_dirent_read(struct zip_dirent *, FILE *, unsigned char **,
|
||||
unsigned int *, int, struct zip_error *);
|
||||
zip_uint32_t *, int, struct zip_error *);
|
||||
void _zip_dirent_torrent_normalize(struct zip_dirent *);
|
||||
int _zip_dirent_write(struct zip_dirent *, FILE *, int, struct zip_error *);
|
||||
|
||||
@@ -238,6 +258,7 @@ void _zip_error_fini(struct zip_error *);
|
||||
void _zip_error_get(struct zip_error *, int *, int *);
|
||||
void _zip_error_init(struct zip_error *);
|
||||
void _zip_error_set(struct zip_error *, int, int);
|
||||
void _zip_error_set_from_source(struct zip_error *, struct zip_source *);
|
||||
const char *_zip_error_strerror(struct zip_error *);
|
||||
|
||||
int _zip_file_fillbuf(void *, size_t, struct zip_file *);
|
||||
@@ -245,20 +266,27 @@ unsigned int _zip_file_get_offset(struct zip *, int);
|
||||
|
||||
int _zip_filerange_crc(FILE *, off_t, off_t, uLong *, struct zip_error *);
|
||||
|
||||
struct zip_source *_zip_source_file_or_p(struct zip *, const char *, FILE *,
|
||||
off_t, off_t);
|
||||
struct zip *_zip_open(const char *, FILE *, int, int, int *);
|
||||
|
||||
struct zip_source *_zip_source_file_or_p(struct zip *, const char *, FILE *,
|
||||
zip_uint64_t, zip_int64_t, int,
|
||||
const struct zip_stat *);
|
||||
struct zip_source *_zip_source_new(struct zip *);
|
||||
|
||||
int _zip_changed(struct zip *, int *);
|
||||
void _zip_free(struct zip *);
|
||||
const char *_zip_get_name(struct zip *, int, int, struct zip_error *);
|
||||
const char *_zip_get_name(struct zip *, zip_uint64_t, int, struct zip_error *);
|
||||
int _zip_local_header_read(struct zip *, int);
|
||||
void *_zip_memdup(const void *, size_t, struct zip_error *);
|
||||
int _zip_name_locate(struct zip *, const char *, int, struct zip_error *);
|
||||
struct zip *_zip_new(struct zip_error *);
|
||||
unsigned short _zip_read2(unsigned char **);
|
||||
unsigned int _zip_read4(unsigned char **);
|
||||
int _zip_replace(struct zip *, int, const char *, struct zip_source *);
|
||||
int _zip_set_name(struct zip *, int, const char *);
|
||||
int _zip_unchange(struct zip *, int, int);
|
||||
zip_int64_t _zip_replace(struct zip *, zip_uint64_t, const char *,
|
||||
struct zip_source *);
|
||||
int _zip_set_name(struct zip *, zip_uint64_t, const char *);
|
||||
void _zip_u2d_time(time_t, unsigned short *, unsigned short *);
|
||||
int _zip_unchange(struct zip *, zip_uint64_t, int);
|
||||
void _zip_unchange_data(struct zip_entry *);
|
||||
|
||||
#endif /* zipint.h */
|
||||
|
||||
@@ -1,25 +0,0 @@
|
||||
/* gzclose.c -- zlib gzclose() function
|
||||
* Copyright (C) 2004, 2010 Mark Adler
|
||||
* For conditions of distribution and use, see copyright notice in zlib.h
|
||||
*/
|
||||
|
||||
#include "gzguts.h"
|
||||
|
||||
/* gzclose() is in a separate file so that it is linked in only if it is used.
|
||||
That way the other gzclose functions can be used instead to avoid linking in
|
||||
unneeded compression or decompression routines. */
|
||||
int ZEXPORT gzclose(file)
|
||||
gzFile file;
|
||||
{
|
||||
#ifndef NO_GZCOMPRESS
|
||||
gz_statep state;
|
||||
|
||||
if (file == NULL)
|
||||
return Z_STREAM_ERROR;
|
||||
state = (gz_statep)file;
|
||||
|
||||
return state->mode == GZ_READ ? gzclose_r(file) : gzclose_w(file);
|
||||
#else
|
||||
return gzclose_r(file);
|
||||
#endif
|
||||
}
|
||||
@@ -1,132 +0,0 @@
|
||||
/* gzguts.h -- zlib internal header definitions for gz* operations
|
||||
* Copyright (C) 2004, 2005, 2010 Mark Adler
|
||||
* For conditions of distribution and use, see copyright notice in zlib.h
|
||||
*/
|
||||
|
||||
#ifdef _LARGEFILE64_SOURCE
|
||||
# ifndef _LARGEFILE_SOURCE
|
||||
# define _LARGEFILE_SOURCE 1
|
||||
# endif
|
||||
# ifdef _FILE_OFFSET_BITS
|
||||
# undef _FILE_OFFSET_BITS
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#if ((__GNUC__-0) * 10 + __GNUC_MINOR__-0 >= 33) && !defined(NO_VIZ)
|
||||
# define ZLIB_INTERNAL __attribute__((visibility ("hidden")))
|
||||
#else
|
||||
# define ZLIB_INTERNAL
|
||||
#endif
|
||||
|
||||
#include <stdio.h>
|
||||
#include "zlib.h"
|
||||
#ifdef STDC
|
||||
# include <string.h>
|
||||
# include <stdlib.h>
|
||||
# include <limits.h>
|
||||
#endif
|
||||
#include <fcntl.h>
|
||||
|
||||
#ifdef NO_DEFLATE /* for compatibility with old definition */
|
||||
# define NO_GZCOMPRESS
|
||||
#endif
|
||||
|
||||
#ifdef _MSC_VER
|
||||
# include <io.h>
|
||||
# define vsnprintf _vsnprintf
|
||||
#endif
|
||||
|
||||
#ifndef local
|
||||
# define local static
|
||||
#endif
|
||||
/* compile with -Dlocal if your debugger can't find static symbols */
|
||||
|
||||
/* gz* functions always use library allocation functions */
|
||||
#ifndef STDC
|
||||
extern voidp malloc OF((uInt size));
|
||||
extern void free OF((voidpf ptr));
|
||||
#endif
|
||||
|
||||
/* get errno and strerror definition */
|
||||
#if defined UNDER_CE
|
||||
# include <windows.h>
|
||||
# define zstrerror() gz_strwinerror((DWORD)GetLastError())
|
||||
#else
|
||||
# ifdef STDC
|
||||
# include <errno.h>
|
||||
# define zstrerror() strerror(errno)
|
||||
# else
|
||||
# define zstrerror() "stdio error (consult errno)"
|
||||
# endif
|
||||
#endif
|
||||
|
||||
/* provide prototypes for these when building zlib without LFS */
|
||||
#if !defined(_LARGEFILE64_SOURCE) || _LFS64_LARGEFILE-0 == 0
|
||||
ZEXTERN gzFile ZEXPORT gzopen64 OF((const char *, const char *));
|
||||
ZEXTERN z_off64_t ZEXPORT gzseek64 OF((gzFile, z_off64_t, int));
|
||||
ZEXTERN z_off64_t ZEXPORT gztell64 OF((gzFile));
|
||||
ZEXTERN z_off64_t ZEXPORT gzoffset64 OF((gzFile));
|
||||
#endif
|
||||
|
||||
/* default i/o buffer size -- double this for output when reading */
|
||||
#define GZBUFSIZE 8192
|
||||
|
||||
/* gzip modes, also provide a little integrity check on the passed structure */
|
||||
#define GZ_NONE 0
|
||||
#define GZ_READ 7247
|
||||
#define GZ_WRITE 31153
|
||||
#define GZ_APPEND 1 /* mode set to GZ_WRITE after the file is opened */
|
||||
|
||||
/* values for gz_state how */
|
||||
#define LOOK 0 /* look for a gzip header */
|
||||
#define COPY 1 /* copy input directly */
|
||||
#define GZIP 2 /* decompress a gzip stream */
|
||||
|
||||
/* internal gzip file state data structure */
|
||||
typedef struct {
|
||||
/* used for both reading and writing */
|
||||
int mode; /* see gzip modes above */
|
||||
int fd; /* file descriptor */
|
||||
char *path; /* path or fd for error messages */
|
||||
z_off64_t pos; /* current position in uncompressed data */
|
||||
unsigned size; /* buffer size, zero if not allocated yet */
|
||||
unsigned want; /* requested buffer size, default is GZBUFSIZE */
|
||||
unsigned char *in; /* input buffer */
|
||||
unsigned char *out; /* output buffer (double-sized when reading) */
|
||||
unsigned char *next; /* next output data to deliver or write */
|
||||
/* just for reading */
|
||||
unsigned have; /* amount of output data unused at next */
|
||||
int eof; /* true if end of input file reached */
|
||||
z_off64_t start; /* where the gzip data started, for rewinding */
|
||||
z_off64_t raw; /* where the raw data started, for seeking */
|
||||
int how; /* 0: get header, 1: copy, 2: decompress */
|
||||
int direct; /* true if last read direct, false if gzip */
|
||||
/* just for writing */
|
||||
int level; /* compression level */
|
||||
int strategy; /* compression strategy */
|
||||
/* seek request */
|
||||
z_off64_t skip; /* amount to skip (already rewound if backwards) */
|
||||
int seek; /* true if seek request pending */
|
||||
/* error information */
|
||||
int err; /* error code */
|
||||
char *msg; /* error message */
|
||||
/* zlib inflate or deflate stream */
|
||||
z_stream strm; /* stream structure in-place (not a pointer) */
|
||||
} gz_state;
|
||||
typedef gz_state FAR *gz_statep;
|
||||
|
||||
/* shared functions */
|
||||
void ZLIB_INTERNAL gz_error OF((gz_statep, int, const char *));
|
||||
#if defined UNDER_CE
|
||||
char ZLIB_INTERNAL *gz_strwinerror OF((DWORD error));
|
||||
#endif
|
||||
|
||||
/* GT_OFF(x), where x is an unsigned value, is true if x > maximum z_off64_t
|
||||
value -- needed when comparing unsigned to z_off64_t, which is signed
|
||||
(possible z_off64_t types off_t, off64_t, and long are all signed) */
|
||||
#ifdef INT_MAX
|
||||
# define GT_OFF(x) (sizeof(int) == sizeof(z_off64_t) && (x) > INT_MAX)
|
||||
#else
|
||||
unsigned ZLIB_INTERNAL gz_intmax OF((void));
|
||||
# define GT_OFF(x) (sizeof(int) == sizeof(z_off64_t) && (x) > gz_intmax())
|
||||
#endif
|
||||
@@ -1,538 +0,0 @@
|
||||
/* gzlib.c -- zlib functions common to reading and writing gzip files
|
||||
* Copyright (C) 2004, 2010 Mark Adler
|
||||
* For conditions of distribution and use, see copyright notice in zlib.h
|
||||
*/
|
||||
|
||||
#include "gzguts.h"
|
||||
#include <unistd.h>
|
||||
|
||||
#if defined(_LARGEFILE64_SOURCE) && _LFS64_LARGEFILE-0
|
||||
# define LSEEK lseek64
|
||||
#else
|
||||
# define LSEEK lseek
|
||||
#endif
|
||||
|
||||
/* Local functions */
|
||||
local void gz_reset OF((gz_statep));
|
||||
local gzFile gz_open OF((const char *, int, const char *));
|
||||
|
||||
#if defined UNDER_CE
|
||||
|
||||
/* Map the Windows error number in ERROR to a locale-dependent error message
|
||||
string and return a pointer to it. Typically, the values for ERROR come
|
||||
from GetLastError.
|
||||
|
||||
The string pointed to shall not be modified by the application, but may be
|
||||
overwritten by a subsequent call to gz_strwinerror
|
||||
|
||||
The gz_strwinerror function does not change the current setting of
|
||||
GetLastError. */
|
||||
char ZLIB_INTERNAL *gz_strwinerror (error)
|
||||
DWORD error;
|
||||
{
|
||||
static char buf[1024];
|
||||
|
||||
wchar_t *msgbuf;
|
||||
DWORD lasterr = GetLastError();
|
||||
DWORD chars = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM
|
||||
| FORMAT_MESSAGE_ALLOCATE_BUFFER,
|
||||
NULL,
|
||||
error,
|
||||
0, /* Default language */
|
||||
(LPVOID)&msgbuf,
|
||||
0,
|
||||
NULL);
|
||||
if (chars != 0) {
|
||||
/* If there is an \r\n appended, zap it. */
|
||||
if (chars >= 2
|
||||
&& msgbuf[chars - 2] == '\r' && msgbuf[chars - 1] == '\n') {
|
||||
chars -= 2;
|
||||
msgbuf[chars] = 0;
|
||||
}
|
||||
|
||||
if (chars > sizeof (buf) - 1) {
|
||||
chars = sizeof (buf) - 1;
|
||||
msgbuf[chars] = 0;
|
||||
}
|
||||
|
||||
wcstombs(buf, msgbuf, chars + 1);
|
||||
LocalFree(msgbuf);
|
||||
}
|
||||
else {
|
||||
sprintf(buf, "unknown win32 error (%ld)", error);
|
||||
}
|
||||
|
||||
SetLastError(lasterr);
|
||||
return buf;
|
||||
}
|
||||
|
||||
#endif /* UNDER_CE */
|
||||
|
||||
/* Reset gzip file state */
|
||||
local void gz_reset(state)
|
||||
gz_statep state;
|
||||
{
|
||||
if (state->mode == GZ_READ) { /* for reading ... */
|
||||
state->have = 0; /* no output data available */
|
||||
state->eof = 0; /* not at end of file */
|
||||
state->how = LOOK; /* look for gzip header */
|
||||
state->direct = 1; /* default for empty file */
|
||||
}
|
||||
state->seek = 0; /* no seek request pending */
|
||||
gz_error(state, Z_OK, NULL); /* clear error */
|
||||
state->pos = 0; /* no uncompressed data yet */
|
||||
state->strm.avail_in = 0; /* no input data yet */
|
||||
}
|
||||
|
||||
/* Open a gzip file either by name or file descriptor. */
|
||||
local gzFile gz_open(path, fd, mode)
|
||||
const char *path;
|
||||
int fd;
|
||||
const char *mode;
|
||||
{
|
||||
gz_statep state;
|
||||
|
||||
/* allocate gzFile structure to return */
|
||||
state = malloc(sizeof(gz_state));
|
||||
if (state == NULL)
|
||||
return NULL;
|
||||
state->size = 0; /* no buffers allocated yet */
|
||||
state->want = GZBUFSIZE; /* requested buffer size */
|
||||
state->msg = NULL; /* no error message yet */
|
||||
|
||||
/* interpret mode */
|
||||
state->mode = GZ_NONE;
|
||||
state->level = Z_DEFAULT_COMPRESSION;
|
||||
state->strategy = Z_DEFAULT_STRATEGY;
|
||||
while (*mode) {
|
||||
if (*mode >= '0' && *mode <= '9')
|
||||
state->level = *mode - '0';
|
||||
else
|
||||
switch (*mode) {
|
||||
case 'r':
|
||||
state->mode = GZ_READ;
|
||||
break;
|
||||
#ifndef NO_GZCOMPRESS
|
||||
case 'w':
|
||||
state->mode = GZ_WRITE;
|
||||
break;
|
||||
case 'a':
|
||||
state->mode = GZ_APPEND;
|
||||
break;
|
||||
#endif
|
||||
case '+': /* can't read and write at the same time */
|
||||
free(state);
|
||||
return NULL;
|
||||
case 'b': /* ignore -- will request binary anyway */
|
||||
break;
|
||||
case 'f':
|
||||
state->strategy = Z_FILTERED;
|
||||
break;
|
||||
case 'h':
|
||||
state->strategy = Z_HUFFMAN_ONLY;
|
||||
break;
|
||||
case 'R':
|
||||
state->strategy = Z_RLE;
|
||||
break;
|
||||
case 'F':
|
||||
state->strategy = Z_FIXED;
|
||||
default: /* could consider as an error, but just ignore */
|
||||
;
|
||||
}
|
||||
mode++;
|
||||
}
|
||||
|
||||
/* must provide an "r", "w", or "a" */
|
||||
if (state->mode == GZ_NONE) {
|
||||
free(state);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* save the path name for error messages */
|
||||
state->path = malloc(strlen(path) + 1);
|
||||
if (state->path == NULL) {
|
||||
free(state);
|
||||
return NULL;
|
||||
}
|
||||
strcpy(state->path, path);
|
||||
|
||||
/* open the file with the appropriate mode (or just use fd) */
|
||||
state->fd = fd != -1 ? fd :
|
||||
open(path,
|
||||
#ifdef O_LARGEFILE
|
||||
O_LARGEFILE |
|
||||
#endif
|
||||
#ifdef O_BINARY
|
||||
O_BINARY |
|
||||
#endif
|
||||
(state->mode == GZ_READ ?
|
||||
O_RDONLY :
|
||||
(O_WRONLY | O_CREAT | (
|
||||
state->mode == GZ_WRITE ?
|
||||
O_TRUNC :
|
||||
O_APPEND))),
|
||||
0666);
|
||||
if (state->fd == -1) {
|
||||
free(state->path);
|
||||
free(state);
|
||||
return NULL;
|
||||
}
|
||||
if (state->mode == GZ_APPEND)
|
||||
state->mode = GZ_WRITE; /* simplify later checks */
|
||||
|
||||
/* save the current position for rewinding (only if reading) */
|
||||
if (state->mode == GZ_READ) {
|
||||
state->start = LSEEK(state->fd, 0, SEEK_CUR);
|
||||
if (state->start == -1) state->start = 0;
|
||||
}
|
||||
|
||||
/* initialize stream */
|
||||
gz_reset(state);
|
||||
|
||||
/* return stream */
|
||||
return (gzFile)state;
|
||||
}
|
||||
|
||||
/* -- see zlib.h -- */
|
||||
gzFile ZEXPORT gzopen(path, mode)
|
||||
const char *path;
|
||||
const char *mode;
|
||||
{
|
||||
return gz_open(path, -1, mode);
|
||||
}
|
||||
|
||||
/* -- see zlib.h -- */
|
||||
gzFile ZEXPORT gzopen64(path, mode)
|
||||
const char *path;
|
||||
const char *mode;
|
||||
{
|
||||
return gz_open(path, -1, mode);
|
||||
}
|
||||
|
||||
/* -- see zlib.h -- */
|
||||
gzFile ZEXPORT gzdopen(fd, mode)
|
||||
int fd;
|
||||
const char *mode;
|
||||
{
|
||||
char *path; /* identifier for error messages */
|
||||
gzFile gz;
|
||||
|
||||
if (fd == -1 || (path = malloc(7 + 3 * sizeof(int))) == NULL)
|
||||
return NULL;
|
||||
sprintf(path, "<fd:%d>", fd); /* for debugging */
|
||||
gz = gz_open(path, fd, mode);
|
||||
free(path);
|
||||
return gz;
|
||||
}
|
||||
|
||||
/* -- see zlib.h -- */
|
||||
int ZEXPORT gzbuffer(file, size)
|
||||
gzFile file;
|
||||
unsigned size;
|
||||
{
|
||||
gz_statep state;
|
||||
|
||||
/* get internal structure and check integrity */
|
||||
if (file == NULL)
|
||||
return -1;
|
||||
state = (gz_statep)file;
|
||||
if (state->mode != GZ_READ && state->mode != GZ_WRITE)
|
||||
return -1;
|
||||
|
||||
/* make sure we haven't already allocated memory */
|
||||
if (state->size != 0)
|
||||
return -1;
|
||||
|
||||
/* check and set requested size */
|
||||
if (size == 0)
|
||||
return -1;
|
||||
state->want = size;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* -- see zlib.h -- */
|
||||
int ZEXPORT gzrewind(file)
|
||||
gzFile file;
|
||||
{
|
||||
gz_statep state;
|
||||
|
||||
/* get internal structure */
|
||||
if (file == NULL)
|
||||
return -1;
|
||||
state = (gz_statep)file;
|
||||
|
||||
/* check that we're reading and that there's no error */
|
||||
if (state->mode != GZ_READ || state->err != Z_OK)
|
||||
return -1;
|
||||
|
||||
/* back up and start over */
|
||||
if (LSEEK(state->fd, state->start, SEEK_SET) == -1)
|
||||
return -1;
|
||||
gz_reset(state);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* -- see zlib.h -- */
|
||||
z_off64_t ZEXPORT gzseek64(file, offset, whence)
|
||||
gzFile file;
|
||||
z_off64_t offset;
|
||||
int whence;
|
||||
{
|
||||
unsigned n;
|
||||
z_off64_t ret;
|
||||
gz_statep state;
|
||||
|
||||
/* get internal structure and check integrity */
|
||||
if (file == NULL)
|
||||
return -1;
|
||||
state = (gz_statep)file;
|
||||
if (state->mode != GZ_READ && state->mode != GZ_WRITE)
|
||||
return -1;
|
||||
|
||||
/* check that there's no error */
|
||||
if (state->err != Z_OK)
|
||||
return -1;
|
||||
|
||||
/* can only seek from start or relative to current position */
|
||||
if (whence != SEEK_SET && whence != SEEK_CUR)
|
||||
return -1;
|
||||
|
||||
/* normalize offset to a SEEK_CUR specification */
|
||||
if (whence == SEEK_SET)
|
||||
offset -= state->pos;
|
||||
else if (state->seek)
|
||||
offset += state->skip;
|
||||
state->seek = 0;
|
||||
|
||||
/* if within raw area while reading, just go there */
|
||||
if (state->mode == GZ_READ && state->how == COPY &&
|
||||
state->pos + offset >= state->raw) {
|
||||
ret = LSEEK(state->fd, offset - state->have, SEEK_CUR);
|
||||
if (ret == -1)
|
||||
return -1;
|
||||
state->have = 0;
|
||||
state->eof = 0;
|
||||
state->seek = 0;
|
||||
gz_error(state, Z_OK, NULL);
|
||||
state->strm.avail_in = 0;
|
||||
state->pos += offset;
|
||||
return state->pos;
|
||||
}
|
||||
|
||||
/* calculate skip amount, rewinding if needed for back seek when reading */
|
||||
if (offset < 0) {
|
||||
if (state->mode != GZ_READ) /* writing -- can't go backwards */
|
||||
return -1;
|
||||
offset += state->pos;
|
||||
if (offset < 0) /* before start of file! */
|
||||
return -1;
|
||||
if (gzrewind(file) == -1) /* rewind, then skip to offset */
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* if reading, skip what's in output buffer (one less gzgetc() check) */
|
||||
if (state->mode == GZ_READ) {
|
||||
n = GT_OFF(state->have) || (z_off64_t)state->have > offset ?
|
||||
(unsigned)offset : state->have;
|
||||
state->have -= n;
|
||||
state->next += n;
|
||||
state->pos += n;
|
||||
offset -= n;
|
||||
}
|
||||
|
||||
/* request skip (if not zero) */
|
||||
if (offset) {
|
||||
state->seek = 1;
|
||||
state->skip = offset;
|
||||
}
|
||||
return state->pos + offset;
|
||||
}
|
||||
|
||||
/* -- see zlib.h -- */
|
||||
z_off_t ZEXPORT gzseek(file, offset, whence)
|
||||
gzFile file;
|
||||
z_off_t offset;
|
||||
int whence;
|
||||
{
|
||||
z_off64_t ret;
|
||||
|
||||
ret = gzseek64(file, (z_off64_t)offset, whence);
|
||||
return ret == (z_off_t)ret ? (z_off_t)ret : -1;
|
||||
}
|
||||
|
||||
/* -- see zlib.h -- */
|
||||
z_off64_t ZEXPORT gztell64(file)
|
||||
gzFile file;
|
||||
{
|
||||
gz_statep state;
|
||||
|
||||
/* get internal structure and check integrity */
|
||||
if (file == NULL)
|
||||
return -1;
|
||||
state = (gz_statep)file;
|
||||
if (state->mode != GZ_READ && state->mode != GZ_WRITE)
|
||||
return -1;
|
||||
|
||||
/* return position */
|
||||
return state->pos + (state->seek ? state->skip : 0);
|
||||
}
|
||||
|
||||
/* -- see zlib.h -- */
|
||||
z_off_t ZEXPORT gztell(file)
|
||||
gzFile file;
|
||||
{
|
||||
z_off64_t ret;
|
||||
|
||||
ret = gztell64(file);
|
||||
return ret == (z_off_t)ret ? (z_off_t)ret : -1;
|
||||
}
|
||||
|
||||
/* -- see zlib.h -- */
|
||||
z_off64_t ZEXPORT gzoffset64(file)
|
||||
gzFile file;
|
||||
{
|
||||
z_off64_t offset;
|
||||
gz_statep state;
|
||||
|
||||
/* get internal structure and check integrity */
|
||||
if (file == NULL)
|
||||
return -1;
|
||||
state = (gz_statep)file;
|
||||
if (state->mode != GZ_READ && state->mode != GZ_WRITE)
|
||||
return -1;
|
||||
|
||||
/* compute and return effective offset in file */
|
||||
offset = LSEEK(state->fd, 0, SEEK_CUR);
|
||||
if (offset == -1)
|
||||
return -1;
|
||||
if (state->mode == GZ_READ) /* reading */
|
||||
offset -= state->strm.avail_in; /* don't count buffered input */
|
||||
return offset;
|
||||
}
|
||||
|
||||
/* -- see zlib.h -- */
|
||||
z_off_t ZEXPORT gzoffset(file)
|
||||
gzFile file;
|
||||
{
|
||||
z_off64_t ret;
|
||||
|
||||
ret = gzoffset64(file);
|
||||
return ret == (z_off_t)ret ? (z_off_t)ret : -1;
|
||||
}
|
||||
|
||||
/* -- see zlib.h -- */
|
||||
int ZEXPORT gzeof(file)
|
||||
gzFile file;
|
||||
{
|
||||
gz_statep state;
|
||||
|
||||
/* get internal structure and check integrity */
|
||||
if (file == NULL)
|
||||
return 0;
|
||||
state = (gz_statep)file;
|
||||
if (state->mode != GZ_READ && state->mode != GZ_WRITE)
|
||||
return 0;
|
||||
|
||||
/* return end-of-file state */
|
||||
return state->mode == GZ_READ ?
|
||||
(state->eof && state->strm.avail_in == 0 && state->have == 0) : 0;
|
||||
}
|
||||
|
||||
/* -- see zlib.h -- */
|
||||
const char * ZEXPORT gzerror(file, errnum)
|
||||
gzFile file;
|
||||
int *errnum;
|
||||
{
|
||||
gz_statep state;
|
||||
|
||||
/* get internal structure and check integrity */
|
||||
if (file == NULL)
|
||||
return NULL;
|
||||
state = (gz_statep)file;
|
||||
if (state->mode != GZ_READ && state->mode != GZ_WRITE)
|
||||
return NULL;
|
||||
|
||||
/* return error information */
|
||||
if (errnum != NULL)
|
||||
*errnum = state->err;
|
||||
return state->msg == NULL ? "" : state->msg;
|
||||
}
|
||||
|
||||
/* -- see zlib.h -- */
|
||||
void ZEXPORT gzclearerr(file)
|
||||
gzFile file;
|
||||
{
|
||||
gz_statep state;
|
||||
|
||||
/* get internal structure and check integrity */
|
||||
if (file == NULL)
|
||||
return;
|
||||
state = (gz_statep)file;
|
||||
if (state->mode != GZ_READ && state->mode != GZ_WRITE)
|
||||
return;
|
||||
|
||||
/* clear error and end-of-file */
|
||||
if (state->mode == GZ_READ)
|
||||
state->eof = 0;
|
||||
gz_error(state, Z_OK, NULL);
|
||||
}
|
||||
|
||||
/* Create an error message in allocated memory and set state->err and
|
||||
state->msg accordingly. Free any previous error message already there. Do
|
||||
not try to free or allocate space if the error is Z_MEM_ERROR (out of
|
||||
memory). Simply save the error message as a static string. If there is an
|
||||
allocation failure constructing the error message, then convert the error to
|
||||
out of memory. */
|
||||
void ZLIB_INTERNAL gz_error(state, err, msg)
|
||||
gz_statep state;
|
||||
int err;
|
||||
const char *msg;
|
||||
{
|
||||
/* free previously allocated message and clear */
|
||||
if (state->msg != NULL) {
|
||||
if (state->err != Z_MEM_ERROR)
|
||||
free(state->msg);
|
||||
state->msg = NULL;
|
||||
}
|
||||
|
||||
/* set error code, and if no message, then done */
|
||||
state->err = err;
|
||||
if (msg == NULL)
|
||||
return;
|
||||
|
||||
/* for an out of memory error, save as static string */
|
||||
if (err == Z_MEM_ERROR) {
|
||||
state->msg = (char *)msg;
|
||||
return;
|
||||
}
|
||||
|
||||
/* construct error message with path */
|
||||
if ((state->msg = malloc(strlen(state->path) + strlen(msg) + 3)) == NULL) {
|
||||
state->err = Z_MEM_ERROR;
|
||||
state->msg = (char *)"out of memory";
|
||||
return;
|
||||
}
|
||||
strcpy(state->msg, state->path);
|
||||
strcat(state->msg, ": ");
|
||||
strcat(state->msg, msg);
|
||||
return;
|
||||
}
|
||||
|
||||
#ifndef INT_MAX
|
||||
/* portably return maximum value for an int (when limits.h presumed not
|
||||
available) -- we need to do this to cover cases where 2's complement not
|
||||
used, since C standard permits 1's complement and sign-bit representations,
|
||||
otherwise we could just use ((unsigned)-1) >> 1 */
|
||||
unsigned ZLIB_INTERNAL gz_intmax()
|
||||
{
|
||||
unsigned p, q;
|
||||
|
||||
p = 1;
|
||||
do {
|
||||
q = p;
|
||||
p <<= 1;
|
||||
p++;
|
||||
} while (p > q);
|
||||
return q >> 1;
|
||||
}
|
||||
#endif
|
||||
@@ -1,654 +0,0 @@
|
||||
/* gzread.c -- zlib functions for reading gzip files
|
||||
* Copyright (C) 2004, 2005, 2010 Mark Adler
|
||||
* For conditions of distribution and use, see copyright notice in zlib.h
|
||||
*/
|
||||
|
||||
#include "gzguts.h"
|
||||
#include <unistd.h>
|
||||
|
||||
/* Local functions */
|
||||
local int gz_load OF((gz_statep, unsigned char *, unsigned, unsigned *));
|
||||
local int gz_avail OF((gz_statep));
|
||||
local int gz_next4 OF((gz_statep, unsigned long *));
|
||||
local int gz_head OF((gz_statep));
|
||||
local int gz_decomp OF((gz_statep));
|
||||
local int gz_make OF((gz_statep));
|
||||
local int gz_skip OF((gz_statep, z_off64_t));
|
||||
|
||||
/* Use read() to load a buffer -- return -1 on error, otherwise 0. Read from
|
||||
state->fd, and update state->eof, state->err, and state->msg as appropriate.
|
||||
This function needs to loop on read(), since read() is not guaranteed to
|
||||
read the number of bytes requested, depending on the type of descriptor. */
|
||||
local int gz_load(state, buf, len, have)
|
||||
gz_statep state;
|
||||
unsigned char *buf;
|
||||
unsigned len;
|
||||
unsigned *have;
|
||||
{
|
||||
int ret;
|
||||
|
||||
*have = 0;
|
||||
do {
|
||||
ret = read(state->fd, buf + *have, len - *have);
|
||||
if (ret <= 0)
|
||||
break;
|
||||
*have += ret;
|
||||
} while (*have < len);
|
||||
if (ret < 0) {
|
||||
gz_error(state, Z_ERRNO, zstrerror());
|
||||
return -1;
|
||||
}
|
||||
if (ret == 0)
|
||||
state->eof = 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Load up input buffer and set eof flag if last data loaded -- return -1 on
|
||||
error, 0 otherwise. Note that the eof flag is set when the end of the input
|
||||
file is reached, even though there may be unused data in the buffer. Once
|
||||
that data has been used, no more attempts will be made to read the file.
|
||||
gz_avail() assumes that strm->avail_in == 0. */
|
||||
local int gz_avail(state)
|
||||
gz_statep state;
|
||||
{
|
||||
z_streamp strm = &(state->strm);
|
||||
|
||||
if (state->err != Z_OK)
|
||||
return -1;
|
||||
if (state->eof == 0) {
|
||||
if (gz_load(state, state->in, state->size,
|
||||
(unsigned *)&(strm->avail_in)) == -1)
|
||||
return -1;
|
||||
strm->next_in = state->in;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Get next byte from input, or -1 if end or error. */
|
||||
#define NEXT() ((strm->avail_in == 0 && gz_avail(state) == -1) ? -1 : \
|
||||
(strm->avail_in == 0 ? -1 : \
|
||||
(strm->avail_in--, *(strm->next_in)++)))
|
||||
|
||||
/* Get a four-byte little-endian integer and return 0 on success and the value
|
||||
in *ret. Otherwise -1 is returned and *ret is not modified. */
|
||||
local int gz_next4(state, ret)
|
||||
gz_statep state;
|
||||
unsigned long *ret;
|
||||
{
|
||||
int ch;
|
||||
unsigned long val;
|
||||
z_streamp strm = &(state->strm);
|
||||
|
||||
val = NEXT();
|
||||
val += (unsigned)NEXT() << 8;
|
||||
val += (unsigned long)NEXT() << 16;
|
||||
ch = NEXT();
|
||||
if (ch == -1)
|
||||
return -1;
|
||||
val += (unsigned long)ch << 24;
|
||||
*ret = val;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Look for gzip header, set up for inflate or copy. state->have must be zero.
|
||||
If this is the first time in, allocate required memory. state->how will be
|
||||
left unchanged if there is no more input data available, will be set to COPY
|
||||
if there is no gzip header and direct copying will be performed, or it will
|
||||
be set to GZIP for decompression, and the gzip header will be skipped so
|
||||
that the next available input data is the raw deflate stream. If direct
|
||||
copying, then leftover input data from the input buffer will be copied to
|
||||
the output buffer. In that case, all further file reads will be directly to
|
||||
either the output buffer or a user buffer. If decompressing, the inflate
|
||||
state and the check value will be initialized. gz_head() will return 0 on
|
||||
success or -1 on failure. Failures may include read errors or gzip header
|
||||
errors. */
|
||||
local int gz_head(state)
|
||||
gz_statep state;
|
||||
{
|
||||
z_streamp strm = &(state->strm);
|
||||
int flags;
|
||||
unsigned len;
|
||||
|
||||
/* allocate read buffers and inflate memory */
|
||||
if (state->size == 0) {
|
||||
/* allocate buffers */
|
||||
state->in = malloc(state->want);
|
||||
state->out = malloc(state->want << 1);
|
||||
if (state->in == NULL || state->out == NULL) {
|
||||
if (state->out != NULL)
|
||||
free(state->out);
|
||||
if (state->in != NULL)
|
||||
free(state->in);
|
||||
gz_error(state, Z_MEM_ERROR, "out of memory");
|
||||
return -1;
|
||||
}
|
||||
state->size = state->want;
|
||||
|
||||
/* allocate inflate memory */
|
||||
state->strm.zalloc = Z_NULL;
|
||||
state->strm.zfree = Z_NULL;
|
||||
state->strm.opaque = Z_NULL;
|
||||
state->strm.avail_in = 0;
|
||||
state->strm.next_in = Z_NULL;
|
||||
if (inflateInit2(&(state->strm), -15) != Z_OK) { /* raw inflate */
|
||||
free(state->out);
|
||||
free(state->in);
|
||||
state->size = 0;
|
||||
gz_error(state, Z_MEM_ERROR, "out of memory");
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
/* get some data in the input buffer */
|
||||
if (strm->avail_in == 0) {
|
||||
if (gz_avail(state) == -1)
|
||||
return -1;
|
||||
if (strm->avail_in == 0)
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* look for the gzip magic header bytes 31 and 139 */
|
||||
if (strm->next_in[0] == 31) {
|
||||
strm->avail_in--;
|
||||
strm->next_in++;
|
||||
if (strm->avail_in == 0 && gz_avail(state) == -1)
|
||||
return -1;
|
||||
if (strm->avail_in && strm->next_in[0] == 139) {
|
||||
/* we have a gzip header, woo hoo! */
|
||||
strm->avail_in--;
|
||||
strm->next_in++;
|
||||
|
||||
/* skip rest of header */
|
||||
if (NEXT() != 8) { /* compression method */
|
||||
gz_error(state, Z_DATA_ERROR, "unknown compression method");
|
||||
return -1;
|
||||
}
|
||||
flags = NEXT();
|
||||
if (flags & 0xe0) { /* reserved flag bits */
|
||||
gz_error(state, Z_DATA_ERROR, "unknown header flags set");
|
||||
return -1;
|
||||
}
|
||||
NEXT(); /* modification time */
|
||||
NEXT();
|
||||
NEXT();
|
||||
NEXT();
|
||||
NEXT(); /* extra flags */
|
||||
NEXT(); /* operating system */
|
||||
if (flags & 4) { /* extra field */
|
||||
len = (unsigned)NEXT();
|
||||
len += (unsigned)NEXT() << 8;
|
||||
while (len--)
|
||||
if (NEXT() < 0)
|
||||
break;
|
||||
}
|
||||
if (flags & 8) /* file name */
|
||||
while (NEXT() > 0)
|
||||
;
|
||||
if (flags & 16) /* comment */
|
||||
while (NEXT() > 0)
|
||||
;
|
||||
if (flags & 2) { /* header crc */
|
||||
NEXT();
|
||||
NEXT();
|
||||
}
|
||||
/* an unexpected end of file is not checked for here -- it will be
|
||||
noticed on the first request for uncompressed data */
|
||||
|
||||
/* set up for decompression */
|
||||
inflateReset(strm);
|
||||
strm->adler = crc32(0L, Z_NULL, 0);
|
||||
state->how = GZIP;
|
||||
state->direct = 0;
|
||||
return 0;
|
||||
}
|
||||
else {
|
||||
/* not a gzip file -- save first byte (31) and fall to raw i/o */
|
||||
state->out[0] = 31;
|
||||
state->have = 1;
|
||||
}
|
||||
}
|
||||
|
||||
/* doing raw i/o, save start of raw data for seeking, copy any leftover
|
||||
input to output -- this assumes that the output buffer is larger than
|
||||
the input buffer, which also assures space for gzungetc() */
|
||||
state->raw = state->pos;
|
||||
state->next = state->out;
|
||||
if (strm->avail_in) {
|
||||
memcpy(state->next + state->have, strm->next_in, strm->avail_in);
|
||||
state->have += strm->avail_in;
|
||||
strm->avail_in = 0;
|
||||
}
|
||||
state->how = COPY;
|
||||
state->direct = 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Decompress from input to the provided next_out and avail_out in the state.
|
||||
If the end of the compressed data is reached, then verify the gzip trailer
|
||||
check value and length (modulo 2^32). state->have and state->next are set
|
||||
to point to the just decompressed data, and the crc is updated. If the
|
||||
trailer is verified, state->how is reset to LOOK to look for the next gzip
|
||||
stream or raw data, once state->have is depleted. Returns 0 on success, -1
|
||||
on failure. Failures may include invalid compressed data or a failed gzip
|
||||
trailer verification. */
|
||||
local int gz_decomp(state)
|
||||
gz_statep state;
|
||||
{
|
||||
int ret;
|
||||
unsigned had;
|
||||
unsigned long crc, len;
|
||||
z_streamp strm = &(state->strm);
|
||||
|
||||
/* fill output buffer up to end of deflate stream */
|
||||
had = strm->avail_out;
|
||||
do {
|
||||
/* get more input for inflate() */
|
||||
if (strm->avail_in == 0 && gz_avail(state) == -1)
|
||||
return -1;
|
||||
if (strm->avail_in == 0) {
|
||||
gz_error(state, Z_DATA_ERROR, "unexpected end of file");
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* decompress and handle errors */
|
||||
ret = inflate(strm, Z_NO_FLUSH);
|
||||
if (ret == Z_STREAM_ERROR || ret == Z_NEED_DICT) {
|
||||
gz_error(state, Z_STREAM_ERROR,
|
||||
"internal error: inflate stream corrupt");
|
||||
return -1;
|
||||
}
|
||||
if (ret == Z_MEM_ERROR) {
|
||||
gz_error(state, Z_MEM_ERROR, "out of memory");
|
||||
return -1;
|
||||
}
|
||||
if (ret == Z_DATA_ERROR) { /* deflate stream invalid */
|
||||
gz_error(state, Z_DATA_ERROR,
|
||||
strm->msg == NULL ? "compressed data error" : strm->msg);
|
||||
return -1;
|
||||
}
|
||||
} while (strm->avail_out && ret != Z_STREAM_END);
|
||||
|
||||
/* update available output and crc check value */
|
||||
state->have = had - strm->avail_out;
|
||||
state->next = strm->next_out - state->have;
|
||||
strm->adler = crc32(strm->adler, state->next, state->have);
|
||||
|
||||
/* check gzip trailer if at end of deflate stream */
|
||||
if (ret == Z_STREAM_END) {
|
||||
if (gz_next4(state, &crc) == -1 || gz_next4(state, &len) == -1) {
|
||||
gz_error(state, Z_DATA_ERROR, "unexpected end of file");
|
||||
return -1;
|
||||
}
|
||||
if (crc != strm->adler) {
|
||||
gz_error(state, Z_DATA_ERROR, "incorrect data check");
|
||||
return -1;
|
||||
}
|
||||
if (len != (strm->total_out & 0xffffffffL)) {
|
||||
gz_error(state, Z_DATA_ERROR, "incorrect length check");
|
||||
return -1;
|
||||
}
|
||||
state->how = LOOK; /* ready for next stream, once have is 0 (leave
|
||||
state->direct unchanged to remember how) */
|
||||
}
|
||||
|
||||
/* good decompression */
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Make data and put in the output buffer. Assumes that state->have == 0.
|
||||
Data is either copied from the input file or decompressed from the input
|
||||
file depending on state->how. If state->how is LOOK, then a gzip header is
|
||||
looked for (and skipped if found) to determine wither to copy or decompress.
|
||||
Returns -1 on error, otherwise 0. gz_make() will leave state->have as COPY
|
||||
or GZIP unless the end of the input file has been reached and all data has
|
||||
been processed. */
|
||||
local int gz_make(state)
|
||||
gz_statep state;
|
||||
{
|
||||
z_streamp strm = &(state->strm);
|
||||
|
||||
if (state->how == LOOK) { /* look for gzip header */
|
||||
if (gz_head(state) == -1)
|
||||
return -1;
|
||||
if (state->have) /* got some data from gz_head() */
|
||||
return 0;
|
||||
}
|
||||
if (state->how == COPY) { /* straight copy */
|
||||
if (gz_load(state, state->out, state->size << 1, &(state->have)) == -1)
|
||||
return -1;
|
||||
state->next = state->out;
|
||||
}
|
||||
else if (state->how == GZIP) { /* decompress */
|
||||
strm->avail_out = state->size << 1;
|
||||
strm->next_out = state->out;
|
||||
if (gz_decomp(state) == -1)
|
||||
return -1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Skip len uncompressed bytes of output. Return -1 on error, 0 on success. */
|
||||
local int gz_skip(state, len)
|
||||
gz_statep state;
|
||||
z_off64_t len;
|
||||
{
|
||||
unsigned n;
|
||||
|
||||
/* skip over len bytes or reach end-of-file, whichever comes first */
|
||||
while (len)
|
||||
/* skip over whatever is in output buffer */
|
||||
if (state->have) {
|
||||
n = GT_OFF(state->have) || (z_off64_t)state->have > len ?
|
||||
(unsigned)len : state->have;
|
||||
state->have -= n;
|
||||
state->next += n;
|
||||
state->pos += n;
|
||||
len -= n;
|
||||
}
|
||||
|
||||
/* output buffer empty -- return if we're at the end of the input */
|
||||
else if (state->eof && state->strm.avail_in == 0)
|
||||
break;
|
||||
|
||||
/* need more data to skip -- load up output buffer */
|
||||
else {
|
||||
/* get more output, looking for header if required */
|
||||
if (gz_make(state) == -1)
|
||||
return -1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* -- see zlib.h -- */
|
||||
int ZEXPORT gzread(file, buf, len)
|
||||
gzFile file;
|
||||
voidp buf;
|
||||
unsigned len;
|
||||
{
|
||||
unsigned got, n;
|
||||
gz_statep state;
|
||||
z_streamp strm;
|
||||
|
||||
/* get internal structure */
|
||||
if (file == NULL)
|
||||
return -1;
|
||||
state = (gz_statep)file;
|
||||
strm = &(state->strm);
|
||||
|
||||
/* check that we're reading and that there's no error */
|
||||
if (state->mode != GZ_READ || state->err != Z_OK)
|
||||
return -1;
|
||||
|
||||
/* since an int is returned, make sure len fits in one, otherwise return
|
||||
with an error (this avoids the flaw in the interface) */
|
||||
if ((int)len < 0) {
|
||||
gz_error(state, Z_BUF_ERROR, "requested length does not fit in int");
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* if len is zero, avoid unnecessary operations */
|
||||
if (len == 0)
|
||||
return 0;
|
||||
|
||||
/* process a skip request */
|
||||
if (state->seek) {
|
||||
state->seek = 0;
|
||||
if (gz_skip(state, state->skip) == -1)
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* get len bytes to buf, or less than len if at the end */
|
||||
got = 0;
|
||||
do {
|
||||
/* first just try copying data from the output buffer */
|
||||
if (state->have) {
|
||||
n = state->have > len ? len : state->have;
|
||||
memcpy(buf, state->next, n);
|
||||
state->next += n;
|
||||
state->have -= n;
|
||||
}
|
||||
|
||||
/* output buffer empty -- return if we're at the end of the input */
|
||||
else if (state->eof && strm->avail_in == 0)
|
||||
break;
|
||||
|
||||
/* need output data -- for small len or new stream load up our output
|
||||
buffer */
|
||||
else if (state->how == LOOK || len < (state->size << 1)) {
|
||||
/* get more output, looking for header if required */
|
||||
if (gz_make(state) == -1)
|
||||
return -1;
|
||||
continue; /* no progress yet -- go back to memcpy() above */
|
||||
/* the copy above assures that we will leave with space in the
|
||||
output buffer, allowing at least one gzungetc() to succeed */
|
||||
}
|
||||
|
||||
/* large len -- read directly into user buffer */
|
||||
else if (state->how == COPY) { /* read directly */
|
||||
if (gz_load(state, buf, len, &n) == -1)
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* large len -- decompress directly into user buffer */
|
||||
else { /* state->how == GZIP */
|
||||
strm->avail_out = len;
|
||||
strm->next_out = buf;
|
||||
if (gz_decomp(state) == -1)
|
||||
return -1;
|
||||
n = state->have;
|
||||
state->have = 0;
|
||||
}
|
||||
|
||||
/* update progress */
|
||||
len -= n;
|
||||
buf = (char *)buf + n;
|
||||
got += n;
|
||||
state->pos += n;
|
||||
} while (len);
|
||||
|
||||
/* return number of bytes read into user buffer (will fit in int) */
|
||||
return (int)got;
|
||||
}
|
||||
|
||||
/* -- see zlib.h -- */
|
||||
int ZEXPORT gzgetc(file)
|
||||
gzFile file;
|
||||
{
|
||||
int ret;
|
||||
unsigned char buf[1];
|
||||
gz_statep state;
|
||||
|
||||
/* get internal structure */
|
||||
if (file == NULL)
|
||||
return -1;
|
||||
state = (gz_statep)file;
|
||||
|
||||
/* check that we're reading and that there's no error */
|
||||
if (state->mode != GZ_READ || state->err != Z_OK)
|
||||
return -1;
|
||||
|
||||
/* try output buffer (no need to check for skip request) */
|
||||
if (state->have) {
|
||||
state->have--;
|
||||
state->pos++;
|
||||
return *(state->next)++;
|
||||
}
|
||||
|
||||
/* nothing there -- try gzread() */
|
||||
ret = gzread(file, buf, 1);
|
||||
return ret < 1 ? -1 : buf[0];
|
||||
}
|
||||
|
||||
/* -- see zlib.h -- */
|
||||
int ZEXPORT gzungetc(c, file)
|
||||
int c;
|
||||
gzFile file;
|
||||
{
|
||||
gz_statep state;
|
||||
|
||||
/* get internal structure */
|
||||
if (file == NULL)
|
||||
return -1;
|
||||
state = (gz_statep)file;
|
||||
|
||||
/* check that we're reading and that there's no error */
|
||||
if (state->mode != GZ_READ || state->err != Z_OK)
|
||||
return -1;
|
||||
|
||||
/* process a skip request */
|
||||
if (state->seek) {
|
||||
state->seek = 0;
|
||||
if (gz_skip(state, state->skip) == -1)
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* can't push EOF */
|
||||
if (c < 0)
|
||||
return -1;
|
||||
|
||||
/* if output buffer empty, put byte at end (allows more pushing) */
|
||||
if (state->have == 0) {
|
||||
state->have = 1;
|
||||
state->next = state->out + (state->size << 1) - 1;
|
||||
state->next[0] = c;
|
||||
state->pos--;
|
||||
return c;
|
||||
}
|
||||
|
||||
/* if no room, give up (must have already done a gzungetc()) */
|
||||
if (state->have == (state->size << 1)) {
|
||||
gz_error(state, Z_BUF_ERROR, "out of room to push characters");
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* slide output data if needed and insert byte before existing data */
|
||||
if (state->next == state->out) {
|
||||
unsigned char *src = state->out + state->have;
|
||||
unsigned char *dest = state->out + (state->size << 1);
|
||||
while (src > state->out)
|
||||
*--dest = *--src;
|
||||
state->next = dest;
|
||||
}
|
||||
state->have++;
|
||||
state->next--;
|
||||
state->next[0] = c;
|
||||
state->pos--;
|
||||
return c;
|
||||
}
|
||||
|
||||
/* -- see zlib.h -- */
|
||||
char * ZEXPORT gzgets(file, buf, len)
|
||||
gzFile file;
|
||||
char *buf;
|
||||
int len;
|
||||
{
|
||||
unsigned left, n;
|
||||
char *str;
|
||||
unsigned char *eol;
|
||||
gz_statep state;
|
||||
|
||||
/* check parameters and get internal structure */
|
||||
if (file == NULL || buf == NULL || len < 1)
|
||||
return NULL;
|
||||
state = (gz_statep)file;
|
||||
|
||||
/* check that we're reading and that there's no error */
|
||||
if (state->mode != GZ_READ || state->err != Z_OK)
|
||||
return NULL;
|
||||
|
||||
/* process a skip request */
|
||||
if (state->seek) {
|
||||
state->seek = 0;
|
||||
if (gz_skip(state, state->skip) == -1)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* copy output bytes up to new line or len - 1, whichever comes first --
|
||||
append a terminating zero to the string (we don't check for a zero in
|
||||
the contents, let the user worry about that) */
|
||||
str = buf;
|
||||
left = (unsigned)len - 1;
|
||||
if (left) do {
|
||||
/* assure that something is in the output buffer */
|
||||
if (state->have == 0) {
|
||||
if (gz_make(state) == -1)
|
||||
return NULL; /* error */
|
||||
if (state->have == 0) { /* end of file */
|
||||
if (buf == str) /* got bupkus */
|
||||
return NULL;
|
||||
break; /* got something -- return it */
|
||||
}
|
||||
}
|
||||
|
||||
/* look for end-of-line in current output buffer */
|
||||
n = state->have > left ? left : state->have;
|
||||
eol = memchr(state->next, '\n', n);
|
||||
if (eol != NULL)
|
||||
n = (unsigned)(eol - state->next) + 1;
|
||||
|
||||
/* copy through end-of-line, or remainder if not found */
|
||||
memcpy(buf, state->next, n);
|
||||
state->have -= n;
|
||||
state->next += n;
|
||||
state->pos += n;
|
||||
left -= n;
|
||||
buf += n;
|
||||
} while (left && eol == NULL);
|
||||
|
||||
/* found end-of-line or out of space -- terminate string and return it */
|
||||
buf[0] = 0;
|
||||
return str;
|
||||
}
|
||||
|
||||
/* -- see zlib.h -- */
|
||||
int ZEXPORT gzdirect(file)
|
||||
gzFile file;
|
||||
{
|
||||
gz_statep state;
|
||||
|
||||
/* get internal structure */
|
||||
if (file == NULL)
|
||||
return 0;
|
||||
state = (gz_statep)file;
|
||||
|
||||
/* check that we're reading */
|
||||
if (state->mode != GZ_READ)
|
||||
return 0;
|
||||
|
||||
/* if the state is not known, but we can find out, then do so (this is
|
||||
mainly for right after a gzopen() or gzdopen()) */
|
||||
if (state->how == LOOK && state->have == 0)
|
||||
(void)gz_head(state);
|
||||
|
||||
/* return 1 if reading direct, 0 if decompressing a gzip stream */
|
||||
return state->direct;
|
||||
}
|
||||
|
||||
/* -- see zlib.h -- */
|
||||
int ZEXPORT gzclose_r(file)
|
||||
gzFile file;
|
||||
{
|
||||
int ret;
|
||||
gz_statep state;
|
||||
|
||||
/* get internal structure */
|
||||
if (file == NULL)
|
||||
return Z_STREAM_ERROR;
|
||||
state = (gz_statep)file;
|
||||
|
||||
/* check that we're reading */
|
||||
if (state->mode != GZ_READ)
|
||||
return Z_STREAM_ERROR;
|
||||
|
||||
/* free memory and close file */
|
||||
if (state->size) {
|
||||
inflateEnd(&(state->strm));
|
||||
free(state->out);
|
||||
free(state->in);
|
||||
}
|
||||
gz_error(state, Z_OK, NULL);
|
||||
free(state->path);
|
||||
ret = close(state->fd);
|
||||
free(state);
|
||||
return ret ? Z_ERRNO : Z_OK;
|
||||
}
|
||||
@@ -1,532 +0,0 @@
|
||||
/* gzwrite.c -- zlib functions for writing gzip files
|
||||
* Copyright (C) 2004, 2005, 2010 Mark Adler
|
||||
* For conditions of distribution and use, see copyright notice in zlib.h
|
||||
*/
|
||||
|
||||
#include "gzguts.h"
|
||||
#include <unistd.h>
|
||||
|
||||
/* Local functions */
|
||||
local int gz_init OF((gz_statep));
|
||||
local int gz_comp OF((gz_statep, int));
|
||||
local int gz_zero OF((gz_statep, z_off64_t));
|
||||
|
||||
/* Initialize state for writing a gzip file. Mark initialization by setting
|
||||
state->size to non-zero. Return -1 on failure or 0 on success. */
|
||||
local int gz_init(state)
|
||||
gz_statep state;
|
||||
{
|
||||
int ret;
|
||||
z_streamp strm = &(state->strm);
|
||||
|
||||
/* allocate input and output buffers */
|
||||
state->in = malloc(state->want);
|
||||
state->out = malloc(state->want);
|
||||
if (state->in == NULL || state->out == NULL) {
|
||||
if (state->out != NULL)
|
||||
free(state->out);
|
||||
if (state->in != NULL)
|
||||
free(state->in);
|
||||
gz_error(state, Z_MEM_ERROR, "out of memory");
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* allocate deflate memory, set up for gzip compression */
|
||||
strm->zalloc = Z_NULL;
|
||||
strm->zfree = Z_NULL;
|
||||
strm->opaque = Z_NULL;
|
||||
ret = deflateInit2(strm, state->level, Z_DEFLATED,
|
||||
15 + 16, 8, state->strategy);
|
||||
if (ret != Z_OK) {
|
||||
free(state->in);
|
||||
gz_error(state, Z_MEM_ERROR, "out of memory");
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* mark state as initialized */
|
||||
state->size = state->want;
|
||||
|
||||
/* initialize write buffer */
|
||||
strm->avail_out = state->size;
|
||||
strm->next_out = state->out;
|
||||
state->next = strm->next_out;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Compress whatever is at avail_in and next_in and write to the output file.
|
||||
Return -1 if there is an error writing to the output file, otherwise 0.
|
||||
flush is assumed to be a valid deflate() flush value. If flush is Z_FINISH,
|
||||
then the deflate() state is reset to start a new gzip stream. */
|
||||
local int gz_comp(state, flush)
|
||||
gz_statep state;
|
||||
int flush;
|
||||
{
|
||||
int ret, got;
|
||||
unsigned have;
|
||||
z_streamp strm = &(state->strm);
|
||||
|
||||
/* allocate memory if this is the first time through */
|
||||
if (state->size == 0 && gz_init(state) == -1)
|
||||
return -1;
|
||||
|
||||
/* run deflate() on provided input until it produces no more output */
|
||||
ret = Z_OK;
|
||||
do {
|
||||
/* write out current buffer contents if full, or if flushing, but if
|
||||
doing Z_FINISH then don't write until we get to Z_STREAM_END */
|
||||
if (strm->avail_out == 0 || (flush != Z_NO_FLUSH &&
|
||||
(flush != Z_FINISH || ret == Z_STREAM_END))) {
|
||||
have = (unsigned)(strm->next_out - state->next);
|
||||
if (have && ((got = write(state->fd, state->next, have)) < 0 ||
|
||||
(unsigned)got != have)) {
|
||||
gz_error(state, Z_ERRNO, zstrerror());
|
||||
return -1;
|
||||
}
|
||||
if (strm->avail_out == 0) {
|
||||
strm->avail_out = state->size;
|
||||
strm->next_out = state->out;
|
||||
}
|
||||
state->next = strm->next_out;
|
||||
}
|
||||
|
||||
/* compress */
|
||||
have = strm->avail_out;
|
||||
ret = deflate(strm, flush);
|
||||
if (ret == Z_STREAM_ERROR) {
|
||||
gz_error(state, Z_STREAM_ERROR,
|
||||
"internal error: deflate stream corrupt");
|
||||
return -1;
|
||||
}
|
||||
have -= strm->avail_out;
|
||||
} while (have);
|
||||
|
||||
/* if that completed a deflate stream, allow another to start */
|
||||
if (flush == Z_FINISH)
|
||||
deflateReset(strm);
|
||||
|
||||
/* all done, no errors */
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Compress len zeros to output. Return -1 on error, 0 on success. */
|
||||
local int gz_zero(state, len)
|
||||
gz_statep state;
|
||||
z_off64_t len;
|
||||
{
|
||||
int first;
|
||||
unsigned n;
|
||||
z_streamp strm = &(state->strm);
|
||||
|
||||
/* consume whatever's left in the input buffer */
|
||||
if (strm->avail_in && gz_comp(state, Z_NO_FLUSH) == -1)
|
||||
return -1;
|
||||
|
||||
/* compress len zeros (len guaranteed > 0) */
|
||||
first = 1;
|
||||
while (len) {
|
||||
n = GT_OFF(state->size) || (z_off64_t)state->size > len ?
|
||||
(unsigned)len : state->size;
|
||||
if (first) {
|
||||
memset(state->in, 0, n);
|
||||
first = 0;
|
||||
}
|
||||
strm->avail_in = n;
|
||||
strm->next_in = state->in;
|
||||
state->pos += n;
|
||||
if (gz_comp(state, Z_NO_FLUSH) == -1)
|
||||
return -1;
|
||||
len -= n;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* -- see zlib.h -- */
|
||||
int ZEXPORT gzwrite(file, buf, len)
|
||||
gzFile file;
|
||||
voidpc buf;
|
||||
unsigned len;
|
||||
{
|
||||
unsigned put = len;
|
||||
unsigned n;
|
||||
gz_statep state;
|
||||
z_streamp strm;
|
||||
|
||||
/* get internal structure */
|
||||
if (file == NULL)
|
||||
return 0;
|
||||
state = (gz_statep)file;
|
||||
strm = &(state->strm);
|
||||
|
||||
/* check that we're writing and that there's no error */
|
||||
if (state->mode != GZ_WRITE || state->err != Z_OK)
|
||||
return 0;
|
||||
|
||||
/* since an int is returned, make sure len fits in one, otherwise return
|
||||
with an error (this avoids the flaw in the interface) */
|
||||
if ((int)len < 0) {
|
||||
gz_error(state, Z_BUF_ERROR, "requested length does not fit in int");
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* if len is zero, avoid unnecessary operations */
|
||||
if (len == 0)
|
||||
return 0;
|
||||
|
||||
/* allocate memory if this is the first time through */
|
||||
if (state->size == 0 && gz_init(state) == -1)
|
||||
return 0;
|
||||
|
||||
/* check for seek request */
|
||||
if (state->seek) {
|
||||
state->seek = 0;
|
||||
if (gz_zero(state, state->skip) == -1)
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* for small len, copy to input buffer, otherwise compress directly */
|
||||
if (len < state->size) {
|
||||
/* copy to input buffer, compress when full */
|
||||
do {
|
||||
if (strm->avail_in == 0)
|
||||
strm->next_in = state->in;
|
||||
n = state->size - strm->avail_in;
|
||||
if (n > len)
|
||||
n = len;
|
||||
memcpy(strm->next_in + strm->avail_in, buf, n);
|
||||
strm->avail_in += n;
|
||||
state->pos += n;
|
||||
buf = (char *)buf + n;
|
||||
len -= n;
|
||||
if (len && gz_comp(state, Z_NO_FLUSH) == -1)
|
||||
return 0;
|
||||
} while (len);
|
||||
}
|
||||
else {
|
||||
/* consume whatever's left in the input buffer */
|
||||
if (strm->avail_in && gz_comp(state, Z_NO_FLUSH) == -1)
|
||||
return 0;
|
||||
|
||||
/* directly compress user buffer to file */
|
||||
strm->avail_in = len;
|
||||
strm->next_in = (voidp)buf;
|
||||
state->pos += len;
|
||||
if (gz_comp(state, Z_NO_FLUSH) == -1)
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* input was all buffered or compressed (put will fit in int) */
|
||||
return (int)put;
|
||||
}
|
||||
|
||||
/* -- see zlib.h -- */
|
||||
int ZEXPORT gzputc(file, c)
|
||||
gzFile file;
|
||||
int c;
|
||||
{
|
||||
unsigned char buf[1];
|
||||
gz_statep state;
|
||||
z_streamp strm;
|
||||
|
||||
/* get internal structure */
|
||||
if (file == NULL)
|
||||
return -1;
|
||||
state = (gz_statep)file;
|
||||
strm = &(state->strm);
|
||||
|
||||
/* check that we're writing and that there's no error */
|
||||
if (state->mode != GZ_WRITE || state->err != Z_OK)
|
||||
return -1;
|
||||
|
||||
/* check for seek request */
|
||||
if (state->seek) {
|
||||
state->seek = 0;
|
||||
if (gz_zero(state, state->skip) == -1)
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* try writing to input buffer for speed (state->size == 0 if buffer not
|
||||
initialized) */
|
||||
if (strm->avail_in < state->size) {
|
||||
if (strm->avail_in == 0)
|
||||
strm->next_in = state->in;
|
||||
strm->next_in[strm->avail_in++] = c;
|
||||
state->pos++;
|
||||
return c;
|
||||
}
|
||||
|
||||
/* no room in buffer or not initialized, use gz_write() */
|
||||
buf[0] = c;
|
||||
if (gzwrite(file, buf, 1) != 1)
|
||||
return -1;
|
||||
return c;
|
||||
}
|
||||
|
||||
/* -- see zlib.h -- */
|
||||
int ZEXPORT gzputs(file, str)
|
||||
gzFile file;
|
||||
const char *str;
|
||||
{
|
||||
int ret;
|
||||
unsigned len;
|
||||
|
||||
/* write string */
|
||||
len = (unsigned)strlen(str);
|
||||
ret = gzwrite(file, str, len);
|
||||
return ret == 0 && len != 0 ? -1 : ret;
|
||||
}
|
||||
|
||||
#ifdef STDC
|
||||
#include <stdarg.h>
|
||||
|
||||
/* -- see zlib.h -- */
|
||||
int ZEXPORTVA gzprintf (gzFile file, const char *format, ...)
|
||||
{
|
||||
int size, len;
|
||||
gz_statep state;
|
||||
z_streamp strm;
|
||||
va_list va;
|
||||
|
||||
/* get internal structure */
|
||||
if (file == NULL)
|
||||
return -1;
|
||||
state = (gz_statep)file;
|
||||
strm = &(state->strm);
|
||||
|
||||
/* check that we're writing and that there's no error */
|
||||
if (state->mode != GZ_WRITE || state->err != Z_OK)
|
||||
return 0;
|
||||
|
||||
/* make sure we have some buffer space */
|
||||
if (state->size == 0 && gz_init(state) == -1)
|
||||
return 0;
|
||||
|
||||
/* check for seek request */
|
||||
if (state->seek) {
|
||||
state->seek = 0;
|
||||
if (gz_zero(state, state->skip) == -1)
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* consume whatever's left in the input buffer */
|
||||
if (strm->avail_in && gz_comp(state, Z_NO_FLUSH) == -1)
|
||||
return 0;
|
||||
|
||||
/* do the printf() into the input buffer, put length in len */
|
||||
size = (int)(state->size);
|
||||
state->in[size - 1] = 0;
|
||||
va_start(va, format);
|
||||
#ifdef NO_vsnprintf
|
||||
# ifdef HAS_vsprintf_void
|
||||
(void)vsprintf(state->in, format, va);
|
||||
va_end(va);
|
||||
for (len = 0; len < size; len++)
|
||||
if (state->in[len] == 0) break;
|
||||
# else
|
||||
len = vsprintf(state->in, format, va);
|
||||
va_end(va);
|
||||
# endif
|
||||
#else
|
||||
# ifdef HAS_vsnprintf_void
|
||||
(void)vsnprintf(state->in, size, format, va);
|
||||
va_end(va);
|
||||
len = strlen(state->in);
|
||||
# else
|
||||
len = vsnprintf((char *)(state->in), size, format, va);
|
||||
va_end(va);
|
||||
# endif
|
||||
#endif
|
||||
|
||||
/* check that printf() results fit in buffer */
|
||||
if (len <= 0 || len >= (int)size || state->in[size - 1] != 0)
|
||||
return 0;
|
||||
|
||||
/* update buffer and position, defer compression until needed */
|
||||
strm->avail_in = (unsigned)len;
|
||||
strm->next_in = state->in;
|
||||
state->pos += len;
|
||||
return len;
|
||||
}
|
||||
|
||||
#else /* !STDC */
|
||||
|
||||
/* -- see zlib.h -- */
|
||||
int ZEXPORTVA gzprintf (file, format, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10,
|
||||
a11, a12, a13, a14, a15, a16, a17, a18, a19, a20)
|
||||
gzFile file;
|
||||
const char *format;
|
||||
int a1, a2, a3, a4, a5, a6, a7, a8, a9, a10,
|
||||
a11, a12, a13, a14, a15, a16, a17, a18, a19, a20;
|
||||
{
|
||||
int size, len;
|
||||
gz_statep state;
|
||||
z_streamp strm;
|
||||
|
||||
/* get internal structure */
|
||||
if (file == NULL)
|
||||
return -1;
|
||||
state = (gz_statep)file;
|
||||
strm = &(state->strm);
|
||||
|
||||
/* check that we're writing and that there's no error */
|
||||
if (state->mode != GZ_WRITE || state->err != Z_OK)
|
||||
return 0;
|
||||
|
||||
/* make sure we have some buffer space */
|
||||
if (state->size == 0 && gz_init(state) == -1)
|
||||
return 0;
|
||||
|
||||
/* check for seek request */
|
||||
if (state->seek) {
|
||||
state->seek = 0;
|
||||
if (gz_zero(state, state->skip) == -1)
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* consume whatever's left in the input buffer */
|
||||
if (strm->avail_in && gz_comp(state, Z_NO_FLUSH) == -1)
|
||||
return 0;
|
||||
|
||||
/* do the printf() into the input buffer, put length in len */
|
||||
size = (int)(state->size);
|
||||
state->in[size - 1] = 0;
|
||||
#ifdef NO_snprintf
|
||||
# ifdef HAS_sprintf_void
|
||||
sprintf(state->in, format, a1, a2, a3, a4, a5, a6, a7, a8,
|
||||
a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20);
|
||||
for (len = 0; len < size; len++)
|
||||
if (state->in[len] == 0) break;
|
||||
# else
|
||||
len = sprintf(state->in, format, a1, a2, a3, a4, a5, a6, a7, a8,
|
||||
a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20);
|
||||
# endif
|
||||
#else
|
||||
# ifdef HAS_snprintf_void
|
||||
snprintf(state->in, size, format, a1, a2, a3, a4, a5, a6, a7, a8,
|
||||
a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20);
|
||||
len = strlen(state->in);
|
||||
# else
|
||||
len = snprintf(state->in, size, format, a1, a2, a3, a4, a5, a6, a7, a8,
|
||||
a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20);
|
||||
# endif
|
||||
#endif
|
||||
|
||||
/* check that printf() results fit in buffer */
|
||||
if (len <= 0 || len >= (int)size || state->in[size - 1] != 0)
|
||||
return 0;
|
||||
|
||||
/* update buffer and position, defer compression until needed */
|
||||
strm->avail_in = (unsigned)len;
|
||||
strm->next_in = state->in;
|
||||
state->pos += len;
|
||||
return len;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
/* -- see zlib.h -- */
|
||||
int ZEXPORT gzflush(file, flush)
|
||||
gzFile file;
|
||||
int flush;
|
||||
{
|
||||
gz_statep state;
|
||||
|
||||
/* get internal structure */
|
||||
if (file == NULL)
|
||||
return -1;
|
||||
state = (gz_statep)file;
|
||||
|
||||
/* check that we're writing and that there's no error */
|
||||
if (state->mode != GZ_WRITE || state->err != Z_OK)
|
||||
return Z_STREAM_ERROR;
|
||||
|
||||
/* check flush parameter */
|
||||
if (flush < 0 || flush > Z_FINISH)
|
||||
return Z_STREAM_ERROR;
|
||||
|
||||
/* check for seek request */
|
||||
if (state->seek) {
|
||||
state->seek = 0;
|
||||
if (gz_zero(state, state->skip) == -1)
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* compress remaining data with requested flush */
|
||||
gz_comp(state, flush);
|
||||
return state->err;
|
||||
}
|
||||
|
||||
/* -- see zlib.h -- */
|
||||
int ZEXPORT gzsetparams(file, level, strategy)
|
||||
gzFile file;
|
||||
int level;
|
||||
int strategy;
|
||||
{
|
||||
gz_statep state;
|
||||
z_streamp strm;
|
||||
|
||||
/* get internal structure */
|
||||
if (file == NULL)
|
||||
return Z_STREAM_ERROR;
|
||||
state = (gz_statep)file;
|
||||
strm = &(state->strm);
|
||||
|
||||
/* check that we're writing and that there's no error */
|
||||
if (state->mode != GZ_WRITE || state->err != Z_OK)
|
||||
return Z_STREAM_ERROR;
|
||||
|
||||
/* if no change is requested, then do nothing */
|
||||
if (level == state->level && strategy == state->strategy)
|
||||
return Z_OK;
|
||||
|
||||
/* check for seek request */
|
||||
if (state->seek) {
|
||||
state->seek = 0;
|
||||
if (gz_zero(state, state->skip) == -1)
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* change compression parameters for subsequent input */
|
||||
if (state->size) {
|
||||
/* flush previous input with previous parameters before changing */
|
||||
if (strm->avail_in && gz_comp(state, Z_PARTIAL_FLUSH) == -1)
|
||||
return state->err;
|
||||
deflateParams(strm, level, strategy);
|
||||
}
|
||||
state->level = level;
|
||||
state->strategy = strategy;
|
||||
return Z_OK;
|
||||
}
|
||||
|
||||
/* -- see zlib.h -- */
|
||||
int ZEXPORT gzclose_w(file)
|
||||
gzFile file;
|
||||
{
|
||||
int ret = 0;
|
||||
gz_statep state;
|
||||
|
||||
/* get internal structure */
|
||||
if (file == NULL)
|
||||
return Z_STREAM_ERROR;
|
||||
state = (gz_statep)file;
|
||||
|
||||
/* check that we're writing */
|
||||
if (state->mode != GZ_WRITE)
|
||||
return Z_STREAM_ERROR;
|
||||
|
||||
/* check for seek request */
|
||||
if (state->seek) {
|
||||
state->seek = 0;
|
||||
ret += gz_zero(state, state->skip);
|
||||
}
|
||||
|
||||
/* flush, free memory, and close file */
|
||||
ret += gz_comp(state, Z_FINISH);
|
||||
(void)deflateEnd(&(state->strm));
|
||||
free(state->out);
|
||||
free(state->in);
|
||||
gz_error(state, Z_OK, NULL);
|
||||
free(state->path);
|
||||
ret += close(state->fd);
|
||||
free(state);
|
||||
return ret ? Z_ERRNO : Z_OK;
|
||||
}
|
||||
@@ -78,7 +78,7 @@ bool cZip::AddFile( const Uint8 * data, const Uint32& dataSize, const std::strin
|
||||
struct zip_source * zs = zip_source_buffer( mZip, (const void*)data, dataSize, 0 );
|
||||
|
||||
if ( NULL != zs ) {
|
||||
Int32 Result = zip_add( mZip, inpack.c_str(), zs );
|
||||
Int32 Result = (Int32)zip_add( mZip, inpack.c_str(), zs );
|
||||
|
||||
std::string path = mZipPath;
|
||||
Close();
|
||||
@@ -158,17 +158,22 @@ bool cZip::ExtractFileToMemory( const std::string& path, std::vector<Uint8>& dat
|
||||
if ( 0 == CheckPack() && -1 != Pos ) {
|
||||
data.clear();
|
||||
|
||||
struct zip_file * zf = zip_fopen( mZip, path.c_str(), 0 );
|
||||
struct zip_stat zs;
|
||||
int err = zip_stat( mZip, path.c_str(), 0, &zs );
|
||||
|
||||
if ( NULL != zf ) {
|
||||
data.resize( zf->bytes_left );
|
||||
if ( !err ) {
|
||||
struct zip_file * zf = zip_fopen_index( mZip, zs.index, 0 );
|
||||
|
||||
Result = zip_fread( zf, reinterpret_cast<void*> (&data[0]), zf->bytes_left );
|
||||
if ( NULL != zf ) {
|
||||
data.resize( zs.size );
|
||||
|
||||
zip_fclose(zf);
|
||||
Result = (Int32)zip_fread( zf, reinterpret_cast<void*> (&data[0]), data.size() );
|
||||
|
||||
if ( -1 != Result )
|
||||
Ret = true;
|
||||
zip_fclose(zf);
|
||||
|
||||
if ( -1 != Result )
|
||||
Ret = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -184,19 +189,25 @@ bool cZip::ExtractFileToMemory( const std::string& path, Uint8** data, Uint32* d
|
||||
Int32 Pos = Exists( path );
|
||||
Int32 Result = 0;
|
||||
|
||||
|
||||
if ( 0 == CheckPack() && -1 != Pos ) {
|
||||
struct zip_file * zf = zip_fopen( mZip, path.c_str(), 0 );
|
||||
struct zip_stat zs;
|
||||
int err = zip_stat( mZip, path.c_str(), 0, &zs );
|
||||
|
||||
if ( NULL != zf ) {
|
||||
*dataSize = zf->bytes_left;
|
||||
*data = eeNew( Uint8, (*dataSize) );
|
||||
if ( !err ) {
|
||||
struct zip_file * zf = zip_fopen_index( mZip, zs.index, 0 );
|
||||
|
||||
Result = zip_fread( zf, reinterpret_cast<void*> (&data[0]), zf->bytes_left );
|
||||
if ( NULL != zf ) {
|
||||
*dataSize = (Uint32)zs.size;
|
||||
*data = eeNew( Uint8, (*dataSize) );
|
||||
|
||||
zip_fclose(zf);
|
||||
Result = (Int32)zip_fread( zf, reinterpret_cast<void*> (&data[0]), (*dataSize) );
|
||||
|
||||
if ( -1 != Result )
|
||||
Ret = true;
|
||||
zip_fclose(zf);
|
||||
|
||||
if ( -1 != Result )
|
||||
Ret = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -880,7 +880,7 @@ void cEETest::Render() {
|
||||
|
||||
cTexture * TexFace = TF->GetTexture( mFace );
|
||||
if ( TexFace )
|
||||
TexFace->Draw( EE->GetWidth() - TexFace->Width() , EE->GetHeight() - TexFace->Height(), 0.f, 1.f, eeColorA(), ALPHA_DESTALPHA, RN_MIRROR );
|
||||
TexFace->Draw( (eeFloat)EE->GetWidth() - (eeFloat)TexFace->Width() , (eeFloat)EE->GetHeight() - (eeFloat)TexFace->Height(), 0.f, 1.f, eeColorA(), ALPHA_DESTALPHA, RN_MIRROR );
|
||||
|
||||
FF2->SetText( L"FPS: " + toWStr( EE->FPS() ) );
|
||||
FF2->Draw( EE->GetWidth() - FF2->GetTextWidth() - 15, 0 );
|
||||
@@ -898,7 +898,7 @@ void cEETest::Render() {
|
||||
mFB->Unbind();
|
||||
|
||||
if ( NULL != mFB->GetTexture() )
|
||||
mFB->GetTexture()->Draw( EE->GetWidth() - 256, 240, Ang );
|
||||
mFB->GetTexture()->Draw( (eeFloat)EE->GetWidth() - 256.f, 240.f, Ang );
|
||||
}
|
||||
|
||||
cUIManager::instance()->Update();
|
||||
@@ -1152,12 +1152,12 @@ void cEETest::End() {
|
||||
tmpv.clear();
|
||||
MySong.clear();
|
||||
|
||||
cLog::instance()->Save();
|
||||
|
||||
eeSAFE_DELETE( mTGL );
|
||||
eeSAFE_DELETE( mFB );
|
||||
eeSAFE_DELETE( mVBO );
|
||||
eeSAFE_DELETE( mBudaTC );
|
||||
|
||||
cLog::instance()->Save();
|
||||
|
||||
cEngine::DestroySingleton();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user