Fixed compilation with MSVC++.

This commit is contained in:
spartanj
2010-09-08 05:30:59 -03:00
parent f7f7fdcebd
commit c4a1a36892
77 changed files with 3204 additions and 2698 deletions

View File

@@ -17,7 +17,7 @@
<kdevcustomproject>
<run>
<directoryradio>executable</directoryradio>
<mainprogram>eeiv</mainprogram>
<mainprogram>eetest</mainprogram>
<programargs/>
<globaldebugarguments/>
<globalcwd>./</globalcwd>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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

View File

@@ -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();

View File

@@ -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) {

View File

@@ -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 )

View File

@@ -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();

View File

@@ -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 );

View File

@@ -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();

View File

@@ -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 ) {

View File

@@ -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;

View File

@@ -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;

View File

@@ -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 */

View 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_ ]

View File

@@ -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
View 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_ ]

View File

@@ -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 *);

View File

@@ -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);
}

View File

@@ -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;

View File

@@ -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;
}

View File

@@ -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)

View File

@@ -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;

View File

@@ -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)

View File

@@ -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,
};

View File

@@ -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);
}

View File

@@ -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;

View File

@@ -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;

View 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);
}

View File

@@ -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);
}

View 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);
}

View File

@@ -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);
}

View 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;
}

View File

@@ -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;
}

View File

@@ -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++) {

View 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;
}

View 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;
}

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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;

View File

@@ -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;

View File

@@ -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;

View File

@@ -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;
}

View 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;
}

View File

@@ -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;

View File

@@ -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;
}

View File

@@ -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);
}

View 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;
}

View 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;
}
}

View 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);
}

View 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];
}

View File

@@ -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);
}

View File

@@ -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;

View File

@@ -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);
}

View File

@@ -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;
}

View 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;
}

View 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;
}

View 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);
}

View 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;
}

View 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;
}

View 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;
}

View File

@@ -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;

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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
View 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 */

View File

@@ -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 */

View File

@@ -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
}

View File

@@ -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

View File

@@ -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

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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;
}
}
}

View File

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