early-access version 1255
This commit is contained in:
564
externals/libzip/CMakeLists.txt
vendored
Executable file
564
externals/libzip/CMakeLists.txt
vendored
Executable file
@@ -0,0 +1,564 @@
|
||||
# TODO:
|
||||
# create usable libtool .la file
|
||||
|
||||
CMAKE_MINIMUM_REQUIRED(VERSION 3.0.2)
|
||||
|
||||
LIST(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/libzip")
|
||||
|
||||
PROJECT(libzip C)
|
||||
|
||||
OPTION(ENABLE_COMMONCRYPTO "Enable use of CommonCrypto" ON)
|
||||
OPTION(ENABLE_GNUTLS "Enable use of GnuTLS" ON)
|
||||
OPTION(ENABLE_MBEDTLS "Enable use of mbed TLS" ON)
|
||||
OPTION(ENABLE_OPENSSL "Enable use of OpenSSL" ON)
|
||||
OPTION(ENABLE_WINDOWS_CRYPTO "Enable use of Windows cryptography libraries" ON)
|
||||
|
||||
OPTION(ENABLE_BZIP2 "Enable use of BZip2" OFF)
|
||||
OPTION(ENABLE_LZMA "Enable use of LZMA" OFF)
|
||||
|
||||
INCLUDE(CheckFunctionExists)
|
||||
INCLUDE(CheckIncludeFiles)
|
||||
INCLUDE(CheckSymbolExists)
|
||||
INCLUDE(CheckTypeSize)
|
||||
INCLUDE(CheckCSourceRuns)
|
||||
INCLUDE(CheckCSourceCompiles)
|
||||
INCLUDE(CheckStructHasMember)
|
||||
INCLUDE(TestBigEndian)
|
||||
INCLUDE(GNUInstallDirs)
|
||||
IF(ENABLE_COMMONCRYPTO)
|
||||
CHECK_INCLUDE_FILES(CommonCrypto/CommonCrypto.h COMMONCRYPTO_FOUND)
|
||||
ELSE()
|
||||
SET(COMMONCRYPTO_FOUND FALSE)
|
||||
ENDIF()
|
||||
IF(ENABLE_GNUTLS)
|
||||
INCLUDE(FindNettle)
|
||||
INCLUDE(FindGnuTLS)
|
||||
ELSE()
|
||||
SET(GNUTLS_FOUND FALSE)
|
||||
ENDIF()
|
||||
IF(ENABLE_MBEDTLS)
|
||||
FIND_PATH(MBEDTLS_INCLUDE_DIR mbedtls/aes.h)
|
||||
FIND_LIBRARY(MBEDTLS_LIBRARIES NAMES mbedcrypto)
|
||||
ELSE()
|
||||
SET(MBEDTLS_LIBRARIES FALSE)
|
||||
ENDIF()
|
||||
IF(ENABLE_OPENSSL)
|
||||
INCLUDE(FindOpenSSL)
|
||||
ELSE()
|
||||
SET(OPENSSL_FOUND FALSE)
|
||||
ENDIF()
|
||||
IF(WIN32)
|
||||
IF(ENABLE_WINDOWS_CRYPTO)
|
||||
SET(WINDOWS_CRYPTO_FOUND TRUE)
|
||||
ENDIF()
|
||||
ELSE()
|
||||
SET(WINDOWS_CRYPTO_FOUND FALSE)
|
||||
ENDIF()
|
||||
|
||||
OPTION(BUILD_SHARED_LIBS "Build shared libraries" ON)
|
||||
OPTION(SHARED_LIB_VERSIONNING "Add SO version in .so build" ON)
|
||||
|
||||
SET(PACKAGE "libzip")
|
||||
SET(PACKAGE_NAME ${PACKAGE})
|
||||
SET(PACKAGE_VERSION_MAJOR "1")
|
||||
SET(PACKAGE_VERSION_MINOR "5")
|
||||
SET(PACKAGE_VERSION_MICRO "2a")
|
||||
#SET(VERSION "${PACKAGE_VERSION_MAJOR}.${PACKAGE_VERSION_MINOR}")
|
||||
SET(VERSION "${PACKAGE_VERSION_MAJOR}.${PACKAGE_VERSION_MINOR}.${PACKAGE_VERSION_MICRO}")
|
||||
SET(PACKAGE_VERSION ${VERSION})
|
||||
SET(LIBZIP_VERSION ${PACKAGE_VERSION})
|
||||
SET(LIBZIP_VERSION_MAJOR ${PACKAGE_VERSION_MAJOR})
|
||||
SET(LIBZIP_VERSION_MINOR ${PACKAGE_VERSION_MINOR})
|
||||
SET(LIBZIP_VERSION_MICRO ${PACKAGE_VERSION_MICRO})
|
||||
SET(PACKAGE_STRING "${PACKAGE_NAME} ${PACKAGE_VERSION}")
|
||||
|
||||
SET(ARCHIVE_NAME ${PACKAGE_NAME}-${PACKAGE_VERSION})
|
||||
IF(NOT TARGET dist)
|
||||
ADD_CUSTOM_TARGET(dist
|
||||
COMMAND git config tar.tar.xz.command "xz -c"
|
||||
COMMAND git archive --prefix=${ARCHIVE_NAME}/ -o ${ARCHIVE_NAME}.tar.gz HEAD
|
||||
COMMAND git archive --prefix=${ARCHIVE_NAME}/ -o ${ARCHIVE_NAME}.tar.xz HEAD
|
||||
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
|
||||
)
|
||||
ADD_CUSTOM_TARGET(distcheck
|
||||
COMMAND chmod -R u+w ${ARCHIVE_NAME} ${ARCHIVE_NAME}-build ${ARCHIVE_NAME}-dest 2>/dev/null || true
|
||||
COMMAND rm -rf ${ARCHIVE_NAME} ${ARCHIVE_NAME}-build ${ARCHIVE_NAME}-dest
|
||||
COMMAND cmake -E tar xf ${ARCHIVE_NAME}.tar.gz
|
||||
COMMAND chmod -R u-w ${ARCHIVE_NAME}
|
||||
COMMAND mkdir ${ARCHIVE_NAME}-build
|
||||
COMMAND mkdir ${ARCHIVE_NAME}-dest
|
||||
COMMAND cd ${ARCHIVE_NAME}-build && cmake -DCMAKE_INSTALL_PREFIX=../${ARCHIVE_NAME}-dest ../${ARCHIVE_NAME}
|
||||
COMMAND cd ${ARCHIVE_NAME}-build && make -j4
|
||||
COMMAND cd ${ARCHIVE_NAME}-build && make test
|
||||
COMMAND cd ${ARCHIVE_NAME}-build && make install
|
||||
# COMMAND cd ${ARCHIVE_NAME}-build && make uninstall
|
||||
# COMMAND if [ `find ${ARCHIVE_NAME}-dest ! -type d | wc -l` -ne 0 ]; then echo leftover files in ${ARCHIVE_NAME}-dest; false; fi
|
||||
COMMAND cd ${ARCHIVE_NAME}-build && make clean
|
||||
COMMAND chmod -R u+w ${ARCHIVE_NAME} ${ARCHIVE_NAME}-build ${ARCHIVE_NAME}-dest
|
||||
COMMAND rm -rf ${ARCHIVE_NAME} ${ARCHIVE_NAME}-build ${ARCHIVE_NAME}-dest
|
||||
COMMAND echo "${ARCHIVE_NAME}.tar.gz is ready for distribution."
|
||||
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
|
||||
)
|
||||
ADD_DEPENDENCIES(distcheck dist)
|
||||
ENDIF(NOT TARGET dist)
|
||||
|
||||
IF(BUILD_SHARED_LIBS)
|
||||
SET(HAVE_SHARED TRUE)
|
||||
ELSE()
|
||||
SET(ZIP_STATIC TRUE)
|
||||
ENDIF()
|
||||
|
||||
# Checks
|
||||
|
||||
CHECK_FUNCTION_EXISTS(_chmod HAVE__CHMOD)
|
||||
CHECK_FUNCTION_EXISTS(_close HAVE__CLOSE)
|
||||
CHECK_FUNCTION_EXISTS(_dup HAVE__DUP)
|
||||
CHECK_FUNCTION_EXISTS(_fdopen HAVE__FDOPEN)
|
||||
CHECK_FUNCTION_EXISTS(_fileno HAVE__FILENO)
|
||||
CHECK_FUNCTION_EXISTS(_open HAVE__OPEN)
|
||||
CHECK_FUNCTION_EXISTS(_setmode HAVE__SETMODE)
|
||||
CHECK_FUNCTION_EXISTS(_snprintf HAVE__SNPRINTF)
|
||||
CHECK_FUNCTION_EXISTS(_strdup HAVE__STRDUP)
|
||||
CHECK_FUNCTION_EXISTS(_stricmp HAVE__STRICMP)
|
||||
CHECK_FUNCTION_EXISTS(_strtoi64 HAVE__STRTOI64)
|
||||
CHECK_FUNCTION_EXISTS(_strtoui64 HAVE__STRTOUI64)
|
||||
CHECK_FUNCTION_EXISTS(_unlink HAVE__UNLINK)
|
||||
CHECK_FUNCTION_EXISTS(arc4random HAVE_ARC4RANDOM)
|
||||
CHECK_FUNCTION_EXISTS(clonefile HAVE_CLONEFILE)
|
||||
CHECK_FUNCTION_EXISTS(explicit_bzero HAVE_EXPLICIT_BZERO)
|
||||
CHECK_FUNCTION_EXISTS(explicit_memset HAVE_EXPLICIT_MEMSET)
|
||||
CHECK_FUNCTION_EXISTS(fileno HAVE_FILENO)
|
||||
CHECK_FUNCTION_EXISTS(fseeko HAVE_FSEEKO)
|
||||
CHECK_FUNCTION_EXISTS(ftello HAVE_FTELLO)
|
||||
CHECK_FUNCTION_EXISTS(getprogname HAVE_GETPROGNAME)
|
||||
CHECK_FUNCTION_EXISTS(localtime_r HAVE_LOCALTIME_R)
|
||||
CHECK_FUNCTION_EXISTS(open HAVE_OPEN)
|
||||
CHECK_FUNCTION_EXISTS(setmode HAVE_SETMODE)
|
||||
CHECK_FUNCTION_EXISTS(snprintf HAVE_SNPRINTF)
|
||||
CHECK_FUNCTION_EXISTS(strcasecmp HAVE_STRCASECMP)
|
||||
CHECK_FUNCTION_EXISTS(strdup HAVE_STRDUP)
|
||||
CHECK_FUNCTION_EXISTS(stricmp HAVE_STRICMP)
|
||||
CHECK_FUNCTION_EXISTS(strtoll HAVE_STRTOLL)
|
||||
CHECK_FUNCTION_EXISTS(strtoull HAVE_STRTOULL)
|
||||
|
||||
CHECK_INCLUDE_FILES("sys/types.h;sys/stat.h;fts.h" HAVE_FTS_H)
|
||||
CHECK_INCLUDE_FILES(stdbool.h HAVE_STDBOOL_H)
|
||||
CHECK_INCLUDE_FILES(strings.h HAVE_STRINGS_H)
|
||||
CHECK_INCLUDE_FILES(unistd.h HAVE_UNISTD_H)
|
||||
|
||||
CHECK_INCLUDE_FILES(inttypes.h HAVE_INTTYPES_H_LIBZIP)
|
||||
CHECK_INCLUDE_FILES(stdint.h HAVE_STDINT_H_LIBZIP)
|
||||
CHECK_INCLUDE_FILES(sys/types.h HAVE_SYS_TYPES_H_LIBZIP)
|
||||
|
||||
# TODO: fix test
|
||||
# this test does not find __progname even when it exists
|
||||
#CHECK_SYMBOL_EXISTS(__progname stdlib.h HAVE___PROGNAME)
|
||||
|
||||
CHECK_TYPE_SIZE(__int8 __INT8_LIBZIP)
|
||||
CHECK_TYPE_SIZE(int8_t INT8_T_LIBZIP)
|
||||
CHECK_TYPE_SIZE(uint8_t UINT8_T_LIBZIP)
|
||||
CHECK_TYPE_SIZE(__int16 __INT16_LIBZIP)
|
||||
CHECK_TYPE_SIZE(int16_t INT16_T_LIBZIP)
|
||||
CHECK_TYPE_SIZE(uint16_t UINT16_T_LIBZIP)
|
||||
CHECK_TYPE_SIZE(__int32 __INT32_LIBZIP)
|
||||
CHECK_TYPE_SIZE(int32_t INT32_T_LIBZIP)
|
||||
CHECK_TYPE_SIZE(uint32_t UINT32_T_LIBZIP)
|
||||
CHECK_TYPE_SIZE(__int64 __INT64_LIBZIP)
|
||||
CHECK_TYPE_SIZE(int64_t INT64_T_LIBZIP)
|
||||
CHECK_TYPE_SIZE(uint64_t UINT64_T_LIBZIP)
|
||||
CHECK_TYPE_SIZE("short" SHORT_LIBZIP)
|
||||
CHECK_TYPE_SIZE("int" INT_LIBZIP)
|
||||
CHECK_TYPE_SIZE("long" LONG_LIBZIP)
|
||||
CHECK_TYPE_SIZE("long long" LONG_LONG_LIBZIP)
|
||||
CHECK_TYPE_SIZE("off_t" SIZEOF_OFF_T)
|
||||
CHECK_TYPE_SIZE("size_t" SIZE_T_LIBZIP)
|
||||
CHECK_TYPE_SIZE("ssize_t" SSIZE_T_LIBZIP)
|
||||
|
||||
CHECK_C_SOURCE_COMPILES("#include <sys/ioctl.h>
|
||||
#include <linux/fs.h>
|
||||
int main(int argc, char *argv[]) { unsigned long x = FICLONERANGE; }" HAVE_FICLONERANGE)
|
||||
|
||||
CHECK_C_SOURCE_COMPILES("
|
||||
int foo(char * _Nullable bar);
|
||||
int main(int argc, char *argv[]) { }" HAVE_NULLABLE)
|
||||
|
||||
TEST_BIG_ENDIAN(WORDS_BIGENDIAN)
|
||||
|
||||
#FIND_PACKAGE(ZLIB 1.1.2 REQUIRED)
|
||||
INCLUDE_DIRECTORIES(../zlib/zlib)
|
||||
SET(CMAKE_REQUIRED_INCLUDES ../zlib/zlib)
|
||||
|
||||
IF(ENABLE_BZIP2)
|
||||
FIND_PACKAGE(BZip2)
|
||||
IF(BZIP2_FOUND)
|
||||
SET (HAVE_LIBBZ2 1)
|
||||
|
||||
INCLUDE_DIRECTORIES(${BZIP2_INCLUDE_DIR})
|
||||
SET (OPTIONAL_LIBRARY ${OPTIONAL_LIBRARY} ${BZIP2_LIBRARIES})
|
||||
ELSE()
|
||||
MESSAGE(WARNING "-- bzip2 library not found; bzip2 support disabled")
|
||||
ENDIF(BZIP2_FOUND)
|
||||
ENDIF(ENABLE_BZIP2)
|
||||
|
||||
IF(ENABLE_LZMA)
|
||||
FIND_PACKAGE(LibLZMA)
|
||||
IF(LIBLZMA_FOUND)
|
||||
SET (HAVE_LIBLZMA 1)
|
||||
|
||||
INCLUDE_DIRECTORIES(${LIBLZMA_INCLUDE_DIR})
|
||||
SET (OPTIONAL_LIBRARY ${OPTIONAL_LIBRARY} ${LIBLZMA_LIBRARY})
|
||||
ELSE()
|
||||
MESSAGE(WARNING "-- lzma library not found; lzma support disabled")
|
||||
ENDIF(LIBLZMA_FOUND)
|
||||
ENDIF(ENABLE_LZMA)
|
||||
|
||||
|
||||
IF (COMMONCRYPTO_FOUND)
|
||||
SET (HAVE_CRYPTO 1)
|
||||
SET (HAVE_COMMONCRYPTO 1)
|
||||
ELSEIF (WINDOWS_CRYPTO_FOUND)
|
||||
SET (HAVE_CRYPTO 1)
|
||||
SET (HAVE_WINDOWS_CRYPTO 1)
|
||||
ELSEIF (GNUTLS_FOUND AND NETTLE_FOUND)
|
||||
SET (HAVE_CRYPTO 1)
|
||||
SET (HAVE_GNUTLS 1)
|
||||
INCLUDE_DIRECTORIES(${GNUTLS_INCLUDE_DIR} ${NETTLE_INCLUDE_DIR})
|
||||
SET (OPTIONAL_LIBRARY ${OPTIONAL_LIBRARY} ${GNUTLS_LIBRARY} ${NETTLE_LIBRARY})
|
||||
ELSEIF (OPENSSL_FOUND)
|
||||
SET (HAVE_CRYPTO 1)
|
||||
SET (HAVE_OPENSSL 1)
|
||||
INCLUDE_DIRECTORIES(${OPENSSL_INCLUDE_DIR})
|
||||
SET (OPTIONAL_LIBRARY ${OPTIONAL_LIBRARY} ${OPENSSL_LIBRARIES})
|
||||
ELSEIF (MBEDTLS_LIBRARIES)
|
||||
SET (HAVE_CRYPTO 1)
|
||||
SET (HAVE_MBEDTLS 1)
|
||||
INCLUDE_DIRECTORIES(${MBEDTLS_INCLUDE_DIR})
|
||||
SET (OPTIONAL_LIBRARY ${OPTIONAL_LIBRARY} ${MBEDTLS_LIBRARIES})
|
||||
ENDIF()
|
||||
|
||||
IF (NOT HAVE_CRYPTO)
|
||||
MESSAGE(WARNING "-- neither Common Crypto, GnuTLS, mbed TLS, OpenSSL, nor Windows Cryptography found; AES support disabled")
|
||||
ENDIF()
|
||||
|
||||
IF(MSVC)
|
||||
ADD_DEFINITIONS("-D_CRT_SECURE_NO_WARNINGS")
|
||||
ADD_DEFINITIONS("-D_CRT_NONSTDC_NO_DEPRECATE")
|
||||
ENDIF(MSVC)
|
||||
|
||||
if(WIN32)
|
||||
if(HAVE_WINDOWS_CRYPTO)
|
||||
SET (OPTIONAL_LIBRARY ${OPTIONAL_LIBRARY} bcrypt)
|
||||
endif()
|
||||
if(CMAKE_SYSTEM_NAME MATCHES WindowsPhone OR CMAKE_SYSTEM_NAME MATCHES WindowsStore)
|
||||
ADD_DEFINITIONS(-DMS_UWP)
|
||||
else(CMAKE_SYSTEM_NAME MATCHES WindowsPhone OR CMAKE_SYSTEM_NAME MATCHES WindowsStore)
|
||||
SET (OPTIONAL_LIBRARY ${OPTIONAL_LIBRARY} advapi32)
|
||||
endif(CMAKE_SYSTEM_NAME MATCHES WindowsPhone OR CMAKE_SYSTEM_NAME MATCHES WindowsStore)
|
||||
endif(WIN32)
|
||||
|
||||
ADD_DEFINITIONS("-DHAVE_CONFIG_H")
|
||||
|
||||
# rpath handling: use rpath in installed binaries
|
||||
IF(NOT CMAKE_SYSTEM_NAME MATCHES Linux)
|
||||
SET(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}")
|
||||
SET(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
|
||||
ENDIF()
|
||||
|
||||
# fixed size integral types
|
||||
|
||||
IF(HAVE_INTTYPES_H_LIBZIP)
|
||||
SET(LIBZIP_TYPES_INCLUDE "#define __STDC_FORMAT_MACROS 1
|
||||
#include <inttypes.h>")
|
||||
ELSEIF(HAVE_STDINT_H_LIBZIP)
|
||||
SET(LIBZIP_TYPES_INCLUDE "#include <stdint.h>")
|
||||
ELSEIF(HAVE_SYS_TYPES_H_LIBZIP)
|
||||
SET(LIBZIP_TYPES_INCLUDE "#include <sys/types.h>")
|
||||
ENDIF()
|
||||
|
||||
IF(HAVE_INT8_T_LIBZIP)
|
||||
SET(ZIP_INT8_T int8_t)
|
||||
ELSEIF(HAVE___INT8_LIBZIP)
|
||||
SET(ZIP_INT8_T __int8)
|
||||
ELSE()
|
||||
SET(ZIP_INT8_T "signed char")
|
||||
ENDIF()
|
||||
|
||||
IF(HAVE_UINT8_T_LIBZIP)
|
||||
SET(ZIP_UINT8_T uint8_t)
|
||||
ELSEIF(HAVE___INT8_LIBZIP)
|
||||
SET(ZIP_UINT8_T "unsigned __int8")
|
||||
ELSE()
|
||||
SET(ZIP_UINT8_T "unsigned char")
|
||||
ENDIF()
|
||||
|
||||
IF(HAVE_INT16_T_LIBZIP)
|
||||
SET(ZIP_INT16_T int16_t)
|
||||
ELSEIF(HAVE___INT16_LIBZIP)
|
||||
SET(INT16_T_LIBZIP __int16)
|
||||
ELSEIF(SHORT_LIBZIP EQUAL 2)
|
||||
SET(INT16_T_LIBZIP short)
|
||||
ENDIF()
|
||||
|
||||
IF(HAVE_UINT16_T_LIBZIP)
|
||||
SET(ZIP_UINT16_T uint16_t)
|
||||
ELSEIF(HAVE___INT16_LIBZIP)
|
||||
SET(UINT16_T_LIBZIP "unsigned __int16")
|
||||
ELSEIF(SHORT_LIBZIP EQUAL 2)
|
||||
SET(UINT16_T_LIBZIP "unsigned short")
|
||||
ENDIF()
|
||||
|
||||
IF(HAVE_INT32_T_LIBZIP)
|
||||
SET(ZIP_INT32_T int32_t)
|
||||
ELSEIF(HAVE___INT32_LIBZIP)
|
||||
SET(ZIP_INT32_T __int32)
|
||||
ELSEIF(INT_LIBZIP EQUAL 4)
|
||||
SET(ZIP_INT32_T int)
|
||||
ELSEIF(LONG_LIBZIP EQUAL 4)
|
||||
SET(ZIP_INT32_T long)
|
||||
ENDIF()
|
||||
|
||||
IF(HAVE_UINT32_T_LIBZIP)
|
||||
SET(ZIP_UINT32_T uint32_t)
|
||||
ELSEIF(HAVE___INT32_LIBZIP)
|
||||
SET(ZIP_UINT32_T "unsigned __int32")
|
||||
ELSEIF(INT_LIBZIP EQUAL 4)
|
||||
SET(ZIP_UINT32_T "unsigned int")
|
||||
ELSEIF(LONG_LIBZIP EQUAL 4)
|
||||
SET(ZIP_UINT32_T "unsigned long")
|
||||
ENDIF()
|
||||
|
||||
IF(HAVE_INT64_T_LIBZIP)
|
||||
SET(ZIP_INT64_T int64_t)
|
||||
ELSEIF(HAVE___INT64_LIBZIP)
|
||||
SET(ZIP_INT64_T __int64)
|
||||
ELSEIF(LONG_LIBZIP EQUAL 8)
|
||||
SET(ZIP_INT64_T long)
|
||||
ELSEIF(LONG_LONG_LIBZIP EQUAL 8)
|
||||
SET(ZIP_INT64_T "long long")
|
||||
ENDIF()
|
||||
|
||||
IF(HAVE_UINT64_T_LIBZIP)
|
||||
SET(ZIP_UINT64_T uint64_t)
|
||||
ELSEIF(HAVE___INT64_LIBZIP)
|
||||
SET(ZIP_UINT64_T "unsigned __int64")
|
||||
ELSEIF(LONG_LIBZIP EQUAL 8)
|
||||
SET(ZIP_UINT64_T "unsigned long")
|
||||
ELSEIF(LONG_LONG_LIBZIP EQUAL 8)
|
||||
SET(ZIP_UINT64_T "unsigned long long")
|
||||
ENDIF()
|
||||
|
||||
IF(HAVE_NULLABLE)
|
||||
SET(ZIP_NULLABLE_DEFINES)
|
||||
ELSE()
|
||||
SET(ZIP_NULLABLE_DEFINES "#define _Nullable
|
||||
#define _Nonnull")
|
||||
ENDIF()
|
||||
|
||||
# write out config file
|
||||
CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/libzip/cmake-config.h.in ${CMAKE_CURRENT_BINARY_DIR}/libzip/config.h)
|
||||
CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/libzip/cmake-zipconf.h.in ${CMAKE_CURRENT_BINARY_DIR}/libzip/zipconf.h)
|
||||
|
||||
# installation
|
||||
INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/libzip/zipconf.h DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
|
||||
INSTALL(FILES libzip/lib/zip.h DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
|
||||
|
||||
SET(CMAKE_C_VISIBILITY_PRESET hidden)
|
||||
|
||||
ADD_LIBRARY(zip
|
||||
libzip/lib/zip_add.c
|
||||
libzip/lib/zip_add_dir.c
|
||||
libzip/lib/zip_add_entry.c
|
||||
libzip/lib/zip_algorithm_deflate.c
|
||||
libzip/lib/zip_buffer.c
|
||||
libzip/lib/zip_close.c
|
||||
libzip/lib/zip_delete.c
|
||||
libzip/lib/zip_dir_add.c
|
||||
libzip/lib/zip_dirent.c
|
||||
libzip/lib/zip_discard.c
|
||||
libzip/lib/zip_entry.c
|
||||
libzip/lib/zip_err_str.c
|
||||
libzip/lib/zip_error.c
|
||||
libzip/lib/zip_error_clear.c
|
||||
libzip/lib/zip_error_get.c
|
||||
libzip/lib/zip_error_get_sys_type.c
|
||||
libzip/lib/zip_error_strerror.c
|
||||
libzip/lib/zip_error_to_str.c
|
||||
libzip/lib/zip_extra_field.c
|
||||
libzip/lib/zip_extra_field_api.c
|
||||
libzip/lib/zip_fclose.c
|
||||
libzip/lib/zip_fdopen.c
|
||||
libzip/lib/zip_file_add.c
|
||||
libzip/lib/zip_file_error_clear.c
|
||||
libzip/lib/zip_file_error_get.c
|
||||
libzip/lib/zip_file_get_comment.c
|
||||
libzip/lib/zip_file_get_external_attributes.c
|
||||
libzip/lib/zip_file_get_offset.c
|
||||
libzip/lib/zip_file_rename.c
|
||||
libzip/lib/zip_file_replace.c
|
||||
libzip/lib/zip_file_set_comment.c
|
||||
libzip/lib/zip_file_set_encryption.c
|
||||
libzip/lib/zip_file_set_external_attributes.c
|
||||
libzip/lib/zip_file_set_mtime.c
|
||||
libzip/lib/zip_file_strerror.c
|
||||
libzip/lib/zip_filerange_crc.c
|
||||
libzip/lib/zip_fopen.c
|
||||
libzip/lib/zip_fopen_encrypted.c
|
||||
libzip/lib/zip_fopen_index.c
|
||||
libzip/lib/zip_fopen_index_encrypted.c
|
||||
libzip/lib/zip_fread.c
|
||||
libzip/lib/zip_fseek.c
|
||||
libzip/lib/zip_ftell.c
|
||||
libzip/lib/zip_get_archive_comment.c
|
||||
libzip/lib/zip_get_archive_flag.c
|
||||
libzip/lib/zip_get_encryption_implementation.c
|
||||
libzip/lib/zip_get_file_comment.c
|
||||
libzip/lib/zip_get_name.c
|
||||
libzip/lib/zip_get_num_entries.c
|
||||
libzip/lib/zip_get_num_files.c
|
||||
libzip/lib/zip_hash.c
|
||||
libzip/lib/zip_io_util.c
|
||||
libzip/lib/zip_libzip_version.c
|
||||
libzip/lib/zip_memdup.c
|
||||
libzip/lib/zip_name_locate.c
|
||||
libzip/lib/zip_new.c
|
||||
libzip/lib/zip_open.c
|
||||
libzip/lib/zip_progress.c
|
||||
libzip/lib/zip_rename.c
|
||||
libzip/lib/zip_replace.c
|
||||
libzip/lib/zip_set_archive_comment.c
|
||||
libzip/lib/zip_set_archive_flag.c
|
||||
libzip/lib/zip_set_default_password.c
|
||||
libzip/lib/zip_set_file_comment.c
|
||||
libzip/lib/zip_set_file_compression.c
|
||||
libzip/lib/zip_set_name.c
|
||||
libzip/lib/zip_source_accept_empty.c
|
||||
libzip/lib/zip_source_begin_write.c
|
||||
libzip/lib/zip_source_begin_write_cloning.c
|
||||
libzip/lib/zip_source_buffer.c
|
||||
libzip/lib/zip_source_call.c
|
||||
libzip/lib/zip_source_close.c
|
||||
libzip/lib/zip_source_commit_write.c
|
||||
libzip/lib/zip_source_compress.c
|
||||
libzip/lib/zip_source_crc.c
|
||||
libzip/lib/zip_source_error.c
|
||||
libzip/lib/zip_source_filep.c
|
||||
libzip/lib/zip_source_free.c
|
||||
libzip/lib/zip_source_function.c
|
||||
libzip/lib/zip_source_get_compression_flags.c
|
||||
libzip/lib/zip_source_is_deleted.c
|
||||
libzip/lib/zip_source_layered.c
|
||||
libzip/lib/zip_source_open.c
|
||||
libzip/lib/zip_source_pkware.c
|
||||
libzip/lib/zip_source_read.c
|
||||
libzip/lib/zip_source_remove.c
|
||||
libzip/lib/zip_source_rollback_write.c
|
||||
libzip/lib/zip_source_seek.c
|
||||
libzip/lib/zip_source_seek_write.c
|
||||
libzip/lib/zip_source_stat.c
|
||||
libzip/lib/zip_source_supports.c
|
||||
libzip/lib/zip_source_tell.c
|
||||
libzip/lib/zip_source_tell_write.c
|
||||
libzip/lib/zip_source_window.c
|
||||
libzip/lib/zip_source_write.c
|
||||
libzip/lib/zip_source_zip.c
|
||||
libzip/lib/zip_source_zip_new.c
|
||||
libzip/lib/zip_stat.c
|
||||
libzip/lib/zip_stat_index.c
|
||||
libzip/lib/zip_stat_init.c
|
||||
libzip/lib/zip_strerror.c
|
||||
libzip/lib/zip_string.c
|
||||
libzip/lib/zip_unchange.c
|
||||
libzip/lib/zip_unchange_all.c
|
||||
libzip/lib/zip_unchange_archive.c
|
||||
libzip/lib/zip_unchange_data.c
|
||||
libzip/lib/zip_utf-8.c
|
||||
)
|
||||
|
||||
IF(WIN32)
|
||||
target_sources(zip PRIVATE
|
||||
libzip/lib/zip_source_win32handle.c
|
||||
libzip/lib/zip_source_win32utf8.c
|
||||
libzip/lib/zip_source_win32w.c
|
||||
)
|
||||
IF(CMAKE_SYSTEM_NAME MATCHES WindowsPhone OR CMAKE_SYSTEM_NAME MATCHES WindowsStore)
|
||||
ELSE()
|
||||
target_sources(zip PRIVATE libzip/lib/zip_source_win32a.c)
|
||||
ENDIF()
|
||||
ELSE()
|
||||
target_sources(zip PRIVATE
|
||||
libzip/lib/zip_mkstempm.c
|
||||
libzip/lib/zip_source_file.c
|
||||
libzip/lib/zip_random_unix.c
|
||||
)
|
||||
ENDIF()
|
||||
|
||||
IF(HAVE_LIBBZ2)
|
||||
target_sources(zip PRIVATE libzip/lib/zip_algorithm_bzip2.c)
|
||||
ENDIF()
|
||||
|
||||
IF(HAVE_LIBLZMA)
|
||||
target_sources(zip PRIVATE libzip/lib/zip_algorithm_xz.c)
|
||||
ENDIF()
|
||||
|
||||
IF(HAVE_COMMONCRYPTO)
|
||||
target_sources(zip PRIVATE libzip/lib/zip_crypto_commoncrypto.c)
|
||||
ELSEIF(HAVE_WINDOWS_CRYPTO)
|
||||
target_sources(zip PRIVATE libzip/lib/zip_crypto_win.c)
|
||||
ELSEIF(HAVE_GNUTLS)
|
||||
target_sources(zip PRIVATE libzip/lib/zip_crypto_gnutls.c)
|
||||
ELSEIF(HAVE_OPENSSL)
|
||||
target_sources(zip PRIVATE libzip/lib/zip_crypto_openssl.c)
|
||||
ELSEIF(HAVE_MBEDTLS)
|
||||
target_sources(zip PRIVATE libzip/lib/zip_crypto_mbedtls.c)
|
||||
ENDIF()
|
||||
|
||||
IF(HAVE_CRYPTO)
|
||||
target_sources(zip PRIVATE
|
||||
libzip/lib/zip_winzip_aes.c
|
||||
libzip/lib/zip_source_winzip_aes_decode.c
|
||||
libzip/lib/zip_source_winzip_aes_encode.c
|
||||
)
|
||||
ENDIF()
|
||||
|
||||
target_include_directories(zip
|
||||
PUBLIC
|
||||
libzip/lib
|
||||
${CMAKE_CURRENT_BINARY_DIR}/libzip
|
||||
)
|
||||
|
||||
# pkgconfig file
|
||||
SET(prefix ${CMAKE_INSTALL_PREFIX})
|
||||
SET(exec_prefix \${prefix})
|
||||
SET(bindir \${exec_prefix}/${CMAKE_INSTALL_BINDIR})
|
||||
SET(libdir \${exec_prefix}/${CMAKE_INSTALL_LIBDIR})
|
||||
SET(includedir \${prefix}/${CMAKE_INSTALL_INCLUDEDIR})
|
||||
IF(CMAKE_SYSTEM_NAME MATCHES BSD)
|
||||
SET(PKG_CONFIG_RPATH "-Wl,-R\${libdir}")
|
||||
ENDIF(CMAKE_SYSTEM_NAME MATCHES BSD)
|
||||
get_target_property(LIBS_PRIVATE zip LINK_LIBRARIES)
|
||||
foreach(LIB ${LIBS_PRIVATE})
|
||||
if(LIB MATCHES "^/")
|
||||
get_filename_component(LIB ${LIB} NAME_WE)
|
||||
string(REGEX REPLACE "^lib" "" LIB ${LIB})
|
||||
endif()
|
||||
set(LIBS "${LIBS} -l${LIB}")
|
||||
endforeach()
|
||||
CONFIGURE_FILE(libzip/libzip.pc.in libzip/libzip.pc @ONLY)
|
||||
INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/libzip.pc DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig)
|
||||
|
||||
ADD_CUSTOM_TARGET(update_zip_err_str
|
||||
COMMAND sh ${CMAKE_CURRENT_SOURCE_DIR}/libzip/lib/make_zip_err_str.sh ${CMAKE_CURRENT_SOURCE_DIR}/libzip/lib/zip.h ${CMAKE_CURRENT_SOURCE_DIR}/libzip/lib/zip_err_str.c
|
||||
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/libzip/lib/zip.h ${CMAKE_CURRENT_SOURCE_DIR}/libzip/lib/make_zip_err_str.sh
|
||||
)
|
||||
|
||||
IF(SHARED_LIB_VERSIONNING)
|
||||
SET_TARGET_PROPERTIES(zip PROPERTIES VERSION 5.0 SOVERSION 5)
|
||||
ENDIF()
|
||||
|
||||
TARGET_LINK_LIBRARIES(zip ${ZLIB_LIBRARIES} ${OPTIONAL_LIBRARY})
|
||||
INSTALL(TARGETS zip
|
||||
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
|
||||
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
|
||||
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
|
||||
)
|
||||
|
12
externals/libzip/libzip/.clang-format
vendored
Executable file
12
externals/libzip/libzip/.clang-format
vendored
Executable file
@@ -0,0 +1,12 @@
|
||||
BasedOnStyle: LLVM
|
||||
IndentWidth: 4
|
||||
ColumnLimit: 2000
|
||||
AlwaysBreakAfterReturnType: TopLevelDefinitions
|
||||
KeepEmptyLinesAtTheStartOfBlocks: false
|
||||
MaxEmptyLinesToKeep: 2
|
||||
BreakBeforeBraces: Custom
|
||||
BraceWrapping:
|
||||
BeforeElse: true
|
||||
AlignEscapedNewlines: Left
|
||||
UseTab: ForContinuationAndIndentation
|
||||
#PPDirectiveIndentStyle: AfterHash
|
11
externals/libzip/libzip/.gitattributes
vendored
Executable file
11
externals/libzip/libzip/.gitattributes
vendored
Executable file
@@ -0,0 +1,11 @@
|
||||
.gitattributes export-ignore
|
||||
.gitignore export-ignore
|
||||
.travis.yml export-ignore
|
||||
create-cmake-config.h.in.pl export-ignore
|
||||
docs export-ignore
|
||||
man/fix-man-links.sh export-ignore
|
||||
man/make_zip_errors.sh export-ignore
|
||||
man/mkdocset.pl export-ignore
|
||||
man/nih-man.css export-ignore
|
||||
vstudio export-ignore
|
||||
xcode export-ignore
|
32
externals/libzip/libzip/.github/ISSUE_TEMPLATE/bug-report.md
vendored
Executable file
32
externals/libzip/libzip/.github/ISSUE_TEMPLATE/bug-report.md
vendored
Executable file
@@ -0,0 +1,32 @@
|
||||
---
|
||||
name: Bug Report
|
||||
about: Report where libzip didn't behave like you expected.
|
||||
title: ''
|
||||
labels: bug
|
||||
assignees: ''
|
||||
|
||||
---
|
||||
|
||||
**Describe the Bug**
|
||||
A clear and concise description of what the bug is.
|
||||
|
||||
**Expected Behavior**
|
||||
A clear and concise description of what you expected to happen.
|
||||
|
||||
**Observed Behavior**
|
||||
A clear and concise description of what actually happened.
|
||||
|
||||
**To Reproduce**
|
||||
Short program or code snippet that reproduces the problem.
|
||||
|
||||
**libzip Version**
|
||||
Version of libzip or revision repository used.
|
||||
|
||||
**Operating System**
|
||||
Operating system and version, used compiler.
|
||||
|
||||
**Test Files**
|
||||
If applicable, attach and describe zip archives that trigger the problem.
|
||||
|
||||
**Additional context**
|
||||
Add any other context about the problem here.
|
25
externals/libzip/libzip/.github/ISSUE_TEMPLATE/compile-error.md
vendored
Executable file
25
externals/libzip/libzip/.github/ISSUE_TEMPLATE/compile-error.md
vendored
Executable file
@@ -0,0 +1,25 @@
|
||||
---
|
||||
name: Compile Error
|
||||
about: Report when libzip does not compile.
|
||||
title: ''
|
||||
labels: compile
|
||||
assignees: ''
|
||||
|
||||
---
|
||||
|
||||
**Compiler Error**
|
||||
Output from the compiler, including exact and complete error message, file name and line number.
|
||||
|
||||
**libzip Version**
|
||||
Version of libzip or revision repository used.
|
||||
|
||||
**Operating System and Compiler**
|
||||
The operating system and compiler used, including version number.
|
||||
|
||||
Also, any flags passed to `cmake`.
|
||||
|
||||
**Autodetected Configuration**
|
||||
Attach `CmakeCache.txt` from your build directory. This list everything `cmake` detected on your system.
|
||||
|
||||
**Additional context**
|
||||
Add any other context about the problem here.
|
22
externals/libzip/libzip/.github/ISSUE_TEMPLATE/feature-request.md
vendored
Executable file
22
externals/libzip/libzip/.github/ISSUE_TEMPLATE/feature-request.md
vendored
Executable file
@@ -0,0 +1,22 @@
|
||||
---
|
||||
name: Feature Request
|
||||
about: Suggest an idea for this project.
|
||||
title: ''
|
||||
labels: enhancement
|
||||
assignees: ''
|
||||
|
||||
---
|
||||
|
||||
**Description**
|
||||
A clear and concise description of what you want to achieve, why the current features are insufficient, and why you think it is generally useful.
|
||||
|
||||
Also, have you checked wether the feature is already mentioned in TODO.md? If so, only submit a new issue if you expand on it.
|
||||
|
||||
**Solution**
|
||||
A clear and concise description of what you want to happen.
|
||||
|
||||
**Describe alternatives you've considered**
|
||||
A clear and concise description of any alternative solutions or features you've considered.
|
||||
|
||||
**Additional context**
|
||||
Add any other context about the feature request here.
|
7
externals/libzip/libzip/.gitignore
vendored
Executable file
7
externals/libzip/libzip/.gitignore
vendored
Executable file
@@ -0,0 +1,7 @@
|
||||
.DS_Store
|
||||
/build*
|
||||
/xcode/libzip.xcodeproj/project.xcworkspace/xcuserdata/
|
||||
/xcode/libzip.xcodeproj/xcuserdata/
|
||||
*~
|
||||
*.tar.gz
|
||||
*.tar.xz
|
19
externals/libzip/libzip/.travis.yml
vendored
Executable file
19
externals/libzip/libzip/.travis.yml
vendored
Executable file
@@ -0,0 +1,19 @@
|
||||
language: c
|
||||
compiler:
|
||||
- clang
|
||||
- gcc
|
||||
os:
|
||||
- linux
|
||||
- osx
|
||||
script:
|
||||
- mkdir build
|
||||
- cd build
|
||||
- cmake ..
|
||||
- make
|
||||
- make test
|
||||
notifications:
|
||||
email:
|
||||
recipients:
|
||||
- build-status@libzip.org
|
||||
on_success: change
|
||||
on_failure: change
|
162
externals/libzip/libzip/API-CHANGES.md
vendored
Executable file
162
externals/libzip/libzip/API-CHANGES.md
vendored
Executable file
@@ -0,0 +1,162 @@
|
||||
# libzip API changes
|
||||
|
||||
This file describes changes in the libzip API and how to adapt your
|
||||
code for them.
|
||||
|
||||
You can define `ZIP_DISABLE_DEPRECATED` before including `<zip.h>` to hide
|
||||
prototypes for deprecated functions, to find out about functions that
|
||||
might be removed at some point.
|
||||
|
||||
## Changed in libzip-1.0
|
||||
|
||||
### new type `zip_error_t`
|
||||
|
||||
Error information is stored in the newly public type `zip_error_t`. Use
|
||||
this to access information about an error, instead of the deprecated
|
||||
functions that operated on two ints.
|
||||
|
||||
deprecated functions:
|
||||
- `zip_error_get_sys_type()`
|
||||
- `zip_error_get()`
|
||||
- `zip_error_to_str()`
|
||||
- `zip_file_error_get()`
|
||||
|
||||
See their man pages for instructions on how to replace them.
|
||||
|
||||
The most common affected use is `zip_open`. The new recommended usage
|
||||
is:
|
||||
|
||||
```c
|
||||
int err;
|
||||
if ((za = zip_open(archive, flags, &err)) == NULL) {
|
||||
zip_error_t error;
|
||||
zip_error_init_with_code(&error, err);
|
||||
fprintf(stderr, "can't open zip archive '%s': %s\n", archive, zip_error_strerror(&error));
|
||||
zip_error_fini(&error);
|
||||
}
|
||||
```
|
||||
|
||||
### more typedefs
|
||||
|
||||
The following typedefs have been added for better readability:
|
||||
|
||||
```c
|
||||
typedef struct zip zip_t;
|
||||
typedef struct zip_file zip_file_t;
|
||||
typedef struct zip_source zip_source_t;
|
||||
typedef struct zip_stat zip_stat_t;
|
||||
```
|
||||
|
||||
This means you can use "`zip_t`" instead of "`struct zip`", etc.
|
||||
|
||||
|
||||
### torrentzip support removed
|
||||
|
||||
torrentzip depends on a particular zlib version which is by now quite
|
||||
old.
|
||||
|
||||
## Changed in libzip-0.11
|
||||
|
||||
### new type `zip_flags_t`
|
||||
|
||||
The functions which have flags now use the `zip_flags_t` type for this.
|
||||
All old flags fit; you need only to adapt code if you were saving flags in a
|
||||
local variable. Use `zip_flags_t` for such a variable.
|
||||
This affects:
|
||||
- `zip_fopen()`
|
||||
- `zip_fopen_encrypted()`
|
||||
- `zip_fopen_index()`
|
||||
- `zip_fopen_index_encrypted()`
|
||||
- `zip_get_archive_comment()`
|
||||
- `zip_get_archive_flag()`
|
||||
- `zip_get_num_entries()`
|
||||
- `zip_get_name()`
|
||||
- `zip_name_locate()`
|
||||
- `zip_set_archive_flag()`
|
||||
- `zip_source_zip()`
|
||||
- `zip_stat()`
|
||||
- `zip_stat_index()`
|
||||
|
||||
#### `ZIP_FL_*`, `ZIP_AFL_*`, `ZIP_STAT_*` are now unsigned constants
|
||||
|
||||
To match the new `zip_flags_t` type.
|
||||
|
||||
#### `zip_add()`, `zip_add_dir()`
|
||||
|
||||
These functions were replaced with `zip_file_add()` and `zip_dir_add()`, respectively,
|
||||
to add a flags argument.
|
||||
|
||||
#### `zip_rename()`, `zip_replace()`
|
||||
|
||||
These functions were replaced with `zip_file_rename()` and `zip_file_replace()`,
|
||||
respectively, to add a flags argument.
|
||||
|
||||
#### `zip_get_file_comment()`
|
||||
|
||||
This function was replaced with `zip_file_get_comment()`; one argument was promoted from
|
||||
`int` to `zip_uint32_t`, the other is now a `zip_flags_t`.
|
||||
|
||||
#### `zip_set_file_comment()`
|
||||
|
||||
This function was replaced with `zip_file_set_comment()`; an argument was promoted from
|
||||
`int` to `zip_uint16_t`, and a `zip_flags_t` argument was added.
|
||||
|
||||
### integer type size changes
|
||||
|
||||
Some argument and return values were not the right size or sign.
|
||||
|
||||
#### `zip_name_locate()`
|
||||
|
||||
The return value was `int`, which can be too small. The function now returns `zip_int64_t`.
|
||||
|
||||
|
||||
#### `zip_get_num_entries()`
|
||||
|
||||
The return type is now signed, to allow signaling errors.
|
||||
|
||||
#### `zip_set_archive_comment()`
|
||||
|
||||
The last argument changed from `int` to `zip_uint16_t`.
|
||||
|
||||
### extra field handling rewritten
|
||||
|
||||
The `zip_get_file_extra()` and `zip_set_file_extra()` functions were removed.
|
||||
They only worked on the whole extra field set.
|
||||
|
||||
Instead, you can now set, get, count, and delete each extra field separately,
|
||||
using the functions:
|
||||
- `zip_file_extra_field_delete()`
|
||||
- `zip_file_extra_field_delete_by_id()`
|
||||
- `zip_file_extra_field_get()`
|
||||
- `zip_file_extra_field_get_by_id()`
|
||||
- `zip_file_extra_fields_count()`
|
||||
- `zip_file_extra_fields_count_by_id()`
|
||||
- `zip_file_extra_field_set()`
|
||||
|
||||
Please read the corresponding man pages for details.
|
||||
|
||||
### new functions
|
||||
|
||||
#### `zip_discard()`
|
||||
|
||||
The new `zip_discard()` function closes an archive without committing the
|
||||
scheduled changes.
|
||||
|
||||
#### `zip_set_file_compression()`
|
||||
|
||||
The new `zip_set_file_compression()` function allows setting compression
|
||||
levels for files.
|
||||
|
||||
### argument changes
|
||||
|
||||
#### file names
|
||||
|
||||
File names arguments are now allowed to be `NULL` to have an empty file name.
|
||||
This mostly affects `zip_file_add()`, `zip_dir_add()`, and `zip_file_rename()`.
|
||||
|
||||
For `zip_get_name()`, `zip_file_get_comment()`, and `zip_get_archive_comment()`, if
|
||||
the file name or comment is empty, a string of length 0 is returned.
|
||||
`NULL` is returned for errors only.
|
||||
|
||||
Previously, `NULL` was returned for empty/unset file names and comments and
|
||||
errors, leaving no way to differentiate between the two.
|
2
externals/libzip/libzip/AUTHORS
vendored
Executable file
2
externals/libzip/libzip/AUTHORS
vendored
Executable file
@@ -0,0 +1,2 @@
|
||||
Dieter Baron <dillo@nih.at>
|
||||
Thomas Klausner <tk@giga.or.at>
|
438
externals/libzip/libzip/CMakeLists.txt
vendored
Executable file
438
externals/libzip/libzip/CMakeLists.txt
vendored
Executable file
@@ -0,0 +1,438 @@
|
||||
# TODO:
|
||||
# create usable libtool .la file
|
||||
|
||||
CMAKE_MINIMUM_REQUIRED(VERSION 3.0.2)
|
||||
|
||||
LIST(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR})
|
||||
|
||||
PROJECT(libzip C)
|
||||
|
||||
OPTION(ENABLE_COMMONCRYPTO "Enable use of CommonCrypto" ON)
|
||||
OPTION(ENABLE_GNUTLS "Enable use of GnuTLS" ON)
|
||||
OPTION(ENABLE_MBEDTLS "Enable use of mbed TLS" ON)
|
||||
OPTION(ENABLE_OPENSSL "Enable use of OpenSSL" ON)
|
||||
OPTION(ENABLE_WINDOWS_CRYPTO "Enable use of Windows cryptography libraries" ON)
|
||||
|
||||
OPTION(ENABLE_BZIP2 "Enable use of BZip2" ON)
|
||||
OPTION(ENABLE_LZMA "Enable use of LZMA" ON)
|
||||
|
||||
OPTION(BUILD_TOOLS "Build tools in the src directory (zipcmp, zipmerge, ziptool)" ON)
|
||||
OPTION(BUILD_REGRESS "Build regression tests" ON)
|
||||
OPTION(BUILD_EXAMPLES "Build examples" ON)
|
||||
OPTION(BUILD_DOC "Build documentation" ON)
|
||||
|
||||
INCLUDE(CheckFunctionExists)
|
||||
INCLUDE(CheckIncludeFiles)
|
||||
INCLUDE(CheckSymbolExists)
|
||||
INCLUDE(CheckTypeSize)
|
||||
INCLUDE(CheckCSourceRuns)
|
||||
INCLUDE(CheckCSourceCompiles)
|
||||
INCLUDE(CheckStructHasMember)
|
||||
INCLUDE(TestBigEndian)
|
||||
INCLUDE(GNUInstallDirs)
|
||||
IF(ENABLE_COMMONCRYPTO)
|
||||
CHECK_INCLUDE_FILES(CommonCrypto/CommonCrypto.h COMMONCRYPTO_FOUND)
|
||||
ELSE()
|
||||
SET(COMMONCRYPTO_FOUND FALSE)
|
||||
ENDIF()
|
||||
IF(ENABLE_GNUTLS)
|
||||
INCLUDE(FindNettle)
|
||||
INCLUDE(FindGnuTLS)
|
||||
ELSE()
|
||||
SET(GNUTLS_FOUND FALSE)
|
||||
ENDIF()
|
||||
IF(ENABLE_MBEDTLS)
|
||||
FIND_PATH(MBEDTLS_INCLUDE_DIR mbedtls/aes.h)
|
||||
FIND_LIBRARY(MBEDTLS_LIBRARIES NAMES mbedcrypto)
|
||||
ELSE()
|
||||
SET(MBEDTLS_LIBRARIES FALSE)
|
||||
ENDIF()
|
||||
IF(ENABLE_OPENSSL)
|
||||
INCLUDE(FindOpenSSL)
|
||||
ELSE()
|
||||
SET(OPENSSL_FOUND FALSE)
|
||||
ENDIF()
|
||||
IF(WIN32)
|
||||
IF(ENABLE_WINDOWS_CRYPTO)
|
||||
SET(WINDOWS_CRYPTO_FOUND TRUE)
|
||||
ENDIF()
|
||||
ELSE()
|
||||
SET(WINDOWS_CRYPTO_FOUND FALSE)
|
||||
ENDIF()
|
||||
|
||||
OPTION(BUILD_SHARED_LIBS "Build shared libraries" ON)
|
||||
|
||||
|
||||
OPTION(SHARED_LIB_VERSIONNING "Add SO version in .so build" ON)
|
||||
|
||||
FIND_PROGRAM(MDOCTOOL NAMES mandoc groff)
|
||||
IF (MDOCTOOL)
|
||||
SET(DOCUMENTATION_FORMAT "mdoc" CACHE STRING "Documentation format")
|
||||
ELSE()
|
||||
FIND_PROGRAM(MANTOOL NAMES nroff)
|
||||
IF (MANTOOL)
|
||||
SET(DOCUMENTATION_FORMAT "man" CACHE STRING "Documentation format")
|
||||
ELSE()
|
||||
SET(DOCUMENTATION_FORMAT "html" CACHE STRING "Documentation format")
|
||||
ENDIF()
|
||||
ENDIF()
|
||||
|
||||
SET(PACKAGE "libzip")
|
||||
SET(PACKAGE_NAME ${PACKAGE})
|
||||
SET(PACKAGE_VERSION_MAJOR "1")
|
||||
SET(PACKAGE_VERSION_MINOR "5")
|
||||
SET(PACKAGE_VERSION_MICRO "2a")
|
||||
#SET(VERSION "${PACKAGE_VERSION_MAJOR}.${PACKAGE_VERSION_MINOR}")
|
||||
SET(VERSION "${PACKAGE_VERSION_MAJOR}.${PACKAGE_VERSION_MINOR}.${PACKAGE_VERSION_MICRO}")
|
||||
SET(PACKAGE_VERSION ${VERSION})
|
||||
SET(LIBZIP_VERSION ${PACKAGE_VERSION})
|
||||
SET(LIBZIP_VERSION_MAJOR ${PACKAGE_VERSION_MAJOR})
|
||||
SET(LIBZIP_VERSION_MINOR ${PACKAGE_VERSION_MINOR})
|
||||
SET(LIBZIP_VERSION_MICRO ${PACKAGE_VERSION_MICRO})
|
||||
SET(PACKAGE_STRING "${PACKAGE_NAME} ${PACKAGE_VERSION}")
|
||||
|
||||
SET(ARCHIVE_NAME ${PACKAGE_NAME}-${PACKAGE_VERSION})
|
||||
IF(NOT TARGET dist)
|
||||
ADD_CUSTOM_TARGET(dist
|
||||
COMMAND git config tar.tar.xz.command "xz -c"
|
||||
COMMAND git archive --prefix=${ARCHIVE_NAME}/ -o ${ARCHIVE_NAME}.tar.gz HEAD
|
||||
COMMAND git archive --prefix=${ARCHIVE_NAME}/ -o ${ARCHIVE_NAME}.tar.xz HEAD
|
||||
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
|
||||
)
|
||||
ADD_CUSTOM_TARGET(distcheck
|
||||
COMMAND chmod -R u+w ${ARCHIVE_NAME} ${ARCHIVE_NAME}-build ${ARCHIVE_NAME}-dest 2>/dev/null || true
|
||||
COMMAND rm -rf ${ARCHIVE_NAME} ${ARCHIVE_NAME}-build ${ARCHIVE_NAME}-dest
|
||||
COMMAND cmake -E tar xf ${ARCHIVE_NAME}.tar.gz
|
||||
COMMAND chmod -R u-w ${ARCHIVE_NAME}
|
||||
COMMAND mkdir ${ARCHIVE_NAME}-build
|
||||
COMMAND mkdir ${ARCHIVE_NAME}-dest
|
||||
COMMAND cd ${ARCHIVE_NAME}-build && cmake -DCMAKE_INSTALL_PREFIX=../${ARCHIVE_NAME}-dest ../${ARCHIVE_NAME}
|
||||
COMMAND cd ${ARCHIVE_NAME}-build && make -j4
|
||||
COMMAND cd ${ARCHIVE_NAME}-build && make test
|
||||
COMMAND cd ${ARCHIVE_NAME}-build && make install
|
||||
# COMMAND cd ${ARCHIVE_NAME}-build && make uninstall
|
||||
# COMMAND if [ `find ${ARCHIVE_NAME}-dest ! -type d | wc -l` -ne 0 ]; then echo leftover files in ${ARCHIVE_NAME}-dest; false; fi
|
||||
COMMAND cd ${ARCHIVE_NAME}-build && make clean
|
||||
COMMAND chmod -R u+w ${ARCHIVE_NAME} ${ARCHIVE_NAME}-build ${ARCHIVE_NAME}-dest
|
||||
COMMAND rm -rf ${ARCHIVE_NAME} ${ARCHIVE_NAME}-build ${ARCHIVE_NAME}-dest
|
||||
COMMAND echo "${ARCHIVE_NAME}.tar.gz is ready for distribution."
|
||||
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
|
||||
)
|
||||
ADD_DEPENDENCIES(distcheck dist)
|
||||
ENDIF(NOT TARGET dist)
|
||||
|
||||
IF(BUILD_SHARED_LIBS)
|
||||
SET(HAVE_SHARED TRUE)
|
||||
ELSE()
|
||||
SET(ZIP_STATIC TRUE)
|
||||
ENDIF()
|
||||
|
||||
# Checks
|
||||
|
||||
CHECK_FUNCTION_EXISTS(_chmod HAVE__CHMOD)
|
||||
CHECK_FUNCTION_EXISTS(_close HAVE__CLOSE)
|
||||
CHECK_FUNCTION_EXISTS(_dup HAVE__DUP)
|
||||
CHECK_FUNCTION_EXISTS(_fdopen HAVE__FDOPEN)
|
||||
CHECK_FUNCTION_EXISTS(_fileno HAVE__FILENO)
|
||||
CHECK_FUNCTION_EXISTS(_open HAVE__OPEN)
|
||||
CHECK_FUNCTION_EXISTS(_setmode HAVE__SETMODE)
|
||||
CHECK_FUNCTION_EXISTS(_snprintf HAVE__SNPRINTF)
|
||||
CHECK_FUNCTION_EXISTS(_strdup HAVE__STRDUP)
|
||||
CHECK_FUNCTION_EXISTS(_stricmp HAVE__STRICMP)
|
||||
CHECK_FUNCTION_EXISTS(_strtoi64 HAVE__STRTOI64)
|
||||
CHECK_FUNCTION_EXISTS(_strtoui64 HAVE__STRTOUI64)
|
||||
CHECK_FUNCTION_EXISTS(_unlink HAVE__UNLINK)
|
||||
CHECK_FUNCTION_EXISTS(arc4random HAVE_ARC4RANDOM)
|
||||
CHECK_FUNCTION_EXISTS(clonefile HAVE_CLONEFILE)
|
||||
CHECK_FUNCTION_EXISTS(explicit_bzero HAVE_EXPLICIT_BZERO)
|
||||
CHECK_FUNCTION_EXISTS(explicit_memset HAVE_EXPLICIT_MEMSET)
|
||||
CHECK_FUNCTION_EXISTS(fileno HAVE_FILENO)
|
||||
CHECK_FUNCTION_EXISTS(fseeko HAVE_FSEEKO)
|
||||
CHECK_FUNCTION_EXISTS(ftello HAVE_FTELLO)
|
||||
CHECK_FUNCTION_EXISTS(getprogname HAVE_GETPROGNAME)
|
||||
CHECK_FUNCTION_EXISTS(localtime_r HAVE_LOCALTIME_R)
|
||||
CHECK_FUNCTION_EXISTS(open HAVE_OPEN)
|
||||
CHECK_FUNCTION_EXISTS(setmode HAVE_SETMODE)
|
||||
CHECK_FUNCTION_EXISTS(snprintf HAVE_SNPRINTF)
|
||||
CHECK_FUNCTION_EXISTS(strcasecmp HAVE_STRCASECMP)
|
||||
CHECK_FUNCTION_EXISTS(strdup HAVE_STRDUP)
|
||||
CHECK_FUNCTION_EXISTS(stricmp HAVE_STRICMP)
|
||||
CHECK_FUNCTION_EXISTS(strtoll HAVE_STRTOLL)
|
||||
CHECK_FUNCTION_EXISTS(strtoull HAVE_STRTOULL)
|
||||
|
||||
CHECK_INCLUDE_FILES("sys/types.h;sys/stat.h;fts.h" HAVE_FTS_H)
|
||||
CHECK_INCLUDE_FILES(stdbool.h HAVE_STDBOOL_H)
|
||||
CHECK_INCLUDE_FILES(strings.h HAVE_STRINGS_H)
|
||||
CHECK_INCLUDE_FILES(unistd.h HAVE_UNISTD_H)
|
||||
|
||||
CHECK_INCLUDE_FILES(inttypes.h HAVE_INTTYPES_H_LIBZIP)
|
||||
CHECK_INCLUDE_FILES(stdint.h HAVE_STDINT_H_LIBZIP)
|
||||
CHECK_INCLUDE_FILES(sys/types.h HAVE_SYS_TYPES_H_LIBZIP)
|
||||
|
||||
# TODO: fix test
|
||||
# this test does not find __progname even when it exists
|
||||
#CHECK_SYMBOL_EXISTS(__progname stdlib.h HAVE___PROGNAME)
|
||||
|
||||
CHECK_TYPE_SIZE(__int8 __INT8_LIBZIP)
|
||||
CHECK_TYPE_SIZE(int8_t INT8_T_LIBZIP)
|
||||
CHECK_TYPE_SIZE(uint8_t UINT8_T_LIBZIP)
|
||||
CHECK_TYPE_SIZE(__int16 __INT16_LIBZIP)
|
||||
CHECK_TYPE_SIZE(int16_t INT16_T_LIBZIP)
|
||||
CHECK_TYPE_SIZE(uint16_t UINT16_T_LIBZIP)
|
||||
CHECK_TYPE_SIZE(__int32 __INT32_LIBZIP)
|
||||
CHECK_TYPE_SIZE(int32_t INT32_T_LIBZIP)
|
||||
CHECK_TYPE_SIZE(uint32_t UINT32_T_LIBZIP)
|
||||
CHECK_TYPE_SIZE(__int64 __INT64_LIBZIP)
|
||||
CHECK_TYPE_SIZE(int64_t INT64_T_LIBZIP)
|
||||
CHECK_TYPE_SIZE(uint64_t UINT64_T_LIBZIP)
|
||||
CHECK_TYPE_SIZE("short" SHORT_LIBZIP)
|
||||
CHECK_TYPE_SIZE("int" INT_LIBZIP)
|
||||
CHECK_TYPE_SIZE("long" LONG_LIBZIP)
|
||||
CHECK_TYPE_SIZE("long long" LONG_LONG_LIBZIP)
|
||||
CHECK_TYPE_SIZE("off_t" SIZEOF_OFF_T)
|
||||
CHECK_TYPE_SIZE("size_t" SIZE_T_LIBZIP)
|
||||
CHECK_TYPE_SIZE("ssize_t" SSIZE_T_LIBZIP)
|
||||
|
||||
CHECK_C_SOURCE_COMPILES("#include <sys/ioctl.h>
|
||||
#include <linux/fs.h>
|
||||
int main(int argc, char *argv[]) { unsigned long x = FICLONERANGE; }" HAVE_FICLONERANGE)
|
||||
|
||||
CHECK_C_SOURCE_COMPILES("
|
||||
int foo(char * _Nullable bar);
|
||||
int main(int argc, char *argv[]) { }" HAVE_NULLABLE)
|
||||
|
||||
TEST_BIG_ENDIAN(WORDS_BIGENDIAN)
|
||||
|
||||
FIND_PACKAGE(ZLIB 1.1.2 REQUIRED)
|
||||
INCLUDE_DIRECTORIES(${ZLIB_INCLUDE_DIR})
|
||||
SET(CMAKE_REQUIRED_INCLUDES ${ZLIB_INCLUDE_DIR})
|
||||
|
||||
IF(ENABLE_BZIP2)
|
||||
FIND_PACKAGE(BZip2)
|
||||
IF(BZIP2_FOUND)
|
||||
SET (HAVE_LIBBZ2 1)
|
||||
|
||||
INCLUDE_DIRECTORIES(${BZIP2_INCLUDE_DIR})
|
||||
SET (OPTIONAL_LIBRARY ${OPTIONAL_LIBRARY} ${BZIP2_LIBRARIES})
|
||||
ELSE()
|
||||
MESSAGE(WARNING "-- bzip2 library not found; bzip2 support disabled")
|
||||
ENDIF(BZIP2_FOUND)
|
||||
ENDIF(ENABLE_BZIP2)
|
||||
|
||||
IF(ENABLE_LZMA)
|
||||
FIND_PACKAGE(LibLZMA)
|
||||
IF(LIBLZMA_FOUND)
|
||||
SET (HAVE_LIBLZMA 1)
|
||||
|
||||
INCLUDE_DIRECTORIES(${LIBLZMA_INCLUDE_DIR})
|
||||
SET (OPTIONAL_LIBRARY ${OPTIONAL_LIBRARY} ${LIBLZMA_LIBRARY})
|
||||
ELSE()
|
||||
MESSAGE(WARNING "-- lzma library not found; lzma support disabled")
|
||||
ENDIF(LIBLZMA_FOUND)
|
||||
ENDIF(ENABLE_LZMA)
|
||||
|
||||
|
||||
IF (COMMONCRYPTO_FOUND)
|
||||
SET (HAVE_CRYPTO 1)
|
||||
SET (HAVE_COMMONCRYPTO 1)
|
||||
ELSEIF (WINDOWS_CRYPTO_FOUND)
|
||||
SET (HAVE_CRYPTO 1)
|
||||
SET (HAVE_WINDOWS_CRYPTO 1)
|
||||
ELSEIF (GNUTLS_FOUND AND NETTLE_FOUND)
|
||||
SET (HAVE_CRYPTO 1)
|
||||
SET (HAVE_GNUTLS 1)
|
||||
INCLUDE_DIRECTORIES(${GNUTLS_INCLUDE_DIR} ${NETTLE_INCLUDE_DIR})
|
||||
SET (OPTIONAL_LIBRARY ${OPTIONAL_LIBRARY} ${GNUTLS_LIBRARY} ${NETTLE_LIBRARY})
|
||||
ELSEIF (OPENSSL_FOUND)
|
||||
SET (HAVE_CRYPTO 1)
|
||||
SET (HAVE_OPENSSL 1)
|
||||
INCLUDE_DIRECTORIES(${OPENSSL_INCLUDE_DIR})
|
||||
SET (OPTIONAL_LIBRARY ${OPTIONAL_LIBRARY} ${OPENSSL_LIBRARIES})
|
||||
ELSEIF (MBEDTLS_LIBRARIES)
|
||||
SET (HAVE_CRYPTO 1)
|
||||
SET (HAVE_MBEDTLS 1)
|
||||
INCLUDE_DIRECTORIES(${MBEDTLS_INCLUDE_DIR})
|
||||
SET (OPTIONAL_LIBRARY ${OPTIONAL_LIBRARY} ${MBEDTLS_LIBRARIES})
|
||||
ENDIF()
|
||||
|
||||
IF (NOT HAVE_CRYPTO)
|
||||
MESSAGE(WARNING "-- neither Common Crypto, GnuTLS, mbed TLS, OpenSSL, nor Windows Cryptography found; AES support disabled")
|
||||
ENDIF()
|
||||
|
||||
IF(MSVC)
|
||||
ADD_DEFINITIONS("-D_CRT_SECURE_NO_WARNINGS")
|
||||
ADD_DEFINITIONS("-D_CRT_NONSTDC_NO_DEPRECATE")
|
||||
ENDIF(MSVC)
|
||||
|
||||
if(WIN32)
|
||||
if(HAVE_WINDOWS_CRYPTO)
|
||||
SET (OPTIONAL_LIBRARY ${OPTIONAL_LIBRARY} bcrypt)
|
||||
endif()
|
||||
if(CMAKE_SYSTEM_NAME MATCHES WindowsPhone OR CMAKE_SYSTEM_NAME MATCHES WindowsStore)
|
||||
ADD_DEFINITIONS(-DMS_UWP)
|
||||
else(CMAKE_SYSTEM_NAME MATCHES WindowsPhone OR CMAKE_SYSTEM_NAME MATCHES WindowsStore)
|
||||
SET (OPTIONAL_LIBRARY ${OPTIONAL_LIBRARY} advapi32)
|
||||
endif(CMAKE_SYSTEM_NAME MATCHES WindowsPhone OR CMAKE_SYSTEM_NAME MATCHES WindowsStore)
|
||||
endif(WIN32)
|
||||
|
||||
ADD_DEFINITIONS("-DHAVE_CONFIG_H")
|
||||
|
||||
# rpath handling: use rpath in installed binaries
|
||||
IF(NOT CMAKE_SYSTEM_NAME MATCHES Linux)
|
||||
SET(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}")
|
||||
SET(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
|
||||
ENDIF()
|
||||
|
||||
# Testing
|
||||
ENABLE_TESTING()
|
||||
|
||||
# Targets
|
||||
ADD_SUBDIRECTORY(lib)
|
||||
|
||||
IF(BUILD_DOC)
|
||||
ADD_SUBDIRECTORY(man)
|
||||
ENDIF()
|
||||
|
||||
IF(BUILD_TOOLS)
|
||||
ADD_SUBDIRECTORY(src)
|
||||
ENDIF()
|
||||
|
||||
IF(BUILD_REGRESS)
|
||||
ADD_SUBDIRECTORY(regress)
|
||||
ENDIF()
|
||||
|
||||
IF(BUILD_EXAMPLES)
|
||||
ADD_SUBDIRECTORY(examples)
|
||||
ENDIF()
|
||||
|
||||
|
||||
# pkgconfig file
|
||||
SET(prefix ${CMAKE_INSTALL_PREFIX})
|
||||
SET(exec_prefix \${prefix})
|
||||
SET(bindir \${exec_prefix}/${CMAKE_INSTALL_BINDIR})
|
||||
SET(libdir \${exec_prefix}/${CMAKE_INSTALL_LIBDIR})
|
||||
SET(includedir \${prefix}/${CMAKE_INSTALL_INCLUDEDIR})
|
||||
IF(CMAKE_SYSTEM_NAME MATCHES BSD)
|
||||
SET(PKG_CONFIG_RPATH "-Wl,-R\${libdir}")
|
||||
ENDIF(CMAKE_SYSTEM_NAME MATCHES BSD)
|
||||
get_target_property(LIBS_PRIVATE zip LINK_LIBRARIES)
|
||||
foreach(LIB ${LIBS_PRIVATE})
|
||||
if(LIB MATCHES "^/")
|
||||
get_filename_component(LIB ${LIB} NAME_WE)
|
||||
string(REGEX REPLACE "^lib" "" LIB ${LIB})
|
||||
endif()
|
||||
set(LIBS "${LIBS} -l${LIB}")
|
||||
endforeach()
|
||||
CONFIGURE_FILE(libzip.pc.in libzip.pc @ONLY)
|
||||
INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/libzip.pc DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig)
|
||||
|
||||
# fixed size integral types
|
||||
|
||||
IF(HAVE_INTTYPES_H_LIBZIP)
|
||||
SET(LIBZIP_TYPES_INCLUDE "#define __STDC_FORMAT_MACROS 1
|
||||
#include <inttypes.h>")
|
||||
ELSEIF(HAVE_STDINT_H_LIBZIP)
|
||||
SET(LIBZIP_TYPES_INCLUDE "#include <stdint.h>")
|
||||
ELSEIF(HAVE_SYS_TYPES_H_LIBZIP)
|
||||
SET(LIBZIP_TYPES_INCLUDE "#include <sys/types.h>")
|
||||
ENDIF()
|
||||
|
||||
IF(HAVE_INT8_T_LIBZIP)
|
||||
SET(ZIP_INT8_T int8_t)
|
||||
ELSEIF(HAVE___INT8_LIBZIP)
|
||||
SET(ZIP_INT8_T __int8)
|
||||
ELSE()
|
||||
SET(ZIP_INT8_T "signed char")
|
||||
ENDIF()
|
||||
|
||||
IF(HAVE_UINT8_T_LIBZIP)
|
||||
SET(ZIP_UINT8_T uint8_t)
|
||||
ELSEIF(HAVE___INT8_LIBZIP)
|
||||
SET(ZIP_UINT8_T "unsigned __int8")
|
||||
ELSE()
|
||||
SET(ZIP_UINT8_T "unsigned char")
|
||||
ENDIF()
|
||||
|
||||
IF(HAVE_INT16_T_LIBZIP)
|
||||
SET(ZIP_INT16_T int16_t)
|
||||
ELSEIF(HAVE___INT16_LIBZIP)
|
||||
SET(INT16_T_LIBZIP __int16)
|
||||
ELSEIF(SHORT_LIBZIP EQUAL 2)
|
||||
SET(INT16_T_LIBZIP short)
|
||||
ENDIF()
|
||||
|
||||
IF(HAVE_UINT16_T_LIBZIP)
|
||||
SET(ZIP_UINT16_T uint16_t)
|
||||
ELSEIF(HAVE___INT16_LIBZIP)
|
||||
SET(UINT16_T_LIBZIP "unsigned __int16")
|
||||
ELSEIF(SHORT_LIBZIP EQUAL 2)
|
||||
SET(UINT16_T_LIBZIP "unsigned short")
|
||||
ENDIF()
|
||||
|
||||
IF(HAVE_INT32_T_LIBZIP)
|
||||
SET(ZIP_INT32_T int32_t)
|
||||
ELSEIF(HAVE___INT32_LIBZIP)
|
||||
SET(ZIP_INT32_T __int32)
|
||||
ELSEIF(INT_LIBZIP EQUAL 4)
|
||||
SET(ZIP_INT32_T int)
|
||||
ELSEIF(LONG_LIBZIP EQUAL 4)
|
||||
SET(ZIP_INT32_T long)
|
||||
ENDIF()
|
||||
|
||||
IF(HAVE_UINT32_T_LIBZIP)
|
||||
SET(ZIP_UINT32_T uint32_t)
|
||||
ELSEIF(HAVE___INT32_LIBZIP)
|
||||
SET(ZIP_UINT32_T "unsigned __int32")
|
||||
ELSEIF(INT_LIBZIP EQUAL 4)
|
||||
SET(ZIP_UINT32_T "unsigned int")
|
||||
ELSEIF(LONG_LIBZIP EQUAL 4)
|
||||
SET(ZIP_UINT32_T "unsigned long")
|
||||
ENDIF()
|
||||
|
||||
IF(HAVE_INT64_T_LIBZIP)
|
||||
SET(ZIP_INT64_T int64_t)
|
||||
ELSEIF(HAVE___INT64_LIBZIP)
|
||||
SET(ZIP_INT64_T __int64)
|
||||
ELSEIF(LONG_LIBZIP EQUAL 8)
|
||||
SET(ZIP_INT64_T long)
|
||||
ELSEIF(LONG_LONG_LIBZIP EQUAL 8)
|
||||
SET(ZIP_INT64_T "long long")
|
||||
ENDIF()
|
||||
|
||||
IF(HAVE_UINT64_T_LIBZIP)
|
||||
SET(ZIP_UINT64_T uint64_t)
|
||||
ELSEIF(HAVE___INT64_LIBZIP)
|
||||
SET(ZIP_UINT64_T "unsigned __int64")
|
||||
ELSEIF(LONG_LIBZIP EQUAL 8)
|
||||
SET(ZIP_UINT64_T "unsigned long")
|
||||
ELSEIF(LONG_LONG_LIBZIP EQUAL 8)
|
||||
SET(ZIP_UINT64_T "unsigned long long")
|
||||
ENDIF()
|
||||
|
||||
IF(HAVE_NULLABLE)
|
||||
SET(ZIP_NULLABLE_DEFINES)
|
||||
ELSE()
|
||||
SET(ZIP_NULLABLE_DEFINES "#define _Nullable
|
||||
#define _Nonnull")
|
||||
ENDIF()
|
||||
|
||||
# write out config file
|
||||
CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/cmake-config.h.in ${CMAKE_CURRENT_BINARY_DIR}/config.h)
|
||||
CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/cmake-zipconf.h.in ${CMAKE_CURRENT_BINARY_DIR}/zipconf.h)
|
||||
|
||||
# for tests
|
||||
|
||||
SET(srcdir ${CMAKE_CURRENT_SOURCE_DIR}/regress)
|
||||
SET(abs_srcdir ${CMAKE_CURRENT_SOURCE_DIR}/regress)
|
||||
SET(top_builddir ${CMAKE_CURRENT_BINARY_DIR}) # used to find config.h
|
||||
|
||||
CONFIGURE_FILE(regress/runtest.in ${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/runtest @ONLY)
|
||||
FILE(COPY ${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/runtest
|
||||
DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/regress
|
||||
FILE_PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE
|
||||
)
|
||||
|
||||
|
||||
# installation
|
||||
|
||||
INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/zipconf.h DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
|
23
externals/libzip/libzip/FindNettle.cmake
vendored
Executable file
23
externals/libzip/libzip/FindNettle.cmake
vendored
Executable file
@@ -0,0 +1,23 @@
|
||||
# - Find Nettle
|
||||
# Find the Nettle include directory and library
|
||||
#
|
||||
# NETTLE_INCLUDE_DIR - where to find <nettle/sha.h>, etc.
|
||||
# NETTLE_LIBRARIES - List of libraries when using libnettle.
|
||||
# NETTLE_FOUND - True if libnettle found.
|
||||
|
||||
IF (NETTLE_INCLUDE_DIR)
|
||||
# Already in cache, be silent
|
||||
SET(NETTLE_FIND_QUIETLY TRUE)
|
||||
ENDIF (NETTLE_INCLUDE_DIR)
|
||||
|
||||
FIND_PATH(NETTLE_INCLUDE_DIR nettle/md5.h nettle/ripemd160.h nettle/sha.h)
|
||||
FIND_LIBRARY(NETTLE_LIBRARY NAMES nettle libnettle)
|
||||
|
||||
# handle the QUIETLY and REQUIRED arguments and set NETTLE_FOUND to TRUE if
|
||||
# all listed variables are TRUE
|
||||
INCLUDE(FindPackageHandleStandardArgs)
|
||||
FIND_PACKAGE_HANDLE_STANDARD_ARGS(NETTLE DEFAULT_MSG NETTLE_LIBRARY NETTLE_INCLUDE_DIR)
|
||||
|
||||
IF(NETTLE_FOUND)
|
||||
SET(NETTLE_LIBRARIES ${NETTLE_LIBRARY})
|
||||
ENDIF(NETTLE_FOUND)
|
58
externals/libzip/libzip/INSTALL.md
vendored
Executable file
58
externals/libzip/libzip/INSTALL.md
vendored
Executable file
@@ -0,0 +1,58 @@
|
||||
libzip uses [cmake](https://cmake.org) to build.
|
||||
|
||||
For running the tests, you need to have [perl](https://www.perl.org).
|
||||
|
||||
You'll need [zlib](http://www.zlib.net/) (at least version 1.1.2). It
|
||||
comes with most operating systems.
|
||||
|
||||
For supporting bzip2-compressed zip archives, you need
|
||||
[bzip2](http://bzip.org/).
|
||||
|
||||
For supporting xz-compressed zip archives, you need
|
||||
[liblzma](https://tukaani.org/xz/) which is part of xz.
|
||||
|
||||
For AES (encryption) support, you need one of these cryptographic libraries,
|
||||
listed in order of preference:
|
||||
|
||||
- Apple's CommonCrypto (available on macOS and iOS)
|
||||
- [GnuTLS](https://www.gnutls.org/)
|
||||
- [mbed TLS](https://tls.mbed.org/)
|
||||
- [OpenSSL](https://www.openssl.org/) >= 1.0.
|
||||
- Microsoft Windows Cryptography Framework
|
||||
|
||||
If you don't want a library even if it is installed, you can
|
||||
pass `-DENABLE_<LIBRARY>=OFF` to cmake, where `<LIBRARY>` is one of
|
||||
`COMMONCRYPTO`, `GNUTLS`, `MBEDTLS`, or `OPENSSL`.
|
||||
|
||||
The basic usage is
|
||||
```sh
|
||||
mkdir build
|
||||
cd build
|
||||
cmake ..
|
||||
make
|
||||
make test
|
||||
make install
|
||||
```
|
||||
|
||||
Some useful parameters you can pass to `cmake` with `-Dparameter=value`:
|
||||
|
||||
- `BUILD_SHARED_LIBS`: set to `ON` or `OFF` to enable/disable building
|
||||
of shared libraries, defaults to `ON`
|
||||
- `CMAKE_INSTALL_PREFIX`: for setting the installation path
|
||||
- `DOCUMENTATION_FORMAT`: choose one of 'man', 'mdoc', and 'html' for
|
||||
the installed documentation (default: decided by cmake depending on
|
||||
available tools)
|
||||
|
||||
If you want to compile with custom `CFLAGS`, set them in the environment
|
||||
before running `cmake`:
|
||||
```sh
|
||||
CFLAGS=-DMY_CUSTOM_FLAG cmake ..
|
||||
```
|
||||
|
||||
If you are compiling on a system with a small stack size, add
|
||||
`-DZIP_ALLOCATE_BUFFER` to `CFLAGS`.
|
||||
|
||||
You can get verbose build output with by passing `VERBOSE=1` to
|
||||
`make`.
|
||||
|
||||
You can also check the [cmake FAQ](https://cmake.org/Wiki/CMake_FAQ).
|
31
externals/libzip/libzip/LICENSE
vendored
Executable file
31
externals/libzip/libzip/LICENSE
vendored
Executable file
@@ -0,0 +1,31 @@
|
||||
Copyright (C) 1999-2019 Dieter Baron and Thomas Klausner
|
||||
|
||||
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.
|
235
externals/libzip/libzip/NEWS.md
vendored
Executable file
235
externals/libzip/libzip/NEWS.md
vendored
Executable file
@@ -0,0 +1,235 @@
|
||||
1.X.X [20XX-XX-XX]
|
||||
==================
|
||||
|
||||
* Avoid using umask() since it's not thread-safe.
|
||||
* Set close-on-exec flag when opening files.
|
||||
* Do not accept empty files as valid zip archives any longer.
|
||||
* Add support for XZ compressed files (using liblzma).
|
||||
|
||||
1.5.2 [2019-03-12]
|
||||
==================
|
||||
* Fix bug in AES encryption affecting certain file sizes
|
||||
* Keep file permissions when modifying zip archives
|
||||
* Support systems with small stack size.
|
||||
* Support mbed TLS as crypto backend.
|
||||
* Add nullability annotations.
|
||||
|
||||
1.5.1 [2018-04-11]
|
||||
==================
|
||||
|
||||
* Choose format of installed documentation based on available tools.
|
||||
* Fix visibility of symbols.
|
||||
* Fix zipcmp directory support.
|
||||
* Don't set RPATH on Linux.
|
||||
* Use Libs.private for link dependencies in pkg-config file.
|
||||
* Fix build with LibreSSL.
|
||||
* Various bugfixes.
|
||||
|
||||
1.5.0 [2018-03-11]
|
||||
==================
|
||||
|
||||
* Use standard cryptographic library instead of custom AES implementation.
|
||||
This also simplifies the license.
|
||||
* Use `clang-format` to format the source code.
|
||||
* More Windows improvements.
|
||||
|
||||
1.4.0 [2017-12-29]
|
||||
==================
|
||||
|
||||
* Improve build with cmake
|
||||
* Retire autoconf/automake build system
|
||||
* Add `zip_source_buffer_fragment()`.
|
||||
* Add support to clone unchanged beginning of archive (instead of rewriting it).
|
||||
Supported for buffer sources and on Apple File System.
|
||||
* Add support for Microsoft Universal Windows Platform.
|
||||
|
||||
1.3.2 [2017-11-20]
|
||||
==================
|
||||
* Fix bug introduced in last: zip_t was erroneously freed if zip_close() failed.
|
||||
|
||||
1.3.1 [2017-11-19]
|
||||
==================
|
||||
|
||||
* Install zipconf.h into ${PREFIX}/include
|
||||
* Add zip_libzip_version()
|
||||
* Fix AES tests on Linux
|
||||
|
||||
1.3.0 [2017-09-02]
|
||||
==================
|
||||
|
||||
* Support bzip2 compressed zip archives
|
||||
* Improve file progress callback code
|
||||
* Fix zip_fdopen()
|
||||
* CVE-2017-12858: Fix double free()
|
||||
* CVE-2017-14107: Improve EOCD64 parsing
|
||||
|
||||
1.2.0 [2017-02-19]
|
||||
==================
|
||||
|
||||
* Support for AES encryption (Winzip version), both encryption
|
||||
and decryption
|
||||
* Support legacy zip files with >64k entries
|
||||
* Fix seeking in zip_source_file if start > 0
|
||||
* Add zip_fseek() for seeking in uncompressed data
|
||||
* Add zip_ftell() for telling position in uncompressed data
|
||||
* Add zip_register_progress_callback() for UI updates during zip_close()
|
||||
|
||||
1.1.3 [2016-05-28]
|
||||
==================
|
||||
|
||||
* Fix build on Windows when using autoconf
|
||||
|
||||
1.1.2 [2016-02-19]
|
||||
==================
|
||||
|
||||
* Improve support for 3MF files
|
||||
|
||||
1.1.1 [2016-02-07]
|
||||
==================
|
||||
|
||||
* Build fixes for Linux
|
||||
* Fix some warnings reported by PVS-Studio
|
||||
|
||||
1.1 [2016-01-26]
|
||||
================
|
||||
|
||||
* ziptool(1): command line tool to modify zip archives
|
||||
* Speedups for archives with many entries
|
||||
* Coverity fixes
|
||||
* Better APK support
|
||||
* Support for running tests on Windows
|
||||
* More build fixes for Windows
|
||||
* Portability fixes
|
||||
* Documentation improvements
|
||||
|
||||
1.0.1 [2015-05-04]
|
||||
==================
|
||||
|
||||
* Build fixes for Windows
|
||||
|
||||
1.0 [2015-05-03]
|
||||
================
|
||||
|
||||
* Implemented an I/O abstraction layer
|
||||
* Added support for native Windows API for files
|
||||
* Added support for setting the last modification time for a file
|
||||
* Added a new type zip_error_t for errors
|
||||
* Added more typedefs for structs
|
||||
* Torrentzip support was removed
|
||||
* CVE-2015-2331 was fixed
|
||||
* Addressed all Coverity CIDs
|
||||
|
||||
0.11.2 [2013-12-19]
|
||||
===================
|
||||
|
||||
* Support querying/setting operating system and external attributes
|
||||
* For newly added files, set operating system to UNIX, permissions
|
||||
to 0666 (0777 for directories)
|
||||
* Fix bug when writing zip archives containing files bigger than 4GB
|
||||
|
||||
0.11.1 [2013-04-27]
|
||||
===================
|
||||
|
||||
* Fix bugs in zip_set_file_compression()
|
||||
* Include Xcode build infrastructure
|
||||
|
||||
0.11 [2013-03-23]
|
||||
=================
|
||||
|
||||
* Added Zip64 support (large file support)
|
||||
* Added UTF-8 support for file names, file comments, and archive comments
|
||||
* Changed API for name and comment related functions for UTF-8 support
|
||||
* Added zip_discard()
|
||||
* Added ZIP_TRUNCATE for zip_open()
|
||||
* Added zip_set_file_compression()
|
||||
* Added API for accessing and modifying extra fields
|
||||
* Improved API type consistency
|
||||
* Use gcc4's visibility __attribute__
|
||||
* More changes for Windows support
|
||||
* Additional test cases
|
||||
|
||||
0.10.1 [2012-03-20]
|
||||
===================
|
||||
|
||||
* Fixed CVE-2012-1162
|
||||
* Fixed CVE-2012-1163
|
||||
|
||||
0.10 [2010-03-18]
|
||||
=================
|
||||
|
||||
* Added zip_get_num_entries(), deprecated zip_get_num_files()
|
||||
* Better windows support
|
||||
* Support for traditional PKWARE encryption added
|
||||
* Fix opening archives with more than 65535 entries
|
||||
* Fix some memory leaks
|
||||
* Fix cmake build and installation
|
||||
* Fix memory leak in error case in zip_open()
|
||||
* Fixed CVE-2011-0421 (no security implications though)
|
||||
* More documentation
|
||||
|
||||
0.9.3 [2010-02-01]
|
||||
==================
|
||||
|
||||
* Include m4/ directory in distribution; some packagers need it
|
||||
|
||||
0.9.2 [2010-01-31]
|
||||
==================
|
||||
|
||||
* Avoid passing uninitialized data to deflate()
|
||||
* Fix memory leak when closing zip archives
|
||||
|
||||
0.9.1 [2010-01-24]
|
||||
==================
|
||||
|
||||
* Fix infinite loop on reading some broken files
|
||||
* Optimization in time conversion (don't call localtime())
|
||||
* Clear data descriptor flag in central directory, fixing Open Office files
|
||||
* Allow more than 64k entries
|
||||
|
||||
0.9 [2008-07-25]
|
||||
==================
|
||||
|
||||
* on Windows, explictly set dllimport/dllexport
|
||||
* remove erroneous references to GPL
|
||||
* add support for torrentzip
|
||||
* new functions: zip_get_archive_flag, zip_set_archive_flag
|
||||
* zip_source_zip: add flag to force recompression
|
||||
* zip_sorce_file: only keep file open while reading from it
|
||||
|
||||
0.8 [2007-06-06]
|
||||
==================
|
||||
|
||||
* fix for zip archives larger than 2GiB
|
||||
* fix zip_error_strerror to include libzip error string
|
||||
* add support for reading streamed zip files
|
||||
* new functions: zip_add_dir, zip_error_clear, zip_file_error_clear
|
||||
* add basic support for building with CMake (incomplete)
|
||||
|
||||
0.7.1 [2006-05-18]
|
||||
==================
|
||||
|
||||
* bugfix for zip_close
|
||||
|
||||
0.7 [2006-05-06]
|
||||
================
|
||||
|
||||
* struct zip_stat increased for future encryption support
|
||||
* zip_add return value changed (now returns new index of added file)
|
||||
* shared library major bump because of previous two
|
||||
* added functions for reading and writing file and archive comments
|
||||
New functions: zip_get_archive_comment, zip_get_file_comment,
|
||||
zip_set_archive_comment, zip_set_file_comment, zip_unchange_archive
|
||||
|
||||
0.6.1 [2005-07-14]
|
||||
==================
|
||||
|
||||
* various bug fixes
|
||||
|
||||
0.6 [2005-06-09]
|
||||
================
|
||||
|
||||
* first standalone release
|
||||
* changed license to three-clause BSD
|
||||
* overhauled API
|
||||
* added man pages
|
||||
* install zipcmp and zipmerge
|
39
externals/libzip/libzip/README.md
vendored
Executable file
39
externals/libzip/libzip/README.md
vendored
Executable file
@@ -0,0 +1,39 @@
|
||||
This is libzip, a C library for reading, creating, and modifying zip
|
||||
archives. Files can be added from data buffers, files, or compressed
|
||||
data copied directly from other zip archives. Changes made without
|
||||
closing the archive can be reverted. Decryption and encryption of
|
||||
Winzip AES and decryption of legacy PKware encrypted files is
|
||||
supported. The API is documented by man pages.
|
||||
|
||||
libzip is fully documented via man pages. HTML versions of the man
|
||||
pages are on [libzip.org](https://libzip.org/documentation/) and
|
||||
in the [man](man) directory. You can start with
|
||||
[libzip(3)](https://libzip.org/documentation/libzip.html), which
|
||||
lists
|
||||
all others. Example source code is in the [examples](examples) and
|
||||
[src](src) subdirectories.
|
||||
|
||||
If you have developed an application using libzip, you can find out
|
||||
about API changes and how to adapt your code for them in the included
|
||||
file [API-CHANGES.md](API-CHANGES.md).
|
||||
|
||||
See the [INSTALL.md](INSTALL.md) file for installation instructions and
|
||||
dependencies.
|
||||
|
||||
If you make a binary distribution, please include a pointer to the
|
||||
distribution site:
|
||||
> https://libzip.org/
|
||||
|
||||
The latest version can always be found there. The official repository
|
||||
is at [github](https://github.com/nih-at/libzip/).
|
||||
|
||||
There is a mailing list for developers using libzip. You can
|
||||
subscribe to it by sending a mail with the subject "subscribe
|
||||
libzip-discuss" to minimalist at nih.at. List mail should be sent
|
||||
to libzip-discuss at nih.at. Use this for bug reports or questions.
|
||||
|
||||
If you want to reach the authors in private, use <libzip@nih.at>.
|
||||
|
||||
[](https://travis-ci.org/nih-at/libzip)
|
||||
[](https://ci.appveyor.com/project/0-wiz-0/libzip)
|
||||
[](https://scan.coverity.com/projects/libzip)
|
96
externals/libzip/libzip/THANKS
vendored
Executable file
96
externals/libzip/libzip/THANKS
vendored
Executable file
@@ -0,0 +1,96 @@
|
||||
Thanks to Info-ZIP for info on the DOS-time/date conversion code,
|
||||
and some other general information gathered from their sources.
|
||||
|
||||
Thanks to these people for suggestions, testing, and bug reports:
|
||||
|
||||
Agostino Sarubbo
|
||||
Alexander Galanin <al@galanin.nnov.ru>
|
||||
Alexandr Shadchin <alexandr.shadchin@gmail.com>
|
||||
Alexey Bykov <gnfalex@rambler.ru>
|
||||
Andreas Falkenhahn <andreas@falkenhahn.com>
|
||||
Andrew Brampton <brampton@gmail.com>
|
||||
Andrew Molyneux <andrew@molyneuxfamily.co.uk>
|
||||
Ankur Kothari <ankz.kothari@gmail.com>
|
||||
BALATON Zoltan <balaton@eik.bme.hu>
|
||||
Benjamin Gilbert <bgilbert@backtick.net>
|
||||
Beuc <beuc@beuc.net>
|
||||
Boaz Stolk <bstolk@aweta.nl>
|
||||
Bogdan <bogiebog@gmail.com>
|
||||
Brian 'geeknik' Carpenter <geeknik@protonmail.ch>
|
||||
Carl Mastrangelo <notcarl@google.com>
|
||||
Cédric Tabin
|
||||
celan69
|
||||
Chris Nehren <cnehren+libzip@pobox.com>
|
||||
Coverity <info@coverity.com>
|
||||
Dane Springmeyer <dane.springmeyer@gmail.com>
|
||||
David Demelier <demelier.david@gmail.com>
|
||||
Declan Moran
|
||||
Del Merritt <del@alum.mit.edu>
|
||||
Dmytro Rybachenko <atmoliton@gmail.com>
|
||||
Elvis Angelaccio
|
||||
Erwin Haid <erwin.haid@gmx.de>
|
||||
Eun-cheol Joo
|
||||
Florian Delizy <florian.delizy@gmail.com>
|
||||
François Simon <AT.GFI.Francois.SIMON@sesam-vitale.fr>
|
||||
Frederik Ramm <frederik@remote.org>
|
||||
Hanno Böck <hanno@hboeck.de>
|
||||
HeeMyung
|
||||
Heiko Becker
|
||||
Heiko Hund <heiko@ist.eigentlich.net>
|
||||
Ilya Voronin
|
||||
Info-ZIP group
|
||||
Jan Weiß <jan@geheimwerk.de>
|
||||
Jay Freeman (saurik) <saurik@saurik.com>
|
||||
Joachim Reichel <joachim.reichel@gmx.de>
|
||||
João Custódio <joao_custodio@symantec.com>
|
||||
Joel Ebrahimi <joel.ebrahimi@gmail.com>
|
||||
Jono Spiro <jono.spiro@gmail.com>
|
||||
Julien Schueller <schueller@phimeca.com>
|
||||
kensington <kensington@gentoo.org>
|
||||
Keith Jones <keith@keithjjones.com>
|
||||
Kohei Yoshida <kohei.yoshida@gmail.com>
|
||||
Leith Bade <leith@mapbox.com>
|
||||
Lubomir I. Ivanov <neolit123@gmail.com>
|
||||
Maël Nison
|
||||
Martin Buchholz <martinrb@google.com>
|
||||
Martin Herkt <lachs0r@srsfckn.biz>
|
||||
Martin Szulecki <m.szulecki@libimobiledevice.org>
|
||||
Michael Balzer
|
||||
Michael Beck <mm.beck@gmx.net>
|
||||
Michał Janiszewski
|
||||
Michal Vyskocil <mvyskocil@suse.cz>
|
||||
Mikhail Gusarov <dottedmag@dottedmag.net>.
|
||||
Miklos Vajna
|
||||
Morris Hafner
|
||||
Oliver Kaiser <under.northern.sky@googlemail.com>
|
||||
Oliver Kuckertz <oliver.kuckertz@mologie.de>
|
||||
OSS-Fuzz Team
|
||||
Pascal Terjan <pterjan@gmail.com>
|
||||
Patrick Spendrin <ps_ml@gmx.de>
|
||||
Paul Harris <harris.pc@gmail.com>
|
||||
Paul Sheppard <shepsoft@googlemail.com>
|
||||
Pavel Raiskup <praiskup@redhat.com>
|
||||
Pierre Joye <pierre.php@gmail.com>
|
||||
Pierre-Louis Cabelguen <plcabelguen@googlemail.com>
|
||||
Randy <randy408@protonmail.com>
|
||||
Remi Collet <remi@fedoraproject.org>
|
||||
Richard Schütz
|
||||
Rick Carback <carback1@umbc.edu>
|
||||
Robert Norris <rw_norris@hotmail.com>
|
||||
Roberto Tirabassi <rtirabassi@3di.it>
|
||||
Roland Ortloff <Ortloff.R@gmx.de>
|
||||
Sergei Ozerov <ru.programmist@gmail.com>
|
||||
Simon Talbot <simont@nse.co.uk>
|
||||
Stephen Bryant <steve@bawue.de>
|
||||
Tarmo Pikaro <tapika@yahoo.com>
|
||||
TC
|
||||
Tim Lunn <Tim@feathertop.org>
|
||||
Timo Warns <warns@pre-sense.de>
|
||||
Tom Callaway <tcallawa@redhat.com>
|
||||
Tomas Hoger <thoger@redhat.com>
|
||||
Tomáš Malý <malytomas@ucpu.cz>
|
||||
Torsten Paul <Torsten.Paul@gmx.de>
|
||||
Vassili Courzakis <vcoxvco@googlemail.com>
|
||||
William Lee
|
||||
Wojciech Michalski <wmichalski@quay.pl>
|
||||
Wolfgang Glunz <Wolfgang.Glunz@gmx.de>
|
189
externals/libzip/libzip/TODO.md
vendored
Executable file
189
externals/libzip/libzip/TODO.md
vendored
Executable file
@@ -0,0 +1,189 @@
|
||||
# Soon
|
||||
|
||||
* review guidelines/community standards
|
||||
- (Linux Foundation Core Infrastructure Initiative Best Practices)[https://bestpractices.coreinfrastructure.org/]
|
||||
- (Readme Maturity Level)[https://github.com/LappleApple/feedmereadmes/blob/master/README-maturity-model.md]
|
||||
- (Github Community Profile)[https://github.com/nih-at/libzip/community]
|
||||
|
||||
* test different crypto backends with TravisCI.
|
||||
|
||||
* test for zipcmp reading directory (requires fts)
|
||||
|
||||
* improve man page formatting of tagged lists on webpage (`<dl>`)
|
||||
|
||||
* test error cases with special source
|
||||
- tell it which command should fail
|
||||
- use it both as source for `zip_add` and `zip_open_from_source`
|
||||
- `ziptool_regress`:
|
||||
- `-e error_spec`: source containing zip fails depending on `error_spec`
|
||||
- `add_with_error name content error_spec`: add content to archive, where source fails depending on `error_spec`
|
||||
- `add_file_with_error name file_to_add offset len error_spec`: add file to archive, len bytes starting from offset, where source fails depending on `error_spec`
|
||||
- `error_spec`:
|
||||
- source command that fails
|
||||
- error code that source returns
|
||||
- conditions that must be met for error to trigger
|
||||
- Nth call of command
|
||||
- read/write: total byte count so far
|
||||
- state of source (opened, EOF reached, ...)
|
||||
|
||||
# Later
|
||||
|
||||
## macOS / iOS framework
|
||||
|
||||
* get cmake to optionally build frameworks
|
||||
|
||||
## Prefixes
|
||||
|
||||
For example for adding extractors for self-extracting zip archives.
|
||||
````c
|
||||
zip_set_archive_prefix(struct zip *za, const zip_uint8_t *data, zip_uint64_t length);
|
||||
const zip_uint8_t *zip_get_archive_prefix(struct zip *za, zip_uint64_t *lengthp);
|
||||
````
|
||||
|
||||
## Compression
|
||||
|
||||
* add lzma support
|
||||
|
||||
## API Issues
|
||||
|
||||
* `zip_get_archive_comment` has `int *lenp` argument. Cleaner would be `zip_uint32_t *`.
|
||||
rename and fix. which other functions for naming consistency?
|
||||
* rename remaining `zip_XXX_{file,archive}_*` to `zip_{file,archive}_XXX_*`?
|
||||
* compression/crypt implementations: how to set error code on failure
|
||||
* compression/crypt error messages a la `ZIP_ER_ZLIB` (no detailed info passing)
|
||||
|
||||
## Features
|
||||
|
||||
* add seek support for AES-encrypted files
|
||||
* consistently use `_zip_crypto_clear()` for passwords
|
||||
* support setting extra fields from `zip_source`
|
||||
* introduce layers of extra fields:
|
||||
* original
|
||||
* from `zip_source`
|
||||
* manually set
|
||||
* when querying extra fields, search all of them in reverse order
|
||||
* add whiteout (deleted) flag
|
||||
* allow invalid data flag, used when computing extra field size before writing data
|
||||
* new command `ZIP_SOURCE_EXTRA_FIELDS`
|
||||
* no support for multiple copies of same extra field
|
||||
* delete all extra fields during `zip_replace()`
|
||||
* function to copy file from one archive to another
|
||||
* set `O_CLOEXEC` flag after fopen and mkstemp
|
||||
* `zip_file_set_mtime()`: support InfoZIP time stamps
|
||||
* support streaming output (creating new archive to e.g. stdout)
|
||||
* add function to read/set ASCII file flag
|
||||
* `zip_commit()` (to finish changes without closing archive)
|
||||
* add custom compression function support
|
||||
* `zip_source_zip()`: allow rewinding
|
||||
* add `zip_abort()` to allow aborting `zip_close()` (can be called from progress callback)
|
||||
* `zipcmp`: add option for file content comparison
|
||||
* `zipcmp`: add more paranoid checks:
|
||||
* external attributes/opsys
|
||||
* last_mod
|
||||
* version needed/made by
|
||||
* general purpose bit flags
|
||||
* add more consistency checks:
|
||||
* for stored files, test compressed = uncompressed
|
||||
* data descriptor
|
||||
* local headers come before central dir
|
||||
* support for old compression methods?
|
||||
|
||||
## Bugs
|
||||
|
||||
* support InfoZIP encryption header extension (copy data descriptor for encrypted files)
|
||||
* ensure that nentries is small enough not to cause overflow (size_t for entry, uint64 for CD on disk)
|
||||
* check for limits imposed by format (central dir size, file size, extra fields, ...)
|
||||
* `_zip_u2d_time()`: handle `localtime(3)` failure
|
||||
* POSIX: `zip_open()`: check whether file can be created and fail if not
|
||||
* fix inconsistent usage of valid flags (not checked in many places)
|
||||
* `cdr == NULL` -> `ER_NOENT` vs. `idx > cdir->nentry` -> `ER_INVAL` inconsistent (still there?)
|
||||
|
||||
|
||||
## Cleanup
|
||||
|
||||
* drop _LIBZIP suffixes in cmake defines (no longer needed since they no longer appear in zipconf.h)
|
||||
* go over cdir parser and rename various offset/size variables to make it clearer
|
||||
* use bool
|
||||
* use `ZIP_SOURCE_SUPPORTS_{READABLE,SEEKABLE,WRITABLE}`
|
||||
* use `zip_source_seek_compute_offset()`
|
||||
* get rid of `zip_get_{compression,encryption}_implementation()`
|
||||
* use `zip_*int*_t` internally
|
||||
|
||||
## Infrastructure
|
||||
|
||||
* rewrite `make_zip_errors.sh` in cmake
|
||||
* rewrite `make_zip_err_str.sh` in cmake
|
||||
* configure appveyor for Windows builds of libzip
|
||||
|
||||
## Test Case Issues
|
||||
|
||||
* add test case for clone with files > 4k
|
||||
* consider testing for malloc/realloc failures
|
||||
* Winzip AES support
|
||||
* test cases decryption: <=20, >20, stat for both
|
||||
* test cases encryption: no password, default password, file-specific password, 128/192/256, <=20, >20
|
||||
* support testing on macOS
|
||||
* add test cases for lots of files (including too many)
|
||||
* add test cases for holes (between files, between files and cdir, between cdir and eocd, + zip64 where appropriate)
|
||||
* unchange on added file
|
||||
* test seek in `zip_source_crc()`
|
||||
* test cases for `set_extra*`, `delete_extra*`, `*extra_field*`
|
||||
* test cases for in memory archives
|
||||
* add
|
||||
* delete
|
||||
* delete all
|
||||
* modify
|
||||
* use gcov output to increase test coverage
|
||||
* add test case to change values for newly added files (name, compression method, comment, mtime, . . .)
|
||||
* `zip_open()` file less than `EOCDLEN` bytes long
|
||||
* test calls against old API
|
||||
* run regression tests also from CMake framework
|
||||
* rename file to dir/ and vice versa (fails)
|
||||
* fix comment test to be newline insensitive
|
||||
* check if http://bugs.python.org/issue20078 provides ideas for new tests
|
||||
|
||||
* (`add`, `replace`)
|
||||
* add to empty zip
|
||||
* add to existing zip
|
||||
* add w/ existing file name [E]
|
||||
* replace ok
|
||||
* replace w/ illegal index [E]
|
||||
* replace w/ deleted name [E]
|
||||
* unchange added/replaced file
|
||||
* (`close`)
|
||||
* copy zip file
|
||||
* open copy
|
||||
* rename, delete, replace, add w/ new name, add w/ deleted name
|
||||
* close
|
||||
* zipcmp copy expected
|
||||
* remove copy
|
||||
* (`error_get)
|
||||
* (`error_get_sys_type`)
|
||||
* (`error_to_str`)
|
||||
* (`extra_fields`)
|
||||
* (`file_error_get`)
|
||||
* (`file_strerror`)
|
||||
* (`replace`)
|
||||
* (`source_buffer`)
|
||||
* (`source_file`)
|
||||
* (`source_filep`)
|
||||
* (`source_free`)
|
||||
* (`source_function`)
|
||||
* (`source_zip`)
|
||||
* (`strerror`)
|
||||
* (`unchange`)
|
||||
* (`unchange_all`)
|
||||
* `open(ZIP_RDONLY)`
|
||||
* I/O abstraction layer
|
||||
* `zip_open_from_source`
|
||||
* read two zip entries interleaved
|
||||
|
||||
## Unsorted
|
||||
|
||||
* `zip_source_file()`: don't allow write if start/len specify a part of the file
|
||||
* script to check if all exported symbols are marked with `ZIP_EXTERN`, add to make distcheck
|
||||
|
||||
* document: `zip_source_write()`: length can't be > `ZIP_INT64_MAX`
|
||||
* document: `ZIP_SOURCE_CLOSE` implementation can't return error
|
||||
* keep error codes in man pages in sync
|
||||
* document error codes in new man pages
|
63
externals/libzip/libzip/android/do.sh
vendored
Executable file
63
externals/libzip/libzip/android/do.sh
vendored
Executable file
@@ -0,0 +1,63 @@
|
||||
|
||||
# Author: Declan Moran
|
||||
# www.silverglint.com
|
||||
# Thanks to damaex (https://github.com/damaex), for significant contributions
|
||||
|
||||
ANDROID_NDK_ROOT=/home/android/android-ndk-r19c
|
||||
|
||||
INSTALL_DIR=install
|
||||
BUILD_DIR=build
|
||||
START_DIR=$(pwd)
|
||||
|
||||
rm -rf $INSTALL_DIR
|
||||
rm -rf $BUILD_DIR
|
||||
mkdir -p $BUILD_DIR #"${ANDROID_TARGET_PLATFORM}"
|
||||
|
||||
#--------------------------------------------------------------------
|
||||
build_it()
|
||||
{
|
||||
# builds either a static or shared lib depending on parm passed (ON or OFF)
|
||||
want_shared=$1
|
||||
|
||||
cmake -DCMAKE_TOOLCHAIN_FILE=${ANDROID_NDK_ROOT}/build/cmake/android.toolchain.cmake \
|
||||
-DCMAKE_INSTALL_PREFIX:PATH=../../${INSTALL_DIR}/${ANDROID_TARGET_PLATFORM} \
|
||||
-DANDROID_ABI=${ANDROID_TARGET_PLATFORM} \
|
||||
-DENABLE_OPENSSL:BOOL=OFF \
|
||||
-DENABLE_COMMONCRYPTO:BOOL=OFF \
|
||||
-DENABLE_GNUTLS:BOOL=OFF \
|
||||
-DENABLE_MBEDTLS:BOOL=OFF \
|
||||
-DENABLE_OPENSSL:BOOL=OFF \
|
||||
-DENABLE_WINDOWS_CRYPTO:BOOL=OFF \
|
||||
-DBUILD_TOOLS:BOOL=OFF \
|
||||
-DBUILD_REGRESS:BOOL=OFF \
|
||||
-DBUILD_EXAMPLES:BOOL=OFF \
|
||||
-DBUILD_SHARED_LIBS:BOOL=$want_shared \
|
||||
-DBUILD_DOC:BOOL=OFF \
|
||||
-DANDROID_TOOLCHAIN=clang cmake -H.. -B$BUILD_DIR/${ANDROID_TARGET_PLATFORM}
|
||||
|
||||
#run make with all system threads and install
|
||||
cd $BUILD_DIR/${ANDROID_TARGET_PLATFORM}
|
||||
make install -j$(nproc --all)
|
||||
cd $START_DIR
|
||||
}
|
||||
|
||||
#--------------------------------------------------------------------
|
||||
for ANDROID_TARGET_PLATFORM in armeabi-v7a arm64-v8a x86 x86_64
|
||||
do
|
||||
echo "Building libzip for ${ANDROID_TARGET_PLATFORM}"
|
||||
|
||||
build_it ON
|
||||
build_it OFF
|
||||
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "Error executing: cmake"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "Error executing make install for platform: ${ANDROID_TARGET_PLATFORM}"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
done
|
122
externals/libzip/libzip/android/docker/Dockerfile
vendored
Executable file
122
externals/libzip/libzip/android/docker/Dockerfile
vendored
Executable file
@@ -0,0 +1,122 @@
|
||||
# Version: 1.0
|
||||
|
||||
# Dockerfile for building libzip for android
|
||||
# https://github.com/dec1/libzip.git
|
||||
# creates docker container with all tools, libraries and sources required to build libzip for android.
|
||||
|
||||
# Author: Declan Moran
|
||||
# www.silverglint.com
|
||||
|
||||
|
||||
# Usage:
|
||||
#---------
|
||||
# download the libzip repository
|
||||
# > git clone https://github.com/dec1/libzip.git
|
||||
# > cd libzip
|
||||
#
|
||||
# build docker image "my_img_zip" from the dockerfile in "docker" dir
|
||||
# > docker build -t my_img_zip ./android/docker
|
||||
#
|
||||
# run docker container "my_ctr_zip" from this image, mounting the current dir. (Need to pass absolute host paths to mount volume- hence "pwd")
|
||||
# > docker run -v $(pwd):/home/docker-share/libzip -it --entrypoint=/bin/bash --name my_ctr_zip my_img_zip
|
||||
#
|
||||
# Now inside docker container
|
||||
# $ cd /home/docker-share/libzip/android
|
||||
#
|
||||
# Modify ./do.sh (on host), to match the boost and android ndk versions/paths in the "Configure here" section below
|
||||
# Build from running docker container.
|
||||
# $./do.sh
|
||||
#
|
||||
# "./build" dir contains required build, but owned by root. chown to your username/group
|
||||
# > sudo chown -R <userid>:<groupid> ./build
|
||||
# > sudo chown -R <userid>:<groupid> ./install
|
||||
#
|
||||
# Exit container, when build is finsihed.
|
||||
# $ exit
|
||||
#
|
||||
|
||||
|
||||
|
||||
|
||||
FROM ubuntu:18.04
|
||||
|
||||
|
||||
## --------------------------------------------------------------------
|
||||
## Configure here
|
||||
# ---------------------------------------------------------------------
|
||||
# ---------------------------------------------------------------------
|
||||
# Here you can speciofy exactly what android ndk (and sdk) version you want to use.
|
||||
|
||||
|
||||
|
||||
# (2) Android SDK
|
||||
# https://developer.android.com/studio#downloads
|
||||
ARG SDK_URL_BASE=https://dl.google.com/android/repository
|
||||
ARG SDK_FILE=sdk-tools-linux-4333796.zip
|
||||
|
||||
# the sdk plaform to use
|
||||
# https://developer.android.com/guide/topics/manifest/uses-sdk-element
|
||||
ARG ANDROID_SDK_PLATFORM_VERS="platforms;android-28"
|
||||
|
||||
|
||||
|
||||
# (3) Android NDK
|
||||
# https://developer.android.com/ndk/downloads
|
||||
ARG NDK_URL_BASE=https://dl.google.com/android/repository
|
||||
ARG NDK_FILE=android-ndk-r19c-linux-x86_64.zip
|
||||
# ---------------------------------------------------------------------
|
||||
## --------------------------------------------------------------------
|
||||
|
||||
RUN apt-get update
|
||||
RUN apt-get -y dist-upgrade
|
||||
|
||||
|
||||
# for downloading archives
|
||||
RUN apt-get -y install wget
|
||||
|
||||
# for unzipping downloaded android archives
|
||||
RUN apt-get -y install zip
|
||||
RUN apt-get -y install cmake
|
||||
|
||||
RUN apt-get -y install lib32z1
|
||||
|
||||
|
||||
# need this this to install some (32 bit) prerequisites for android builds
|
||||
RUN dpkg --add-architecture i386
|
||||
RUN apt-get update
|
||||
RUN apt-get -y dist-upgrade
|
||||
RUN apt-get install -y libc6:i386 libncurses5:i386 libstdc++6:i386 libbz2-1.0:i386
|
||||
|
||||
|
||||
# need c compiler to set up create boost build system (before building boost with it and android toolchain)
|
||||
RUN apt-get -y install build-essential
|
||||
RUN apt-get -y install libc6-dev-i386
|
||||
RUN apt-get -y install clang
|
||||
|
||||
RUN apt-get -y install openjdk-8-jdk
|
||||
#--------------------------------------
|
||||
|
||||
ARG ANDROID_HOME=/home/android
|
||||
WORKDIR ${ANDROID_HOME}
|
||||
|
||||
|
||||
# SDK
|
||||
# ----
|
||||
# download android sdk command line tools
|
||||
RUN wget ${SDK_URL_BASE}/$SDK_FILE
|
||||
RUN unzip $SDK_FILE
|
||||
|
||||
ENV PATH ${PATH}:${ANDROID_HOME}/tools:${ANDROID_HOME}/tools/bin:${ANDROID_HOME}/platform-tools
|
||||
|
||||
|
||||
RUN yes | sdkmanager --licenses
|
||||
|
||||
RUN sdkmanager "platform-tools" $ANDROID_SDK_PLATFORM_VERS
|
||||
#RUN sdkmanager "platform-tools" "platforms;android-28"
|
||||
|
||||
|
||||
# NDK
|
||||
# ----
|
||||
RUN wget ${NDK_URL_BASE}/$NDK_FILE
|
||||
RUN unzip $NDK_FILE
|
||||
|
10
externals/libzip/libzip/android/readme.txt
vendored
Executable file
10
externals/libzip/libzip/android/readme.txt
vendored
Executable file
@@ -0,0 +1,10 @@
|
||||
|
||||
Cross compile libzip for android.
|
||||
--------------------------------
|
||||
Modify "do.sh" as appropriate if you need to specify a different ndk dir or wish to specify different build parameters
|
||||
|
||||
Prerequisites for the development machine - see docker/Dockerfile
|
||||
|
||||
You can either set you host machine up with these prerequisites or simply use docker (in which case you need not install anything on your host machine except docker itself).
|
||||
|
||||
See "Usage" in docker/Dockerfile for detailed instructions.
|
81
externals/libzip/libzip/appveyor.yml
vendored
Executable file
81
externals/libzip/libzip/appveyor.yml
vendored
Executable file
@@ -0,0 +1,81 @@
|
||||
os:
|
||||
- Visual Studio 2017
|
||||
|
||||
environment:
|
||||
matrix:
|
||||
- GENERATOR: "Visual Studio 15 2017 Win64"
|
||||
TRIPLET: x64-windows
|
||||
CMAKE_OPTS: "-DBUILD_SHARED_LIBS=off"
|
||||
CMAKE_CONFIG: Release
|
||||
- GENERATOR: "Visual Studio 15 2017 Win64"
|
||||
TRIPLET: x64-windows
|
||||
CMAKE_OPTS: "-DBUILD_SHARED_LIBS=off"
|
||||
CMAKE_CONFIG: Debug
|
||||
- GENERATOR: "Visual Studio 15 2017 Win64"
|
||||
TRIPLET: x64-uwp
|
||||
CMAKE_OPTS: "-DCMAKE_SYSTEM_NAME=WindowsStore -DCMAKE_SYSTEM_VERSION=10.0"
|
||||
CMAKE_CONFIG: Release
|
||||
- GENERATOR: "Visual Studio 15 2017"
|
||||
TRIPLET: x86-windows
|
||||
CMAKE_OPTS: "-DBUILD_SHARED_LIBS=off"
|
||||
CMAKE_CONFIG: Release
|
||||
- GENERATOR: "Visual Studio 15 2017"
|
||||
TRIPLET: x86-windows
|
||||
CMAKE_OPTS: "-DBUILD_SHARED_LIBS=off"
|
||||
CMAKE_CONFIG: Debug
|
||||
- GENERATOR: "Visual Studio 15 2017"
|
||||
TRIPLET: x86-uwp
|
||||
CMAKE_OPTS: "-DCMAKE_SYSTEM_NAME=WindowsStore -DCMAKE_SYSTEM_VERSION=10.0"
|
||||
CMAKE_CONFIG: Release
|
||||
- GENERATOR: "Visual Studio 15 2017 ARM"
|
||||
TRIPLET: arm-windows
|
||||
CMAKE_OPTS: "-DENABLE_OPENSSL=off"
|
||||
CMAKE_CONFIG: Release
|
||||
- GENERATOR: "Visual Studio 15 2017 ARM"
|
||||
TRIPLET: arm-uwp
|
||||
CMAKE_OPTS: "-DCMAKE_SYSTEM_NAME=WindowsStore -DCMAKE_SYSTEM_VERSION=10.0 -DENABLE_OPENSSL=off"
|
||||
CMAKE_CONFIG: Release
|
||||
- GENERATOR: "Visual Studio 15 2017"
|
||||
TRIPLET: arm64-windows
|
||||
CMAKE_OPTS: "-AARM64 -DENABLE_OPENSSL=off"
|
||||
CMAKE_CONFIG: Release
|
||||
- GENERATOR: "Visual Studio 15 2017"
|
||||
TRIPLET: arm64-uwp
|
||||
CMAKE_OPTS: "-AARM64 -DCMAKE_SYSTEM_NAME=WindowsStore -DCMAKE_SYSTEM_VERSION=10.0 -DENABLE_OPENSSL=off"
|
||||
CMAKE_CONFIG: Release
|
||||
|
||||
before_build:
|
||||
cmd: >-
|
||||
git clone https://github.com/Microsoft/vcpkg
|
||||
|
||||
cd vcpkg
|
||||
|
||||
.\bootstrap-vcpkg.bat
|
||||
|
||||
.\vcpkg integrate install
|
||||
|
||||
.\vcpkg install zlib:%TRIPLET% bzip2:%TRIPLET%
|
||||
|
||||
cd ..
|
||||
|
||||
mkdir build
|
||||
|
||||
cd build
|
||||
|
||||
cmake -DCMAKE_TOOLCHAIN_FILE=%cd%/../vcpkg/scripts/buildsystems/vcpkg.cmake .. -G "%GENERATOR%" %CMAKE_OPTS%
|
||||
|
||||
appveyor PushArtifact config.h
|
||||
|
||||
appveyor PushArtifact CMakeCache.txt
|
||||
|
||||
build_script:
|
||||
cmd: >-
|
||||
cmake --build . --config %CMAKE_CONFIG% --target INSTALL
|
||||
|
||||
cmake --build . --config %CMAKE_CONFIG%
|
||||
|
||||
test_script:
|
||||
cmd: >-
|
||||
set VERBOSE=yes
|
||||
|
||||
ctest -C %CMAKE_CONFIG% --output-on-failure
|
95
externals/libzip/libzip/cmake-config.h.in
vendored
Executable file
95
externals/libzip/libzip/cmake-config.h.in
vendored
Executable file
@@ -0,0 +1,95 @@
|
||||
#ifndef HAD_CONFIG_H
|
||||
#define HAD_CONFIG_H
|
||||
#ifndef _HAD_ZIPCONF_H
|
||||
#include "zipconf.h"
|
||||
#endif
|
||||
/* BEGIN DEFINES */
|
||||
#cmakedefine HAVE___PROGNAME
|
||||
#cmakedefine HAVE__CHMOD
|
||||
#cmakedefine HAVE__CLOSE
|
||||
#cmakedefine HAVE__DUP
|
||||
#cmakedefine HAVE__FDOPEN
|
||||
#cmakedefine HAVE__FILENO
|
||||
#cmakedefine HAVE__OPEN
|
||||
#cmakedefine HAVE__SETMODE
|
||||
#cmakedefine HAVE__SNPRINTF
|
||||
#cmakedefine HAVE__STRDUP
|
||||
#cmakedefine HAVE__STRICMP
|
||||
#cmakedefine HAVE__STRTOI64
|
||||
#cmakedefine HAVE__STRTOUI64
|
||||
#cmakedefine HAVE__UMASK
|
||||
#cmakedefine HAVE__UNLINK
|
||||
#cmakedefine HAVE_ARC4RANDOM
|
||||
#cmakedefine HAVE_CLONEFILE
|
||||
#cmakedefine HAVE_COMMONCRYPTO
|
||||
#cmakedefine HAVE_CRYPTO
|
||||
#cmakedefine HAVE_FICLONERANGE
|
||||
#cmakedefine HAVE_FILENO
|
||||
#cmakedefine HAVE_FSEEKO
|
||||
#cmakedefine HAVE_FTELLO
|
||||
#cmakedefine HAVE_GETPROGNAME
|
||||
#cmakedefine HAVE_GNUTLS
|
||||
#cmakedefine HAVE_LIBBZ2
|
||||
#cmakedefine HAVE_LIBLZMA
|
||||
#cmakedefine HAVE_LOCALTIME_R
|
||||
#cmakedefine HAVE_MBEDTLS
|
||||
#cmakedefine HAVE_MKSTEMP
|
||||
#cmakedefine HAVE_NULLABLE
|
||||
#cmakedefine HAVE_OPEN
|
||||
#cmakedefine HAVE_OPENSSL
|
||||
#cmakedefine HAVE_SETMODE
|
||||
#cmakedefine HAVE_SNPRINTF
|
||||
#cmakedefine HAVE_SSIZE_T_LIBZIP
|
||||
#cmakedefine HAVE_STRCASECMP
|
||||
#cmakedefine HAVE_STRDUP
|
||||
#cmakedefine HAVE_STRICMP
|
||||
#cmakedefine HAVE_STRTOLL
|
||||
#cmakedefine HAVE_STRTOULL
|
||||
#cmakedefine HAVE_STRUCT_TM_TM_ZONE
|
||||
#cmakedefine HAVE_STDBOOL_H
|
||||
#cmakedefine HAVE_STRINGS_H
|
||||
#cmakedefine HAVE_UNISTD_H
|
||||
#cmakedefine HAVE_WINDOWS_CRYPTO
|
||||
#cmakedefine __INT8_LIBZIP ${__INT8_LIBZIP}
|
||||
#cmakedefine INT8_T_LIBZIP ${INT8_T_LIBZIP}
|
||||
#cmakedefine UINT8_T_LIBZIP ${UINT8_T_LIBZIP}
|
||||
#cmakedefine __INT16_LIBZIP ${__INT16_LIBZIP}
|
||||
#cmakedefine INT16_T_LIBZIP ${INT16_T_LIBZIP}
|
||||
#cmakedefine UINT16_T_LIBZIP ${UINT16_T_LIBZIP}
|
||||
#cmakedefine __INT32_LIBZIP ${__INT32_LIBZIP}
|
||||
#cmakedefine INT32_T_LIBZIP ${INT32_T_LIBZIP}
|
||||
#cmakedefine UINT32_T_LIBZIP ${UINT32_T_LIBZIP}
|
||||
#cmakedefine __INT64_LIBZIP ${__INT64_LIBZIP}
|
||||
#cmakedefine INT64_T_LIBZIP ${INT64_T_LIBZIP}
|
||||
#cmakedefine UINT64_T_LIBZIP ${UINT64_T_LIBZIP}
|
||||
#cmakedefine SHORT_LIBZIP ${SHORT_LIBZIP}
|
||||
#cmakedefine INT_LIBZIP ${INT_LIBZIP}
|
||||
#cmakedefine LONG_LIBZIP ${LONG_LIBZIP}
|
||||
#cmakedefine LONG_LONG_LIBZIP ${LONG_LONG_LIBZIP}
|
||||
#cmakedefine SIZEOF_OFF_T ${SIZEOF_OFF_T}
|
||||
#cmakedefine SIZE_T_LIBZIP ${SIZE_T_LIBZIP}
|
||||
#cmakedefine SSIZE_T_LIBZIP ${SSIZE_T_LIBZIP}
|
||||
#cmakedefine HAVE_DIRENT_H
|
||||
#cmakedefine HAVE_FTS_H
|
||||
#cmakedefine HAVE_NDIR_H
|
||||
#cmakedefine HAVE_SYS_DIR_H
|
||||
#cmakedefine HAVE_SYS_NDIR_H
|
||||
#cmakedefine WORDS_BIGENDIAN
|
||||
#cmakedefine HAVE_SHARED
|
||||
/* END DEFINES */
|
||||
#define PACKAGE "@PACKAGE@"
|
||||
#define VERSION "@VERSION@"
|
||||
|
||||
#ifndef HAVE_SSIZE_T_LIBZIP
|
||||
# if SIZE_T_LIBZIP == INT_LIBZIP
|
||||
typedef int ssize_t;
|
||||
# elif SIZE_T_LIBZIP == LONG_LIBZIP
|
||||
typedef long ssize_t;
|
||||
# elif SIZE_T_LIBZIP == LONG_LONG_LIBZIP
|
||||
typedef long long ssize_t;
|
||||
# else
|
||||
#error no suitable type for ssize_t found
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#endif /* HAD_CONFIG_H */
|
47
externals/libzip/libzip/cmake-zipconf.h.in
vendored
Executable file
47
externals/libzip/libzip/cmake-zipconf.h.in
vendored
Executable file
@@ -0,0 +1,47 @@
|
||||
#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.in.
|
||||
*/
|
||||
|
||||
#cmakedefine LIBZIP_VERSION "@PACKAGE_VERSION@"
|
||||
#cmakedefine LIBZIP_VERSION_MAJOR @PACKAGE_VERSION_MAJOR@
|
||||
#cmakedefine LIBZIP_VERSION_MINOR @PACKAGE_VERSION_MINOR@
|
||||
#cmakedefine LIBZIP_VERSION_MICRO @PACKAGE_VERSION_MICRO@
|
||||
|
||||
#cmakedefine ZIP_STATIC
|
||||
|
||||
${ZIP_NULLABLE_DEFINES}
|
||||
|
||||
${LIBZIP_TYPES_INCLUDE}
|
||||
|
||||
typedef ${ZIP_INT8_T} zip_int8_t;
|
||||
typedef ${ZIP_UINT8_T} zip_uint8_t;
|
||||
typedef ${ZIP_INT16_T} zip_int16_t;
|
||||
typedef ${ZIP_UINT16_T} zip_uint16_t;
|
||||
typedef ${ZIP_INT32_T} zip_int32_t;
|
||||
typedef ${ZIP_UINT32_T} zip_uint32_t;
|
||||
typedef ${ZIP_INT64_T} zip_int64_t;
|
||||
typedef ${ZIP_UINT64_T} zip_uint64_t;
|
||||
|
||||
#define ZIP_INT8_MIN (-ZIP_INT8_MAX-1)
|
||||
#define ZIP_INT8_MAX 0x7f
|
||||
#define ZIP_UINT8_MAX 0xff
|
||||
|
||||
#define ZIP_INT16_MIN (-ZIP_INT16_MAX-1)
|
||||
#define ZIP_INT16_MAX 0x7fff
|
||||
#define ZIP_UINT16_MAX 0xffff
|
||||
|
||||
#define ZIP_INT32_MIN (-ZIP_INT32_MAX-1L)
|
||||
#define ZIP_INT32_MAX 0x7fffffffL
|
||||
#define ZIP_UINT32_MAX 0xffffffffLU
|
||||
|
||||
#define ZIP_INT64_MIN (-ZIP_INT64_MAX-1LL)
|
||||
#define ZIP_INT64_MAX 0x7fffffffffffffffLL
|
||||
#define ZIP_UINT64_MAX 0xffffffffffffffffULL
|
||||
|
||||
#endif /* zipconf.h */
|
77
externals/libzip/libzip/create-cmake-config.h.in.pl
vendored
Executable file
77
externals/libzip/libzip/create-cmake-config.h.in.pl
vendored
Executable file
@@ -0,0 +1,77 @@
|
||||
#!/usr/bin/env perl
|
||||
# Haiku OS: we don't care!
|
||||
|
||||
use strict;
|
||||
|
||||
my $in = 'cmake-config.h.in';
|
||||
my $out = "$in.$$";
|
||||
|
||||
my ($fin, $fout);
|
||||
open $fin, "< $in" or die "can't open $in: $!";
|
||||
open $fout, "> $out" or die "can't create $out: $!";
|
||||
|
||||
my $zipconf_defines = read_zipconf_defines();
|
||||
|
||||
my $in_defines = 0;
|
||||
while (my $line = <$fin>) {
|
||||
if ($in_defines) {
|
||||
if ($line =~ m,/* END DEFINES,) {
|
||||
$in_defines = 0;
|
||||
}
|
||||
else {
|
||||
next;
|
||||
}
|
||||
}
|
||||
print $fout $line;
|
||||
if ($line =~ m,/\* BEGIN DEFINES,) {
|
||||
$in_defines = 1;
|
||||
add_defines($fout, $zipconf_defines);
|
||||
}
|
||||
}
|
||||
|
||||
close $fin;
|
||||
close $fout;
|
||||
|
||||
rename($out, $in);
|
||||
|
||||
sub add_defines {
|
||||
my ($fout, $zipconf_defines) = @_;
|
||||
|
||||
my $fin;
|
||||
open $fin, "< CMakeLists.txt" or die "can't open CMakeLists.txt: $!";
|
||||
|
||||
while (my $line = <$fin>) {
|
||||
my ($key, $value);
|
||||
|
||||
if ($line =~ m/CHECK_TYPE_SIZE\(.* (\S*)\)/) {
|
||||
$key = $1;
|
||||
$value = "\${$1}";
|
||||
}
|
||||
elsif ($line =~ m/CHECK_\S*\(.* (\S*)\)/) {
|
||||
$key = $1;
|
||||
}
|
||||
|
||||
if (defined($key) && !defined($zipconf_defines->{$key})) {
|
||||
print $fout "#cmakedefine $key" . ($value ? " $value" : "") . "\n";
|
||||
}
|
||||
}
|
||||
|
||||
close $fin;
|
||||
}
|
||||
|
||||
sub read_zipconf_defines {
|
||||
my %zipconf_defines = ();
|
||||
|
||||
my $fin;
|
||||
open $fin, "< cmake-zipconf.h.in" or die "can't open cmake-zipconf.h.in: $!";
|
||||
|
||||
while (my $line = <$fin>) {
|
||||
if ($line =~ m/#cmakedefine\s+(\S+)/) {
|
||||
$zipconf_defines{$1} = 1;
|
||||
}
|
||||
}
|
||||
|
||||
close $fin;
|
||||
|
||||
return \%zipconf_defines;
|
||||
}
|
253
externals/libzip/libzip/docs/aes_coding_tips.txt
vendored
Executable file
253
externals/libzip/libzip/docs/aes_coding_tips.txt
vendored
Executable file
@@ -0,0 +1,253 @@
|
||||
AES Coding Tips for Developers
|
||||
|
||||
NOTE: WinZip^(R) users do not need to read or understand the information
|
||||
contained on this page. It is intended for developers of Zip file utilities.
|
||||
|
||||
This document contains information that may be helpful to developers and other
|
||||
interested parties who wish to support the AE-1 and AE-2 AES encryption formats
|
||||
in their own Zip file utilities. WinZip Computing makes no warranties regarding
|
||||
the information provided in this document. In particular, WinZip Computing does
|
||||
not represent or warrant that the information provided here is free from errors
|
||||
or is suitable for any particular use, or that the file formats described here
|
||||
will be supported in future versions of WinZip. You should test and validate
|
||||
all code and techniques in accordance with good programming practice.
|
||||
|
||||
This information supplements the basic encryption specification document found
|
||||
here.
|
||||
|
||||
This document assumes that you are using Dr. Brian Gladman's AES encryption
|
||||
package. Dr. Gladman has generously made public a sample application that
|
||||
demonstrates the use of his encryption/decryption and other routines, and the
|
||||
code samples shown below are derived from this sample application. Dr.
|
||||
Gladman's AES library and the sample application are available from the AES
|
||||
project page on Dr. Gladman's web site.
|
||||
|
||||
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||
|
||||
Generating a salt value
|
||||
|
||||
Please read the discussion of salt values in the encryption specification.
|
||||
|
||||
Dr. Gladman has provided a pseudo-random number generator in the files PRNG.C
|
||||
and PRNG.H. You may find this suitable for generating salt values. These files
|
||||
are included in the sample package available through the AES project page on
|
||||
Dr. Gladman's web site.
|
||||
|
||||
Here are guidelines for using Dr. Gladman's generator. Note that the generator
|
||||
is used rather like an I/O stream: it is opened (initialized), used, and
|
||||
finally closed. To obtain the best results, it is recommended that you
|
||||
initialize the generator when your application starts and close it when your
|
||||
application closes. (If you are coding in C++, you may wish to wrap these
|
||||
actions in a C++ class that initializes the generator on construction and
|
||||
closes it on destruction.)
|
||||
|
||||
1. You will need to provide an entropy function in your code for
|
||||
initialization of the generator. The entropy function need not be
|
||||
particularly sophisticated for this use. Here is one possibility for such a
|
||||
function, based primarily upon the Windows performance counter:
|
||||
|
||||
int entropy_fun(
|
||||
unsigned char buf[],
|
||||
unsigned int len)
|
||||
{
|
||||
unsigned __int64 pentium_tsc[1];
|
||||
unsigned int i;
|
||||
static unsigned int num = 0;
|
||||
// this sample code returns the following sequence of entropy information
|
||||
// - the current 8-byte Windows performance counter value
|
||||
// - an 8-byte representation of the current date/time
|
||||
// - an 8-byte value built from the current process ID and thread ID
|
||||
// - all subsequent calls return the then-current 8-byte performance
|
||||
// counter value
|
||||
switch (num)
|
||||
{
|
||||
case 1:
|
||||
++num;
|
||||
// use a value that is unlikely to repeat across system reboots
|
||||
GetSystemTimeAsFileTime((FILETIME *)pentium_tsc);
|
||||
break;
|
||||
case 2:
|
||||
++num;
|
||||
{
|
||||
// use a value that distinguishes between different instances of this
|
||||
// code that might be running on different processors at the same time
|
||||
unsigned __int32 processtest = GetCurrentProcessId();
|
||||
unsigned __int32 threadtest = GetCurrentThreadId();
|
||||
pentium_tsc[0] = processtest;
|
||||
pentium_tsc[0] = (pentium_tsc[0] << 32) + threadtest;
|
||||
}
|
||||
break;
|
||||
case 0:
|
||||
++num;
|
||||
// fall through to default case
|
||||
default:
|
||||
// use a rapidly-changing value
|
||||
// Note: check QueryPerformanceFrequency() first to
|
||||
// ensure that QueryPerformanceCounter() will work.
|
||||
QueryPerformanceCounter((LARGE_INTEGER *)pentium_tsc);
|
||||
break;
|
||||
}
|
||||
for(i = 0; i < 8 && i < len; ++i)
|
||||
buf[i] = ((unsigned char*)pentium_tsc)[i];
|
||||
return i;
|
||||
}
|
||||
|
||||
Note: the required prototype for the entropy function is defined in PRNG.H.
|
||||
|
||||
2. Initialize the generator by calling prng_init(), providing the addresses of
|
||||
your entropy function and of an instance of a prng_ctx structure (defined
|
||||
in PRNG.H). The prng_ctx variable maintains a context for the generator and
|
||||
is used as a parameter for the other generator functions. Therefore, the
|
||||
variable's state must be maintained until the generator is closed.
|
||||
|
||||
prng_ctx ctx;
|
||||
prng_init(entropy_fun, &ctx);
|
||||
|
||||
You only need to do this once per application session (as long as you keep
|
||||
the "stream" open).
|
||||
|
||||
3. To obtain a sequence of random bytes of arbitrary size, use prng_rand().
|
||||
This code obtains 16 random bytes, suitable for use as a salt value for
|
||||
256-bit AES encryption:
|
||||
|
||||
unsigned char buffer[16];
|
||||
prng_rand(buffer, sizeof(buffer), &ctx);
|
||||
|
||||
Note that the ctx parameter is the same prng_ctx variable that was used in
|
||||
the initialization call.
|
||||
|
||||
4. When you are done with the generator (this would normally be when your
|
||||
application closes), close it by calling prng_end:
|
||||
|
||||
prng_end(&ctx);
|
||||
|
||||
Again, the ctx parameter is the same prng_ctx variable that was used in the
|
||||
initialization call.
|
||||
|
||||
Encryption and decryption
|
||||
|
||||
The actual encryption and decryption of data are handled quite similarly, and
|
||||
again are rather stream-like: a stream is "opened", data is passed to it for
|
||||
encryption or decryption, and then it is closed. The password verifier is
|
||||
returned when the stream is opened, and the authentication code is returned
|
||||
when the stream is closed.
|
||||
|
||||
Here is the basic technique:
|
||||
|
||||
1. Initialize the "stream" for encryption or decryption and obtain the
|
||||
password verification value.
|
||||
|
||||
There is no difference in the initialization, regardless of whether you are
|
||||
encrypting or decrypting:
|
||||
|
||||
fcrypt_ctx zctx; // the encryption context
|
||||
int rc = fcrypt_init(
|
||||
KeySize, // extra data value indicating key size
|
||||
pszPassword, // the password
|
||||
strlen(pszPassword), // number of bytes in password
|
||||
achSALT, // the salt
|
||||
achPswdVerifier, // on return contains password verifier
|
||||
&zctx); // encryption context
|
||||
|
||||
The return value is 0 if the initialization was successful; non-zero values
|
||||
indicate errors. Note that passwords are null-terminated ANSI strings;
|
||||
embedded nulls must not be used. (To avoid incompatibilities between the
|
||||
various character sets in use, especially in different versions of Windows,
|
||||
users should be encouraged to use passwords containing only the "standard"
|
||||
characters in the range 32-127.)
|
||||
|
||||
The function returns the password verification value in achPswdVerifier,
|
||||
which must be a 2-byte buffer. If you are encrypting, store this value in
|
||||
the Zip file as indicated by the encryption specification. If you are
|
||||
decrypting, compare this returned value to the value stored in the Zip
|
||||
file. If they are different, then either the password provided by your user
|
||||
was incorrect or the encrypted file has been altered in some way since it
|
||||
was encrypted. (Note that if they match, there is still a 1 in 65,536
|
||||
chance that an incorrect password was provided.)
|
||||
|
||||
The initialized encryption context (zctx) is used as a parameter to the
|
||||
encryption/decryption functions. Therefore, its state must be maintained
|
||||
until the "stream" is closed.
|
||||
|
||||
2. Encrypt or decrypt the data.
|
||||
|
||||
To encrypt:
|
||||
|
||||
fcrypt_encrypt(
|
||||
pchData, // pointer to the data to encrypt
|
||||
cb, // how many bytes to encrypt
|
||||
&zctx); // encryption context
|
||||
|
||||
To decrypt:
|
||||
|
||||
fcrypt_decrypt(
|
||||
pchData, // pointer to the data to decrypt
|
||||
cb, // how many bytes to decrypt
|
||||
&zctx); // decryption context
|
||||
|
||||
You may need to call the encrypt or decrypt function multiple times,
|
||||
passing in successive chunks of data in the buffer. For AE-1 and AE-2
|
||||
compatibility, the buffer size must be a multiple of 16 bytes except for
|
||||
the last buffer, which may be smaller. For efficiency, a larger buffer size
|
||||
such as 32,768 would generally be used.
|
||||
|
||||
Note: to encrypt zero-length files, simply skip this step. You will still
|
||||
obtain and use the password verifier (step 1) and authentication code (step
|
||||
3).
|
||||
|
||||
3. Close the "stream" and obtain the authentication code.
|
||||
|
||||
When encryption/decryption is complete, close the "stream" as follows:
|
||||
|
||||
int rc = fcrypt_end(
|
||||
achMAC, // on return contains the authentication code
|
||||
&zctx); // encryption context
|
||||
|
||||
The return value is the size of the authentication code, which will always
|
||||
be 10 for AE-1 and AE-2. The authentication code itself is returned in your
|
||||
buffer at achMAC, which is an array of char, sized to hold at least 10
|
||||
characters. If you are encrypting, store this value in the Zip file as
|
||||
indicated by the encryption specification; if you are decrypting, compare
|
||||
this value to the value stored in the Zip file. If the values are
|
||||
different, either the password is incorrect or the encrypted data has been
|
||||
altered subsequent to storage.
|
||||
|
||||
Note that decryption can fail even if the encrypted data is unaltered and
|
||||
the password verifier was correct in step 1. The password verifier is
|
||||
useful as a quick way to detect most incorrect passwords, but it is not
|
||||
perfect and on rare occasions (1 out of 65,536) it will fail to detect an
|
||||
incorrect password. It is therefore important for you to check the
|
||||
authentication code on completion even though the password verifier was
|
||||
correct.
|
||||
|
||||
Notes
|
||||
|
||||
• Dr. Gladman's AES code depends on the byte order (little-endian or
|
||||
big-endian) used by the computing platform the code will run on. This is
|
||||
determined by a C preprocessor constant called PLATFORM_BYTE_ORDER, which
|
||||
is defined in the file AESOPT.H. You should be sure that
|
||||
PLATFORM_BYTE_ORDER gets the proper value for your platform; if it does
|
||||
not, you will need to define it yourself to the correct value. When using
|
||||
the Microsoft compiler on Intel platforms it does get the proper value,
|
||||
which on these platforms is AES_LITTLE_ENDIAN. We have, however, had a
|
||||
report that it does not default properly when Borland C++ Builder is used,
|
||||
and that manual assignment is necessary. For additional information on this
|
||||
topic, refer to the comments within AESOPT.H.
|
||||
|
||||
Change history
|
||||
|
||||
Changes made in document version 1.04, July, 2008:
|
||||
|
||||
A. Sample Entropy Function
|
||||
|
||||
The sample entropy function was changed to include information near the
|
||||
very beginning of the entropy stream that's unique to the day and to the
|
||||
process and thread.
|
||||
|
||||
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||
|
||||
Document version: 1.04
|
||||
Last modified: July 21, 2008
|
||||
|
||||
Copyright(C) 2003-2016 WinZip International LLC.
|
||||
All Rights Reserved
|
607
externals/libzip/libzip/docs/aes_info.txt
vendored
Executable file
607
externals/libzip/libzip/docs/aes_info.txt
vendored
Executable file
@@ -0,0 +1,607 @@
|
||||
AES Encryption Information:
|
||||
Encryption Specification AE-1 and AE-2
|
||||
|
||||
Document version: 1.04
|
||||
Last modified: January 30, 2009
|
||||
|
||||
NOTE: WinZip^(R) users do not need to read or understand the information
|
||||
contained on this page. It is intended for developers of Zip file utilities.
|
||||
|
||||
Changes since the original version of this document are summarized in the
|
||||
Change History section below.
|
||||
|
||||
This document describes the file format that WinZip uses to create
|
||||
AES-encrypted Zip files. The AE-1 encryption specification was introduced in
|
||||
WinZip 9.0 Beta 1, released in May 2003. The AE-2 encryption specification, a
|
||||
minor variant of the original AE-1 specification differing only in how the CRC
|
||||
is handled, was introduced in WinZip 9.0 Beta 3, released in January, 2004.
|
||||
Note that as of WinZip 11, WinZip itself encrypts most files using the AE-1
|
||||
format and encrypts others using the AE-2 format.
|
||||
|
||||
From time to time we may update the information provided here, for example to
|
||||
document any changes to the file formats, or to add additional notes or
|
||||
implementation tips. If you would like to receive e-mail announcements of any
|
||||
substantive changes we make to this document, you can sign up below for our
|
||||
Developer Information mailing list.
|
||||
|
||||
Without compromising the basic Zip file format, WinZip Computing has extended
|
||||
the format specification to support AES encryption, and this document fully
|
||||
describes the format extension. Additionally, we are providing information
|
||||
about a no-cost third-party source for the actual AES encryption code--the same
|
||||
code that is used by WinZip. We believe that use of the free encryption code
|
||||
and of this specification will make it easy for all developers to add
|
||||
compatible advanced encryption to their Zip file utilities.
|
||||
|
||||
This document is not a tutorial on encryption or Zip file structure. While we
|
||||
have attempted to provide the necessary details of the current WinZip AES
|
||||
encryption format, developers and other interested third parties will need to
|
||||
have or obtain an understanding of basic encryption concepts, Zip file format,
|
||||
etc.
|
||||
|
||||
Developers should also review AES Coding Tips page.
|
||||
|
||||
WinZip Computing makes no warranties regarding the information provided in this
|
||||
document. In particular, WinZip Computing does not represent or warrant that
|
||||
the information provided here is free from errors or is suitable for any
|
||||
particular use, or that the file formats described here will be supported in
|
||||
future versions of WinZip. You should test and validate all code and techniques
|
||||
in accordance with good programming practice.
|
||||
|
||||
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||
|
||||
Contents
|
||||
|
||||
I. Encryption services
|
||||
II. Zip file format
|
||||
A. Base format reference
|
||||
B. Compression method and encryption flag
|
||||
C. CRC value
|
||||
D. AES extra data field
|
||||
III. Encrypted file storage format
|
||||
A. File format
|
||||
B. Salt value
|
||||
C. Password verification value
|
||||
D. Encrypted file data
|
||||
E. Authentication code
|
||||
IV. Changes in WinZip 11
|
||||
V. Notes
|
||||
A. Non-files and zero-length files
|
||||
B. "Mixed" Zip files
|
||||
C. Key generation
|
||||
VI. FAQs
|
||||
VII. Change history
|
||||
VIII. Mailing list signup
|
||||
|
||||
|
||||
I. Encryption services
|
||||
|
||||
To perform AES encryption and decryption, WinZip uses AES functions written by
|
||||
Dr. Brian Gladman. The source code for these functions is available in C/C++
|
||||
and Pentium family assembler for anyone to use under an open source BSD or GPL
|
||||
license from the AES project page on Dr. Gladman's web site. The AES Coding
|
||||
Tips page also has some information on the use of these functions. WinZip
|
||||
Computing thanks Dr. Gladman for making his AES functions available to anyone
|
||||
under liberal license terms.
|
||||
|
||||
Dr. Gladman's encryption functions are portable to a number of operating
|
||||
systems and can be static linked into your applications, so there are no
|
||||
operating system version or library dependencies. In particular, the functions
|
||||
do not require Microsoft's Cryptography API.
|
||||
|
||||
General information on the AES standard and the encryption algorithm (also
|
||||
known as Rijndael) is readily available on the Internet. A good place to start
|
||||
is http://www.nist.gov/public_affairs/releases/g00-176.htm.
|
||||
|
||||
II. Zip file format
|
||||
|
||||
A. Base format reference
|
||||
|
||||
AES-encrypted files are stored within the guidelines of the standard Zip
|
||||
file format using only a new "extra data" field, a new compression method
|
||||
code, and a value in the CRC field dependant on the encryption version,
|
||||
AE-1 or AE-2. The basic Zip file format is otherwise unchanged.
|
||||
|
||||
WinZip sets the version needed to extract and version made by fields in the
|
||||
local and central headers to the same values it would use if the file were
|
||||
not encrypted.
|
||||
|
||||
The basic Zip file format specification used by WinZip is available via FTP
|
||||
from the Info-ZIP group at ftp://ftp.info-zip.org/pub/infozip/doc/
|
||||
appnote-iz-latest.zip.
|
||||
|
||||
B. Compression method and encryption flag
|
||||
|
||||
As for any encrypted file, bit 0 of the "general purpose bit flags" field
|
||||
must be set to 1 in each AES-encrypted file's local header and central
|
||||
directory entry.
|
||||
|
||||
Additionally, the presence of an AES-encrypted file in a Zip file is
|
||||
indicated by a new compression method code (decimal 99) in the file's local
|
||||
header and central directory entry, used along with the AES extra data
|
||||
field described below. There is no change in either the version made by or
|
||||
version needed to extract codes.
|
||||
|
||||
The code for the actual compression method is stored in the AES extra data
|
||||
field (see below).
|
||||
|
||||
C. CRC value
|
||||
|
||||
For files encrypted using the AE-2 method, the standard Zip CRC value is
|
||||
not used, and a 0 must be stored in this field. Corruption of encrypted
|
||||
data within a Zip file is instead detected via the authentication code
|
||||
field.
|
||||
|
||||
Files encrypted using the AE-1 method do include the standard Zip CRC
|
||||
value. This, along with the fact that the vendor version stored in the AES
|
||||
extra data field is 0x0001 for AE-1 and 0x0002 for AE-2, is the only
|
||||
difference between the AE-1 and AE-2 formats.
|
||||
|
||||
NOTE: Zip utilities that support the AE-2 format are required to be able to
|
||||
read files that were created in the AE-1 format, and during decryption/
|
||||
extraction of files in AE-1 format should verify that the file's CRC
|
||||
matches the value stored in the CRC field.
|
||||
|
||||
D. AES extra data field
|
||||
1. A file encrypted with AES encryption will have a special "extra data"
|
||||
field associated with it. This extra data field is stored in both the
|
||||
local header and central directory entry for the file.
|
||||
|
||||
Note: see the Zip file format document referenced above for general
|
||||
information on the format and use of extra data fields.
|
||||
|
||||
2. The extra data header ID for AES encryption is 0x9901. The fields are
|
||||
all stored in Intel low-byte/high-byte order. The extra data field
|
||||
currently has a length of 11: seven data bytes plus two bytes for the
|
||||
header ID and two bytes for the data size. Therefore, the extra data
|
||||
overhead for each file in the archive is 22 bytes (11 bytes in the
|
||||
central header plus 11 bytes in the local header).
|
||||
3. The format of the data in the AES extra data field is as follows. See
|
||||
the notes below for additional information.
|
||||
|
||||
Offset Size(bytes) Content
|
||||
|
||||
0 2 Extra field header ID (0x9901)
|
||||
|
||||
2 2 Data size (currently 7, but subject
|
||||
to possible increase in the future)
|
||||
|
||||
4 2 Integer version number specific to
|
||||
the zip vendor
|
||||
|
||||
6 2 2-character vendor ID
|
||||
|
||||
8 1 Integer mode value indicating AES
|
||||
encryption strength
|
||||
|
||||
9 2 The actual compression method used to
|
||||
compress the file
|
||||
|
||||
4. Notes
|
||||
☆ Data size: this value is currently 7, but because it is possible
|
||||
that this specification will be modified in the future to store
|
||||
additional data in this extra field, vendors should not assume that
|
||||
it will always remain 7.
|
||||
☆ Vendor ID: the vendor ID field should always be set to the two
|
||||
ASCII characters "AE".
|
||||
☆ Vendor version: the vendor version for AE-1 is 0x0001. The vendor
|
||||
version for AE-2 is 0x0002.
|
||||
|
||||
Zip utilities that support AE-2 must also be able to process files
|
||||
that are encrypted in AE-1 format. The handling of the CRC value is
|
||||
the only difference between the AE-1 and AE-2 formats.
|
||||
|
||||
☆ Encryption strength: the mode values (encryption strength) for AE-1
|
||||
and AE-2 are:
|
||||
|
||||
Value Strength
|
||||
|
||||
0x01 128-bit encryption key
|
||||
|
||||
0x02 192-bit encryption key
|
||||
|
||||
0x03 256-bit encryption key
|
||||
|
||||
The encryption specification supports only 128-, 192-, and 256-bit
|
||||
encryption keys. No other key lengths are permitted.
|
||||
|
||||
(Note: the current version of WinZip does not support encrypting
|
||||
files using 192-bit keys. This specification, however, does provide
|
||||
for the use of 192-bit keys, and WinZip is able to decrypt such
|
||||
files.)
|
||||
|
||||
☆ Compression method: the compression method is the one that would
|
||||
otherwise have been stored in the local and central headers for the
|
||||
file. For example, if the file is imploded, this field will contain
|
||||
the compression code 6. This is needed because a compression method
|
||||
of 99 is used to indicate the presence of an AES-encrypted file
|
||||
(see above).
|
||||
|
||||
III. Encrypted file storage format
|
||||
|
||||
A. File format
|
||||
|
||||
Additional overhead data required for decryption is stored with the
|
||||
encrypted file itself (i.e., not in the headers). The actual format of the
|
||||
stored file is as follows; additional information about these fields is
|
||||
below. All fields are byte-aligned.
|
||||
|
||||
Size Content
|
||||
(bytes)
|
||||
|
||||
Variable Salt value
|
||||
|
||||
2 Password verification value
|
||||
|
||||
Variable Encrypted file data
|
||||
|
||||
10 Authentication code
|
||||
|
||||
Note that the value in the "compressed size" fields of the local file
|
||||
header and the central directory entry is the total size of all the items
|
||||
listed above. In other words, it is the total size of the salt value,
|
||||
password verification value, encrypted data, and authentication code.
|
||||
|
||||
B. Salt value
|
||||
|
||||
The "salt" or "salt value" is a random or pseudo-random sequence of bytes
|
||||
that is combined with the encryption password to create encryption and
|
||||
authentication keys. The salt is generated by the encrypting application
|
||||
and is stored unencrypted with the file data. The addition of salt values
|
||||
to passwords provides a number of security benefits and makes dictionary
|
||||
attacks based on precomputed keys much more difficult.
|
||||
|
||||
Good cryptographic practice requires that a different salt value be used
|
||||
for each of multiple files encrypted with the same password. If two files
|
||||
are encrypted with the same password and salt, they can leak information
|
||||
about each other. For example, it is possible to determine whether two
|
||||
files encrypted with the same password and salt are identical, and an
|
||||
attacker who somehow already knows the contents of one of two files
|
||||
encrypted with the same password and salt can determine some or all of the
|
||||
contents of the other file. Therefore, you should make every effort to use
|
||||
a unique salt value for each file.
|
||||
|
||||
The size of the salt value depends on the length of the encryption key, as
|
||||
follows:
|
||||
|
||||
Key size Salt size
|
||||
|
||||
128 bits 8 bytes
|
||||
|
||||
192 bits 12 bytes
|
||||
|
||||
256 bits 16 bytes
|
||||
|
||||
C. Password verification value
|
||||
|
||||
This two-byte value is produced as part of the process that derives the
|
||||
encryption and decryption keys from the password. When encrypting, a
|
||||
verification value is derived from the encryption password and stored with
|
||||
the encrypted file. Before decrypting, a verification value can be derived
|
||||
from the decryption password and compared to the value stored with the
|
||||
file, serving as a quick check that will detect most, but not all,
|
||||
incorrect passwords. There is a 1 in 65,536 chance that an incorrect
|
||||
password will yield a matching verification value; therefore, a matching
|
||||
verification value cannot be absolutely relied on to indicate a correct
|
||||
password.
|
||||
|
||||
Information on how to obtain the password verification value from Dr.
|
||||
Gladman's encryption library can be found on the coding tips page.
|
||||
|
||||
This value is stored unencrypted.
|
||||
|
||||
D. Encrypted file data
|
||||
|
||||
Encryption is applied only to the content of files. It is performed after
|
||||
compression, and not to any other associated data. The file data is
|
||||
encrypted byte-for-byte using the AES encryption algorithm operating in
|
||||
"CTR" mode, which means that the lengths of the compressed data and the
|
||||
compressed, encrypted data are the same.
|
||||
|
||||
It is important for implementors to note that, although the data is
|
||||
encrypted byte-for-byte, it is presented to the encryption and decryption
|
||||
functions in blocks. The block size used for encryption and decryption must
|
||||
be the same. To be compatible with the encryption specification, this block
|
||||
size must be 16 bytes (although the last block may be smaller).
|
||||
|
||||
E. Authentication code
|
||||
|
||||
Authentication provides a high quality check that the contents of an
|
||||
encrypted file have not been inadvertently changed or deliberately tampered
|
||||
with since they were first encrypted. In effect, this is a super-CRC check
|
||||
on the data in the file after compression and encryption. (Additionally,
|
||||
authentication is essential when using CTR mode encryption because this
|
||||
mode is vulnerable to several trivial attacks in its absence.)
|
||||
|
||||
The authentication code is derived from the output of the encryption
|
||||
process. Dr. Gladman's AES code provides this service, and information
|
||||
about how to obtain it is in the coding tips.
|
||||
|
||||
The authentication code is stored unencrypted. It is byte-aligned and
|
||||
immediately follows the last byte of encrypted data.
|
||||
|
||||
For more discussion about authentication, see the authentication code FAQ
|
||||
below.
|
||||
|
||||
IV. Changes in WinZip 11
|
||||
|
||||
Beginning with WinZip 11, WinZip makes a change in its use of the AE-1 and AE-2
|
||||
file formats. The file formats themselves have not changed, and AES-encrypted
|
||||
files created by WinZip 11 are completely compatible with version 1.02 the
|
||||
WinZip AES encryption specification, which was published in January 2004.
|
||||
|
||||
WinZip 9.0 and WinZip 10.0 stored all AES-encrypted files using the AE-2 file
|
||||
format, which does not store the encrypted file's CRC. WinZip 11 instead uses
|
||||
the AE-1 file format, which does store the CRC, for most files. This provides
|
||||
an extra integrity check against the possibility of hardware or software errors
|
||||
that occur during the actual process of file compression/encryption or
|
||||
decryption/decompression. For more information on this point, see the
|
||||
discussion of the CRC below.
|
||||
|
||||
Because for some very small files the CRC can be used to determine the exact
|
||||
contents of a file, regardless of the encryption method used, WinZip 11
|
||||
continues to use the AE-2 file format, with no CRC stored, for files with an
|
||||
uncompressed size of less than 20 bytes. WinZip 11 also uses the AE-2 file
|
||||
format for files compressed in BZIP2 format, because the BZIP2 format contains
|
||||
its own integrity checks equivalent to those provided by the Zip format's CRC.
|
||||
|
||||
Other vendors who support WinZip's AES encryption specification may want to
|
||||
consider making a similar change to their own implementations of the
|
||||
specification, to get the benefit of the extra integrity check that it
|
||||
provides.
|
||||
|
||||
Note that the January 2004 version of the WinZip AE-2 specification, version
|
||||
1.0.2, already required that all utilities that implemented the AE-2 format
|
||||
also be able to process files in AE-1 format, and should check on decryption/
|
||||
extraction of those files that the CRC was correct.
|
||||
|
||||
V. Notes
|
||||
|
||||
A. Non-files and zero-length files
|
||||
|
||||
To reduce Zip file size, it is recommended that non-file entries such as
|
||||
folder/directory entries not be encrypted. This, however, is only a
|
||||
recommendation; it is permissible to encrypt or not encrypt these entries,
|
||||
as you prefer.
|
||||
|
||||
On the other hand, it is recommended that you do encrypt zero-length files.
|
||||
The presence of both encrypted and unencrypted files in a Zip file may
|
||||
trigger user warnings in some Zip file utilities, so the user experience
|
||||
may be improved if all files (including zero-length files) are encrypted.
|
||||
|
||||
If zero-length files are encrypted, the encrypted data portion of the file
|
||||
storage (see above) will be empty, but the remainder of the encryption
|
||||
overhead data must be present, both in the file storage area and in the
|
||||
local and central headers.
|
||||
|
||||
B. "Mixed" Zip files
|
||||
|
||||
There is no requirement that all files in a Zip file be encrypted or that
|
||||
all files that are encrypted use the same encryption method or the same
|
||||
password.
|
||||
|
||||
A Zip file can contain any combination of unencrypted files and files
|
||||
encrypted with any of the four currently defined encryption methods (Zip
|
||||
2.0, AES-128, AES-192, AES-256). Encrypted files may use the same password
|
||||
or different passwords.
|
||||
|
||||
C. Key Generation
|
||||
|
||||
Key derivation, as used by AE-1 and AE-2 and as implemented in Dr.
|
||||
Gladman's library, is done according to the PBKDF2 algorithm, which is
|
||||
described in the RFC2898 guidelines. An iteration count of 1000 is used. An
|
||||
appropriate number of bits from the resulting hash value are used to
|
||||
compose three output values: an encryption key, an authentication key, and
|
||||
a password verification value. The first n bits become the encryption key,
|
||||
the next m bits become the authentication key, and the last 16 bits (two
|
||||
bytes) become the password verification value.
|
||||
|
||||
As part of the process outlined in RFC 2898 a pseudo-random function must
|
||||
be called; AE-2 uses the HMAC-SHA1 function, since it is a well-respected
|
||||
algorithm that has been in wide use for this purpose for several years.
|
||||
|
||||
Note that, when used in connection with 192- or 256-bit AES encryption, the
|
||||
fact that HMAC-SHA1 produces a 160-bit result means that, regardless of the
|
||||
password that you specify, the search space for the encryption key is
|
||||
unlikely to reach the theoretical 192- or 256-bit maximum, and cannot be
|
||||
guaranteed to exceed 160 bits. This is discussed in section B.1.1 of the
|
||||
RFC2898 specification.
|
||||
|
||||
VI. FAQs
|
||||
|
||||
• Why is the compression method field used to indicate AES encryption?
|
||||
|
||||
As opposed to using new version made by and version needed to extract
|
||||
values to signal AES encryption for a file, the new compression method is
|
||||
more likely to be handled gracefully by older versions of existing Zip file
|
||||
utilities. Zip file utilities typically do not attempt to extract files
|
||||
compressed with unknown methods, presumably notifying the user with an
|
||||
appropriate message.
|
||||
|
||||
• How can I guarantee that the salt value is unique?
|
||||
|
||||
In principle, the value of the salt should be different whenever the same
|
||||
password is used more than once, for the reasons described above, but this
|
||||
is difficult to guarantee.
|
||||
|
||||
In practice, the number of bytes in the salt (as specified by AE-1 and
|
||||
AE-2) is such that using a pseudo-random value will ensure that the
|
||||
probability of duplicated salt values is very low and can be safely
|
||||
ignored.
|
||||
|
||||
There is one exception to this: With the 8-byte salt values used with
|
||||
WinZip's 128-bit encryption it is likely that, if approximately 4 billion
|
||||
files are encrypted with the same password, two of the files will have the
|
||||
same salt, so it is advisable to stay well below this limit. Because of
|
||||
this, when using the same password to encrypt very large numbers of files
|
||||
in WinZip's AES encryption format (that is, files totalling in the
|
||||
millions, for example 2000 Zip files, each containing 1000 encrypted
|
||||
files), we recommend the use of 192-bit or 256-bit AES keys, with their 12-
|
||||
and 16-byte salt values, rather than 128-bit AES keys, with their 8-byte
|
||||
salt values.
|
||||
|
||||
Although salt values do not need to be truly random, it is important that
|
||||
they be generated in a way that the probability of duplicated salt values
|
||||
is not significantly higher than that which would be expected if truly
|
||||
random values were being used.
|
||||
|
||||
One technique for generating salt values is presented in the coding tips
|
||||
page.
|
||||
|
||||
• Why is there an authentication code?
|
||||
|
||||
The purpose of the authentication code is to insure that, once a file's
|
||||
data has been compressed and encrypted, any accidental corruption of the
|
||||
encrypted data, and any deliberate attempts to modify the encrypted data by
|
||||
an attacker who does not know the password, can be detected.
|
||||
|
||||
The current consensus in the cryptographic community is that associating a
|
||||
message authentication code (or MAC) with encrypted data has strong
|
||||
security value because it makes a number of attacks more difficult to
|
||||
engineer. For AES CTR mode encryption in particular, a MAC is especially
|
||||
important because a number of trivial attacks are possible in its absence.
|
||||
The MAC used with WinZip's AES encryption is based on HMAC-SHA1-80, a
|
||||
mature and widely respected authentication algorithm.
|
||||
|
||||
The MAC is calculated after the file data has been compressed and
|
||||
encrypted. This order of calculation is referred to as Encrypt-then-MAC,
|
||||
and is preferred by many cryptographers to the alternative order of
|
||||
MAC-then-Encrypt because Encrypt-then-MAC is immune to some known attacks
|
||||
on MAC-then-Encrypt.
|
||||
|
||||
• What is the role of the CRC in WinZip 11?
|
||||
|
||||
Within the Zip format, the primary use of the CRC value is to detect
|
||||
accidental corruption of data that has been stored in the Zip file. With
|
||||
files encrypted according to the Zip 2.0 encryption specification, it also
|
||||
functions to some extent as a method of detecting deliberate attempts to
|
||||
modify the encrypted data, but not one that can be considered
|
||||
cryptographically strong. The CRC is not needed for these purposes with the
|
||||
WinZip AES encryption specification, where the HMAC-SHA1-based
|
||||
authentication code instead serves these roles.
|
||||
|
||||
The CRC has a drawback in that for very small files, such as files with
|
||||
four or fewer bytes, the CRC can be used, independent of the encryption
|
||||
algorithm, to determine the unencrypted contents of the file. And, in
|
||||
general, it is preferable to store as little information as possible about
|
||||
the encrypted file in the unencrypted Zip headers.
|
||||
|
||||
The CRC does serve one purpose that the authentication code does not. The
|
||||
CRC is computed based on the original uncompressed, unencrypted contents of
|
||||
the file, and it is checked after the file has been decrypted and
|
||||
decompressed. In contrast, the authentication code used with WinZip AES
|
||||
encryption is computed after compression/encryption and it is checked
|
||||
before decryption/decompression. In the very rare event of a hardware or
|
||||
software error that corrupts data during compression and encryption, or
|
||||
during decryption and decompression, the CRC will catch the error, but the
|
||||
authentication code will not.
|
||||
|
||||
WinZip 9.0 and WinZip 10.0 used AE-2 for all files that they created, and
|
||||
did not store the CRC. As of WinZip 11, WinZip instead uses AE-1 for most
|
||||
files, storing the CRC as an additional integrity check against hardware or
|
||||
software errors occurring during the actual compression/encryption or
|
||||
decryption/decompression processes. WinZip 11 will continue to use AE-2,
|
||||
with no CRC, for very small files of less than 20 bytes. It will also use
|
||||
AE-2 for files compressed in BZIP2 format, because this format has internal
|
||||
integrity checks equivalent to a CRC check built in.
|
||||
|
||||
Note that the AES-encrypted files created by WinZip 11 are fully compatible
|
||||
with January 2004's version 1.0.2 of the WinZip AES encryption
|
||||
specification, in which both the AE-1 and AE-2 variants of the file format
|
||||
were already defined.
|
||||
|
||||
VII. Change history
|
||||
|
||||
Changes made in document version 1.04, January, 2009: Minor clarification
|
||||
regarding the algorithm used to generate the authentication code.
|
||||
|
||||
Changes made in document version 1.03, November, 2006: Minor editorial and
|
||||
clarifying changes have been made throughout the document. The following
|
||||
substantive technical changes have been made:
|
||||
|
||||
A. WinZip 11 Usage of AE-1 and AE-2
|
||||
|
||||
WinZip's AES encryption specification defines two formats, known as AE-1
|
||||
and AE-2, which differ in whether the CRC of the encrypted file is stored
|
||||
in the Zip headers. While the file formats themselves remain unchanged,
|
||||
WinZip's usage of them is changing. Beginning with WinZip 11, WinZip uses
|
||||
the AE-1 format, which includes the CRC of the encrypted file, for many
|
||||
encrypted files, in order to provide an additional integrity check against
|
||||
hardware or software errors occurring during the compression/encryption or
|
||||
decryption/decompression processes. Note that AES-encrypted files created
|
||||
by WinZip 11 are completely compatible with the previous version of the
|
||||
WinZip encryption specification, January 2004's version 1.0.2.
|
||||
|
||||
B. The discussion of salt values mentions a limitation that applies to the
|
||||
uniqueness of salt values when very large numbers of files are encrypted
|
||||
with 128-bit encryption.
|
||||
C. Older versions of this specification suggested that other vendors might
|
||||
want to use their own vendor IDs to create their own unique encryption
|
||||
formats. We no longer suggest that vendor-specific alternative encryption
|
||||
methods be created in this way.
|
||||
|
||||
Changes made in document version 1.02, January, 2004: The introductory text at
|
||||
the start of the document has been rewritten, and minor editorial and
|
||||
clarifying changes have been made throughout the document. Two substantive
|
||||
technical changes have been made:
|
||||
|
||||
A. AE-2 Specification
|
||||
|
||||
Standard Zip files store the CRC of each file's unencrypted data. This
|
||||
value is used to help detect damage or other alterations to Zip files.
|
||||
However, storing the CRC value has a drawback in that, for a very small
|
||||
file, such as a file of four or fewer bytes, the CRC value can be used,
|
||||
independent of the encryption algorithm, to help determine the unencrypted
|
||||
contents of the file.
|
||||
|
||||
Because of this, files encrypted with the new AE-2 method store a 0 in the
|
||||
CRC field of the Zip header, and use the authentication code instead of the
|
||||
CRC value to verify that encrypted data within the Zip file has not been
|
||||
corrupted.
|
||||
|
||||
The only differences between the AE-1 and AE-2 methods are the storage in
|
||||
AE-2 of 0 instead of the CRC in the Zip file header,and the use in the AES
|
||||
extra data field of 0x0002 for AE-2 instead of 0x0001 for AE-1 as the
|
||||
vendor version.
|
||||
|
||||
Zip utilities that support the AE-2 format are required to be able to read
|
||||
files that were created in the AE-1 format, and during decryption/
|
||||
extraction of files in AE-1 format should verify that the file's CRC
|
||||
matches the value stored in the CRC field.
|
||||
|
||||
B. Key Generation and HMAC-SHA1
|
||||
|
||||
The description of the key generation mechanism has been updated to point
|
||||
out a limitation arising from its use of HMAC-SHA1 as the pseudo-random
|
||||
function: When used in connection with 192- or 256-bit AES encryption, the
|
||||
fact that HMAC-SHA1 produces a 160-bit result means that, regardless of the
|
||||
password that you specify, the search space for the encryption key is
|
||||
unlikely to reach the theoretical 192- or 256-bit maximum, and cannot be
|
||||
guaranteed to exceed 160 bits. This is discussed in section B.1.1 of the
|
||||
RFC2898 specification.
|
||||
|
||||
VII. Developer Information Mailing List Signup
|
||||
|
||||
We plan to use this mailing list to notify subscribers of any substantive
|
||||
changes made to the Developer Information pages on the WinZip web site.
|
||||
|
||||
|
||||
|
||||
If you enter your e-mail address above, you will receive a message
|
||||
asking you to confirm your wish to be added to the mailing list. If you
|
||||
don't reply to the confirmation message, you will not be added to the
|
||||
list.
|
||||
|
||||
By subscribing to this complimentary mailing list service, you
|
||||
acknowledge and agree that WinZip Computing makes no representations
|
||||
regarding the completeness or accuracy of the information provided
|
||||
through the service, and that this service may be discontinued, in whole
|
||||
or in part, with respect to any or all subscribers at any time.
|
||||
* E-mail Address:
|
||||
[ ] [Submit to Support] [Clear Form]
|
||||
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||
|
||||
Document version: 1.04
|
||||
Last modified: January 30, 2009
|
||||
|
||||
Copyright(C) 2003-2015 WinZip International LLC.
|
||||
All Rights Reserved
|
3686
externals/libzip/libzip/docs/appnote.iz
vendored
Executable file
3686
externals/libzip/libzip/docs/appnote.iz
vendored
Executable file
File diff suppressed because it is too large
Load Diff
3497
externals/libzip/libzip/docs/appnote.txt
vendored
Executable file
3497
externals/libzip/libzip/docs/appnote.txt
vendored
Executable file
File diff suppressed because it is too large
Load Diff
1372
externals/libzip/libzip/docs/extrafld.txt
vendored
Executable file
1372
externals/libzip/libzip/docs/extrafld.txt
vendored
Executable file
File diff suppressed because it is too large
Load Diff
13
externals/libzip/libzip/examples/CMakeLists.txt
vendored
Executable file
13
externals/libzip/libzip/examples/CMakeLists.txt
vendored
Executable file
@@ -0,0 +1,13 @@
|
||||
CHECK_FUNCTION_EXISTS(getopt HAVE_GETOPT)
|
||||
IF(NOT HAVE_GETOPT)
|
||||
SET(SRC_EXTRA_FILES ../src/getopt.c)
|
||||
INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/../src)
|
||||
ENDIF(NOT HAVE_GETOPT)
|
||||
|
||||
ADD_EXECUTABLE(in-memory in-memory.c)
|
||||
TARGET_LINK_LIBRARIES(in-memory zip)
|
||||
|
||||
INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/../lib
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/../src
|
||||
${CMAKE_CURRENT_BINARY_DIR}/..)
|
217
externals/libzip/libzip/examples/in-memory.c
vendored
Executable file
217
externals/libzip/libzip/examples/in-memory.c
vendored
Executable file
@@ -0,0 +1,217 @@
|
||||
/*
|
||||
in-memory.c -- modify zip file in memory
|
||||
Copyright (C) 2014-2018 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 <string.h>
|
||||
#include <sys/stat.h>
|
||||
|
||||
#include <zip.h>
|
||||
|
||||
static int
|
||||
get_data(void **datap, size_t *sizep, const char *archive) {
|
||||
/* example implementation that reads data from file */
|
||||
struct stat st;
|
||||
FILE *fp;
|
||||
|
||||
if ((fp = fopen(archive, "r")) == NULL) {
|
||||
if (errno != ENOENT) {
|
||||
fprintf(stderr, "can't open %s: %s\n", archive, strerror(errno));
|
||||
return -1;
|
||||
}
|
||||
|
||||
*datap = NULL;
|
||||
*sizep = 0;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (fstat(fileno(fp), &st) < 0) {
|
||||
fprintf(stderr, "can't stat %s: %s\n", archive, strerror(errno));
|
||||
fclose(fp);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if ((*datap = malloc((size_t)st.st_size)) == NULL) {
|
||||
fprintf(stderr, "can't allocate buffer\n");
|
||||
fclose(fp);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (fread(*datap, 1, (size_t)st.st_size, fp) < (size_t)st.st_size) {
|
||||
fprintf(stderr, "can't read %s: %s\n", archive, strerror(errno));
|
||||
free(*datap);
|
||||
fclose(fp);
|
||||
return -1;
|
||||
}
|
||||
|
||||
fclose(fp);
|
||||
|
||||
*sizep = (size_t)st.st_size;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
modify_archive(zip_t *za) {
|
||||
/* modify the archive */
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
static int
|
||||
use_data(void *data, size_t size, const char *archive) {
|
||||
/* example implementation that writes data to file */
|
||||
FILE *fp;
|
||||
|
||||
if (data == NULL) {
|
||||
if (remove(archive) < 0 && errno != ENOENT) {
|
||||
fprintf(stderr, "can't remove %s: %s\n", archive, strerror(errno));
|
||||
return -1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
if ((fp = fopen(archive, "wb")) == NULL) {
|
||||
fprintf(stderr, "can't open %s: %s\n", archive, strerror(errno));
|
||||
return -1;
|
||||
}
|
||||
if (fwrite(data, 1, size, fp) < size) {
|
||||
fprintf(stderr, "can't write %s: %s\n", archive, strerror(errno));
|
||||
fclose(fp);
|
||||
return -1;
|
||||
}
|
||||
if (fclose(fp) < 0) {
|
||||
fprintf(stderr, "can't write %s: %s\n", archive, strerror(errno));
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
main(int argc, char *argv[]) {
|
||||
const char *archive;
|
||||
zip_source_t *src;
|
||||
zip_t *za;
|
||||
zip_error_t error;
|
||||
void *data;
|
||||
size_t size;
|
||||
|
||||
if (argc < 2) {
|
||||
fprintf(stderr, "usage: %s archive\n", argv[0]);
|
||||
return 1;
|
||||
}
|
||||
archive = argv[1];
|
||||
|
||||
/* get buffer with zip archive inside */
|
||||
if (get_data(&data, &size, archive) < 0) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
zip_error_init(&error);
|
||||
/* create source from buffer */
|
||||
if ((src = zip_source_buffer_create(data, size, 1, &error)) == NULL) {
|
||||
fprintf(stderr, "can't create source: %s\n", zip_error_strerror(&error));
|
||||
free(data);
|
||||
zip_error_fini(&error);
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* open zip archive from source */
|
||||
if ((za = zip_open_from_source(src, 0, &error)) == NULL) {
|
||||
fprintf(stderr, "can't open zip from source: %s\n", zip_error_strerror(&error));
|
||||
zip_source_free(src);
|
||||
zip_error_fini(&error);
|
||||
return 1;
|
||||
}
|
||||
zip_error_fini(&error);
|
||||
|
||||
/* we'll want to read the data back after zip_close */
|
||||
zip_source_keep(src);
|
||||
|
||||
/* modify archive */
|
||||
modify_archive(za);
|
||||
|
||||
/* close archive */
|
||||
if (zip_close(za) < 0) {
|
||||
fprintf(stderr, "can't close zip archive '%s': %s\n", archive, zip_strerror(za));
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
/* copy new archive to buffer */
|
||||
|
||||
if (zip_source_is_deleted(src)) {
|
||||
/* new archive is empty, thus no data */
|
||||
data = NULL;
|
||||
}
|
||||
else {
|
||||
zip_stat_t zst;
|
||||
|
||||
if (zip_source_stat(src, &zst) < 0) {
|
||||
fprintf(stderr, "can't stat source: %s\n", zip_error_strerror(zip_source_error(src)));
|
||||
return 1;
|
||||
}
|
||||
|
||||
size = zst.size;
|
||||
|
||||
if (zip_source_open(src) < 0) {
|
||||
fprintf(stderr, "can't open source: %s\n", zip_error_strerror(zip_source_error(src)));
|
||||
return 1;
|
||||
}
|
||||
if ((data = malloc(size)) == NULL) {
|
||||
fprintf(stderr, "malloc failed: %s\n", strerror(errno));
|
||||
zip_source_close(src);
|
||||
return 1;
|
||||
}
|
||||
if ((zip_uint64_t)zip_source_read(src, data, size) < size) {
|
||||
fprintf(stderr, "can't read data from source: %s\n", zip_error_strerror(zip_source_error(src)));
|
||||
zip_source_close(src);
|
||||
free(data);
|
||||
return 1;
|
||||
}
|
||||
zip_source_close(src);
|
||||
}
|
||||
|
||||
/* we're done with src */
|
||||
zip_source_free(src);
|
||||
|
||||
/* use new data */
|
||||
use_data(data, size, archive);
|
||||
|
||||
free(data);
|
||||
|
||||
return 0;
|
||||
}
|
60
externals/libzip/libzip/examples/windows-open.c
vendored
Executable file
60
externals/libzip/libzip/examples/windows-open.c
vendored
Executable file
@@ -0,0 +1,60 @@
|
||||
/*
|
||||
windows-open.c -- open zip archive using Windows UTF-16/Unicode file name
|
||||
Copyright (C) 2015-2018 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 <zip.h>
|
||||
|
||||
zip_t *
|
||||
windows_open(const wchar_t *name, int flags) {
|
||||
zip_source_t *src;
|
||||
zip_t *za;
|
||||
zip_error_t error;
|
||||
|
||||
zip_error_init(&error);
|
||||
/* create source from buffer */
|
||||
if ((src = zip_source_win32w_create(name, 0, -1, &error)) == NULL) {
|
||||
fprintf(stderr, "can't create source: %s\n", zip_error_strerror(&error));
|
||||
zip_error_fini(&error);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* open zip archive from source */
|
||||
if ((za = zip_open_from_source(src, flags, &error)) == NULL) {
|
||||
fprintf(stderr, "can't open zip from source: %s\n", zip_error_strerror(&error));
|
||||
zip_source_free(src);
|
||||
zip_error_fini(&error);
|
||||
return NULL;
|
||||
}
|
||||
zip_error_fini(&error);
|
||||
|
||||
return za;
|
||||
}
|
233
externals/libzip/libzip/lib/CMakeLists.txt
vendored
Executable file
233
externals/libzip/libzip/lib/CMakeLists.txt
vendored
Executable file
@@ -0,0 +1,233 @@
|
||||
INCLUDE(CheckFunctionExists)
|
||||
|
||||
INSTALL(FILES zip.h DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
|
||||
|
||||
SET(CMAKE_C_VISIBILITY_PRESET hidden)
|
||||
|
||||
# from http://www.cmake.org/Wiki/CMakeMacroLibtoolFile
|
||||
MACRO(GET_TARGET_PROPERTY_WITH_DEFAULT _variable _target _property _default_value)
|
||||
GET_TARGET_PROPERTY(${_variable} ${_target} ${_property})
|
||||
IF(${_variable} STREQUAL NOTFOUND)
|
||||
SET(${_variable} ${_default_value})
|
||||
ENDIF()
|
||||
|
||||
ENDMACRO()
|
||||
|
||||
MACRO(CREATE_LIBTOOL_FILE _target _install_DIR)
|
||||
GET_TARGET_PROPERTY(_target_location ${_target} LOCATION)
|
||||
GET_TARGET_PROPERTY_WITH_DEFAULT(_target_static_lib ${_target} STATIC_LIB "")
|
||||
GET_TARGET_PROPERTY_WITH_DEFAULT(_target_dependency_libs ${_target} LT_DEPENDENCY_LIBS "")
|
||||
GET_TARGET_PROPERTY_WITH_DEFAULT(_target_current ${_target} LT_VERSION_CURRENT 4)
|
||||
GET_TARGET_PROPERTY_WITH_DEFAULT(_target_revision ${_target} LT_VERSION_REVISION 0)
|
||||
GET_TARGET_PROPERTY_WITH_DEFAULT(_target_age ${_target} LT_VERSION_AGE 0)
|
||||
GET_TARGET_PROPERTY_WITH_DEFAULT(_target_installed ${_target} LT_INSTALLED yes)
|
||||
GET_TARGET_PROPERTY_WITH_DEFAULT(_target_shouldnotlink ${_target} LT_SHOULDNOTLINK yes)
|
||||
GET_TARGET_PROPERTY_WITH_DEFAULT(_target_dlopen ${_target} LT_DLOPEN "")
|
||||
GET_TARGET_PROPERTY_WITH_DEFAULT(_target_dlpreopen ${_target} LT_DLPREOPEN "")
|
||||
GET_FILENAME_COMPONENT(_laname ${_target_location} NAME_WE)
|
||||
GET_FILENAME_COMPONENT(_soname ${_target_location} NAME)
|
||||
SET(_laname ${_laname}.la)
|
||||
FILE(WRITE ${_laname} "# ${_laname} - a libtool library file, generated by cmake \n")
|
||||
FILE(APPEND ${_laname} "# The name that we can dlopen(3).\n")
|
||||
FILE(APPEND ${_laname} "dlname='${_soname}'\n")
|
||||
FILE(APPEND ${_laname} "# Names of this library\n")
|
||||
FILE(APPEND ${_laname} "library_names='${_soname}.${_target_current}.${_target_age}.${_target_revision} ${_soname}.${_target_current} ${_soname}'\n")
|
||||
FILE(APPEND ${_laname} "# The name of the static archive\n")
|
||||
FILE(APPEND ${_laname} "old_library='${_target_static_lib}'\n")
|
||||
FILE(APPEND ${_laname} "# Libraries that this one depends upon.\n")
|
||||
FILE(APPEND ${_laname} "dependency_libs='${_target_dependency_libs}'\n")
|
||||
FILE(APPEND ${_laname} "# Version information.\n")
|
||||
FILE(APPEND ${_laname} "current=${_target_current}\n")
|
||||
FILE(APPEND ${_laname} "age=${_target_age}\n")
|
||||
FILE(APPEND ${_laname} "revision=${_target_revision}\n")
|
||||
FILE(APPEND ${_laname} "# Is this an already installed library?\n")
|
||||
FILE(APPEND ${_laname} "installed=${_target_installed}\n")
|
||||
FILE(APPEND ${_laname} "# Should we warn about portability when linking against -modules?\n")
|
||||
FILE(APPEND ${_laname} "shouldnotlink=${_target_shouldnotlink}\n")
|
||||
FILE(APPEND ${_laname} "# Files to dlopen/dlpreopen\n")
|
||||
FILE(APPEND ${_laname} "dlopen='${_target_dlopen}'\n")
|
||||
FILE(APPEND ${_laname} "dlpreopen='${_target_dlpreopen}'\n")
|
||||
FILE(APPEND ${_laname} "# Directory that this library needs to be installed in:\n")
|
||||
FILE(APPEND ${_laname} "libdir='${CMAKE_INSTALL_PREFIX}/${_install_DIR}'\n")
|
||||
INSTALL( FILES ${_laname} ${_soname} DESTINATION ${CMAKE_INSTALL_PREFIX}${_install_DIR})
|
||||
ENDMACRO()
|
||||
|
||||
SET(LIBZIP_SOURCES
|
||||
zip_add.c
|
||||
zip_add_dir.c
|
||||
zip_add_entry.c
|
||||
zip_algorithm_deflate.c
|
||||
zip_buffer.c
|
||||
zip_close.c
|
||||
zip_delete.c
|
||||
zip_dir_add.c
|
||||
zip_dirent.c
|
||||
zip_discard.c
|
||||
zip_entry.c
|
||||
zip_err_str.c
|
||||
zip_error.c
|
||||
zip_error_clear.c
|
||||
zip_error_get.c
|
||||
zip_error_get_sys_type.c
|
||||
zip_error_strerror.c
|
||||
zip_error_to_str.c
|
||||
zip_extra_field.c
|
||||
zip_extra_field_api.c
|
||||
zip_fclose.c
|
||||
zip_fdopen.c
|
||||
zip_file_add.c
|
||||
zip_file_error_clear.c
|
||||
zip_file_error_get.c
|
||||
zip_file_get_comment.c
|
||||
zip_file_get_external_attributes.c
|
||||
zip_file_get_offset.c
|
||||
zip_file_rename.c
|
||||
zip_file_replace.c
|
||||
zip_file_set_comment.c
|
||||
zip_file_set_encryption.c
|
||||
zip_file_set_external_attributes.c
|
||||
zip_file_set_mtime.c
|
||||
zip_file_strerror.c
|
||||
zip_filerange_crc.c
|
||||
zip_fopen.c
|
||||
zip_fopen_encrypted.c
|
||||
zip_fopen_index.c
|
||||
zip_fopen_index_encrypted.c
|
||||
zip_fread.c
|
||||
zip_fseek.c
|
||||
zip_ftell.c
|
||||
zip_get_archive_comment.c
|
||||
zip_get_archive_flag.c
|
||||
zip_get_encryption_implementation.c
|
||||
zip_get_file_comment.c
|
||||
zip_get_name.c
|
||||
zip_get_num_entries.c
|
||||
zip_get_num_files.c
|
||||
zip_hash.c
|
||||
zip_io_util.c
|
||||
zip_libzip_version.c
|
||||
zip_memdup.c
|
||||
zip_name_locate.c
|
||||
zip_new.c
|
||||
zip_open.c
|
||||
zip_progress.c
|
||||
zip_rename.c
|
||||
zip_replace.c
|
||||
zip_set_archive_comment.c
|
||||
zip_set_archive_flag.c
|
||||
zip_set_default_password.c
|
||||
zip_set_file_comment.c
|
||||
zip_set_file_compression.c
|
||||
zip_set_name.c
|
||||
zip_source_accept_empty.c
|
||||
zip_source_begin_write.c
|
||||
zip_source_begin_write_cloning.c
|
||||
zip_source_buffer.c
|
||||
zip_source_call.c
|
||||
zip_source_close.c
|
||||
zip_source_commit_write.c
|
||||
zip_source_compress.c
|
||||
zip_source_crc.c
|
||||
zip_source_error.c
|
||||
zip_source_filep.c
|
||||
zip_source_free.c
|
||||
zip_source_function.c
|
||||
zip_source_get_compression_flags.c
|
||||
zip_source_is_deleted.c
|
||||
zip_source_layered.c
|
||||
zip_source_open.c
|
||||
zip_source_pkware.c
|
||||
zip_source_read.c
|
||||
zip_source_remove.c
|
||||
zip_source_rollback_write.c
|
||||
zip_source_seek.c
|
||||
zip_source_seek_write.c
|
||||
zip_source_stat.c
|
||||
zip_source_supports.c
|
||||
zip_source_tell.c
|
||||
zip_source_tell_write.c
|
||||
zip_source_window.c
|
||||
zip_source_write.c
|
||||
zip_source_zip.c
|
||||
zip_source_zip_new.c
|
||||
zip_stat.c
|
||||
zip_stat_index.c
|
||||
zip_stat_init.c
|
||||
zip_strerror.c
|
||||
zip_string.c
|
||||
zip_unchange.c
|
||||
zip_unchange_all.c
|
||||
zip_unchange_archive.c
|
||||
zip_unchange_data.c
|
||||
zip_utf-8.c
|
||||
)
|
||||
|
||||
IF(WIN32)
|
||||
SET(LIBZIP_OPSYS_FILES
|
||||
zip_source_win32handle.c
|
||||
zip_source_win32utf8.c
|
||||
zip_source_win32w.c
|
||||
)
|
||||
IF(CMAKE_SYSTEM_NAME MATCHES WindowsPhone OR CMAKE_SYSTEM_NAME MATCHES WindowsStore)
|
||||
ELSE()
|
||||
SET(LIBZIP_OPSYS_FILES "${LIBZIP_OPSYS_FILES}"
|
||||
zip_source_win32a.c
|
||||
)
|
||||
ENDIF()
|
||||
ELSE(WIN32)
|
||||
SET(LIBZIP_OPSYS_FILES
|
||||
zip_mkstempm.c
|
||||
zip_source_file.c
|
||||
zip_random_unix.c
|
||||
)
|
||||
ENDIF(WIN32)
|
||||
|
||||
INCLUDE_DIRECTORIES(BEFORE ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR}/..)
|
||||
|
||||
ADD_CUSTOM_TARGET(update_zip_err_str
|
||||
COMMAND sh ${CMAKE_CURRENT_SOURCE_DIR}/make_zip_err_str.sh ${CMAKE_CURRENT_SOURCE_DIR}/zip.h ${CMAKE_CURRENT_SOURCE_DIR}/zip_err_str.c
|
||||
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/zip.h ${CMAKE_CURRENT_SOURCE_DIR}/make_zip_err_str.sh
|
||||
)
|
||||
IF(HAVE_LIBBZ2)
|
||||
SET(LIBZIP_OPTIONAL_FILES zip_algorithm_bzip2.c)
|
||||
ENDIF()
|
||||
|
||||
IF(HAVE_LIBLZMA)
|
||||
SET(LIBZIP_OPTIONAL_FILES ${LIBZIP_OPTIONAL_FILES} zip_algorithm_xz.c)
|
||||
ENDIF()
|
||||
|
||||
IF(HAVE_COMMONCRYPTO)
|
||||
SET(LIBZIP_OPTIONAL_FILES ${LIBZIP_OPTIONAL_FILES} zip_crypto_commoncrypto.c
|
||||
)
|
||||
ELSEIF(HAVE_WINDOWS_CRYPTO)
|
||||
SET(LIBZIP_OPTIONAL_FILES ${LIBZIP_OPTIONAL_FILES} zip_crypto_win.c
|
||||
)
|
||||
ELSEIF(HAVE_GNUTLS)
|
||||
SET(LIBZIP_OPTIONAL_FILES ${LIBZIP_OPTIONAL_FILES} zip_crypto_gnutls.c
|
||||
)
|
||||
ELSEIF(HAVE_OPENSSL)
|
||||
SET(LIBZIP_OPTIONAL_FILES ${LIBZIP_OPTIONAL_FILES} zip_crypto_openssl.c
|
||||
)
|
||||
ELSEIF(HAVE_MBEDTLS)
|
||||
SET(LIBZIP_OPTIONAL_FILES ${LIBZIP_OPTIONAL_FILES} zip_crypto_mbedtls.c
|
||||
)
|
||||
ENDIF()
|
||||
|
||||
IF(HAVE_CRYPTO)
|
||||
SET(LIBZIP_OPTIONAL_FILES ${LIBZIP_OPTIONAL_FILES} zip_winzip_aes.c zip_source_winzip_aes_decode.c zip_source_winzip_aes_encode.c
|
||||
)
|
||||
ENDIF()
|
||||
|
||||
ADD_LIBRARY(zip ${LIBZIP_SOURCES} ${LIBZIP_EXTRA_FILES} ${LIBZIP_OPTIONAL_FILES} ${LIBZIP_OPSYS_FILES})
|
||||
|
||||
IF(SHARED_LIB_VERSIONNING)
|
||||
SET_TARGET_PROPERTIES(zip PROPERTIES VERSION 5.0 SOVERSION 5)
|
||||
ENDIF()
|
||||
|
||||
|
||||
TARGET_LINK_LIBRARIES(zip ${ZLIB_LIBRARIES} ${OPTIONAL_LIBRARY})
|
||||
INSTALL(TARGETS zip
|
||||
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
|
||||
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
|
||||
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR})
|
||||
#CREATE_LIBTOOL_FILE(zip lib)
|
203
externals/libzip/libzip/lib/compat.h
vendored
Executable file
203
externals/libzip/libzip/lib/compat.h
vendored
Executable file
@@ -0,0 +1,203 @@
|
||||
#ifndef _HAD_LIBZIP_COMPAT_H
|
||||
#define _HAD_LIBZIP_COMPAT_H
|
||||
|
||||
/*
|
||||
compat.h -- compatibility defines.
|
||||
Copyright (C) 1999-2018 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 "zipconf.h"
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "config.h"
|
||||
#endif
|
||||
|
||||
/* to have *_MAX definitions for all types when compiling with g++ */
|
||||
#define __STDC_LIMIT_MACROS
|
||||
|
||||
#ifdef _WIN32
|
||||
#ifndef ZIP_EXTERN
|
||||
#ifndef ZIP_STATIC
|
||||
#define ZIP_EXTERN __declspec(dllexport)
|
||||
#endif
|
||||
#endif
|
||||
/* for dup(), close(), etc. */
|
||||
#include <io.h>
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_STDBOOL_H
|
||||
#include <stdbool.h>
|
||||
#else
|
||||
typedef char bool;
|
||||
#define true 1
|
||||
#define false 0
|
||||
#endif
|
||||
|
||||
#include <errno.h>
|
||||
|
||||
/* at least MinGW does not provide EOPNOTSUPP, see
|
||||
* http://sourceforge.net/p/mingw/bugs/263/
|
||||
*/
|
||||
#ifndef EOPNOTSUPP
|
||||
#define EOPNOTSUPP EINVAL
|
||||
#endif
|
||||
|
||||
/* at least MinGW does not provide EOVERFLOW, see
|
||||
* http://sourceforge.net/p/mingw/bugs/242/
|
||||
*/
|
||||
#ifndef EOVERFLOW
|
||||
#define EOVERFLOW EFBIG
|
||||
#endif
|
||||
|
||||
/* not supported on at least Windows */
|
||||
#ifndef O_CLOEXEC
|
||||
#define O_CLOEXEC 0
|
||||
#endif
|
||||
|
||||
#ifdef _WIN32
|
||||
#if defined(HAVE__CHMOD)
|
||||
#define chmod _chmod
|
||||
#endif
|
||||
#if defined(HAVE__CLOSE)
|
||||
#define close _close
|
||||
#endif
|
||||
#if defined(HAVE__DUP)
|
||||
#define dup _dup
|
||||
#endif
|
||||
/* crashes reported when using fdopen instead of _fdopen on Windows/Visual Studio 10/Win64 */
|
||||
#if defined(HAVE__FDOPEN)
|
||||
#define fdopen _fdopen
|
||||
#endif
|
||||
#if !defined(HAVE_FILENO) && defined(HAVE__FILENO)
|
||||
#define fileno _fileno
|
||||
#endif
|
||||
/* Windows' open() doesn't understand Unix permissions */
|
||||
#if defined(HAVE__OPEN)
|
||||
#define open(a, b, c) _open((a), (b))
|
||||
#endif
|
||||
#if defined(HAVE__SNPRINTF)
|
||||
#define snprintf _snprintf
|
||||
#endif
|
||||
#if defined(HAVE__STRDUP)
|
||||
#if !defined(HAVE_STRDUP) || defined(_WIN32)
|
||||
#undef strdup
|
||||
#define strdup _strdup
|
||||
#endif
|
||||
#endif
|
||||
#if !defined(HAVE__SETMODE) && defined(HAVE_SETMODE)
|
||||
#define _setmode setmode
|
||||
#endif
|
||||
#if !defined(HAVE_STRTOLL) && defined(HAVE__STRTOI64)
|
||||
#define strtoll _strtoi64
|
||||
#endif
|
||||
#if !defined(HAVE_STRTOULL) && defined(HAVE__STRTOUI64)
|
||||
#define strtoull _strtoui64
|
||||
#endif
|
||||
#if defined(HAVE__UNLINK)
|
||||
#define unlink _unlink
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#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
|
||||
|
||||
#if !defined(HAVE_STRCASECMP)
|
||||
#if defined(HAVE__STRICMP)
|
||||
#define strcasecmp _stricmp
|
||||
#elif defined(HAVE_STRICMP)
|
||||
#define strcasecmp stricmp
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if SIZEOF_OFF_T == 8
|
||||
#define ZIP_OFF_MAX ZIP_INT64_MAX
|
||||
#define ZIP_OFF_MIN ZIP_INT64_MIN
|
||||
#elif SIZEOF_OFF_T == 4
|
||||
#define ZIP_OFF_MAX ZIP_INT32_MAX
|
||||
#define ZIP_OFF_MIN ZIP_INT32_MIN
|
||||
#elif SIZEOF_OFF_T == 2
|
||||
#define ZIP_OFF_MAX ZIP_INT16_MAX
|
||||
#define ZIP_OFF_MIN ZIP_INT16_MIN
|
||||
#else
|
||||
#error unsupported size of off_t
|
||||
#endif
|
||||
|
||||
#if defined(HAVE_FTELLO) && defined(HAVE_FSEEKO)
|
||||
#define ZIP_FSEEK_MAX ZIP_OFF_MAX
|
||||
#define ZIP_FSEEK_MIN ZIP_OFF_MIN
|
||||
#else
|
||||
#include <limits.h>
|
||||
#define ZIP_FSEEK_MAX LONG_MAX
|
||||
#define ZIP_FSEEK_MIN LONG_MIN
|
||||
#endif
|
||||
|
||||
#ifndef SIZE_MAX
|
||||
#if SIZEOF_SIZE_T == 8
|
||||
#define SIZE_MAX ZIP_INT64_MAX
|
||||
#elif SIZEOF_SIZE_T == 4
|
||||
#define SIZE_MAX ZIP_INT32_MAX
|
||||
#elif SIZEOF_SIZE_T == 2
|
||||
#define SIZE_MAX ZIP_INT16_MAX
|
||||
#else
|
||||
#error unsupported size of size_t
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifndef PRId64
|
||||
#ifdef _MSC_VER
|
||||
#define PRId64 "I64d"
|
||||
#else
|
||||
#define PRId64 "lld"
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifndef PRIu64
|
||||
#ifdef _MSC_VER
|
||||
#define PRIu64 "I64u"
|
||||
#else
|
||||
#define PRIu64 "llu"
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifndef S_ISDIR
|
||||
#define S_ISDIR(mode) (((mode)&S_IFMT) == S_IFDIR)
|
||||
#endif
|
||||
|
||||
#ifndef S_ISREG
|
||||
#define S_ISREG(mode) (((mode)&S_IFMT) == S_IFREG)
|
||||
#endif
|
||||
|
||||
#endif /* compat.h */
|
79
externals/libzip/libzip/lib/make_zip_err_str.sh
vendored
Executable file
79
externals/libzip/libzip/lib/make_zip_err_str.sh
vendored
Executable file
@@ -0,0 +1,79 @@
|
||||
#!/bin/sh
|
||||
|
||||
# make_zip_err_str.sh: create zip_err_str.c from zip.h
|
||||
# Copyright (C) 1999-2014 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.
|
||||
|
||||
|
||||
if [ "$#" -ne 2 ]
|
||||
then
|
||||
echo "Usage: $0 in_file out_file" >&2
|
||||
echo " e.g. $0 zip.h zip_err_str.c" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ "$1" = "$2" ]
|
||||
then
|
||||
echo "$0: error: output file = input file" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
cat <<EOF >> "$2.$$" || exit 1
|
||||
/*
|
||||
This file was generated automatically by $0
|
||||
from $1; make changes there.
|
||||
*/
|
||||
|
||||
#include "zipint.h"
|
||||
|
||||
const char * const _zip_err_str[] = {
|
||||
EOF
|
||||
|
||||
sed -n '/^#define ZIP_ER_/ s/.*\/\* . \([^*]*\) \*\// "\1",/p' "$1" \
|
||||
>> "$2.$$" || exit 1
|
||||
|
||||
cat <<EOF >> "$2.$$" || exit 1
|
||||
};
|
||||
|
||||
const int _zip_nerr_str = sizeof(_zip_err_str)/sizeof(_zip_err_str[0]);
|
||||
|
||||
#define N ZIP_ET_NONE
|
||||
#define S ZIP_ET_SYS
|
||||
#define Z ZIP_ET_ZLIB
|
||||
|
||||
const int _zip_err_type[] = {
|
||||
EOF
|
||||
|
||||
sed -n '/^#define ZIP_ER_/ s/.*\/\* \(.\) \([^*]*\) \*\// \1,/p' "$1" \
|
||||
>> "$2.$$" || exit 1
|
||||
|
||||
echo '};' >> "$2.$$" || exit 1
|
||||
|
||||
mv "$2.$$" "$2" || exit 1
|
163
externals/libzip/libzip/lib/make_zipconf.sh
vendored
Executable file
163
externals/libzip/libzip/lib/make_zipconf.sh
vendored
Executable file
@@ -0,0 +1,163 @@
|
||||
#!/bin/sh
|
||||
|
||||
# make_zipconf.sh: create platform specific include file zipconf.h
|
||||
# Copyright (C) 1999-2011 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.
|
||||
|
||||
|
||||
set -e
|
||||
|
||||
define_type()
|
||||
{
|
||||
short=$1
|
||||
long=$2
|
||||
bytes=$3
|
||||
infile="$4"
|
||||
outfile="$5"
|
||||
|
||||
bits=`expr $bytes '*' 8`
|
||||
type="${short}int${bits}"
|
||||
TYPE=`echo $type | tr '[a-z]' '[A-Z]'`
|
||||
if grep "define HAVE_${TYPE}_T" "$infile" > /dev/null
|
||||
then
|
||||
echo "typedef ${type}_t zip_${type}_t;" >> "$outfile"
|
||||
LTYPE="$TYPE"
|
||||
else
|
||||
SHORT=`echo $short | tr '[a-z]' '[A-Z]'`
|
||||
if [ -z "$SHORT" ]
|
||||
then
|
||||
SHORT='S'
|
||||
fi
|
||||
if [ "$bytes" -eq 1 ]
|
||||
then
|
||||
if [ -z "$long" ]
|
||||
then
|
||||
long='signed'
|
||||
fi
|
||||
echo "typedef $long char ${type}_t;" >> $outfile
|
||||
LTYPE="${SHORT}CHAR"
|
||||
else
|
||||
ctype=`sed -n "s/.define SIZEOF_\([A-Z_]*\) $bytes/\1/p" "$infile" \
|
||||
| head -1 | tr '[A-Z_]' '[a-z ]'`
|
||||
if [ -z "$ctype" ]
|
||||
then
|
||||
echo "$0: no $bits bit type found" >&2
|
||||
exit 1
|
||||
fi
|
||||
echo "typedef $long $ctype ${type}_t;" >> "$outfile"
|
||||
case "$ctype" in
|
||||
short) LTYPE=${SHORT}SHRT;;
|
||||
int) LTYPE=${SHORT}INT;;
|
||||
long) LTYPE=${SHORT}LONG;;
|
||||
"long long") LTYPE=${SHORT}LLONG;;
|
||||
esac
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ -z "$long" ]
|
||||
then
|
||||
echo "#define ZIP_${TYPE}_MIN ${LTYPE}_MIN" >> "$outfile"
|
||||
fi
|
||||
echo "#define ZIP_${TYPE}_MAX ${LTYPE}_MAX" >> "$outfile"
|
||||
echo >> "$outfile"
|
||||
}
|
||||
|
||||
|
||||
if [ "$#" -ne 2 ]
|
||||
then
|
||||
echo "Usage: $0 config_h_file out_file" >&2
|
||||
echo " e.g. $0 ../config.h zip_err_str.c" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ "$1" = "$2" ]
|
||||
then
|
||||
echo "$0: error: output file = input file" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
cat <<EOF > "$2.$$"
|
||||
#ifndef _HAD_ZIPCONF_H
|
||||
#define _HAD_ZIPCONF_H
|
||||
|
||||
/*
|
||||
zipconf.h -- platform specific include file
|
||||
|
||||
This file was generated automatically by $0
|
||||
based on $1.
|
||||
*/
|
||||
|
||||
EOF
|
||||
|
||||
version=`sed -n 's/^#define VERSION "\(.*\)"/\1/p' "$1"`
|
||||
|
||||
version_major=`expr "$version" : '^\([0-9]*\)' || true`
|
||||
version_minor=`expr "$version" : '^[0-9]*\.\([0-9]*\)' || true`
|
||||
version_micro=`expr "$version" : '^[0-9]*\.[0-9]\.\([0-9]*\)' || true`
|
||||
|
||||
if [ -z "$version_major" ]
|
||||
then
|
||||
version_major=0
|
||||
fi
|
||||
if [ -z "$version_minor" ]
|
||||
then
|
||||
version_minor=0
|
||||
fi
|
||||
if [ -z "$version_micro" ]
|
||||
then
|
||||
version_micro=0
|
||||
fi
|
||||
|
||||
cat <<EOF >> "$2.$$"
|
||||
#define LIBZIP_VERSION "$version"
|
||||
#define LIBZIP_VERSION_MAJOR $version_major
|
||||
#define LIBZIP_VERSION_MINOR $version_minor
|
||||
#define LIBZIP_VERSION_MICRO $version_micro
|
||||
|
||||
EOF
|
||||
|
||||
if grep 'define HAVE_INTTYPES_H' "$1" > /dev/null
|
||||
then
|
||||
echo '#include <inttypes.h>' >> "$2.$$"
|
||||
else
|
||||
echo '#include <limits.h>' >> "$2.$$"
|
||||
fi
|
||||
echo >> "$2.$$"
|
||||
|
||||
for size in 1 2 4 8
|
||||
do
|
||||
define_type '' '' $size "$1" "$2.$$"
|
||||
define_type u unsigned $size "$1" "$2.$$"
|
||||
done
|
||||
|
||||
echo >> "$2.$$"
|
||||
echo '#endif /* zipconf.h */' >> "$2.$$"
|
||||
|
||||
mv "$2.$$" "$2"
|
452
externals/libzip/libzip/lib/zip.h
vendored
Executable file
452
externals/libzip/libzip/lib/zip.h
vendored
Executable file
@@ -0,0 +1,452 @@
|
||||
#ifndef _HAD_ZIP_H
|
||||
#define _HAD_ZIP_H
|
||||
|
||||
/*
|
||||
zip.h -- exported declarations.
|
||||
Copyright (C) 1999-2019 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.
|
||||
*/
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#if 0
|
||||
} /* fix autoindent */
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#include <zipconf.h>
|
||||
|
||||
#ifndef ZIP_EXTERN
|
||||
#ifndef ZIP_STATIC
|
||||
#ifdef _WIN32
|
||||
#define ZIP_EXTERN __declspec(dllimport)
|
||||
#elif defined(__GNUC__) && __GNUC__ >= 4
|
||||
#define ZIP_EXTERN __attribute__((visibility("default")))
|
||||
#else
|
||||
#define ZIP_EXTERN
|
||||
#endif
|
||||
#else
|
||||
#define ZIP_EXTERN
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#include <stdio.h>
|
||||
#include <sys/types.h>
|
||||
#include <time.h>
|
||||
|
||||
/* flags for zip_open */
|
||||
|
||||
#define ZIP_CREATE 1
|
||||
#define ZIP_EXCL 2
|
||||
#define ZIP_CHECKCONS 4
|
||||
#define ZIP_TRUNCATE 8
|
||||
#define ZIP_RDONLY 16
|
||||
|
||||
|
||||
/* flags for zip_name_locate, zip_fopen, zip_stat, ... */
|
||||
|
||||
#define ZIP_FL_NOCASE 1u /* ignore case on name lookup */
|
||||
#define ZIP_FL_NODIR 2u /* ignore directory component */
|
||||
#define ZIP_FL_COMPRESSED 4u /* read compressed data */
|
||||
#define ZIP_FL_UNCHANGED 8u /* use original data, ignoring changes */
|
||||
#define ZIP_FL_RECOMPRESS 16u /* force recompression of data */
|
||||
#define ZIP_FL_ENCRYPTED 32u /* read encrypted data (implies ZIP_FL_COMPRESSED) */
|
||||
#define ZIP_FL_ENC_GUESS 0u /* guess string encoding (is default) */
|
||||
#define ZIP_FL_ENC_RAW 64u /* get unmodified string */
|
||||
#define ZIP_FL_ENC_STRICT 128u /* follow specification strictly */
|
||||
#define ZIP_FL_LOCAL 256u /* in local header */
|
||||
#define ZIP_FL_CENTRAL 512u /* in central directory */
|
||||
/* 1024u reserved for internal use */
|
||||
#define ZIP_FL_ENC_UTF_8 2048u /* string is UTF-8 encoded */
|
||||
#define ZIP_FL_ENC_CP437 4096u /* string is CP437 encoded */
|
||||
#define ZIP_FL_OVERWRITE 8192u /* zip_file_add: if file with name exists, overwrite (replace) it */
|
||||
|
||||
/* archive global flags flags */
|
||||
|
||||
#define ZIP_AFL_RDONLY 2u /* read only -- cannot be cleared */
|
||||
|
||||
|
||||
/* create a new extra field */
|
||||
|
||||
#define ZIP_EXTRA_FIELD_ALL ZIP_UINT16_MAX
|
||||
#define ZIP_EXTRA_FIELD_NEW ZIP_UINT16_MAX
|
||||
|
||||
|
||||
/* libzip error codes */
|
||||
|
||||
#define ZIP_ER_OK 0 /* N No error */
|
||||
#define ZIP_ER_MULTIDISK 1 /* N Multi-disk zip archives not supported */
|
||||
#define ZIP_ER_RENAME 2 /* S Renaming temporary file failed */
|
||||
#define ZIP_ER_CLOSE 3 /* S Closing zip archive failed */
|
||||
#define ZIP_ER_SEEK 4 /* S Seek error */
|
||||
#define ZIP_ER_READ 5 /* S Read error */
|
||||
#define ZIP_ER_WRITE 6 /* S Write error */
|
||||
#define ZIP_ER_CRC 7 /* N CRC error */
|
||||
#define ZIP_ER_ZIPCLOSED 8 /* N Containing zip archive was closed */
|
||||
#define ZIP_ER_NOENT 9 /* N No such file */
|
||||
#define ZIP_ER_EXISTS 10 /* N File already exists */
|
||||
#define ZIP_ER_OPEN 11 /* S Can't open file */
|
||||
#define ZIP_ER_TMPOPEN 12 /* S Failure to create temporary file */
|
||||
#define ZIP_ER_ZLIB 13 /* Z Zlib error */
|
||||
#define ZIP_ER_MEMORY 14 /* N Malloc failure */
|
||||
#define ZIP_ER_CHANGED 15 /* N Entry has been changed */
|
||||
#define ZIP_ER_COMPNOTSUPP 16 /* N Compression method not supported */
|
||||
#define ZIP_ER_EOF 17 /* N Premature end of file */
|
||||
#define ZIP_ER_INVAL 18 /* N Invalid argument */
|
||||
#define ZIP_ER_NOZIP 19 /* N Not a zip archive */
|
||||
#define ZIP_ER_INTERNAL 20 /* N Internal error */
|
||||
#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 */
|
||||
#define ZIP_ER_OPNOTSUPP 28 /* N Operation not supported */
|
||||
#define ZIP_ER_INUSE 29 /* N Resource still in use */
|
||||
#define ZIP_ER_TELL 30 /* S Tell error */
|
||||
#define ZIP_ER_COMPRESSED_DATA 31 /* N Compressed data invalid */
|
||||
|
||||
/* type of system error value */
|
||||
|
||||
#define ZIP_ET_NONE 0 /* sys_err unused */
|
||||
#define ZIP_ET_SYS 1 /* sys_err is errno */
|
||||
#define ZIP_ET_ZLIB 2 /* sys_err is zlib error code */
|
||||
|
||||
/* compression methods */
|
||||
|
||||
#define ZIP_CM_DEFAULT -1 /* better of deflate or store */
|
||||
#define ZIP_CM_STORE 0 /* stored (uncompressed) */
|
||||
#define ZIP_CM_SHRINK 1 /* shrunk */
|
||||
#define ZIP_CM_REDUCE_1 2 /* reduced with factor 1 */
|
||||
#define ZIP_CM_REDUCE_2 3 /* reduced with factor 2 */
|
||||
#define ZIP_CM_REDUCE_3 4 /* reduced with factor 3 */
|
||||
#define ZIP_CM_REDUCE_4 5 /* reduced with factor 4 */
|
||||
#define ZIP_CM_IMPLODE 6 /* imploded */
|
||||
/* 7 - Reserved for Tokenizing compression algorithm */
|
||||
#define ZIP_CM_DEFLATE 8 /* deflated */
|
||||
#define ZIP_CM_DEFLATE64 9 /* deflate64 */
|
||||
#define ZIP_CM_PKWARE_IMPLODE 10 /* PKWARE imploding */
|
||||
/* 11 - Reserved by PKWARE */
|
||||
#define ZIP_CM_BZIP2 12 /* compressed using BZIP2 algorithm */
|
||||
/* 13 - Reserved by PKWARE */
|
||||
#define ZIP_CM_LZMA 14 /* LZMA (EFS) */
|
||||
/* 15-17 - Reserved by PKWARE */
|
||||
#define ZIP_CM_TERSE 18 /* compressed using IBM TERSE (new) */
|
||||
#define ZIP_CM_LZ77 19 /* IBM LZ77 z Architecture (PFS) */
|
||||
#define ZIP_CM_LZMA2 33
|
||||
#define ZIP_CM_XZ 95 /* XZ compressed data */
|
||||
#define ZIP_CM_JPEG 96 /* Compressed Jpeg data */
|
||||
#define ZIP_CM_WAVPACK 97 /* WavPack compressed data */
|
||||
#define ZIP_CM_PPMD 98 /* PPMd version I, Rev 1 */
|
||||
|
||||
/* encryption methods */
|
||||
|
||||
#define ZIP_EM_NONE 0 /* not encrypted */
|
||||
#define ZIP_EM_TRAD_PKWARE 1 /* traditional PKWARE encryption */
|
||||
#if 0 /* Strong Encryption Header not parsed yet */
|
||||
#define ZIP_EM_DES 0x6601 /* strong encryption: DES */
|
||||
#define ZIP_EM_RC2_OLD 0x6602 /* strong encryption: RC2, version < 5.2 */
|
||||
#define ZIP_EM_3DES_168 0x6603
|
||||
#define ZIP_EM_3DES_112 0x6609
|
||||
#define ZIP_EM_PKZIP_AES_128 0x660e
|
||||
#define ZIP_EM_PKZIP_AES_192 0x660f
|
||||
#define ZIP_EM_PKZIP_AES_256 0x6610
|
||||
#define ZIP_EM_RC2 0x6702 /* strong encryption: RC2, version >= 5.2 */
|
||||
#define ZIP_EM_RC4 0x6801
|
||||
#endif
|
||||
#define ZIP_EM_AES_128 0x0101 /* Winzip AES encryption */
|
||||
#define ZIP_EM_AES_192 0x0102
|
||||
#define ZIP_EM_AES_256 0x0103
|
||||
#define ZIP_EM_UNKNOWN 0xffff /* unknown algorithm */
|
||||
|
||||
#define ZIP_OPSYS_DOS 0x00u
|
||||
#define ZIP_OPSYS_AMIGA 0x01u
|
||||
#define ZIP_OPSYS_OPENVMS 0x02u
|
||||
#define ZIP_OPSYS_UNIX 0x03u
|
||||
#define ZIP_OPSYS_VM_CMS 0x04u
|
||||
#define ZIP_OPSYS_ATARI_ST 0x05u
|
||||
#define ZIP_OPSYS_OS_2 0x06u
|
||||
#define ZIP_OPSYS_MACINTOSH 0x07u
|
||||
#define ZIP_OPSYS_Z_SYSTEM 0x08u
|
||||
#define ZIP_OPSYS_CPM 0x09u
|
||||
#define ZIP_OPSYS_WINDOWS_NTFS 0x0au
|
||||
#define ZIP_OPSYS_MVS 0x0bu
|
||||
#define ZIP_OPSYS_VSE 0x0cu
|
||||
#define ZIP_OPSYS_ACORN_RISC 0x0du
|
||||
#define ZIP_OPSYS_VFAT 0x0eu
|
||||
#define ZIP_OPSYS_ALTERNATE_MVS 0x0fu
|
||||
#define ZIP_OPSYS_BEOS 0x10u
|
||||
#define ZIP_OPSYS_TANDEM 0x11u
|
||||
#define ZIP_OPSYS_OS_400 0x12u
|
||||
#define ZIP_OPSYS_OS_X 0x13u
|
||||
|
||||
#define ZIP_OPSYS_DEFAULT ZIP_OPSYS_UNIX
|
||||
|
||||
|
||||
enum zip_source_cmd {
|
||||
ZIP_SOURCE_OPEN, /* prepare for reading */
|
||||
ZIP_SOURCE_READ, /* read data */
|
||||
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_SEEK, /* set position for reading */
|
||||
ZIP_SOURCE_TELL, /* get read position */
|
||||
ZIP_SOURCE_BEGIN_WRITE, /* prepare for writing */
|
||||
ZIP_SOURCE_COMMIT_WRITE, /* writing is done */
|
||||
ZIP_SOURCE_ROLLBACK_WRITE, /* discard written changes */
|
||||
ZIP_SOURCE_WRITE, /* write data */
|
||||
ZIP_SOURCE_SEEK_WRITE, /* set position for writing */
|
||||
ZIP_SOURCE_TELL_WRITE, /* get write position */
|
||||
ZIP_SOURCE_SUPPORTS, /* check whether source supports command */
|
||||
ZIP_SOURCE_REMOVE, /* remove file */
|
||||
ZIP_SOURCE_GET_COMPRESSION_FLAGS, /* get compression flags, internal only */
|
||||
ZIP_SOURCE_BEGIN_WRITE_CLONING, /* like ZIP_SOURCE_BEGIN_WRITE, but keep part of original file */
|
||||
ZIP_SOURCE_ACCEPT_EMPTY /* whether empty files are valid archives */
|
||||
};
|
||||
typedef enum zip_source_cmd zip_source_cmd_t;
|
||||
|
||||
#define ZIP_SOURCE_MAKE_COMMAND_BITMASK(cmd) (((zip_int64_t)1) << (cmd))
|
||||
|
||||
// clang-format off
|
||||
|
||||
#define ZIP_SOURCE_SUPPORTS_READABLE (ZIP_SOURCE_MAKE_COMMAND_BITMASK(ZIP_SOURCE_OPEN) \
|
||||
| ZIP_SOURCE_MAKE_COMMAND_BITMASK(ZIP_SOURCE_READ) \
|
||||
| ZIP_SOURCE_MAKE_COMMAND_BITMASK(ZIP_SOURCE_CLOSE) \
|
||||
| ZIP_SOURCE_MAKE_COMMAND_BITMASK(ZIP_SOURCE_STAT) \
|
||||
| ZIP_SOURCE_MAKE_COMMAND_BITMASK(ZIP_SOURCE_ERROR) \
|
||||
| ZIP_SOURCE_MAKE_COMMAND_BITMASK(ZIP_SOURCE_FREE))
|
||||
|
||||
#define ZIP_SOURCE_SUPPORTS_SEEKABLE (ZIP_SOURCE_SUPPORTS_READABLE \
|
||||
| ZIP_SOURCE_MAKE_COMMAND_BITMASK(ZIP_SOURCE_SEEK) \
|
||||
| ZIP_SOURCE_MAKE_COMMAND_BITMASK(ZIP_SOURCE_TELL) \
|
||||
| ZIP_SOURCE_MAKE_COMMAND_BITMASK(ZIP_SOURCE_SUPPORTS))
|
||||
|
||||
#define ZIP_SOURCE_SUPPORTS_WRITABLE (ZIP_SOURCE_SUPPORTS_SEEKABLE \
|
||||
| ZIP_SOURCE_MAKE_COMMAND_BITMASK(ZIP_SOURCE_BEGIN_WRITE) \
|
||||
| ZIP_SOURCE_MAKE_COMMAND_BITMASK(ZIP_SOURCE_COMMIT_WRITE) \
|
||||
| ZIP_SOURCE_MAKE_COMMAND_BITMASK(ZIP_SOURCE_ROLLBACK_WRITE) \
|
||||
| ZIP_SOURCE_MAKE_COMMAND_BITMASK(ZIP_SOURCE_WRITE) \
|
||||
| ZIP_SOURCE_MAKE_COMMAND_BITMASK(ZIP_SOURCE_SEEK_WRITE) \
|
||||
| ZIP_SOURCE_MAKE_COMMAND_BITMASK(ZIP_SOURCE_TELL_WRITE) \
|
||||
| ZIP_SOURCE_MAKE_COMMAND_BITMASK(ZIP_SOURCE_REMOVE))
|
||||
|
||||
// clang-format on
|
||||
|
||||
/* for use by sources */
|
||||
struct zip_source_args_seek {
|
||||
zip_int64_t offset;
|
||||
int whence;
|
||||
};
|
||||
|
||||
typedef struct zip_source_args_seek zip_source_args_seek_t;
|
||||
#define ZIP_SOURCE_GET_ARGS(type, data, len, error) ((len) < sizeof(type) ? zip_error_set((error), ZIP_ER_INVAL, 0), (type *)NULL : (type *)(data))
|
||||
|
||||
|
||||
/* error information */
|
||||
/* use zip_error_*() to access */
|
||||
struct zip_error {
|
||||
int zip_err; /* libzip error code (ZIP_ER_*) */
|
||||
int sys_err; /* copy of errno (E*) or zlib error code */
|
||||
char * _Nullable str; /* string representation or NULL */
|
||||
};
|
||||
|
||||
#define ZIP_STAT_NAME 0x0001u
|
||||
#define ZIP_STAT_INDEX 0x0002u
|
||||
#define ZIP_STAT_SIZE 0x0004u
|
||||
#define ZIP_STAT_COMP_SIZE 0x0008u
|
||||
#define ZIP_STAT_MTIME 0x0010u
|
||||
#define ZIP_STAT_CRC 0x0020u
|
||||
#define ZIP_STAT_COMP_METHOD 0x0040u
|
||||
#define ZIP_STAT_ENCRYPTION_METHOD 0x0080u
|
||||
#define ZIP_STAT_FLAGS 0x0100u
|
||||
|
||||
struct zip_stat {
|
||||
zip_uint64_t valid; /* which fields have valid values */
|
||||
const char * _Nullable name; /* name of the file */
|
||||
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 */
|
||||
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_buffer_fragment {
|
||||
zip_uint8_t * _Nonnull data;
|
||||
zip_uint64_t length;
|
||||
};
|
||||
|
||||
struct zip;
|
||||
struct zip_file;
|
||||
struct zip_source;
|
||||
|
||||
typedef struct zip zip_t;
|
||||
typedef struct zip_error zip_error_t;
|
||||
typedef struct zip_file zip_file_t;
|
||||
typedef struct zip_source zip_source_t;
|
||||
typedef struct zip_stat zip_stat_t;
|
||||
typedef struct zip_buffer_fragment zip_buffer_fragment_t;
|
||||
|
||||
typedef zip_uint32_t zip_flags_t;
|
||||
|
||||
typedef zip_int64_t (*zip_source_callback)(void * _Nullable, void * _Nullable, zip_uint64_t, zip_source_cmd_t);
|
||||
typedef void (*zip_progress_callback)(zip_t * _Nonnull, double, void * _Nullable);
|
||||
|
||||
#ifndef ZIP_DISABLE_DEPRECATED
|
||||
typedef void (*zip_progress_callback_t)(double);
|
||||
ZIP_EXTERN void zip_register_progress_callback(zip_t * _Nonnull, zip_progress_callback_t _Nullable); /* use zip_register_progress_callback_with_state */
|
||||
|
||||
ZIP_EXTERN zip_int64_t zip_add(zip_t * _Nonnull, const char * _Nonnull, zip_source_t * _Nonnull); /* use zip_file_add */
|
||||
ZIP_EXTERN zip_int64_t zip_add_dir(zip_t * _Nonnull, const char * _Nonnull); /* use zip_dir_add */
|
||||
ZIP_EXTERN const char * _Nullable zip_get_file_comment(zip_t * _Nonnull, zip_uint64_t, int * _Nullable, int); /* use zip_file_get_comment */
|
||||
ZIP_EXTERN int zip_get_num_files(zip_t * _Nonnull); /* use zip_get_num_entries instead */
|
||||
ZIP_EXTERN int zip_rename(zip_t * _Nonnull, zip_uint64_t, const char * _Nonnull); /* use zip_file_rename */
|
||||
ZIP_EXTERN int zip_replace(zip_t * _Nonnull, zip_uint64_t, zip_source_t * _Nonnull); /* use zip_file_replace */
|
||||
ZIP_EXTERN int zip_set_file_comment(zip_t * _Nonnull, zip_uint64_t, const char * _Nullable, int); /* use zip_file_set_comment */
|
||||
ZIP_EXTERN int zip_error_get_sys_type(int); /* use zip_error_system_type */
|
||||
ZIP_EXTERN void zip_error_get(zip_t * _Nonnull, int * _Nullable, int * _Nullable); /* use zip_get_error, zip_error_code_zip / zip_error_code_system */
|
||||
ZIP_EXTERN int zip_error_to_str(char * _Nonnull, zip_uint64_t, int, int); /* use zip_error_init_with_code / zip_error_strerror */
|
||||
ZIP_EXTERN void zip_file_error_get(zip_file_t * _Nonnull, int * _Nullable, int * _Nullable); /* use zip_file_get_error, zip_error_code_zip / zip_error_code_system */
|
||||
#endif
|
||||
|
||||
ZIP_EXTERN int zip_close(zip_t * _Nonnull);
|
||||
ZIP_EXTERN int zip_delete(zip_t * _Nonnull, zip_uint64_t);
|
||||
ZIP_EXTERN zip_int64_t zip_dir_add(zip_t * _Nonnull, const char * _Nonnull, zip_flags_t);
|
||||
ZIP_EXTERN void zip_discard(zip_t * _Nonnull);
|
||||
|
||||
ZIP_EXTERN zip_error_t * _Nonnull zip_get_error(zip_t * _Nonnull);
|
||||
ZIP_EXTERN void zip_error_clear(zip_t * _Nonnull);
|
||||
ZIP_EXTERN int zip_error_code_zip(const zip_error_t * _Nonnull);
|
||||
ZIP_EXTERN int zip_error_code_system(const zip_error_t * _Nonnull);
|
||||
ZIP_EXTERN void zip_error_fini(zip_error_t * _Nonnull);
|
||||
ZIP_EXTERN void zip_error_init(zip_error_t * _Nonnull);
|
||||
ZIP_EXTERN void zip_error_init_with_code(zip_error_t * _Nonnull, int);
|
||||
ZIP_EXTERN void zip_error_set(zip_error_t * _Nullable, int, int);
|
||||
ZIP_EXTERN const char * _Nonnull zip_error_strerror(zip_error_t * _Nonnull);
|
||||
ZIP_EXTERN int zip_error_system_type(const zip_error_t * _Nonnull);
|
||||
ZIP_EXTERN zip_int64_t zip_error_to_data(const zip_error_t * _Nonnull, void * _Nonnull, zip_uint64_t);
|
||||
|
||||
ZIP_EXTERN int zip_fclose(zip_file_t * _Nonnull);
|
||||
ZIP_EXTERN zip_t * _Nullable zip_fdopen(int, int, int * _Nullable);
|
||||
ZIP_EXTERN zip_int64_t zip_file_add(zip_t * _Nonnull, const char * _Nonnull, zip_source_t * _Nonnull, zip_flags_t);
|
||||
ZIP_EXTERN void zip_file_error_clear(zip_file_t * _Nonnull);
|
||||
ZIP_EXTERN int zip_file_extra_field_delete(zip_t * _Nonnull, zip_uint64_t, zip_uint16_t, zip_flags_t);
|
||||
ZIP_EXTERN int zip_file_extra_field_delete_by_id(zip_t * _Nonnull, zip_uint64_t, zip_uint16_t, zip_uint16_t, zip_flags_t);
|
||||
ZIP_EXTERN int zip_file_extra_field_set(zip_t * _Nonnull, zip_uint64_t, zip_uint16_t, zip_uint16_t, const zip_uint8_t * _Nullable, zip_uint16_t, zip_flags_t);
|
||||
ZIP_EXTERN zip_int16_t zip_file_extra_fields_count(zip_t * _Nonnull, zip_uint64_t, zip_flags_t);
|
||||
ZIP_EXTERN zip_int16_t zip_file_extra_fields_count_by_id(zip_t * _Nonnull, zip_uint64_t, zip_uint16_t, zip_flags_t);
|
||||
ZIP_EXTERN const zip_uint8_t * _Nullable zip_file_extra_field_get(zip_t * _Nonnull, zip_uint64_t, zip_uint16_t, zip_uint16_t * _Nullable, zip_uint16_t * _Nullable, zip_flags_t);
|
||||
ZIP_EXTERN const zip_uint8_t * _Nullable zip_file_extra_field_get_by_id(zip_t * _Nonnull, zip_uint64_t, zip_uint16_t, zip_uint16_t, zip_uint16_t * _Nullable, zip_flags_t);
|
||||
ZIP_EXTERN const char * _Nullable zip_file_get_comment(zip_t * _Nonnull, zip_uint64_t, zip_uint32_t * _Nullable, zip_flags_t);
|
||||
ZIP_EXTERN zip_error_t * _Nonnull zip_file_get_error(zip_file_t * _Nonnull);
|
||||
ZIP_EXTERN int zip_file_get_external_attributes(zip_t * _Nonnull, zip_uint64_t, zip_flags_t, zip_uint8_t * _Nullable, zip_uint32_t * _Nullable);
|
||||
ZIP_EXTERN int zip_file_rename(zip_t * _Nonnull, zip_uint64_t, const char * _Nonnull, zip_flags_t);
|
||||
ZIP_EXTERN int zip_file_replace(zip_t * _Nonnull, zip_uint64_t, zip_source_t * _Nonnull, zip_flags_t);
|
||||
ZIP_EXTERN int zip_file_set_comment(zip_t * _Nonnull, zip_uint64_t, const char * _Nullable, zip_uint16_t, zip_flags_t);
|
||||
ZIP_EXTERN int zip_file_set_encryption(zip_t * _Nonnull, zip_uint64_t, zip_uint16_t, const char * _Nullable);
|
||||
ZIP_EXTERN int zip_file_set_external_attributes(zip_t * _Nonnull, zip_uint64_t, zip_flags_t, zip_uint8_t, zip_uint32_t);
|
||||
ZIP_EXTERN int zip_file_set_mtime(zip_t * _Nonnull, zip_uint64_t, time_t, zip_flags_t);
|
||||
ZIP_EXTERN const char * _Nonnull zip_file_strerror(zip_file_t * _Nonnull);
|
||||
ZIP_EXTERN zip_file_t * _Nullable zip_fopen(zip_t * _Nonnull, const char * _Nonnull, zip_flags_t);
|
||||
ZIP_EXTERN zip_file_t * _Nullable zip_fopen_encrypted(zip_t * _Nonnull, const char * _Nonnull, zip_flags_t, const char * _Nullable);
|
||||
ZIP_EXTERN zip_file_t * _Nullable zip_fopen_index(zip_t * _Nonnull, zip_uint64_t, zip_flags_t);
|
||||
ZIP_EXTERN zip_file_t * _Nullable zip_fopen_index_encrypted(zip_t * _Nonnull, zip_uint64_t, zip_flags_t, const char * _Nullable);
|
||||
ZIP_EXTERN zip_int64_t zip_fread(zip_file_t * _Nonnull, void * _Nonnull, zip_uint64_t);
|
||||
ZIP_EXTERN zip_int8_t zip_fseek(zip_file_t * _Nonnull, zip_int64_t, int);
|
||||
ZIP_EXTERN zip_int64_t zip_ftell(zip_file_t * _Nonnull);
|
||||
ZIP_EXTERN const char * _Nullable zip_get_archive_comment(zip_t * _Nonnull, int * _Nullable, zip_flags_t);
|
||||
ZIP_EXTERN int zip_get_archive_flag(zip_t * _Nonnull, zip_flags_t, zip_flags_t);
|
||||
ZIP_EXTERN const char * _Nullable zip_get_name(zip_t * _Nonnull, zip_uint64_t, zip_flags_t);
|
||||
ZIP_EXTERN zip_int64_t zip_get_num_entries(zip_t * _Nonnull, zip_flags_t);
|
||||
ZIP_EXTERN const char * _Nonnull zip_libzip_version(void);
|
||||
ZIP_EXTERN zip_int64_t zip_name_locate(zip_t * _Nonnull, const char * _Nonnull, zip_flags_t);
|
||||
ZIP_EXTERN zip_t * _Nullable zip_open(const char * _Nonnull, int, int * _Nullable);
|
||||
ZIP_EXTERN zip_t * _Nullable zip_open_from_source(zip_source_t * _Nonnull, int, zip_error_t * _Nullable);
|
||||
ZIP_EXTERN int zip_register_progress_callback_with_state(zip_t * _Nonnull, double, zip_progress_callback _Nullable, void (* _Nullable)(void * _Nullable), void * _Nullable);
|
||||
ZIP_EXTERN int zip_set_archive_comment(zip_t * _Nonnull, const char * _Nullable, zip_uint16_t);
|
||||
ZIP_EXTERN int zip_set_archive_flag(zip_t * _Nonnull, zip_flags_t, int);
|
||||
ZIP_EXTERN int zip_set_default_password(zip_t * _Nonnull, const char * _Nullable);
|
||||
ZIP_EXTERN int zip_set_file_compression(zip_t * _Nonnull, zip_uint64_t, zip_int32_t, zip_uint32_t);
|
||||
ZIP_EXTERN int zip_source_begin_write(zip_source_t * _Nonnull);
|
||||
ZIP_EXTERN int zip_source_begin_write_cloning(zip_source_t * _Nonnull, zip_uint64_t);
|
||||
ZIP_EXTERN zip_source_t * _Nullable zip_source_buffer(zip_t * _Nonnull, const void * _Nullable, zip_uint64_t, int);
|
||||
ZIP_EXTERN zip_source_t * _Nullable zip_source_buffer_create(const void * _Nullable, zip_uint64_t, int, zip_error_t * _Nullable);
|
||||
ZIP_EXTERN zip_source_t * _Nullable zip_source_buffer_fragment(zip_t * _Nonnull, const zip_buffer_fragment_t * _Nonnull, zip_uint64_t, int);
|
||||
ZIP_EXTERN zip_source_t * _Nullable zip_source_buffer_fragment_create(const zip_buffer_fragment_t * _Nonnull, zip_uint64_t, int, zip_error_t * _Nullable);
|
||||
ZIP_EXTERN int zip_source_close(zip_source_t * _Nonnull);
|
||||
ZIP_EXTERN int zip_source_commit_write(zip_source_t * _Nonnull);
|
||||
ZIP_EXTERN zip_error_t * _Nonnull zip_source_error(zip_source_t * _Nonnull);
|
||||
ZIP_EXTERN zip_source_t * _Nullable zip_source_file(zip_t * _Nonnull, const char * _Nonnull, zip_uint64_t, zip_int64_t);
|
||||
ZIP_EXTERN zip_source_t * _Nullable zip_source_file_create(const char * _Nonnull, zip_uint64_t, zip_int64_t, zip_error_t * _Nullable);
|
||||
ZIP_EXTERN zip_source_t * _Nullable zip_source_filep(zip_t * _Nonnull, FILE * _Nonnull, zip_uint64_t, zip_int64_t);
|
||||
ZIP_EXTERN zip_source_t * _Nullable zip_source_filep_create(FILE * _Nonnull, zip_uint64_t, zip_int64_t, zip_error_t * _Nullable);
|
||||
ZIP_EXTERN void zip_source_free(zip_source_t * _Nullable);
|
||||
ZIP_EXTERN zip_source_t * _Nullable zip_source_function(zip_t * _Nonnull, zip_source_callback _Nonnull , void * _Nullable);
|
||||
ZIP_EXTERN zip_source_t * _Nullable zip_source_function_create(zip_source_callback _Nonnull , void * _Nullable, zip_error_t * _Nullable);
|
||||
ZIP_EXTERN int zip_source_is_deleted(zip_source_t * _Nonnull);
|
||||
ZIP_EXTERN void zip_source_keep(zip_source_t * _Nonnull);
|
||||
ZIP_EXTERN zip_int64_t zip_source_make_command_bitmap(zip_source_cmd_t, ...);
|
||||
ZIP_EXTERN int zip_source_open(zip_source_t * _Nonnull);
|
||||
ZIP_EXTERN zip_int64_t zip_source_read(zip_source_t * _Nonnull, void * _Nonnull, zip_uint64_t);
|
||||
ZIP_EXTERN void zip_source_rollback_write(zip_source_t * _Nonnull);
|
||||
ZIP_EXTERN int zip_source_seek(zip_source_t * _Nonnull, zip_int64_t, int);
|
||||
ZIP_EXTERN zip_int64_t zip_source_seek_compute_offset(zip_uint64_t, zip_uint64_t, void * _Nonnull, zip_uint64_t, zip_error_t * _Nullable);
|
||||
ZIP_EXTERN int zip_source_seek_write(zip_source_t * _Nonnull, zip_int64_t, int);
|
||||
ZIP_EXTERN int zip_source_stat(zip_source_t * _Nonnull, zip_stat_t * _Nonnull);
|
||||
ZIP_EXTERN zip_int64_t zip_source_tell(zip_source_t * _Nonnull);
|
||||
ZIP_EXTERN zip_int64_t zip_source_tell_write(zip_source_t * _Nonnull);
|
||||
#ifdef _WIN32
|
||||
ZIP_EXTERN zip_source_t *zip_source_win32a(zip_t *, const char *, zip_uint64_t, zip_int64_t);
|
||||
ZIP_EXTERN zip_source_t *zip_source_win32a_create(const char *, zip_uint64_t, zip_int64_t, zip_error_t *);
|
||||
ZIP_EXTERN zip_source_t *zip_source_win32handle(zip_t *, void *, zip_uint64_t, zip_int64_t);
|
||||
ZIP_EXTERN zip_source_t *zip_source_win32handle_create(void *, zip_uint64_t, zip_int64_t, zip_error_t *);
|
||||
ZIP_EXTERN zip_source_t *zip_source_win32w(zip_t *, const wchar_t *, zip_uint64_t, zip_int64_t);
|
||||
ZIP_EXTERN zip_source_t *zip_source_win32w_create(const wchar_t *, zip_uint64_t, zip_int64_t, zip_error_t *);
|
||||
#endif
|
||||
ZIP_EXTERN zip_int64_t zip_source_write(zip_source_t * _Nonnull, const void * _Nullable, zip_uint64_t);
|
||||
ZIP_EXTERN zip_source_t * _Nullable zip_source_zip(zip_t * _Nonnull, zip_t * _Nonnull, zip_uint64_t, zip_flags_t, zip_uint64_t, zip_int64_t);
|
||||
ZIP_EXTERN int zip_stat(zip_t * _Nonnull, const char * _Nonnull, zip_flags_t, zip_stat_t * _Nonnull);
|
||||
ZIP_EXTERN int zip_stat_index(zip_t * _Nonnull, zip_uint64_t, zip_flags_t, zip_stat_t * _Nonnull);
|
||||
ZIP_EXTERN void zip_stat_init( zip_stat_t * _Nonnull);
|
||||
ZIP_EXTERN const char * _Nonnull zip_strerror(zip_t * _Nonnull);
|
||||
ZIP_EXTERN int zip_unchange(zip_t * _Nonnull, zip_uint64_t);
|
||||
ZIP_EXTERN int zip_unchange_all(zip_t * _Nonnull);
|
||||
ZIP_EXTERN int zip_unchange_archive(zip_t * _Nonnull);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* _HAD_ZIP_H */
|
49
externals/libzip/libzip/lib/zip_add.c
vendored
Executable file
49
externals/libzip/libzip/lib/zip_add.c
vendored
Executable file
@@ -0,0 +1,49 @@
|
||||
/*
|
||||
zip_add.c -- add file via callback function
|
||||
Copyright (C) 1999-2018 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.
|
||||
*/
|
||||
|
||||
|
||||
#define _ZIP_COMPILING_DEPRECATED
|
||||
#include "zipint.h"
|
||||
|
||||
|
||||
/*
|
||||
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(zip_t *za, const char *name, zip_source_t *source) {
|
||||
return zip_file_add(za, name, source, 0);
|
||||
}
|
44
externals/libzip/libzip/lib/zip_add_dir.c
vendored
Executable file
44
externals/libzip/libzip/lib/zip_add_dir.c
vendored
Executable file
@@ -0,0 +1,44 @@
|
||||
/*
|
||||
zip_add_dir.c -- add directory
|
||||
Copyright (C) 1999-2018 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.
|
||||
*/
|
||||
|
||||
|
||||
#define _ZIP_COMPILING_DEPRECATED
|
||||
#include "zipint.h"
|
||||
|
||||
|
||||
/* NOTE: Signed due to -1 on error. See zip_add.c for more details. */
|
||||
|
||||
ZIP_EXTERN zip_int64_t
|
||||
zip_add_dir(zip_t *za, const char *name) {
|
||||
return zip_dir_add(za, name, 0);
|
||||
}
|
80
externals/libzip/libzip/lib/zip_add_entry.c
vendored
Executable file
80
externals/libzip/libzip/lib/zip_add_entry.c
vendored
Executable file
@@ -0,0 +1,80 @@
|
||||
/*
|
||||
zip_add_entry.c -- create and init struct zip_entry
|
||||
Copyright (C) 1999-2018 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"
|
||||
|
||||
|
||||
/* NOTE: Signed due to -1 on error. See zip_add.c for more details. */
|
||||
|
||||
zip_int64_t
|
||||
_zip_add_entry(zip_t *za) {
|
||||
zip_uint64_t idx;
|
||||
|
||||
if (za->nentry + 1 >= za->nentry_alloc) {
|
||||
zip_entry_t *rentries;
|
||||
zip_uint64_t nalloc = za->nentry_alloc;
|
||||
zip_uint64_t additional_entries = 2 * nalloc;
|
||||
zip_uint64_t realloc_size;
|
||||
|
||||
if (additional_entries < 16) {
|
||||
additional_entries = 16;
|
||||
}
|
||||
else if (additional_entries > 1024) {
|
||||
additional_entries = 1024;
|
||||
}
|
||||
/* neither + nor * overflows can happen: nentry_alloc * sizeof(struct zip_entry) < UINT64_MAX */
|
||||
nalloc += additional_entries;
|
||||
realloc_size = sizeof(struct zip_entry) * (size_t)nalloc;
|
||||
|
||||
if (sizeof(struct zip_entry) * (size_t)za->nentry_alloc > realloc_size) {
|
||||
zip_error_set(&za->error, ZIP_ER_MEMORY, 0);
|
||||
return -1;
|
||||
}
|
||||
rentries = (zip_entry_t *)realloc(za->entry, sizeof(struct zip_entry) * (size_t)nalloc);
|
||||
if (!rentries) {
|
||||
zip_error_set(&za->error, ZIP_ER_MEMORY, 0);
|
||||
return -1;
|
||||
}
|
||||
za->entry = rentries;
|
||||
za->nentry_alloc = nalloc;
|
||||
}
|
||||
|
||||
idx = za->nentry++;
|
||||
|
||||
_zip_entry_init(za->entry + idx);
|
||||
|
||||
return (zip_int64_t)idx;
|
||||
}
|
270
externals/libzip/libzip/lib/zip_algorithm_bzip2.c
vendored
Executable file
270
externals/libzip/libzip/lib/zip_algorithm_bzip2.c
vendored
Executable file
@@ -0,0 +1,270 @@
|
||||
/*
|
||||
zip_algorithm_bzip2.c -- bzip2 (de)compression routines
|
||||
Copyright (C) 2017-2018 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"
|
||||
|
||||
#include <bzlib.h>
|
||||
#include <limits.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
struct ctx {
|
||||
zip_error_t *error;
|
||||
bool compress;
|
||||
int compression_flags;
|
||||
bool end_of_input;
|
||||
bz_stream zstr;
|
||||
};
|
||||
|
||||
|
||||
static void *
|
||||
allocate(bool compress, int compression_flags, zip_error_t *error) {
|
||||
struct ctx *ctx;
|
||||
|
||||
if ((ctx = (struct ctx *)malloc(sizeof(*ctx))) == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
ctx->error = error;
|
||||
ctx->compress = compress;
|
||||
ctx->compression_flags = compression_flags;
|
||||
if (ctx->compression_flags < 1 || ctx->compression_flags > 9) {
|
||||
ctx->compression_flags = 9;
|
||||
}
|
||||
ctx->end_of_input = false;
|
||||
|
||||
ctx->zstr.bzalloc = NULL;
|
||||
ctx->zstr.bzfree = NULL;
|
||||
ctx->zstr.opaque = NULL;
|
||||
|
||||
return ctx;
|
||||
}
|
||||
|
||||
|
||||
static void *
|
||||
compress_allocate(zip_uint16_t method, int compression_flags, zip_error_t *error) {
|
||||
return allocate(true, compression_flags, error);
|
||||
}
|
||||
|
||||
|
||||
static void *
|
||||
decompress_allocate(zip_uint16_t method, int compression_flags, zip_error_t *error) {
|
||||
return allocate(false, compression_flags, error);
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
deallocate(void *ud) {
|
||||
struct ctx *ctx = (struct ctx *)ud;
|
||||
|
||||
free(ctx);
|
||||
}
|
||||
|
||||
|
||||
static int
|
||||
compression_flags(void *ud) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
static int
|
||||
map_error(int ret) {
|
||||
switch (ret) {
|
||||
case BZ_FINISH_OK:
|
||||
case BZ_FLUSH_OK:
|
||||
case BZ_OK:
|
||||
case BZ_RUN_OK:
|
||||
case BZ_STREAM_END:
|
||||
return ZIP_ER_OK;
|
||||
|
||||
case BZ_DATA_ERROR:
|
||||
case BZ_DATA_ERROR_MAGIC:
|
||||
case BZ_UNEXPECTED_EOF:
|
||||
return ZIP_ER_COMPRESSED_DATA;
|
||||
|
||||
case BZ_MEM_ERROR:
|
||||
return ZIP_ER_MEMORY;
|
||||
|
||||
case BZ_PARAM_ERROR:
|
||||
return ZIP_ER_INVAL;
|
||||
|
||||
case BZ_CONFIG_ERROR: /* actually, bzip2 miscompiled */
|
||||
case BZ_IO_ERROR:
|
||||
case BZ_OUTBUFF_FULL:
|
||||
case BZ_SEQUENCE_ERROR:
|
||||
return ZIP_ER_INTERNAL;
|
||||
|
||||
default:
|
||||
return ZIP_ER_INTERNAL;
|
||||
}
|
||||
}
|
||||
|
||||
static bool
|
||||
start(void *ud) {
|
||||
struct ctx *ctx = (struct ctx *)ud;
|
||||
int ret;
|
||||
|
||||
ctx->zstr.avail_in = 0;
|
||||
ctx->zstr.next_in = NULL;
|
||||
ctx->zstr.avail_out = 0;
|
||||
ctx->zstr.next_out = NULL;
|
||||
|
||||
if (ctx->compress) {
|
||||
ret = BZ2_bzCompressInit(&ctx->zstr, ctx->compression_flags, 0, 30);
|
||||
}
|
||||
else {
|
||||
ret = BZ2_bzDecompressInit(&ctx->zstr, 0, 0);
|
||||
}
|
||||
|
||||
if (ret != BZ_OK) {
|
||||
zip_error_set(ctx->error, map_error(ret), 0);
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
static bool
|
||||
end(void *ud) {
|
||||
struct ctx *ctx = (struct ctx *)ud;
|
||||
int err;
|
||||
|
||||
if (ctx->compress) {
|
||||
err = BZ2_bzCompressEnd(&ctx->zstr);
|
||||
}
|
||||
else {
|
||||
err = BZ2_bzDecompressEnd(&ctx->zstr);
|
||||
}
|
||||
|
||||
if (err != BZ_OK) {
|
||||
zip_error_set(ctx->error, map_error(err), 0);
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
static bool
|
||||
input(void *ud, zip_uint8_t *data, zip_uint64_t length) {
|
||||
struct ctx *ctx = (struct ctx *)ud;
|
||||
|
||||
if (length > UINT_MAX || ctx->zstr.avail_in > 0) {
|
||||
zip_error_set(ctx->error, ZIP_ER_INVAL, 0);
|
||||
return false;
|
||||
}
|
||||
|
||||
ctx->zstr.avail_in = (unsigned int)length;
|
||||
ctx->zstr.next_in = (char *)data;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
end_of_input(void *ud) {
|
||||
struct ctx *ctx = (struct ctx *)ud;
|
||||
|
||||
ctx->end_of_input = true;
|
||||
}
|
||||
|
||||
|
||||
static zip_compression_status_t
|
||||
process(void *ud, zip_uint8_t *data, zip_uint64_t *length) {
|
||||
struct ctx *ctx = (struct ctx *)ud;
|
||||
|
||||
int ret;
|
||||
|
||||
if (ctx->zstr.avail_in == 0 && !ctx->end_of_input) {
|
||||
*length = 0;
|
||||
return ZIP_COMPRESSION_NEED_DATA;
|
||||
}
|
||||
|
||||
ctx->zstr.avail_out = (unsigned int)ZIP_MIN(UINT_MAX, *length);
|
||||
ctx->zstr.next_out = (char *)data;
|
||||
|
||||
if (ctx->compress) {
|
||||
ret = BZ2_bzCompress(&ctx->zstr, ctx->end_of_input ? BZ_FINISH : BZ_RUN);
|
||||
}
|
||||
else {
|
||||
ret = BZ2_bzDecompress(&ctx->zstr);
|
||||
}
|
||||
|
||||
*length = *length - ctx->zstr.avail_out;
|
||||
|
||||
switch (ret) {
|
||||
case BZ_FINISH_OK: /* compression */
|
||||
return ZIP_COMPRESSION_OK;
|
||||
|
||||
case BZ_OK: /* decompression */
|
||||
case BZ_RUN_OK: /* compression */
|
||||
if (ctx->zstr.avail_in == 0) {
|
||||
return ZIP_COMPRESSION_NEED_DATA;
|
||||
}
|
||||
return ZIP_COMPRESSION_OK;
|
||||
|
||||
case BZ_STREAM_END:
|
||||
return ZIP_COMPRESSION_END;
|
||||
|
||||
default:
|
||||
zip_error_set(ctx->error, map_error(ret), 0);
|
||||
return ZIP_COMPRESSION_ERROR;
|
||||
}
|
||||
}
|
||||
|
||||
// clang-format off
|
||||
|
||||
zip_compression_algorithm_t zip_algorithm_bzip2_compress = {
|
||||
compress_allocate,
|
||||
deallocate,
|
||||
compression_flags,
|
||||
start,
|
||||
end,
|
||||
input,
|
||||
end_of_input,
|
||||
process
|
||||
};
|
||||
|
||||
|
||||
zip_compression_algorithm_t zip_algorithm_bzip2_decompress = {
|
||||
decompress_allocate,
|
||||
deallocate,
|
||||
compression_flags,
|
||||
start,
|
||||
end,
|
||||
input,
|
||||
end_of_input,
|
||||
process
|
||||
};
|
||||
|
||||
// clang-format on
|
248
externals/libzip/libzip/lib/zip_algorithm_deflate.c
vendored
Executable file
248
externals/libzip/libzip/lib/zip_algorithm_deflate.c
vendored
Executable file
@@ -0,0 +1,248 @@
|
||||
/*
|
||||
zip_algorithm_deflate.c -- deflate (de)compression routines
|
||||
Copyright (C) 2017-2018 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"
|
||||
|
||||
#include <limits.h>
|
||||
#include <stdlib.h>
|
||||
#include <zlib.h>
|
||||
|
||||
struct ctx {
|
||||
zip_error_t *error;
|
||||
bool compress;
|
||||
int compression_flags;
|
||||
bool end_of_input;
|
||||
z_stream zstr;
|
||||
};
|
||||
|
||||
|
||||
static void *
|
||||
allocate(bool compress, int compression_flags, zip_error_t *error) {
|
||||
struct ctx *ctx;
|
||||
|
||||
if ((ctx = (struct ctx *)malloc(sizeof(*ctx))) == NULL) {
|
||||
zip_error_set(error, ZIP_ET_SYS, errno);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
ctx->error = error;
|
||||
ctx->compress = compress;
|
||||
ctx->compression_flags = compression_flags;
|
||||
if (ctx->compression_flags < 1 || ctx->compression_flags > 9) {
|
||||
ctx->compression_flags = Z_BEST_COMPRESSION;
|
||||
}
|
||||
ctx->end_of_input = false;
|
||||
|
||||
ctx->zstr.zalloc = Z_NULL;
|
||||
ctx->zstr.zfree = Z_NULL;
|
||||
ctx->zstr.opaque = NULL;
|
||||
|
||||
return ctx;
|
||||
}
|
||||
|
||||
|
||||
static void *
|
||||
compress_allocate(zip_uint16_t method, int compression_flags, zip_error_t *error) {
|
||||
return allocate(true, compression_flags, error);
|
||||
}
|
||||
|
||||
|
||||
static void *
|
||||
decompress_allocate(zip_uint16_t method, int compression_flags, zip_error_t *error) {
|
||||
return allocate(false, compression_flags, error);
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
deallocate(void *ud) {
|
||||
struct ctx *ctx = (struct ctx *)ud;
|
||||
|
||||
free(ctx);
|
||||
}
|
||||
|
||||
|
||||
static int
|
||||
compression_flags(void *ud) {
|
||||
struct ctx *ctx = (struct ctx *)ud;
|
||||
|
||||
if (!ctx->compress) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (ctx->compression_flags < 3) {
|
||||
return 2;
|
||||
}
|
||||
else if (ctx->compression_flags > 7) {
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
static bool
|
||||
start(void *ud) {
|
||||
struct ctx *ctx = (struct ctx *)ud;
|
||||
int ret;
|
||||
|
||||
ctx->zstr.avail_in = 0;
|
||||
ctx->zstr.next_in = NULL;
|
||||
ctx->zstr.avail_out = 0;
|
||||
ctx->zstr.next_out = NULL;
|
||||
|
||||
if (ctx->compress) {
|
||||
/* negative value to tell zlib not to write a header */
|
||||
ret = deflateInit2(&ctx->zstr, ctx->compression_flags, Z_DEFLATED, -MAX_WBITS, MAX_MEM_LEVEL, Z_DEFAULT_STRATEGY);
|
||||
}
|
||||
else {
|
||||
ret = inflateInit2(&ctx->zstr, -MAX_WBITS);
|
||||
}
|
||||
|
||||
if (ret != Z_OK) {
|
||||
zip_error_set(ctx->error, ZIP_ER_ZLIB, ret);
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
static bool
|
||||
end(void *ud) {
|
||||
struct ctx *ctx = (struct ctx *)ud;
|
||||
int err;
|
||||
|
||||
if (ctx->compress) {
|
||||
err = deflateEnd(&ctx->zstr);
|
||||
}
|
||||
else {
|
||||
err = inflateEnd(&ctx->zstr);
|
||||
}
|
||||
|
||||
if (err != Z_OK) {
|
||||
zip_error_set(ctx->error, ZIP_ER_ZLIB, err);
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
static bool
|
||||
input(void *ud, zip_uint8_t *data, zip_uint64_t length) {
|
||||
struct ctx *ctx = (struct ctx *)ud;
|
||||
|
||||
if (length > UINT_MAX || ctx->zstr.avail_in > 0) {
|
||||
zip_error_set(ctx->error, ZIP_ER_INVAL, 0);
|
||||
return false;
|
||||
}
|
||||
|
||||
ctx->zstr.avail_in = (uInt)length;
|
||||
ctx->zstr.next_in = (Bytef *)data;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
end_of_input(void *ud) {
|
||||
struct ctx *ctx = (struct ctx *)ud;
|
||||
|
||||
ctx->end_of_input = true;
|
||||
}
|
||||
|
||||
|
||||
static zip_compression_status_t
|
||||
process(void *ud, zip_uint8_t *data, zip_uint64_t *length) {
|
||||
struct ctx *ctx = (struct ctx *)ud;
|
||||
|
||||
int ret;
|
||||
|
||||
ctx->zstr.avail_out = (uInt)ZIP_MIN(UINT_MAX, *length);
|
||||
ctx->zstr.next_out = (Bytef *)data;
|
||||
|
||||
if (ctx->compress) {
|
||||
ret = deflate(&ctx->zstr, ctx->end_of_input ? Z_FINISH : 0);
|
||||
}
|
||||
else {
|
||||
ret = inflate(&ctx->zstr, Z_SYNC_FLUSH);
|
||||
}
|
||||
|
||||
*length = *length - ctx->zstr.avail_out;
|
||||
|
||||
switch (ret) {
|
||||
case Z_OK:
|
||||
return ZIP_COMPRESSION_OK;
|
||||
|
||||
case Z_STREAM_END:
|
||||
return ZIP_COMPRESSION_END;
|
||||
|
||||
case Z_BUF_ERROR:
|
||||
if (ctx->zstr.avail_in == 0) {
|
||||
return ZIP_COMPRESSION_NEED_DATA;
|
||||
}
|
||||
|
||||
/* fallthrough */
|
||||
|
||||
default:
|
||||
zip_error_set(ctx->error, ZIP_ER_ZLIB, ret);
|
||||
return ZIP_COMPRESSION_ERROR;
|
||||
}
|
||||
}
|
||||
|
||||
// clang-format off
|
||||
|
||||
zip_compression_algorithm_t zip_algorithm_deflate_compress = {
|
||||
compress_allocate,
|
||||
deallocate,
|
||||
compression_flags,
|
||||
start,
|
||||
end,
|
||||
input,
|
||||
end_of_input,
|
||||
process
|
||||
};
|
||||
|
||||
|
||||
zip_compression_algorithm_t zip_algorithm_deflate_decompress = {
|
||||
decompress_allocate,
|
||||
deallocate,
|
||||
compression_flags,
|
||||
start,
|
||||
end,
|
||||
input,
|
||||
end_of_input,
|
||||
process
|
||||
};
|
||||
|
||||
// clang-format on
|
241
externals/libzip/libzip/lib/zip_algorithm_xz.c
vendored
Executable file
241
externals/libzip/libzip/lib/zip_algorithm_xz.c
vendored
Executable file
@@ -0,0 +1,241 @@
|
||||
/*
|
||||
zip_algorithm_xz.c -- XZ (de)compression routines
|
||||
Bazed on zip_algorithm_deflate.c -- deflate (de)compression routines
|
||||
Copyright (C) 2017-2018 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"
|
||||
|
||||
#include <limits.h>
|
||||
#include <stdlib.h>
|
||||
#include <lzma.h>
|
||||
|
||||
struct ctx {
|
||||
zip_error_t *error;
|
||||
bool compress;
|
||||
int compression_flags;
|
||||
bool end_of_input;
|
||||
lzma_stream zstr;
|
||||
zip_uint16_t method;
|
||||
};
|
||||
|
||||
|
||||
static void *
|
||||
allocate(bool compress, int compression_flags, zip_error_t *error, zip_uint16_t method) {
|
||||
struct ctx *ctx;
|
||||
|
||||
if ((ctx = (struct ctx *)malloc(sizeof(*ctx))) == NULL) {
|
||||
zip_error_set(error, ZIP_ET_SYS, errno);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
ctx->error = error;
|
||||
ctx->compress = compress;
|
||||
ctx->compression_flags = compression_flags;
|
||||
ctx->compression_flags |= LZMA_PRESET_EXTREME;
|
||||
ctx->end_of_input = false;
|
||||
memset(&ctx->zstr, 0, sizeof(ctx->zstr));
|
||||
ctx->method = method;
|
||||
return ctx;
|
||||
}
|
||||
|
||||
|
||||
static void *
|
||||
compress_allocate(zip_uint16_t method, int compression_flags, zip_error_t *error) {
|
||||
return allocate(true, compression_flags, error, method);
|
||||
}
|
||||
|
||||
|
||||
static void *
|
||||
decompress_allocate(zip_uint16_t method, int compression_flags, zip_error_t *error) {
|
||||
return allocate(false, compression_flags, error, method);
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
deallocate(void *ud) {
|
||||
struct ctx *ctx = (struct ctx *)ud;
|
||||
free(ctx);
|
||||
}
|
||||
|
||||
|
||||
static int
|
||||
compression_flags(void *ud) {
|
||||
struct ctx *ctx = (struct ctx *)ud;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
map_error(int ret) {
|
||||
switch (ret) {
|
||||
case LZMA_UNSUPPORTED_CHECK:
|
||||
return ZIP_ER_COMPRESSED_DATA;
|
||||
|
||||
case LZMA_MEM_ERROR:
|
||||
return ZIP_ER_MEMORY;
|
||||
|
||||
case LZMA_OPTIONS_ERROR:
|
||||
return ZIP_ER_INVAL;
|
||||
|
||||
default:
|
||||
return ZIP_ER_INTERNAL;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static bool
|
||||
start(void *ud) {
|
||||
struct ctx *ctx = (struct ctx *)ud;
|
||||
lzma_ret ret;
|
||||
|
||||
lzma_options_lzma opt_lzma;
|
||||
lzma_lzma_preset(&opt_lzma, ctx->compression_flags);
|
||||
lzma_filter filters[] = {
|
||||
{ .id = (ctx->method == ZIP_CM_LZMA ? LZMA_FILTER_LZMA1 : LZMA_FILTER_LZMA2), .options = &opt_lzma},
|
||||
{ .id = LZMA_VLI_UNKNOWN, .options = NULL },
|
||||
};
|
||||
|
||||
ctx->zstr.avail_in = 0;
|
||||
ctx->zstr.next_in = NULL;
|
||||
ctx->zstr.avail_out = 0;
|
||||
ctx->zstr.next_out = NULL;
|
||||
|
||||
if (ctx->compress) {
|
||||
if (ctx->method == ZIP_CM_LZMA)
|
||||
ret = lzma_alone_encoder(&ctx->zstr, filters[0].options);
|
||||
else
|
||||
ret = lzma_stream_encoder(&ctx->zstr, filters, LZMA_CHECK_CRC64);
|
||||
} else {
|
||||
if (ctx->method == ZIP_CM_LZMA)
|
||||
ret = lzma_alone_decoder(&ctx->zstr, UINT64_MAX);
|
||||
else
|
||||
ret = lzma_stream_decoder(&ctx->zstr, UINT64_MAX, LZMA_CONCATENATED);
|
||||
}
|
||||
|
||||
if (ret != LZMA_OK) {
|
||||
zip_error_set(ctx->error, map_error(ret), 0);
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
static bool
|
||||
end(void *ud) {
|
||||
struct ctx *ctx = (struct ctx *)ud;
|
||||
int err;
|
||||
|
||||
lzma_end(&ctx->zstr);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
static bool
|
||||
input(void *ud, zip_uint8_t *data, zip_uint64_t length) {
|
||||
struct ctx *ctx = (struct ctx *)ud;
|
||||
|
||||
if (length > UINT_MAX || ctx->zstr.avail_in > 0) {
|
||||
zip_error_set(ctx->error, ZIP_ER_INVAL, 0);
|
||||
return false;
|
||||
}
|
||||
|
||||
ctx->zstr.avail_in = (uInt)length;
|
||||
ctx->zstr.next_in = (Bytef *)data;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
end_of_input(void *ud) {
|
||||
struct ctx *ctx = (struct ctx *)ud;
|
||||
|
||||
ctx->end_of_input = true;
|
||||
}
|
||||
|
||||
|
||||
static zip_compression_status_t
|
||||
process(void *ud, zip_uint8_t *data, zip_uint64_t *length) {
|
||||
struct ctx *ctx = (struct ctx *)ud;
|
||||
lzma_ret ret;
|
||||
|
||||
ctx->zstr.avail_out = (uInt)ZIP_MIN(UINT_MAX, *length);
|
||||
ctx->zstr.next_out = (Bytef *)data;
|
||||
|
||||
ret = lzma_code(&ctx->zstr, ctx->end_of_input ? LZMA_FINISH : LZMA_RUN);
|
||||
*length = *length - ctx->zstr.avail_out;
|
||||
|
||||
switch (ret) {
|
||||
case LZMA_OK:
|
||||
return ZIP_COMPRESSION_OK;
|
||||
|
||||
case LZMA_STREAM_END:
|
||||
return ZIP_COMPRESSION_END;
|
||||
|
||||
case LZMA_BUF_ERROR:
|
||||
if (ctx->zstr.avail_in == 0) {
|
||||
return ZIP_COMPRESSION_NEED_DATA;
|
||||
}
|
||||
|
||||
/* fallthrough */
|
||||
default:
|
||||
zip_error_set(ctx->error, map_error(ret), 0);
|
||||
return ZIP_COMPRESSION_ERROR;
|
||||
}
|
||||
}
|
||||
|
||||
// clang-format off
|
||||
|
||||
zip_compression_algorithm_t zip_algorithm_xz_compress = {
|
||||
compress_allocate,
|
||||
deallocate,
|
||||
compression_flags,
|
||||
start,
|
||||
end,
|
||||
input,
|
||||
end_of_input,
|
||||
process
|
||||
};
|
||||
|
||||
|
||||
zip_compression_algorithm_t zip_algorithm_xz_decompress = {
|
||||
decompress_allocate,
|
||||
deallocate,
|
||||
compression_flags,
|
||||
start,
|
||||
end,
|
||||
input,
|
||||
end_of_input,
|
||||
process
|
||||
};
|
||||
|
||||
// clang-format on
|
324
externals/libzip/libzip/lib/zip_buffer.c
vendored
Executable file
324
externals/libzip/libzip/lib/zip_buffer.c
vendored
Executable file
@@ -0,0 +1,324 @@
|
||||
/*
|
||||
zip_buffer.c -- bounds checked access to memory buffer
|
||||
Copyright (C) 2014-2018 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_uint8_t *
|
||||
_zip_buffer_data(zip_buffer_t *buffer) {
|
||||
return buffer->data;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
_zip_buffer_free(zip_buffer_t *buffer) {
|
||||
if (buffer == NULL) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (buffer->free_data) {
|
||||
free(buffer->data);
|
||||
}
|
||||
|
||||
free(buffer);
|
||||
}
|
||||
|
||||
|
||||
bool
|
||||
_zip_buffer_eof(zip_buffer_t *buffer) {
|
||||
return buffer->ok && buffer->offset == buffer->size;
|
||||
}
|
||||
|
||||
|
||||
zip_uint8_t *
|
||||
_zip_buffer_get(zip_buffer_t *buffer, zip_uint64_t length) {
|
||||
zip_uint8_t *data;
|
||||
|
||||
data = _zip_buffer_peek(buffer, length);
|
||||
|
||||
if (data != NULL) {
|
||||
buffer->offset += length;
|
||||
}
|
||||
|
||||
return data;
|
||||
}
|
||||
|
||||
|
||||
zip_uint16_t
|
||||
_zip_buffer_get_16(zip_buffer_t *buffer) {
|
||||
zip_uint8_t *data = _zip_buffer_get(buffer, 2);
|
||||
|
||||
if (data == NULL) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
return (zip_uint16_t)(data[0] + (data[1] << 8));
|
||||
}
|
||||
|
||||
|
||||
zip_uint32_t
|
||||
_zip_buffer_get_32(zip_buffer_t *buffer) {
|
||||
zip_uint8_t *data = _zip_buffer_get(buffer, 4);
|
||||
|
||||
if (data == NULL) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
return ((((((zip_uint32_t)data[3] << 8) + data[2]) << 8) + data[1]) << 8) + data[0];
|
||||
}
|
||||
|
||||
|
||||
zip_uint64_t
|
||||
_zip_buffer_get_64(zip_buffer_t *buffer) {
|
||||
zip_uint8_t *data = _zip_buffer_get(buffer, 8);
|
||||
|
||||
if (data == NULL) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
return ((zip_uint64_t)data[7] << 56) + ((zip_uint64_t)data[6] << 48) + ((zip_uint64_t)data[5] << 40) + ((zip_uint64_t)data[4] << 32) + ((zip_uint64_t)data[3] << 24) + ((zip_uint64_t)data[2] << 16) + ((zip_uint64_t)data[1] << 8) + (zip_uint64_t)data[0];
|
||||
}
|
||||
|
||||
|
||||
zip_uint8_t
|
||||
_zip_buffer_get_8(zip_buffer_t *buffer) {
|
||||
zip_uint8_t *data = _zip_buffer_get(buffer, 1);
|
||||
|
||||
if (data == NULL) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
return data[0];
|
||||
}
|
||||
|
||||
|
||||
zip_uint64_t
|
||||
_zip_buffer_left(zip_buffer_t *buffer) {
|
||||
return buffer->ok ? buffer->size - buffer->offset : 0;
|
||||
}
|
||||
|
||||
|
||||
zip_uint64_t
|
||||
_zip_buffer_read(zip_buffer_t *buffer, zip_uint8_t *data, zip_uint64_t length) {
|
||||
if (_zip_buffer_left(buffer) < length) {
|
||||
length = _zip_buffer_left(buffer);
|
||||
}
|
||||
|
||||
memcpy(data, _zip_buffer_get(buffer, length), length);
|
||||
|
||||
return length;
|
||||
}
|
||||
|
||||
|
||||
zip_buffer_t *
|
||||
_zip_buffer_new(zip_uint8_t *data, zip_uint64_t size) {
|
||||
bool free_data = (data == NULL);
|
||||
zip_buffer_t *buffer;
|
||||
|
||||
if (data == NULL) {
|
||||
if ((data = (zip_uint8_t *)malloc(size)) == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
if ((buffer = (zip_buffer_t *)malloc(sizeof(*buffer))) == NULL) {
|
||||
if (free_data) {
|
||||
free(data);
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
buffer->ok = true;
|
||||
buffer->data = data;
|
||||
buffer->size = size;
|
||||
buffer->offset = 0;
|
||||
buffer->free_data = free_data;
|
||||
|
||||
return buffer;
|
||||
}
|
||||
|
||||
|
||||
zip_buffer_t *
|
||||
_zip_buffer_new_from_source(zip_source_t *src, zip_uint64_t size, zip_uint8_t *buf, zip_error_t *error) {
|
||||
zip_buffer_t *buffer;
|
||||
|
||||
if ((buffer = _zip_buffer_new(buf, size)) == NULL) {
|
||||
zip_error_set(error, ZIP_ER_MEMORY, 0);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (_zip_read(src, buffer->data, size, error) < 0) {
|
||||
_zip_buffer_free(buffer);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return buffer;
|
||||
}
|
||||
|
||||
|
||||
zip_uint64_t
|
||||
_zip_buffer_offset(zip_buffer_t *buffer) {
|
||||
return buffer->ok ? buffer->offset : 0;
|
||||
}
|
||||
|
||||
|
||||
bool
|
||||
_zip_buffer_ok(zip_buffer_t *buffer) {
|
||||
return buffer->ok;
|
||||
}
|
||||
|
||||
|
||||
zip_uint8_t *
|
||||
_zip_buffer_peek(zip_buffer_t *buffer, zip_uint64_t length) {
|
||||
zip_uint8_t *data;
|
||||
|
||||
if (!buffer->ok || buffer->offset + length < length || buffer->offset + length > buffer->size) {
|
||||
buffer->ok = false;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
data = buffer->data + buffer->offset;
|
||||
return data;
|
||||
}
|
||||
|
||||
int
|
||||
_zip_buffer_put(zip_buffer_t *buffer, const void *src, size_t length) {
|
||||
zip_uint8_t *dst = _zip_buffer_get(buffer, length);
|
||||
|
||||
if (dst == NULL) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
memcpy(dst, src, length);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
_zip_buffer_put_16(zip_buffer_t *buffer, zip_uint16_t i) {
|
||||
zip_uint8_t *data = _zip_buffer_get(buffer, 2);
|
||||
|
||||
if (data == NULL) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
data[0] = (zip_uint8_t)(i & 0xff);
|
||||
data[1] = (zip_uint8_t)((i >> 8) & 0xff);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
_zip_buffer_put_32(zip_buffer_t *buffer, zip_uint32_t i) {
|
||||
zip_uint8_t *data = _zip_buffer_get(buffer, 4);
|
||||
|
||||
if (data == NULL) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
data[0] = (zip_uint8_t)(i & 0xff);
|
||||
data[1] = (zip_uint8_t)((i >> 8) & 0xff);
|
||||
data[2] = (zip_uint8_t)((i >> 16) & 0xff);
|
||||
data[3] = (zip_uint8_t)((i >> 24) & 0xff);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
_zip_buffer_put_64(zip_buffer_t *buffer, zip_uint64_t i) {
|
||||
zip_uint8_t *data = _zip_buffer_get(buffer, 8);
|
||||
|
||||
if (data == NULL) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
data[0] = (zip_uint8_t)(i & 0xff);
|
||||
data[1] = (zip_uint8_t)((i >> 8) & 0xff);
|
||||
data[2] = (zip_uint8_t)((i >> 16) & 0xff);
|
||||
data[3] = (zip_uint8_t)((i >> 24) & 0xff);
|
||||
data[4] = (zip_uint8_t)((i >> 32) & 0xff);
|
||||
data[5] = (zip_uint8_t)((i >> 40) & 0xff);
|
||||
data[6] = (zip_uint8_t)((i >> 48) & 0xff);
|
||||
data[7] = (zip_uint8_t)((i >> 56) & 0xff);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
_zip_buffer_put_8(zip_buffer_t *buffer, zip_uint8_t i) {
|
||||
zip_uint8_t *data = _zip_buffer_get(buffer, 1);
|
||||
|
||||
if (data == NULL) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
data[0] = i;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
_zip_buffer_set_offset(zip_buffer_t *buffer, zip_uint64_t offset) {
|
||||
if (offset > buffer->size) {
|
||||
buffer->ok = false;
|
||||
return -1;
|
||||
}
|
||||
|
||||
buffer->ok = true;
|
||||
buffer->offset = offset;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
_zip_buffer_skip(zip_buffer_t *buffer, zip_uint64_t length) {
|
||||
zip_uint64_t offset = buffer->offset + length;
|
||||
|
||||
if (offset < buffer->offset) {
|
||||
buffer->ok = false;
|
||||
return -1;
|
||||
}
|
||||
return _zip_buffer_set_offset(buffer, offset);
|
||||
}
|
||||
|
||||
zip_uint64_t
|
||||
_zip_buffer_size(zip_buffer_t *buffer) {
|
||||
return buffer->size;
|
||||
}
|
643
externals/libzip/libzip/lib/zip_close.c
vendored
Executable file
643
externals/libzip/libzip/lib/zip_close.c
vendored
Executable file
@@ -0,0 +1,643 @@
|
||||
/*
|
||||
zip_close.c -- close zip archive and update changes
|
||||
Copyright (C) 1999-2018 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"
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#ifdef HAVE_STRINGS_H
|
||||
#include <strings.h>
|
||||
#endif
|
||||
#ifdef HAVE_UNISTD_H
|
||||
#include <unistd.h>
|
||||
#endif
|
||||
#include <sys/stat.h>
|
||||
#include <sys/types.h>
|
||||
#ifdef _WIN32
|
||||
#include <fcntl.h>
|
||||
#include <io.h>
|
||||
#endif
|
||||
|
||||
|
||||
static int add_data(zip_t *, zip_source_t *, zip_dirent_t *);
|
||||
static int copy_data(zip_t *, zip_uint64_t);
|
||||
static int copy_source(zip_t *, zip_source_t *, zip_int64_t);
|
||||
static int write_cdir(zip_t *, const zip_filelist_t *, zip_uint64_t);
|
||||
|
||||
ZIP_EXTERN int
|
||||
zip_close(zip_t *za) {
|
||||
zip_uint64_t i, j, survivors, unchanged_offset;
|
||||
zip_int64_t off;
|
||||
int error;
|
||||
zip_filelist_t *filelist;
|
||||
int changed;
|
||||
|
||||
if (za == NULL)
|
||||
return -1;
|
||||
|
||||
changed = _zip_changed(za, &survivors);
|
||||
|
||||
/* don't create zip files with no entries */
|
||||
if (survivors == 0) {
|
||||
if ((za->open_flags & ZIP_TRUNCATE) || changed) {
|
||||
if (zip_source_remove(za->src) < 0) {
|
||||
if (!((zip_error_code_zip(zip_source_error(za->src)) == ZIP_ER_REMOVE) && (zip_error_code_system(zip_source_error(za->src)) == ENOENT))) {
|
||||
_zip_error_set_from_source(&za->error, za->src);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
}
|
||||
zip_discard(za);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (!changed) {
|
||||
zip_discard(za);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (survivors > za->nentry) {
|
||||
zip_error_set(&za->error, ZIP_ER_INTERNAL, 0);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if ((filelist = (zip_filelist_t *)malloc(sizeof(filelist[0]) * (size_t)survivors)) == NULL)
|
||||
return -1;
|
||||
|
||||
unchanged_offset = ZIP_UINT64_MAX;
|
||||
/* create list of files with index into original archive */
|
||||
for (i = j = 0; i < za->nentry; i++) {
|
||||
if (za->entry[i].orig != NULL && ZIP_ENTRY_HAS_CHANGES(&za->entry[i])) {
|
||||
unchanged_offset = ZIP_MIN(unchanged_offset, za->entry[i].orig->offset);
|
||||
}
|
||||
if (za->entry[i].deleted) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (j >= survivors) {
|
||||
free(filelist);
|
||||
zip_error_set(&za->error, ZIP_ER_INTERNAL, 0);
|
||||
return -1;
|
||||
}
|
||||
|
||||
filelist[j].idx = i;
|
||||
j++;
|
||||
}
|
||||
if (j < survivors) {
|
||||
free(filelist);
|
||||
zip_error_set(&za->error, ZIP_ER_INTERNAL, 0);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if ((zip_source_supports(za->src) & ZIP_SOURCE_MAKE_COMMAND_BITMASK(ZIP_SOURCE_BEGIN_WRITE_CLONING)) == 0) {
|
||||
unchanged_offset = 0;
|
||||
}
|
||||
else {
|
||||
if (unchanged_offset == ZIP_UINT64_MAX) {
|
||||
/* we're keeping all file data, find the end of the last one */
|
||||
zip_uint64_t last_index = ZIP_UINT64_MAX;
|
||||
unchanged_offset = 0;
|
||||
|
||||
for (i = 0; i < za->nentry; i++) {
|
||||
if (za->entry[i].orig != NULL) {
|
||||
if (za->entry[i].orig->offset >= unchanged_offset) {
|
||||
unchanged_offset = za->entry[i].orig->offset;
|
||||
last_index = i;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (last_index != ZIP_UINT64_MAX) {
|
||||
if ((unchanged_offset = _zip_file_get_end(za, last_index, &za->error)) == 0) {
|
||||
free(filelist);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (unchanged_offset > 0) {
|
||||
if (zip_source_begin_write_cloning(za->src, unchanged_offset) < 0) {
|
||||
/* cloning not supported, need to copy everything */
|
||||
unchanged_offset = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (unchanged_offset == 0) {
|
||||
if (zip_source_begin_write(za->src) < 0) {
|
||||
_zip_error_set_from_source(&za->error, za->src);
|
||||
free(filelist);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
_zip_progress_start(za->progress);
|
||||
error = 0;
|
||||
for (j = 0; j < survivors; j++) {
|
||||
int new_data;
|
||||
zip_entry_t *entry;
|
||||
zip_dirent_t *de;
|
||||
|
||||
_zip_progress_subrange(za->progress, (double)j / (double)survivors, (double)(j + 1) / (double)survivors);
|
||||
|
||||
i = filelist[j].idx;
|
||||
entry = za->entry + i;
|
||||
|
||||
if (entry->orig != NULL && entry->orig->offset < unchanged_offset) {
|
||||
/* already implicitly copied by cloning */
|
||||
continue;
|
||||
}
|
||||
|
||||
new_data = (ZIP_ENTRY_DATA_CHANGED(entry) || ZIP_ENTRY_CHANGED(entry, ZIP_DIRENT_COMP_METHOD) || ZIP_ENTRY_CHANGED(entry, ZIP_DIRENT_ENCRYPTION_METHOD));
|
||||
|
||||
/* create new local directory entry */
|
||||
if (entry->changes == NULL) {
|
||||
if ((entry->changes = _zip_dirent_clone(entry->orig)) == NULL) {
|
||||
zip_error_set(&za->error, ZIP_ER_MEMORY, 0);
|
||||
error = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
de = entry->changes;
|
||||
|
||||
if (_zip_read_local_ef(za, i) < 0) {
|
||||
error = 1;
|
||||
break;
|
||||
}
|
||||
|
||||
if ((off = zip_source_tell_write(za->src)) < 0) {
|
||||
error = 1;
|
||||
break;
|
||||
}
|
||||
de->offset = (zip_uint64_t)off;
|
||||
|
||||
if (new_data) {
|
||||
zip_source_t *zs;
|
||||
|
||||
zs = NULL;
|
||||
if (!ZIP_ENTRY_DATA_CHANGED(entry)) {
|
||||
if ((zs = _zip_source_zip_new(za, za, i, ZIP_FL_UNCHANGED, 0, 0, NULL)) == NULL) {
|
||||
error = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/* add_data writes dirent */
|
||||
if (add_data(za, zs ? zs : entry->source, de) < 0) {
|
||||
error = 1;
|
||||
if (zs)
|
||||
zip_source_free(zs);
|
||||
break;
|
||||
}
|
||||
if (zs)
|
||||
zip_source_free(zs);
|
||||
}
|
||||
else {
|
||||
zip_uint64_t offset;
|
||||
|
||||
/* when copying data, all sizes are known -> no data descriptor needed */
|
||||
de->bitflags &= (zip_uint16_t)~ZIP_GPBF_DATA_DESCRIPTOR;
|
||||
if (_zip_dirent_write(za, de, ZIP_FL_LOCAL) < 0) {
|
||||
error = 1;
|
||||
break;
|
||||
}
|
||||
if ((offset = _zip_file_get_offset(za, i, &za->error)) == 0) {
|
||||
error = 1;
|
||||
break;
|
||||
}
|
||||
if (zip_source_seek(za->src, (zip_int64_t)offset, SEEK_SET) < 0) {
|
||||
_zip_error_set_from_source(&za->error, za->src);
|
||||
error = 1;
|
||||
break;
|
||||
}
|
||||
if (copy_data(za, de->comp_size) < 0) {
|
||||
error = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!error) {
|
||||
if (write_cdir(za, filelist, survivors) < 0)
|
||||
error = 1;
|
||||
}
|
||||
|
||||
free(filelist);
|
||||
|
||||
if (!error) {
|
||||
if (zip_source_commit_write(za->src) != 0) {
|
||||
_zip_error_set_from_source(&za->error, za->src);
|
||||
error = 1;
|
||||
}
|
||||
}
|
||||
|
||||
_zip_progress_end(za->progress);
|
||||
|
||||
if (error) {
|
||||
zip_source_rollback_write(za->src);
|
||||
return -1;
|
||||
}
|
||||
|
||||
zip_discard(za);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
static int
|
||||
add_data(zip_t *za, zip_source_t *src, zip_dirent_t *de) {
|
||||
zip_int64_t offstart, offdata, offend, data_length;
|
||||
struct zip_stat st;
|
||||
zip_source_t *src_final, *src_tmp;
|
||||
int ret;
|
||||
int is_zip64;
|
||||
zip_flags_t flags;
|
||||
zip_int8_t compression_flags;
|
||||
bool needs_recompress, needs_decompress, needs_crc, needs_compress, needs_reencrypt, needs_decrypt, needs_encrypt;
|
||||
|
||||
if (zip_source_stat(src, &st) < 0) {
|
||||
_zip_error_set_from_source(&za->error, src);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if ((st.valid & ZIP_STAT_COMP_METHOD) == 0) {
|
||||
st.valid |= ZIP_STAT_COMP_METHOD;
|
||||
st.comp_method = ZIP_CM_STORE;
|
||||
}
|
||||
|
||||
if (ZIP_CM_IS_DEFAULT(de->comp_method) && st.comp_method != ZIP_CM_STORE)
|
||||
de->comp_method = st.comp_method;
|
||||
else if (de->comp_method == ZIP_CM_STORE && (st.valid & ZIP_STAT_SIZE)) {
|
||||
st.valid |= ZIP_STAT_COMP_SIZE;
|
||||
st.comp_size = st.size;
|
||||
}
|
||||
else {
|
||||
/* we'll recompress */
|
||||
st.valid &= ~ZIP_STAT_COMP_SIZE;
|
||||
}
|
||||
|
||||
if ((st.valid & ZIP_STAT_ENCRYPTION_METHOD) == 0) {
|
||||
st.valid |= ZIP_STAT_ENCRYPTION_METHOD;
|
||||
st.encryption_method = ZIP_EM_NONE;
|
||||
}
|
||||
|
||||
flags = ZIP_EF_LOCAL;
|
||||
|
||||
if ((st.valid & ZIP_STAT_SIZE) == 0) {
|
||||
flags |= ZIP_FL_FORCE_ZIP64;
|
||||
data_length = -1;
|
||||
}
|
||||
else {
|
||||
de->uncomp_size = st.size;
|
||||
/* this is technically incorrect (copy_source counts compressed data), but it's the best we have */
|
||||
data_length = (zip_int64_t)st.size;
|
||||
|
||||
if ((st.valid & ZIP_STAT_COMP_SIZE) == 0) {
|
||||
zip_uint64_t max_size;
|
||||
|
||||
switch (ZIP_CM_ACTUAL(de->comp_method)) {
|
||||
case ZIP_CM_BZIP2:
|
||||
/* computed by looking at increase of 10 random files of size 1MB when
|
||||
* compressed with bzip2, rounded up: 1.006 */
|
||||
max_size = 4269351188u;
|
||||
break;
|
||||
|
||||
case ZIP_CM_DEFLATE:
|
||||
/* max deflate size increase: size + ceil(size/16k)*5+6 */
|
||||
max_size = 4293656963u;
|
||||
break;
|
||||
|
||||
case ZIP_CM_STORE:
|
||||
max_size = 0xffffffffu;
|
||||
break;
|
||||
|
||||
default:
|
||||
max_size = 0;
|
||||
}
|
||||
|
||||
if (st.size > max_size) {
|
||||
flags |= ZIP_FL_FORCE_ZIP64;
|
||||
}
|
||||
}
|
||||
else
|
||||
de->comp_size = st.comp_size;
|
||||
}
|
||||
|
||||
if ((offstart = zip_source_tell_write(za->src)) < 0) {
|
||||
_zip_error_set_from_source(&za->error, za->src);
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* as long as we don't support non-seekable output, clear data descriptor bit */
|
||||
de->bitflags &= (zip_uint16_t)~ZIP_GPBF_DATA_DESCRIPTOR;
|
||||
if ((is_zip64 = _zip_dirent_write(za, de, flags)) < 0) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
needs_recompress = st.comp_method != ZIP_CM_ACTUAL(de->comp_method);
|
||||
needs_decompress = needs_recompress && (st.comp_method != ZIP_CM_STORE);
|
||||
needs_crc = (st.comp_method == ZIP_CM_STORE) || needs_decompress;
|
||||
needs_compress = needs_recompress && (de->comp_method != ZIP_CM_STORE);
|
||||
|
||||
needs_reencrypt = needs_recompress || (de->changed & ZIP_DIRENT_PASSWORD) || (de->encryption_method != st.encryption_method);
|
||||
needs_decrypt = needs_reencrypt && (st.encryption_method != ZIP_EM_NONE);
|
||||
needs_encrypt = needs_reencrypt && (de->encryption_method != ZIP_EM_NONE);
|
||||
|
||||
src_final = src;
|
||||
zip_source_keep(src_final);
|
||||
|
||||
if (needs_decrypt) {
|
||||
zip_encryption_implementation impl;
|
||||
|
||||
if ((impl = _zip_get_encryption_implementation(st.encryption_method, ZIP_CODEC_DECODE)) == NULL) {
|
||||
zip_error_set(&za->error, ZIP_ER_ENCRNOTSUPP, 0);
|
||||
zip_source_free(src_final);
|
||||
return -1;
|
||||
}
|
||||
if ((src_tmp = impl(za, src_final, st.encryption_method, ZIP_CODEC_DECODE, za->default_password)) == NULL) {
|
||||
/* error set by impl */
|
||||
zip_source_free(src_final);
|
||||
return -1;
|
||||
}
|
||||
|
||||
zip_source_free(src_final);
|
||||
src_final = src_tmp;
|
||||
}
|
||||
|
||||
if (needs_decompress) {
|
||||
if ((src_tmp = zip_source_decompress(za, src_final, st.comp_method)) == NULL) {
|
||||
zip_source_free(src_final);
|
||||
return -1;
|
||||
}
|
||||
|
||||
zip_source_free(src_final);
|
||||
src_final = src_tmp;
|
||||
}
|
||||
|
||||
if (needs_crc) {
|
||||
if ((src_tmp = zip_source_crc(za, src_final, 0)) == NULL) {
|
||||
zip_source_free(src_final);
|
||||
return -1;
|
||||
}
|
||||
|
||||
zip_source_free(src_final);
|
||||
src_final = src_tmp;
|
||||
}
|
||||
|
||||
if (needs_compress) {
|
||||
if ((src_tmp = zip_source_compress(za, src_final, de->comp_method, de->compression_level)) == NULL) {
|
||||
zip_source_free(src_final);
|
||||
return -1;
|
||||
}
|
||||
|
||||
zip_source_free(src_final);
|
||||
src_final = src_tmp;
|
||||
}
|
||||
|
||||
|
||||
if (needs_encrypt) {
|
||||
zip_encryption_implementation impl;
|
||||
const char *password = NULL;
|
||||
|
||||
if (de->password) {
|
||||
password = de->password;
|
||||
}
|
||||
else if (za->default_password) {
|
||||
password = za->default_password;
|
||||
}
|
||||
|
||||
if ((impl = _zip_get_encryption_implementation(de->encryption_method, ZIP_CODEC_ENCODE)) == NULL) {
|
||||
zip_error_set(&za->error, ZIP_ER_ENCRNOTSUPP, 0);
|
||||
zip_source_free(src_final);
|
||||
return -1;
|
||||
}
|
||||
if ((src_tmp = impl(za, src_final, de->encryption_method, ZIP_CODEC_ENCODE, password)) == NULL) {
|
||||
/* error set by impl */
|
||||
zip_source_free(src_final);
|
||||
return -1;
|
||||
}
|
||||
|
||||
zip_source_free(src_final);
|
||||
src_final = src_tmp;
|
||||
}
|
||||
|
||||
|
||||
if ((offdata = zip_source_tell_write(za->src)) < 0) {
|
||||
_zip_error_set_from_source(&za->error, za->src);
|
||||
return -1;
|
||||
}
|
||||
|
||||
ret = copy_source(za, src_final, data_length);
|
||||
|
||||
if (zip_source_stat(src_final, &st) < 0) {
|
||||
_zip_error_set_from_source(&za->error, src_final);
|
||||
ret = -1;
|
||||
}
|
||||
|
||||
if ((compression_flags = zip_source_get_compression_flags(src_final)) < 0) {
|
||||
_zip_error_set_from_source(&za->error, src_final);
|
||||
ret = -1;
|
||||
}
|
||||
|
||||
zip_source_free(src_final);
|
||||
|
||||
if (ret < 0) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
if ((offend = zip_source_tell_write(za->src)) < 0) {
|
||||
_zip_error_set_from_source(&za->error, za->src);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (zip_source_seek_write(za->src, offstart, SEEK_SET) < 0) {
|
||||
_zip_error_set_from_source(&za->error, za->src);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if ((st.valid & (ZIP_STAT_COMP_METHOD | ZIP_STAT_CRC | ZIP_STAT_SIZE)) != (ZIP_STAT_COMP_METHOD | ZIP_STAT_CRC | ZIP_STAT_SIZE)) {
|
||||
zip_error_set(&za->error, ZIP_ER_INTERNAL, 0);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if ((de->changed & ZIP_DIRENT_LAST_MOD) == 0) {
|
||||
if (st.valid & ZIP_STAT_MTIME)
|
||||
de->last_mod = st.mtime;
|
||||
else
|
||||
time(&de->last_mod);
|
||||
}
|
||||
de->comp_method = st.comp_method;
|
||||
de->crc = st.crc;
|
||||
de->uncomp_size = st.size;
|
||||
de->comp_size = (zip_uint64_t)(offend - offdata);
|
||||
de->bitflags = (zip_uint16_t)((de->bitflags & (zip_uint16_t)~6) | ((zip_uint8_t)compression_flags << 1));
|
||||
_zip_dirent_set_version_needed(de, (flags & ZIP_FL_FORCE_ZIP64) != 0);
|
||||
|
||||
if ((ret = _zip_dirent_write(za, de, flags)) < 0)
|
||||
return -1;
|
||||
|
||||
if (is_zip64 != ret) {
|
||||
/* Zip64 mismatch between preliminary file header written before data and final file header written afterwards */
|
||||
zip_error_set(&za->error, ZIP_ER_INTERNAL, 0);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (zip_source_seek_write(za->src, offend, SEEK_SET) < 0) {
|
||||
_zip_error_set_from_source(&za->error, za->src);
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
static int
|
||||
copy_data(zip_t *za, zip_uint64_t len) {
|
||||
DEFINE_BYTE_ARRAY(buf, BUFSIZE);
|
||||
size_t n;
|
||||
double total = (double)len;
|
||||
|
||||
if (!byte_array_init(buf, BUFSIZE)) {
|
||||
zip_error_set(&za->error, ZIP_ER_MEMORY, 0);
|
||||
return -1;
|
||||
}
|
||||
|
||||
while (len > 0) {
|
||||
n = len > BUFSIZE ? BUFSIZE : len;
|
||||
if (_zip_read(za->src, buf, n, &za->error) < 0) {
|
||||
byte_array_fini(buf);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (_zip_write(za, buf, n) < 0) {
|
||||
byte_array_fini(buf);
|
||||
return -1;
|
||||
}
|
||||
|
||||
len -= n;
|
||||
|
||||
_zip_progress_update(za->progress, (total - (double)len) / total);
|
||||
}
|
||||
|
||||
byte_array_fini(buf);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
static int
|
||||
copy_source(zip_t *za, zip_source_t *src, zip_int64_t data_length) {
|
||||
DEFINE_BYTE_ARRAY(buf, BUFSIZE);
|
||||
zip_int64_t n, current;
|
||||
int ret;
|
||||
|
||||
if (zip_source_open(src) < 0) {
|
||||
_zip_error_set_from_source(&za->error, src);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (!byte_array_init(buf, BUFSIZE)) {
|
||||
zip_error_set(&za->error, ZIP_ER_MEMORY, 0);
|
||||
return -1;
|
||||
}
|
||||
|
||||
ret = 0;
|
||||
current = 0;
|
||||
while ((n = zip_source_read(src, buf, BUFSIZE)) > 0) {
|
||||
if (_zip_write(za, buf, (zip_uint64_t)n) < 0) {
|
||||
ret = -1;
|
||||
break;
|
||||
}
|
||||
if (n == BUFSIZE && za->progress && data_length > 0) {
|
||||
current += n;
|
||||
_zip_progress_update(za->progress, (double)current / (double)data_length);
|
||||
}
|
||||
}
|
||||
|
||||
if (n < 0) {
|
||||
_zip_error_set_from_source(&za->error, src);
|
||||
ret = -1;
|
||||
}
|
||||
|
||||
byte_array_fini(buf);
|
||||
|
||||
zip_source_close(src);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int
|
||||
write_cdir(zip_t *za, const zip_filelist_t *filelist, zip_uint64_t survivors) {
|
||||
zip_int64_t cd_start, end, size;
|
||||
|
||||
if ((cd_start = zip_source_tell_write(za->src)) < 0) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
if ((size = _zip_cdir_write(za, filelist, survivors)) < 0) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
if ((end = zip_source_tell_write(za->src)) < 0) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
_zip_changed(const zip_t *za, zip_uint64_t *survivorsp) {
|
||||
int changed;
|
||||
zip_uint64_t i, survivors;
|
||||
|
||||
changed = 0;
|
||||
survivors = 0;
|
||||
|
||||
if (za->comment_changed || za->ch_flags != za->flags) {
|
||||
changed = 1;
|
||||
}
|
||||
|
||||
for (i = 0; i < za->nentry; i++) {
|
||||
if (ZIP_ENTRY_HAS_CHANGES(&za->entry[i])) {
|
||||
changed = 1;
|
||||
}
|
||||
if (!za->entry[i].deleted) {
|
||||
survivors++;
|
||||
}
|
||||
}
|
||||
|
||||
if (survivorsp) {
|
||||
*survivorsp = survivors;
|
||||
}
|
||||
|
||||
return changed;
|
||||
}
|
54
externals/libzip/libzip/lib/zip_crypto.h
vendored
Executable file
54
externals/libzip/libzip/lib/zip_crypto.h
vendored
Executable file
@@ -0,0 +1,54 @@
|
||||
/*
|
||||
zip_crypto.h -- crypto definitions
|
||||
Copyright (C) 2017-2018 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.
|
||||
*/
|
||||
|
||||
#ifndef HAD_ZIP_CRYPTO_H
|
||||
#define HAD_ZIP_CRYPTO_H
|
||||
|
||||
#define ZIP_CRYPTO_SHA1_LENGTH 20
|
||||
#define ZIP_CRYPTO_AES_BLOCK_LENGTH 16
|
||||
|
||||
#if defined(HAVE_WINDOWS_CRYPTO)
|
||||
#include "zip_crypto_win.h"
|
||||
#elif defined(HAVE_COMMONCRYPTO)
|
||||
#include "zip_crypto_commoncrypto.h"
|
||||
#elif defined(HAVE_GNUTLS)
|
||||
#include "zip_crypto_gnutls.h"
|
||||
#elif defined(HAVE_OPENSSL)
|
||||
#include "zip_crypto_openssl.h"
|
||||
#elif defined(HAVE_MBEDTLS)
|
||||
#include "zip_crypto_mbedtls.h"
|
||||
#else
|
||||
#error "no crypto backend found"
|
||||
#endif
|
||||
|
||||
#endif /* HAD_ZIP_CRYPTO_H */
|
110
externals/libzip/libzip/lib/zip_crypto_commoncrypto.c
vendored
Executable file
110
externals/libzip/libzip/lib/zip_crypto_commoncrypto.c
vendored
Executable file
@@ -0,0 +1,110 @@
|
||||
/*
|
||||
zip_crypto_commoncrypto.c -- CommonCrypto wrapper.
|
||||
Copyright (C) 2018 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"
|
||||
|
||||
#include "zip_crypto.h"
|
||||
|
||||
#include <fcntl.h>
|
||||
#include <unistd.h>
|
||||
|
||||
void
|
||||
_zip_crypto_aes_free(_zip_crypto_aes_t *aes) {
|
||||
if (aes == NULL) {
|
||||
return;
|
||||
}
|
||||
|
||||
CCCryptorRelease(aes);
|
||||
}
|
||||
|
||||
|
||||
bool
|
||||
_zip_crypto_aes_encrypt_block(_zip_crypto_aes_t *aes, const zip_uint8_t *in, zip_uint8_t *out) {
|
||||
size_t len;
|
||||
CCCryptorUpdate(aes, in, ZIP_CRYPTO_AES_BLOCK_LENGTH, out, ZIP_CRYPTO_AES_BLOCK_LENGTH, &len);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
_zip_crypto_aes_t *
|
||||
_zip_crypto_aes_new(const zip_uint8_t *key, zip_uint16_t key_size, zip_error_t *error) {
|
||||
_zip_crypto_aes_t *aes;
|
||||
CCCryptorStatus ret;
|
||||
|
||||
ret = CCCryptorCreate(kCCEncrypt, kCCAlgorithmAES, kCCOptionECBMode, key, key_size / 8, NULL, &aes);
|
||||
|
||||
switch (ret) {
|
||||
case kCCSuccess:
|
||||
return aes;
|
||||
|
||||
case kCCMemoryFailure:
|
||||
zip_error_set(error, ZIP_ER_MEMORY, 0);
|
||||
return NULL;
|
||||
|
||||
case kCCParamError:
|
||||
zip_error_set(error, ZIP_ER_INVAL, 0);
|
||||
return NULL;
|
||||
|
||||
default:
|
||||
zip_error_set(error, ZIP_ER_INTERNAL, 0);
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
_zip_crypto_hmac_free(_zip_crypto_hmac_t *hmac) {
|
||||
if (hmac == NULL) {
|
||||
return;
|
||||
}
|
||||
|
||||
_zip_crypto_clear(hmac, sizeof(*hmac));
|
||||
free(hmac);
|
||||
}
|
||||
|
||||
|
||||
_zip_crypto_hmac_t *
|
||||
_zip_crypto_hmac_new(const zip_uint8_t *secret, zip_uint64_t secret_length, zip_error_t *error) {
|
||||
_zip_crypto_hmac_t *hmac;
|
||||
|
||||
if ((hmac = (_zip_crypto_hmac_t *)malloc(sizeof(*hmac))) == NULL) {
|
||||
zip_error_set(error, ZIP_ER_MEMORY, 0);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
CCHmacInit(hmac, kCCHmacAlgSHA1, secret, secret_length);
|
||||
|
||||
return hmac;
|
||||
}
|
53
externals/libzip/libzip/lib/zip_crypto_commoncrypto.h
vendored
Executable file
53
externals/libzip/libzip/lib/zip_crypto_commoncrypto.h
vendored
Executable file
@@ -0,0 +1,53 @@
|
||||
/*
|
||||
zip_crypto_commoncrypto.h -- definitions for CommonCrypto wrapper.
|
||||
Copyright (C) 2018 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.
|
||||
*/
|
||||
|
||||
#ifndef HAD_ZIP_CRYPTO_COMMONCRYPTO_H
|
||||
#define HAD_ZIP_CRYPTO_COMMONCRYPTO_H
|
||||
|
||||
#include <CommonCrypto/CommonCrypto.h>
|
||||
|
||||
#define _zip_crypto_aes_t struct _CCCryptor
|
||||
#define _zip_crypto_hmac_t CCHmacContext
|
||||
|
||||
void _zip_crypto_aes_free(_zip_crypto_aes_t *aes);
|
||||
bool _zip_crypto_aes_encrypt_block(_zip_crypto_aes_t *aes, const zip_uint8_t *in, zip_uint8_t *out);
|
||||
_zip_crypto_aes_t *_zip_crypto_aes_new(const zip_uint8_t *key, zip_uint16_t key_size, zip_error_t *error);
|
||||
|
||||
#define _zip_crypto_hmac(hmac, data, length) (CCHmacUpdate((hmac), (data), (length)), true)
|
||||
void _zip_crypto_hmac_free(_zip_crypto_hmac_t *hmac);
|
||||
_zip_crypto_hmac_t *_zip_crypto_hmac_new(const zip_uint8_t *secret, zip_uint64_t secret_length, zip_error_t *error);
|
||||
#define _zip_crypto_hmac_output(hmac, data) (CCHmacFinal((hmac), (data)), true)
|
||||
|
||||
#define _zip_crypto_pbkdf2(key, key_length, salt, salt_length, iterations, output, output_length) (CCKeyDerivationPBKDF(kCCPBKDF2, (const char *)(key), (key_length), (salt), (salt_length), kCCPRFHmacAlgSHA1, (iterations), (output), (output_length)) == kCCSuccess)
|
||||
|
||||
#endif /* HAD_ZIP_CRYPTO_COMMONCRYPTO_H */
|
135
externals/libzip/libzip/lib/zip_crypto_gnutls.c
vendored
Executable file
135
externals/libzip/libzip/lib/zip_crypto_gnutls.c
vendored
Executable file
@@ -0,0 +1,135 @@
|
||||
/*
|
||||
zip_crypto_gnutls.c -- GnuTLS wrapper.
|
||||
Copyright (C) 2018 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"
|
||||
|
||||
#include "zip_crypto.h"
|
||||
|
||||
_zip_crypto_aes_t *
|
||||
_zip_crypto_aes_new(const zip_uint8_t *key, zip_uint16_t key_size, zip_error_t *error) {
|
||||
_zip_crypto_aes_t *aes;
|
||||
|
||||
if ((aes = (_zip_crypto_aes_t *)malloc(sizeof(*aes))) == NULL) {
|
||||
zip_error_set(error, ZIP_ER_MEMORY, 0);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
aes->key_size = key_size;
|
||||
|
||||
switch (aes->key_size) {
|
||||
case 128:
|
||||
nettle_aes128_set_encrypt_key(&aes->ctx.ctx_128, key);
|
||||
break;
|
||||
case 192:
|
||||
nettle_aes192_set_encrypt_key(&aes->ctx.ctx_192, key);
|
||||
break;
|
||||
case 256:
|
||||
nettle_aes256_set_encrypt_key(&aes->ctx.ctx_256, key);
|
||||
break;
|
||||
default:
|
||||
zip_error_set(error, ZIP_ER_INVAL, 0);
|
||||
free(aes);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return aes;
|
||||
}
|
||||
|
||||
bool
|
||||
_zip_crypto_aes_encrypt_block(_zip_crypto_aes_t *aes, const zip_uint8_t *in, zip_uint8_t *out) {
|
||||
switch (aes->key_size) {
|
||||
case 128:
|
||||
nettle_aes128_encrypt(&aes->ctx.ctx_128, ZIP_CRYPTO_AES_BLOCK_LENGTH, out, in);
|
||||
break;
|
||||
case 192:
|
||||
nettle_aes192_encrypt(&aes->ctx.ctx_192, ZIP_CRYPTO_AES_BLOCK_LENGTH, out, in);
|
||||
break;
|
||||
case 256:
|
||||
nettle_aes256_encrypt(&aes->ctx.ctx_256, ZIP_CRYPTO_AES_BLOCK_LENGTH, out, in);
|
||||
break;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void
|
||||
_zip_crypto_aes_free(_zip_crypto_aes_t *aes) {
|
||||
if (aes == NULL) {
|
||||
return;
|
||||
}
|
||||
|
||||
_zip_crypto_clear(aes, sizeof(*aes));
|
||||
free(aes);
|
||||
}
|
||||
|
||||
|
||||
_zip_crypto_hmac_t *
|
||||
_zip_crypto_hmac_new(const zip_uint8_t *secret, zip_uint64_t secret_length, zip_error_t *error) {
|
||||
_zip_crypto_hmac_t *hmac;
|
||||
int ret;
|
||||
|
||||
if ((hmac = (_zip_crypto_hmac_t *)malloc(sizeof(*hmac))) == NULL) {
|
||||
zip_error_set(error, ZIP_ER_MEMORY, 0);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if ((ret = gnutls_hmac_init(hmac, GNUTLS_MAC_SHA1, secret, secret_length)) < 0) {
|
||||
// TODO: set error
|
||||
free(hmac);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return hmac;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
_zip_crypto_hmac_free(_zip_crypto_hmac_t *hmac) {
|
||||
zip_uint8_t buf[ZIP_CRYPTO_SHA1_LENGTH];
|
||||
|
||||
if (hmac == NULL) {
|
||||
return;
|
||||
}
|
||||
|
||||
gnutls_hmac_deinit(*hmac, buf);
|
||||
_zip_crypto_clear(hmac, sizeof(*hmac));
|
||||
free(hmac);
|
||||
}
|
||||
|
||||
|
||||
ZIP_EXTERN bool
|
||||
zip_secure_random(zip_uint8_t *buffer, zip_uint16_t length) {
|
||||
return gnutls_rnd(GNUTLS_RND_KEY, buffer, length) == 0;
|
||||
}
|
67
externals/libzip/libzip/lib/zip_crypto_gnutls.h
vendored
Executable file
67
externals/libzip/libzip/lib/zip_crypto_gnutls.h
vendored
Executable file
@@ -0,0 +1,67 @@
|
||||
/*
|
||||
zip_crypto_gnutls.h -- definitions for GnuTLS wrapper.
|
||||
Copyright (C) 2018 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.
|
||||
*/
|
||||
|
||||
#ifndef HAD_ZIP_CRYPTO_GNUTLS_H
|
||||
#define HAD_ZIP_CRYPTO_GNUTLS_H
|
||||
|
||||
#define HAVE_SECURE_RANDOM
|
||||
|
||||
#include <nettle/aes.h>
|
||||
#include <nettle/pbkdf2.h>
|
||||
|
||||
#include <gnutls/gnutls.h>
|
||||
#include <gnutls/crypto.h>
|
||||
|
||||
typedef struct {
|
||||
union {
|
||||
struct aes128_ctx ctx_128;
|
||||
struct aes192_ctx ctx_192;
|
||||
struct aes256_ctx ctx_256;
|
||||
} ctx;
|
||||
zip_uint16_t key_size;
|
||||
} _zip_crypto_aes_t;
|
||||
|
||||
#define _zip_crypto_hmac_t gnutls_hmac_hd_t
|
||||
|
||||
void _zip_crypto_aes_free(_zip_crypto_aes_t *aes);
|
||||
bool _zip_crypto_aes_encrypt_block(_zip_crypto_aes_t *aes, const zip_uint8_t *in, zip_uint8_t *out);
|
||||
_zip_crypto_aes_t *_zip_crypto_aes_new(const zip_uint8_t *key, zip_uint16_t key_size, zip_error_t *error);
|
||||
|
||||
#define _zip_crypto_hmac(hmac, data, length) (gnutls_hmac(*(hmac), (data), (length)) == 0)
|
||||
void _zip_crypto_hmac_free(_zip_crypto_hmac_t *hmac);
|
||||
_zip_crypto_hmac_t *_zip_crypto_hmac_new(const zip_uint8_t *secret, zip_uint64_t secret_length, zip_error_t *error);
|
||||
#define _zip_crypto_hmac_output(hmac, data) (gnutls_hmac_output(*(hmac), (data)), true)
|
||||
|
||||
#define _zip_crypto_pbkdf2(key, key_length, salt, salt_length, iterations, output, output_length) (pbkdf2_hmac_sha1((key_length), (key), (iterations), (salt_length), (salt), (output_length), (output)), true)
|
||||
|
||||
#endif /* HAD_ZIP_CRYPTO_GNUTLS_H */
|
160
externals/libzip/libzip/lib/zip_crypto_mbedtls.c
vendored
Executable file
160
externals/libzip/libzip/lib/zip_crypto_mbedtls.c
vendored
Executable file
@@ -0,0 +1,160 @@
|
||||
/*
|
||||
zip_crypto_mbedtls.c -- mbed TLS wrapper
|
||||
Copyright (C) 2018 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"
|
||||
#include "zip_crypto.h"
|
||||
|
||||
#include <mbedtls/ctr_drbg.h>
|
||||
#include <mbedtls/entropy.h>
|
||||
#include <mbedtls/pkcs5.h>
|
||||
|
||||
|
||||
_zip_crypto_aes_t *
|
||||
_zip_crypto_aes_new(const zip_uint8_t *key, zip_uint16_t key_size, zip_error_t *error) {
|
||||
_zip_crypto_aes_t *aes;
|
||||
|
||||
if ((aes = (_zip_crypto_aes_t *)malloc(sizeof(*aes))) == NULL) {
|
||||
zip_error_set(error, ZIP_ER_MEMORY, 0);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
mbedtls_aes_init(aes);
|
||||
mbedtls_aes_setkey_enc(aes, (const unsigned char *)key, (unsigned int)key_size);
|
||||
|
||||
return aes;
|
||||
}
|
||||
|
||||
void
|
||||
_zip_crypto_aes_free(_zip_crypto_aes_t *aes) {
|
||||
if (aes == NULL) {
|
||||
return;
|
||||
}
|
||||
|
||||
mbedtls_aes_free(aes);
|
||||
free(aes);
|
||||
}
|
||||
|
||||
|
||||
_zip_crypto_hmac_t *
|
||||
_zip_crypto_hmac_new(const zip_uint8_t *secret, zip_uint64_t secret_length, zip_error_t *error) {
|
||||
_zip_crypto_hmac_t *hmac;
|
||||
|
||||
if (secret_length > INT_MAX) {
|
||||
zip_error_set(error, ZIP_ER_INVAL, 0);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if ((hmac = (_zip_crypto_hmac_t *)malloc(sizeof(*hmac))) == NULL) {
|
||||
zip_error_set(error, ZIP_ER_MEMORY, 0);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
mbedtls_md_init(hmac);
|
||||
|
||||
if (mbedtls_md_setup(hmac, mbedtls_md_info_from_type(MBEDTLS_MD_SHA1), 1) != 0) {
|
||||
zip_error_set(error, ZIP_ER_INTERNAL, 0);
|
||||
free(hmac);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (mbedtls_md_hmac_starts(hmac, (const unsigned char *)secret, (size_t)secret_length) != 0) {
|
||||
zip_error_set(error, ZIP_ER_INTERNAL, 0);
|
||||
free(hmac);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return hmac;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
_zip_crypto_hmac_free(_zip_crypto_hmac_t *hmac) {
|
||||
if (hmac == NULL) {
|
||||
return;
|
||||
}
|
||||
|
||||
mbedtls_md_free(hmac);
|
||||
free(hmac);
|
||||
}
|
||||
|
||||
|
||||
bool
|
||||
_zip_crypto_pbkdf2(const zip_uint8_t *key, zip_uint64_t key_length, const zip_uint8_t *salt, zip_uint16_t salt_length, int iterations, zip_uint8_t *output, zip_uint64_t output_length) {
|
||||
mbedtls_md_context_t sha1_ctx;
|
||||
bool ok = true;
|
||||
|
||||
mbedtls_md_init(&sha1_ctx);
|
||||
|
||||
if (mbedtls_md_setup(&sha1_ctx, mbedtls_md_info_from_type(MBEDTLS_MD_SHA1), 1) != 0) {
|
||||
ok = false;
|
||||
}
|
||||
|
||||
if (ok && mbedtls_pkcs5_pbkdf2_hmac(&sha1_ctx, (const unsigned char *)key, (size_t)key_length, (const unsigned char *)salt, (size_t)salt_length, (unsigned int)iterations, (uint32_t)output_length, (unsigned char *)output) != 0) {
|
||||
ok = false;
|
||||
}
|
||||
|
||||
mbedtls_md_free(&sha1_ctx);
|
||||
return ok;
|
||||
}
|
||||
|
||||
|
||||
typedef struct {
|
||||
mbedtls_entropy_context entropy;
|
||||
mbedtls_ctr_drbg_context ctr_drbg;
|
||||
} zip_random_context_t;
|
||||
|
||||
ZIP_EXTERN bool
|
||||
zip_secure_random(zip_uint8_t *buffer, zip_uint16_t length) {
|
||||
static zip_random_context_t *ctx = NULL;
|
||||
const unsigned char *pers = "zip_crypto_mbedtls";
|
||||
|
||||
if (!ctx) {
|
||||
ctx = (zip_random_context_t *)malloc(sizeof(zip_random_context_t));
|
||||
if (!ctx) {
|
||||
return false;
|
||||
}
|
||||
mbedtls_entropy_init(&ctx->entropy);
|
||||
mbedtls_ctr_drbg_init(&ctx->ctr_drbg);
|
||||
if (mbedtls_ctr_drbg_seed(&ctx->ctr_drbg, mbedtls_entropy_func, &ctx->entropy, pers, strlen(pers)) != 0) {
|
||||
mbedtls_ctr_drbg_free(&ctx->ctr_drbg);
|
||||
mbedtls_entropy_free(&ctx->entropy);
|
||||
free(ctx);
|
||||
ctx = NULL;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return mbedtls_ctr_drbg_random(&ctx->ctr_drbg, (unsigned char *)buffer, (size_t)length) == 0;
|
||||
}
|
56
externals/libzip/libzip/lib/zip_crypto_mbedtls.h
vendored
Executable file
56
externals/libzip/libzip/lib/zip_crypto_mbedtls.h
vendored
Executable file
@@ -0,0 +1,56 @@
|
||||
/*
|
||||
zip_crypto_mbedtls.h -- definitions for mbedtls wrapper
|
||||
Copyright (C) 2018 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.
|
||||
*/
|
||||
|
||||
#ifndef HAD_ZIP_CRYPTO_MBEDTLS_H
|
||||
#define HAD_ZIP_CRYPTO_MBEDTLS_H
|
||||
|
||||
#define HAVE_SECURE_RANDOM
|
||||
|
||||
#include <mbedtls/aes.h>
|
||||
#include <mbedtls/md.h>
|
||||
|
||||
#define _zip_crypto_aes_t mbedtls_aes_context
|
||||
#define _zip_crypto_hmac_t mbedtls_md_context_t
|
||||
|
||||
_zip_crypto_aes_t *_zip_crypto_aes_new(const zip_uint8_t *key, zip_uint16_t key_size, zip_error_t *error);
|
||||
#define _zip_crypto_aes_encrypt_block(aes, in, out) (mbedtls_aes_crypt_ecb((aes), MBEDTLS_AES_ENCRYPT, (in), (out)) == 0)
|
||||
void _zip_crypto_aes_free(_zip_crypto_aes_t *aes);
|
||||
|
||||
_zip_crypto_hmac_t *_zip_crypto_hmac_new(const zip_uint8_t *secret, zip_uint64_t secret_length, zip_error_t *error);
|
||||
#define _zip_crypto_hmac(hmac, data, length) (mbedtls_md_hmac_update((hmac), (data), (length)) == 0)
|
||||
#define _zip_crypto_hmac_output(hmac, data) (mbedtls_md_hmac_finish((hmac), (data)) == 0)
|
||||
void _zip_crypto_hmac_free(_zip_crypto_hmac_t *hmac);
|
||||
|
||||
bool _zip_crypto_pbkdf2(const zip_uint8_t *key, zip_uint64_t key_length, const zip_uint8_t *salt, zip_uint16_t salt_length, int iterations, zip_uint8_t *output, zip_uint64_t output_length);
|
||||
|
||||
#endif /* HAD_ZIP_CRYPTO_MBEDTLS_H */
|
136
externals/libzip/libzip/lib/zip_crypto_openssl.c
vendored
Executable file
136
externals/libzip/libzip/lib/zip_crypto_openssl.c
vendored
Executable file
@@ -0,0 +1,136 @@
|
||||
/*
|
||||
zip_crypto_openssl.c -- OpenSSL wrapper.
|
||||
Copyright (C) 2018 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"
|
||||
|
||||
#include "zip_crypto.h"
|
||||
|
||||
#include <openssl/rand.h>
|
||||
|
||||
#if OPENSSL_VERSION_NUMBER < 0x1010000fL || defined(LIBRESSL_VERSION_NUMBER)
|
||||
#define USE_OPENSSL_1_0_API
|
||||
#endif
|
||||
|
||||
|
||||
_zip_crypto_aes_t *
|
||||
_zip_crypto_aes_new(const zip_uint8_t *key, zip_uint16_t key_size, zip_error_t *error) {
|
||||
_zip_crypto_aes_t *aes;
|
||||
|
||||
if ((aes = (_zip_crypto_aes_t *)malloc(sizeof(*aes))) == NULL) {
|
||||
zip_error_set(error, ZIP_ER_MEMORY, 0);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
AES_set_encrypt_key(key, key_size, aes);
|
||||
|
||||
return aes;
|
||||
}
|
||||
|
||||
void
|
||||
_zip_crypto_aes_free(_zip_crypto_aes_t *aes) {
|
||||
if (aes == NULL) {
|
||||
return;
|
||||
}
|
||||
|
||||
_zip_crypto_clear(aes, sizeof(*aes));
|
||||
free(aes);
|
||||
}
|
||||
|
||||
|
||||
_zip_crypto_hmac_t *
|
||||
_zip_crypto_hmac_new(const zip_uint8_t *secret, zip_uint64_t secret_length, zip_error_t *error) {
|
||||
_zip_crypto_hmac_t *hmac;
|
||||
|
||||
if (secret_length > INT_MAX) {
|
||||
zip_error_set(error, ZIP_ER_INVAL, 0);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
#ifdef USE_OPENSSL_1_0_API
|
||||
if ((hmac = (_zip_crypto_hmac_t *)malloc(sizeof(*hmac))) == NULL) {
|
||||
zip_error_set(error, ZIP_ER_MEMORY, 0);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
HMAC_CTX_init(hmac);
|
||||
#else
|
||||
if ((hmac = HMAC_CTX_new()) == NULL) {
|
||||
zip_error_set(error, ZIP_ER_MEMORY, 0);
|
||||
return NULL;
|
||||
}
|
||||
#endif
|
||||
|
||||
if (HMAC_Init_ex(hmac, secret, (int)secret_length, EVP_sha1(), NULL) != 1) {
|
||||
zip_error_set(error, ZIP_ER_INTERNAL, 0);
|
||||
#ifdef USE_OPENSSL_1_0_API
|
||||
free(hmac);
|
||||
#else
|
||||
HMAC_CTX_free(hmac);
|
||||
#endif
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return hmac;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
_zip_crypto_hmac_free(_zip_crypto_hmac_t *hmac) {
|
||||
if (hmac == NULL) {
|
||||
return;
|
||||
}
|
||||
|
||||
#ifdef USE_OPENSSL_1_0_API
|
||||
HMAC_CTX_cleanup(hmac);
|
||||
_zip_crypto_clear(hmac, sizeof(*hmac));
|
||||
free(hmac);
|
||||
#else
|
||||
HMAC_CTX_free(hmac);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
bool
|
||||
_zip_crypto_hmac_output(_zip_crypto_hmac_t *hmac, zip_uint8_t *data) {
|
||||
unsigned int length;
|
||||
|
||||
return HMAC_Final(hmac, data, &length) == 1;
|
||||
}
|
||||
|
||||
|
||||
ZIP_EXTERN bool
|
||||
zip_secure_random(zip_uint8_t *buffer, zip_uint16_t length) {
|
||||
return RAND_bytes(buffer, length) == 1;
|
||||
}
|
56
externals/libzip/libzip/lib/zip_crypto_openssl.h
vendored
Executable file
56
externals/libzip/libzip/lib/zip_crypto_openssl.h
vendored
Executable file
@@ -0,0 +1,56 @@
|
||||
/*
|
||||
zip_crypto_openssl.h -- definitions for OpenSSL wrapper.
|
||||
Copyright (C) 2018 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.
|
||||
*/
|
||||
|
||||
#ifndef HAD_ZIP_CRYPTO_OPENSSL_H
|
||||
#define HAD_ZIP_CRYPTO_OPENSSL_H
|
||||
|
||||
#define HAVE_SECURE_RANDOM
|
||||
|
||||
#include <openssl/aes.h>
|
||||
#include <openssl/hmac.h>
|
||||
|
||||
#define _zip_crypto_aes_t AES_KEY
|
||||
#define _zip_crypto_hmac_t HMAC_CTX
|
||||
|
||||
void _zip_crypto_aes_free(_zip_crypto_aes_t *aes);
|
||||
#define _zip_crypto_aes_encrypt_block(aes, in, out) (AES_encrypt((in), (out), (aes)), true)
|
||||
_zip_crypto_aes_t *_zip_crypto_aes_new(const zip_uint8_t *key, zip_uint16_t key_size, zip_error_t *error);
|
||||
|
||||
#define _zip_crypto_hmac(hmac, data, length) (HMAC_Update((hmac), (data), (length)) == 1)
|
||||
void _zip_crypto_hmac_free(_zip_crypto_hmac_t *hmac);
|
||||
_zip_crypto_hmac_t *_zip_crypto_hmac_new(const zip_uint8_t *secret, zip_uint64_t secret_length, zip_error_t *error);
|
||||
bool _zip_crypto_hmac_output(_zip_crypto_hmac_t *hmac, zip_uint8_t *data);
|
||||
|
||||
#define _zip_crypto_pbkdf2(key, key_length, salt, salt_length, iterations, output, output_length) (PKCS5_PBKDF2_HMAC_SHA1((const char *)(key), (key_length), (salt), (salt_length), (iterations), (output_length), (output)))
|
||||
|
||||
#endif /* HAD_ZIP_CRYPTO_OPENSSL_H */
|
492
externals/libzip/libzip/lib/zip_crypto_win.c
vendored
Executable file
492
externals/libzip/libzip/lib/zip_crypto_win.c
vendored
Executable file
@@ -0,0 +1,492 @@
|
||||
/*
|
||||
zip_crypto_win.c -- Windows Crypto API wrapper.
|
||||
Copyright (C) 2018 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"
|
||||
|
||||
#include "zip_crypto.h"
|
||||
|
||||
#define WIN32_LEAN_AND_MEAN
|
||||
#define NOCRYPT
|
||||
|
||||
#include <windows.h>
|
||||
#include <bcrypt.h>
|
||||
|
||||
#pragma comment(lib, "bcrypt.lib")
|
||||
|
||||
/*
|
||||
|
||||
This code is using the Cryptography API: Next Generation (CNG)
|
||||
https://docs.microsoft.com/en-us/windows/desktop/seccng/cng-portal
|
||||
|
||||
This API is supported on
|
||||
- Windows Vista or later (client OS)
|
||||
- Windows Server 2008 (server OS)
|
||||
- Windows Embedded Compact 2013 (don't know about Windows Embedded Compact 7)
|
||||
|
||||
The code was developed for Windows Embedded Compact 2013 (WEC2013),
|
||||
but should be working for all of the above mentioned OSes.
|
||||
|
||||
There are 2 restrictions for WEC2013, Windows Vista and Windows Server 2008:
|
||||
|
||||
1.) The function "BCryptDeriveKeyPBKDF2" is not available
|
||||
|
||||
I found some code which is implementing this function using the deprecated Crypto API here:
|
||||
https://www.idrix.fr/Root/content/view/37/54/
|
||||
|
||||
I took this code and converted it to the newer CNG API. The original code was more
|
||||
flexible, but this is not needed here so i refactored it a bit and just kept what is needed.
|
||||
|
||||
The define "HAS_BCRYPTDERIVEKEYPBKDF2" controls whether "BCryptDeriveKeyPBKDF2"
|
||||
of the CNG API is used or not. This define must not be set if you are compiling for WEC2013 or Windows Vista.
|
||||
|
||||
|
||||
2.) "BCryptCreateHash" can't manage the memory needed for the hash object internally
|
||||
|
||||
On Windows 7 or later it is possible to pass NULL for the hash object buffer.
|
||||
This is not supported on WEC2013, so we have to handle the memory allocation/deallocation ourselves.
|
||||
There is no #ifdef to control that, because this is working for all supported OSes.
|
||||
|
||||
*/
|
||||
|
||||
#if !defined(WINCE) && !defined(__MINGW32__)
|
||||
#define HAS_BCRYPTDERIVEKEYPBKDF2
|
||||
#endif
|
||||
|
||||
#ifdef HAS_BCRYPTDERIVEKEYPBKDF2
|
||||
|
||||
bool
|
||||
_zip_crypto_pbkdf2(const zip_uint8_t *key, zip_uint64_t key_length, const zip_uint8_t *salt, zip_uint16_t salt_length, zip_uint16_t iterations, zip_uint8_t *output, zip_uint16_t output_length) {
|
||||
BCRYPT_ALG_HANDLE hAlgorithm = NULL;
|
||||
|
||||
if (!BCRYPT_SUCCESS(BCryptOpenAlgorithmProvider(&hAlgorithm, BCRYPT_SHA1_ALGORITHM, NULL, BCRYPT_ALG_HANDLE_HMAC_FLAG))) {
|
||||
return false;
|
||||
}
|
||||
|
||||
bool result = BCRYPT_SUCCESS(BCryptDeriveKeyPBKDF2(hAlgorithm, (PUCHAR)key, (ULONG)key_length, (PUCHAR)salt, salt_length, iterations, output, output_length, 0));
|
||||
|
||||
BCryptCloseAlgorithmProvider(hAlgorithm, 0);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
#include <math.h>
|
||||
|
||||
#define DIGEST_SIZE 20
|
||||
#define BLOCK_SIZE 64
|
||||
|
||||
typedef struct {
|
||||
BCRYPT_ALG_HANDLE hAlgorithm;
|
||||
BCRYPT_HASH_HANDLE hInnerHash;
|
||||
BCRYPT_HASH_HANDLE hOuterHash;
|
||||
ULONG cbHashObject;
|
||||
PUCHAR pbInnerHash;
|
||||
PUCHAR pbOuterHash;
|
||||
} PRF_CTX;
|
||||
|
||||
static void
|
||||
hmacFree(PRF_CTX *pContext) {
|
||||
if (pContext->hOuterHash)
|
||||
BCryptDestroyHash(pContext->hOuterHash);
|
||||
if (pContext->hInnerHash)
|
||||
BCryptDestroyHash(pContext->hInnerHash);
|
||||
free(pContext->pbOuterHash);
|
||||
free(pContext->pbInnerHash);
|
||||
if (pContext->hAlgorithm)
|
||||
BCryptCloseAlgorithmProvider(pContext->hAlgorithm, 0);
|
||||
}
|
||||
|
||||
static BOOL
|
||||
hmacPrecomputeDigest(BCRYPT_HASH_HANDLE hHash, PUCHAR pbPassword, DWORD cbPassword, BYTE mask) {
|
||||
BYTE buffer[BLOCK_SIZE];
|
||||
DWORD i;
|
||||
|
||||
if (cbPassword > BLOCK_SIZE) {
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
memset(buffer, mask, sizeof(buffer));
|
||||
|
||||
for (i = 0; i < cbPassword; ++i) {
|
||||
buffer[i] = (char)(pbPassword[i] ^ mask);
|
||||
}
|
||||
|
||||
return BCRYPT_SUCCESS(BCryptHashData(hHash, buffer, sizeof(buffer), 0));
|
||||
}
|
||||
|
||||
static BOOL
|
||||
hmacInit(PRF_CTX *pContext, PUCHAR pbPassword, DWORD cbPassword) {
|
||||
BOOL bStatus = FALSE;
|
||||
ULONG cbResult;
|
||||
BYTE key[DIGEST_SIZE];
|
||||
|
||||
if (!BCRYPT_SUCCESS(BCryptOpenAlgorithmProvider(&pContext->hAlgorithm, BCRYPT_SHA1_ALGORITHM, NULL, 0)) || !BCRYPT_SUCCESS(BCryptGetProperty(pContext->hAlgorithm, BCRYPT_OBJECT_LENGTH, (PUCHAR)&pContext->cbHashObject, sizeof(pContext->cbHashObject), &cbResult, 0)) || ((pContext->pbInnerHash = malloc(pContext->cbHashObject)) == NULL) || ((pContext->pbOuterHash = malloc(pContext->cbHashObject)) == NULL) || !BCRYPT_SUCCESS(BCryptCreateHash(pContext->hAlgorithm, &pContext->hInnerHash, pContext->pbInnerHash, pContext->cbHashObject, NULL, 0, 0)) || !BCRYPT_SUCCESS(BCryptCreateHash(pContext->hAlgorithm, &pContext->hOuterHash, pContext->pbOuterHash, pContext->cbHashObject, NULL, 0, 0))) {
|
||||
goto hmacInit_end;
|
||||
}
|
||||
|
||||
if (cbPassword > BLOCK_SIZE) {
|
||||
BCRYPT_HASH_HANDLE hHash = NULL;
|
||||
PUCHAR pbHashObject = malloc(pContext->cbHashObject);
|
||||
if (pbHashObject == NULL) {
|
||||
goto hmacInit_end;
|
||||
}
|
||||
|
||||
bStatus = BCRYPT_SUCCESS(BCryptCreateHash(pContext->hAlgorithm, &hHash, pbHashObject, pContext->cbHashObject, NULL, 0, 0)) && BCRYPT_SUCCESS(BCryptHashData(hHash, pbPassword, cbPassword, 0)) && BCRYPT_SUCCESS(BCryptGetProperty(hHash, BCRYPT_HASH_LENGTH, (PUCHAR)&cbPassword, sizeof(cbPassword), &cbResult, 0)) && BCRYPT_SUCCESS(BCryptFinishHash(hHash, key, cbPassword, 0));
|
||||
|
||||
if (hHash)
|
||||
BCryptDestroyHash(hHash);
|
||||
free(pbHashObject);
|
||||
|
||||
if (!bStatus) {
|
||||
goto hmacInit_end;
|
||||
}
|
||||
|
||||
pbPassword = key;
|
||||
}
|
||||
|
||||
bStatus = hmacPrecomputeDigest(pContext->hInnerHash, pbPassword, cbPassword, 0x36) && hmacPrecomputeDigest(pContext->hOuterHash, pbPassword, cbPassword, 0x5C);
|
||||
|
||||
hmacInit_end:
|
||||
|
||||
if (bStatus == FALSE)
|
||||
hmacFree(pContext);
|
||||
|
||||
return bStatus;
|
||||
}
|
||||
|
||||
static BOOL
|
||||
hmacCalculateInternal(BCRYPT_HASH_HANDLE hHashTemplate, PUCHAR pbData, DWORD cbData, PUCHAR pbOutput, DWORD cbOutput, DWORD cbHashObject) {
|
||||
BOOL success = FALSE;
|
||||
BCRYPT_HASH_HANDLE hHash = NULL;
|
||||
PUCHAR pbHashObject = malloc(cbHashObject);
|
||||
|
||||
if (pbHashObject == NULL) {
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if (BCRYPT_SUCCESS(BCryptDuplicateHash(hHashTemplate, &hHash, pbHashObject, cbHashObject, 0))) {
|
||||
success = BCRYPT_SUCCESS(BCryptHashData(hHash, pbData, cbData, 0)) && BCRYPT_SUCCESS(BCryptFinishHash(hHash, pbOutput, cbOutput, 0));
|
||||
|
||||
BCryptDestroyHash(hHash);
|
||||
}
|
||||
|
||||
free(pbHashObject);
|
||||
|
||||
return success;
|
||||
}
|
||||
|
||||
static BOOL
|
||||
hmacCalculate(PRF_CTX *pContext, PUCHAR pbData, DWORD cbData, PUCHAR pbDigest) {
|
||||
DWORD cbResult;
|
||||
DWORD cbHashObject;
|
||||
|
||||
return BCRYPT_SUCCESS(BCryptGetProperty(pContext->hAlgorithm, BCRYPT_OBJECT_LENGTH, (PUCHAR)&cbHashObject, sizeof(cbHashObject), &cbResult, 0)) && hmacCalculateInternal(pContext->hInnerHash, pbData, cbData, pbDigest, DIGEST_SIZE, cbHashObject) && hmacCalculateInternal(pContext->hOuterHash, pbDigest, DIGEST_SIZE, pbDigest, DIGEST_SIZE, cbHashObject);
|
||||
}
|
||||
|
||||
static void
|
||||
xor(LPBYTE ptr1, LPBYTE ptr2, DWORD dwLen) {
|
||||
while (dwLen--)
|
||||
*ptr1++ ^= *ptr2++;
|
||||
}
|
||||
|
||||
BOOL
|
||||
pbkdf2(PUCHAR pbPassword, ULONG cbPassword, PUCHAR pbSalt, ULONG cbSalt, DWORD cIterations, PUCHAR pbDerivedKey, ULONG cbDerivedKey) {
|
||||
BOOL bStatus = FALSE;
|
||||
DWORD l, r, dwULen, i, j;
|
||||
BYTE Ti[DIGEST_SIZE];
|
||||
BYTE V[DIGEST_SIZE];
|
||||
LPBYTE U = malloc(max((cbSalt + 4), DIGEST_SIZE));
|
||||
PRF_CTX prfCtx = {0};
|
||||
|
||||
if (U == NULL) {
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if (pbPassword == NULL || cbPassword == 0 || pbSalt == NULL || cbSalt == 0 || cIterations == 0 || pbDerivedKey == NULL || cbDerivedKey == 0) {
|
||||
free(U);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if (!hmacInit(&prfCtx, pbPassword, cbPassword)) {
|
||||
goto PBKDF2_end;
|
||||
}
|
||||
|
||||
l = (DWORD)ceil((double)cbDerivedKey / (double)DIGEST_SIZE);
|
||||
r = cbDerivedKey - (l - 1) * DIGEST_SIZE;
|
||||
|
||||
for (i = 1; i <= l; i++) {
|
||||
ZeroMemory(Ti, DIGEST_SIZE);
|
||||
for (j = 0; j < cIterations; j++) {
|
||||
if (j == 0) {
|
||||
// construct first input for PRF
|
||||
memcpy(U, pbSalt, cbSalt);
|
||||
U[cbSalt] = (BYTE)((i & 0xFF000000) >> 24);
|
||||
U[cbSalt + 1] = (BYTE)((i & 0x00FF0000) >> 16);
|
||||
U[cbSalt + 2] = (BYTE)((i & 0x0000FF00) >> 8);
|
||||
U[cbSalt + 3] = (BYTE)((i & 0x000000FF));
|
||||
dwULen = cbSalt + 4;
|
||||
}
|
||||
else {
|
||||
memcpy(U, V, DIGEST_SIZE);
|
||||
dwULen = DIGEST_SIZE;
|
||||
}
|
||||
|
||||
if (!hmacCalculate(&prfCtx, U, dwULen, V)) {
|
||||
goto PBKDF2_end;
|
||||
}
|
||||
|
||||
xor(Ti, V, DIGEST_SIZE);
|
||||
}
|
||||
|
||||
if (i != l) {
|
||||
memcpy(&pbDerivedKey[(i - 1) * DIGEST_SIZE], Ti, DIGEST_SIZE);
|
||||
}
|
||||
else {
|
||||
// Take only the first r bytes
|
||||
memcpy(&pbDerivedKey[(i - 1) * DIGEST_SIZE], Ti, r);
|
||||
}
|
||||
}
|
||||
|
||||
bStatus = TRUE;
|
||||
|
||||
PBKDF2_end:
|
||||
|
||||
hmacFree(&prfCtx);
|
||||
free(U);
|
||||
return bStatus;
|
||||
}
|
||||
|
||||
bool
|
||||
_zip_crypto_pbkdf2(const zip_uint8_t *key, zip_uint64_t key_length, const zip_uint8_t *salt, zip_uint16_t salt_length, zip_uint16_t iterations, zip_uint8_t *output, zip_uint16_t output_length) {
|
||||
return (key_length <= ZIP_UINT32_MAX) && pbkdf2((PUCHAR)key, (ULONG)key_length, (PUCHAR)salt, salt_length, iterations, output, output_length);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
struct _zip_crypto_aes_s {
|
||||
BCRYPT_ALG_HANDLE hAlgorithm;
|
||||
BCRYPT_KEY_HANDLE hKey;
|
||||
ULONG cbKeyObject;
|
||||
PUCHAR pbKeyObject;
|
||||
};
|
||||
|
||||
_zip_crypto_aes_t *
|
||||
_zip_crypto_aes_new(const zip_uint8_t *key, zip_uint16_t key_size, zip_error_t *error) {
|
||||
_zip_crypto_aes_t *aes = (_zip_crypto_aes_t *)calloc(1, sizeof(*aes));
|
||||
|
||||
ULONG cbResult;
|
||||
ULONG key_length = key_size / 8;
|
||||
|
||||
if (aes == NULL) {
|
||||
zip_error_set(error, ZIP_ER_MEMORY, 0);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (!BCRYPT_SUCCESS(BCryptOpenAlgorithmProvider(&aes->hAlgorithm, BCRYPT_AES_ALGORITHM, NULL, 0))) {
|
||||
_zip_crypto_aes_free(aes);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (!BCRYPT_SUCCESS(BCryptSetProperty(aes->hAlgorithm, BCRYPT_CHAINING_MODE, (PUCHAR)BCRYPT_CHAIN_MODE_ECB, sizeof(BCRYPT_CHAIN_MODE_ECB), 0))) {
|
||||
_zip_crypto_aes_free(aes);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (!BCRYPT_SUCCESS(BCryptGetProperty(aes->hAlgorithm, BCRYPT_OBJECT_LENGTH, (PUCHAR)&aes->cbKeyObject, sizeof(aes->cbKeyObject), &cbResult, 0))) {
|
||||
_zip_crypto_aes_free(aes);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
aes->pbKeyObject = malloc(aes->cbKeyObject);
|
||||
if (aes->pbKeyObject == NULL) {
|
||||
_zip_crypto_aes_free(aes);
|
||||
zip_error_set(error, ZIP_ER_MEMORY, 0);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (!BCRYPT_SUCCESS(BCryptGenerateSymmetricKey(aes->hAlgorithm, &aes->hKey, aes->pbKeyObject, aes->cbKeyObject, (PUCHAR)key, key_length, 0))) {
|
||||
_zip_crypto_aes_free(aes);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return aes;
|
||||
}
|
||||
|
||||
void
|
||||
_zip_crypto_aes_free(_zip_crypto_aes_t *aes) {
|
||||
if (aes == NULL) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (aes->hKey != NULL) {
|
||||
BCryptDestroyKey(aes->hKey);
|
||||
}
|
||||
|
||||
if (aes->pbKeyObject != NULL) {
|
||||
free(aes->pbKeyObject);
|
||||
}
|
||||
|
||||
if (aes->hAlgorithm != NULL) {
|
||||
BCryptCloseAlgorithmProvider(aes->hAlgorithm, 0);
|
||||
}
|
||||
|
||||
free(aes);
|
||||
}
|
||||
|
||||
bool
|
||||
_zip_crypto_aes_encrypt_block(_zip_crypto_aes_t *aes, const zip_uint8_t *in, zip_uint8_t *out) {
|
||||
ULONG cbResult;
|
||||
NTSTATUS status = BCryptEncrypt(aes->hKey, (PUCHAR)in, ZIP_CRYPTO_AES_BLOCK_LENGTH, NULL, NULL, 0, (PUCHAR)out, ZIP_CRYPTO_AES_BLOCK_LENGTH, &cbResult, 0);
|
||||
return BCRYPT_SUCCESS(status);
|
||||
}
|
||||
|
||||
struct _zip_crypto_hmac_s {
|
||||
BCRYPT_ALG_HANDLE hAlgorithm;
|
||||
BCRYPT_HASH_HANDLE hHash;
|
||||
DWORD cbHashObject;
|
||||
PUCHAR pbHashObject;
|
||||
DWORD cbHash;
|
||||
PUCHAR pbHash;
|
||||
};
|
||||
|
||||
// https://code.msdn.microsoft.com/windowsdesktop/Hmac-Computation-Sample-11fe8ec1/sourcecode?fileId=42820&pathId=283874677
|
||||
|
||||
_zip_crypto_hmac_t *
|
||||
_zip_crypto_hmac_new(const zip_uint8_t *secret, zip_uint64_t secret_length, zip_error_t *error) {
|
||||
NTSTATUS status;
|
||||
ULONG cbResult;
|
||||
_zip_crypto_hmac_t *hmac;
|
||||
|
||||
if (secret_length > INT_MAX) {
|
||||
zip_error_set(error, ZIP_ER_INVAL, 0);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
hmac = (_zip_crypto_hmac_t *)calloc(1, sizeof(*hmac));
|
||||
|
||||
if (hmac == NULL) {
|
||||
zip_error_set(error, ZIP_ER_MEMORY, 0);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
status = BCryptOpenAlgorithmProvider(&hmac->hAlgorithm, BCRYPT_SHA1_ALGORITHM, NULL, BCRYPT_ALG_HANDLE_HMAC_FLAG);
|
||||
if (!BCRYPT_SUCCESS(status)) {
|
||||
_zip_crypto_hmac_free(hmac);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
status = BCryptGetProperty(hmac->hAlgorithm, BCRYPT_OBJECT_LENGTH, (PUCHAR)&hmac->cbHashObject, sizeof(hmac->cbHashObject), &cbResult, 0);
|
||||
if (!BCRYPT_SUCCESS(status)) {
|
||||
_zip_crypto_hmac_free(hmac);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
hmac->pbHashObject = malloc(hmac->cbHashObject);
|
||||
if (hmac->pbHashObject == NULL) {
|
||||
_zip_crypto_hmac_free(hmac);
|
||||
zip_error_set(error, ZIP_ER_MEMORY, 0);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
status = BCryptGetProperty(hmac->hAlgorithm, BCRYPT_HASH_LENGTH, (PUCHAR)&hmac->cbHash, sizeof(hmac->cbHash), &cbResult, 0);
|
||||
if (!BCRYPT_SUCCESS(status)) {
|
||||
_zip_crypto_hmac_free(hmac);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
hmac->pbHash = malloc(hmac->cbHash);
|
||||
if (hmac->pbHash == NULL) {
|
||||
_zip_crypto_hmac_free(hmac);
|
||||
zip_error_set(error, ZIP_ER_MEMORY, 0);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
status = BCryptCreateHash(hmac->hAlgorithm, &hmac->hHash, hmac->pbHashObject, hmac->cbHashObject, (PUCHAR)secret, (ULONG)secret_length, 0);
|
||||
if (!BCRYPT_SUCCESS(status)) {
|
||||
_zip_crypto_hmac_free(hmac);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return hmac;
|
||||
}
|
||||
|
||||
void
|
||||
_zip_crypto_hmac_free(_zip_crypto_hmac_t *hmac) {
|
||||
if (hmac == NULL) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (hmac->hHash != NULL) {
|
||||
BCryptDestroyHash(hmac->hHash);
|
||||
}
|
||||
|
||||
if (hmac->pbHash != NULL) {
|
||||
free(hmac->pbHash);
|
||||
}
|
||||
|
||||
if (hmac->pbHashObject != NULL) {
|
||||
free(hmac->pbHashObject);
|
||||
}
|
||||
|
||||
if (hmac->hAlgorithm) {
|
||||
BCryptCloseAlgorithmProvider(hmac->hAlgorithm, 0);
|
||||
}
|
||||
|
||||
free(hmac);
|
||||
}
|
||||
|
||||
bool
|
||||
_zip_crypto_hmac(_zip_crypto_hmac_t *hmac, zip_uint8_t *data, zip_uint64_t length) {
|
||||
if (hmac == NULL || length > ULONG_MAX) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return BCRYPT_SUCCESS(BCryptHashData(hmac->hHash, data, (ULONG)length, 0));
|
||||
}
|
||||
|
||||
bool
|
||||
_zip_crypto_hmac_output(_zip_crypto_hmac_t *hmac, zip_uint8_t *data) {
|
||||
if (hmac == NULL) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return BCRYPT_SUCCESS(BCryptFinishHash(hmac->hHash, data, hmac->cbHash, 0));
|
||||
}
|
||||
|
||||
ZIP_EXTERN bool
|
||||
zip_secure_random(zip_uint8_t *buffer, zip_uint16_t length) {
|
||||
return BCRYPT_SUCCESS(BCryptGenRandom(NULL, buffer, length, BCRYPT_USE_SYSTEM_PREFERRED_RNG));
|
||||
}
|
53
externals/libzip/libzip/lib/zip_crypto_win.h
vendored
Executable file
53
externals/libzip/libzip/lib/zip_crypto_win.h
vendored
Executable file
@@ -0,0 +1,53 @@
|
||||
/*
|
||||
zip_crypto_win.h -- Windows Crypto API wrapper.
|
||||
Copyright (C) 2018 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.
|
||||
*/
|
||||
|
||||
#ifndef HAD_ZIP_CRYPTO_WIN_H
|
||||
#define HAD_ZIP_CRYPTO_WIN_H
|
||||
|
||||
#define HAVE_SECURE_RANDOM
|
||||
|
||||
typedef struct _zip_crypto_aes_s _zip_crypto_aes_t;
|
||||
typedef struct _zip_crypto_hmac_s _zip_crypto_hmac_t;
|
||||
|
||||
void _zip_crypto_aes_free(_zip_crypto_aes_t *aes);
|
||||
_zip_crypto_aes_t *_zip_crypto_aes_new(const zip_uint8_t *key, zip_uint16_t key_size, zip_error_t *error);
|
||||
bool _zip_crypto_aes_encrypt_block(_zip_crypto_aes_t *aes, const zip_uint8_t *in, zip_uint8_t *out);
|
||||
|
||||
bool _zip_crypto_pbkdf2(const zip_uint8_t *key, zip_uint64_t key_length, const zip_uint8_t *salt, zip_uint16_t salt_length, zip_uint16_t iterations, zip_uint8_t *output, zip_uint16_t output_length);
|
||||
|
||||
_zip_crypto_hmac_t *_zip_crypto_hmac_new(const zip_uint8_t *secret, zip_uint64_t secret_length, zip_error_t *error);
|
||||
void _zip_crypto_hmac_free(_zip_crypto_hmac_t *hmac);
|
||||
bool _zip_crypto_hmac(_zip_crypto_hmac_t *hmac, zip_uint8_t *data, zip_uint64_t length);
|
||||
bool _zip_crypto_hmac_output(_zip_crypto_hmac_t *hmac, zip_uint8_t *data);
|
||||
|
||||
#endif /* HAD_ZIP_CRYPTO_WIN_H */
|
68
externals/libzip/libzip/lib/zip_delete.c
vendored
Executable file
68
externals/libzip/libzip/lib/zip_delete.c
vendored
Executable file
@@ -0,0 +1,68 @@
|
||||
/*
|
||||
zip_delete.c -- delete file from zip archive
|
||||
Copyright (C) 1999-2018 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_delete(zip_t *za, zip_uint64_t idx) {
|
||||
const char *name;
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
if ((name = _zip_get_name(za, idx, 0, &za->error)) == NULL) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (!_zip_hash_delete(za->names, (const zip_uint8_t *)name, &za->error)) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* allow duplicate file names, because the file will
|
||||
* be removed directly afterwards */
|
||||
if (_zip_unchange(za, idx, 1) != 0)
|
||||
return -1;
|
||||
|
||||
za->entry[idx].deleted = 1;
|
||||
|
||||
return 0;
|
||||
}
|
92
externals/libzip/libzip/lib/zip_dir_add.c
vendored
Executable file
92
externals/libzip/libzip/lib/zip_dir_add.c
vendored
Executable file
@@ -0,0 +1,92 @@
|
||||
/*
|
||||
zip_dir_add.c -- add directory
|
||||
Copyright (C) 1999-2018 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"
|
||||
|
||||
|
||||
/* NOTE: Signed due to -1 on error. See zip_add.c for more details. */
|
||||
|
||||
ZIP_EXTERN zip_int64_t
|
||||
zip_dir_add(zip_t *za, const char *name, zip_flags_t flags) {
|
||||
size_t len;
|
||||
zip_int64_t idx;
|
||||
char *s;
|
||||
zip_source_t *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;
|
||||
}
|
||||
|
||||
s = NULL;
|
||||
len = strlen(name);
|
||||
|
||||
if (name[len - 1] != '/') {
|
||||
if ((s = (char *)malloc(len + 2)) == NULL) {
|
||||
zip_error_set(&za->error, ZIP_ER_MEMORY, 0);
|
||||
return -1;
|
||||
}
|
||||
strcpy(s, name);
|
||||
s[len] = '/';
|
||||
s[len + 1] = '\0';
|
||||
}
|
||||
|
||||
if ((source = zip_source_buffer(za, NULL, 0, 0)) == NULL) {
|
||||
free(s);
|
||||
return -1;
|
||||
}
|
||||
|
||||
idx = _zip_file_replace(za, ZIP_UINT64_MAX, s ? s : name, source, flags);
|
||||
|
||||
free(s);
|
||||
|
||||
if (idx < 0)
|
||||
zip_source_free(source);
|
||||
else {
|
||||
if (zip_file_set_external_attributes(za, (zip_uint64_t)idx, 0, ZIP_OPSYS_DEFAULT, ZIP_EXT_ATTRIB_DEFAULT_DIR) < 0) {
|
||||
zip_delete(za, (zip_uint64_t)idx);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
return idx;
|
||||
}
|
1127
externals/libzip/libzip/lib/zip_dirent.c
vendored
Executable file
1127
externals/libzip/libzip/lib/zip_dirent.c
vendored
Executable file
File diff suppressed because it is too large
Load Diff
80
externals/libzip/libzip/lib/zip_discard.c
vendored
Executable file
80
externals/libzip/libzip/lib/zip_discard.c
vendored
Executable file
@@ -0,0 +1,80 @@
|
||||
/*
|
||||
zip_discard.c -- discard and free struct zip
|
||||
Copyright (C) 1999-2018 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_discard:
|
||||
frees the space allocated to a zipfile struct, and closes the
|
||||
corresponding file. */
|
||||
|
||||
void
|
||||
zip_discard(zip_t *za) {
|
||||
zip_uint64_t i;
|
||||
|
||||
if (za == NULL)
|
||||
return;
|
||||
|
||||
if (za->src) {
|
||||
zip_source_close(za->src);
|
||||
zip_source_free(za->src);
|
||||
}
|
||||
|
||||
free(za->default_password);
|
||||
_zip_string_free(za->comment_orig);
|
||||
_zip_string_free(za->comment_changes);
|
||||
|
||||
_zip_hash_free(za->names);
|
||||
|
||||
if (za->entry) {
|
||||
for (i = 0; i < za->nentry; i++)
|
||||
_zip_entry_finalize(za->entry + i);
|
||||
free(za->entry);
|
||||
}
|
||||
|
||||
for (i = 0; i < za->nopen_source; i++) {
|
||||
_zip_source_invalidate(za->open_source[i]);
|
||||
}
|
||||
free(za->open_source);
|
||||
|
||||
_zip_progress_free(za->progress);
|
||||
|
||||
zip_error_fini(&za->error);
|
||||
|
||||
free(za);
|
||||
|
||||
return;
|
||||
}
|
51
externals/libzip/libzip/lib/zip_entry.c
vendored
Executable file
51
externals/libzip/libzip/lib/zip_entry.c
vendored
Executable file
@@ -0,0 +1,51 @@
|
||||
/*
|
||||
zip_entry.c -- struct zip_entry helper functions
|
||||
Copyright (C) 1999-2018 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"
|
||||
|
||||
void
|
||||
_zip_entry_finalize(zip_entry_t *e) {
|
||||
_zip_unchange_data(e);
|
||||
_zip_dirent_free(e->orig);
|
||||
_zip_dirent_free(e->changes);
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
_zip_entry_init(zip_entry_t *e) {
|
||||
e->orig = NULL;
|
||||
e->changes = NULL;
|
||||
e->source = NULL;
|
||||
e->deleted = 0;
|
||||
}
|
20
externals/libzip/libzip/lib/zip_err_str.c
vendored
Executable file
20
externals/libzip/libzip/lib/zip_err_str.c
vendored
Executable file
@@ -0,0 +1,20 @@
|
||||
/*
|
||||
This file was generated automatically by ./make_zip_err_str.sh
|
||||
from ./zip.h; make changes there.
|
||||
*/
|
||||
|
||||
#include "zipint.h"
|
||||
|
||||
const char *const _zip_err_str[] = {
|
||||
"No error", "Multi-disk zip archives not supported", "Renaming temporary file failed", "Closing zip archive failed", "Seek error", "Read error", "Write error", "CRC error", "Containing zip archive was closed", "No such file", "File already exists", "Can't open file", "Failure to create temporary file", "Zlib error", "Malloc failure", "Entry has been changed", "Compression method not supported", "Premature end of file", "Invalid argument", "Not a zip archive", "Internal error", "Zip archive inconsistent", "Can't remove file", "Entry has been deleted", "Encryption method not supported", "Read-only archive", "No password provided", "Wrong password provided", "Operation not supported", "Resource still in use", "Tell error", "Compressed data invalid",
|
||||
};
|
||||
|
||||
const int _zip_nerr_str = sizeof(_zip_err_str) / sizeof(_zip_err_str[0]);
|
||||
|
||||
#define N ZIP_ET_NONE
|
||||
#define S ZIP_ET_SYS
|
||||
#define Z ZIP_ET_ZLIB
|
||||
|
||||
const int _zip_err_type[] = {
|
||||
N, N, S, S, S, S, S, N, N, N, N, S, S, Z, N, N, N, N, N, N, N, N, S, N, N, N, N, N, N, N, S, N,
|
||||
};
|
150
externals/libzip/libzip/lib/zip_error.c
vendored
Executable file
150
externals/libzip/libzip/lib/zip_error.c
vendored
Executable file
@@ -0,0 +1,150 @@
|
||||
/*
|
||||
zip_error.c -- zip_error_t helper functions
|
||||
Copyright (C) 1999-2018 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 int
|
||||
zip_error_code_system(const zip_error_t *error) {
|
||||
return error->sys_err;
|
||||
}
|
||||
|
||||
|
||||
ZIP_EXTERN int
|
||||
zip_error_code_zip(const zip_error_t *error) {
|
||||
return error->zip_err;
|
||||
}
|
||||
|
||||
|
||||
ZIP_EXTERN void
|
||||
zip_error_fini(zip_error_t *err) {
|
||||
free(err->str);
|
||||
err->str = NULL;
|
||||
}
|
||||
|
||||
|
||||
ZIP_EXTERN void
|
||||
zip_error_init(zip_error_t *err) {
|
||||
err->zip_err = ZIP_ER_OK;
|
||||
err->sys_err = 0;
|
||||
err->str = NULL;
|
||||
}
|
||||
|
||||
ZIP_EXTERN void
|
||||
zip_error_init_with_code(zip_error_t *error, int ze) {
|
||||
zip_error_init(error);
|
||||
error->zip_err = ze;
|
||||
switch (zip_error_system_type(error)) {
|
||||
case ZIP_ET_SYS:
|
||||
error->sys_err = errno;
|
||||
break;
|
||||
|
||||
default:
|
||||
error->sys_err = 0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
ZIP_EXTERN int
|
||||
zip_error_system_type(const zip_error_t *error) {
|
||||
if (error->zip_err < 0 || error->zip_err >= _zip_nerr_str)
|
||||
return ZIP_ET_NONE;
|
||||
|
||||
return _zip_err_type[error->zip_err];
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
_zip_error_clear(zip_error_t *err) {
|
||||
if (err == NULL)
|
||||
return;
|
||||
|
||||
err->zip_err = ZIP_ER_OK;
|
||||
err->sys_err = 0;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
_zip_error_copy(zip_error_t *dst, const zip_error_t *src) {
|
||||
if (dst == NULL) {
|
||||
return;
|
||||
}
|
||||
|
||||
dst->zip_err = src->zip_err;
|
||||
dst->sys_err = src->sys_err;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
_zip_error_get(const zip_error_t *err, int *zep, int *sep) {
|
||||
if (zep)
|
||||
*zep = err->zip_err;
|
||||
if (sep) {
|
||||
if (zip_error_system_type(err) != ZIP_ET_NONE)
|
||||
*sep = err->sys_err;
|
||||
else
|
||||
*sep = 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
zip_error_set(zip_error_t *err, int ze, int se) {
|
||||
if (err) {
|
||||
err->zip_err = ze;
|
||||
err->sys_err = se;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
_zip_error_set_from_source(zip_error_t *err, zip_source_t *src) {
|
||||
_zip_error_copy(err, zip_source_error(src));
|
||||
}
|
||||
|
||||
|
||||
zip_int64_t
|
||||
zip_error_to_data(const zip_error_t *error, void *data, zip_uint64_t length) {
|
||||
int *e = (int *)data;
|
||||
|
||||
if (length < sizeof(int) * 2) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
e[0] = zip_error_code_zip(error);
|
||||
e[1] = zip_error_code_system(error);
|
||||
return sizeof(int) * 2;
|
||||
}
|
44
externals/libzip/libzip/lib/zip_error_clear.c
vendored
Executable file
44
externals/libzip/libzip/lib/zip_error_clear.c
vendored
Executable file
@@ -0,0 +1,44 @@
|
||||
/*
|
||||
zip_error_clear.c -- clear zip error
|
||||
Copyright (C) 1999-2018 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_error_clear(zip_t *za) {
|
||||
if (za == NULL)
|
||||
return;
|
||||
|
||||
_zip_error_clear(&za->error);
|
||||
}
|
54
externals/libzip/libzip/lib/zip_error_get.c
vendored
Executable file
54
externals/libzip/libzip/lib/zip_error_get.c
vendored
Executable file
@@ -0,0 +1,54 @@
|
||||
/*
|
||||
zip_error_get.c -- get zip error
|
||||
Copyright (C) 1999-2018 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.
|
||||
*/
|
||||
|
||||
|
||||
#define _ZIP_COMPILING_DEPRECATED
|
||||
#include "zipint.h"
|
||||
|
||||
|
||||
ZIP_EXTERN void
|
||||
zip_error_get(zip_t *za, int *zep, int *sep) {
|
||||
_zip_error_get(&za->error, zep, sep);
|
||||
}
|
||||
|
||||
|
||||
ZIP_EXTERN zip_error_t *
|
||||
zip_get_error(zip_t *za) {
|
||||
return &za->error;
|
||||
}
|
||||
|
||||
|
||||
ZIP_EXTERN zip_error_t *
|
||||
zip_file_get_error(zip_file_t *f) {
|
||||
return &f->error;
|
||||
}
|
44
externals/libzip/libzip/lib/zip_error_get_sys_type.c
vendored
Executable file
44
externals/libzip/libzip/lib/zip_error_get_sys_type.c
vendored
Executable file
@@ -0,0 +1,44 @@
|
||||
/*
|
||||
zip_error_get_sys_type.c -- return type of system error code
|
||||
Copyright (C) 1999-2018 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.
|
||||
*/
|
||||
|
||||
#define _ZIP_COMPILING_DEPRECATED
|
||||
#include "zipint.h"
|
||||
|
||||
|
||||
ZIP_EXTERN int
|
||||
zip_error_get_sys_type(int ze) {
|
||||
if (ze < 0 || ze >= _zip_nerr_str)
|
||||
return 0;
|
||||
|
||||
return _zip_err_type[ze];
|
||||
}
|
82
externals/libzip/libzip/lib/zip_error_strerror.c
vendored
Executable file
82
externals/libzip/libzip/lib/zip_error_strerror.c
vendored
Executable file
@@ -0,0 +1,82 @@
|
||||
/*
|
||||
zip_error_sterror.c -- get string representation of struct zip_error
|
||||
Copyright (C) 1999-2018 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 <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "zipint.h"
|
||||
|
||||
|
||||
ZIP_EXTERN const char *
|
||||
zip_error_strerror(zip_error_t *err) {
|
||||
const char *zs, *ss;
|
||||
char buf[128], *s;
|
||||
|
||||
zip_error_fini(err);
|
||||
|
||||
if (err->zip_err < 0 || err->zip_err >= _zip_nerr_str) {
|
||||
sprintf(buf, "Unknown error %d", err->zip_err);
|
||||
zs = NULL;
|
||||
ss = buf;
|
||||
}
|
||||
else {
|
||||
zs = _zip_err_str[err->zip_err];
|
||||
|
||||
switch (_zip_err_type[err->zip_err]) {
|
||||
case ZIP_ET_SYS:
|
||||
ss = strerror(err->sys_err);
|
||||
break;
|
||||
|
||||
case ZIP_ET_ZLIB:
|
||||
ss = zError(err->sys_err);
|
||||
break;
|
||||
|
||||
default:
|
||||
ss = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
if (ss == NULL)
|
||||
return zs;
|
||||
else {
|
||||
if ((s = (char *)malloc(strlen(ss) + (zs ? strlen(zs) + 2 : 0) + 1)) == NULL)
|
||||
return _zip_err_str[ZIP_ER_MEMORY];
|
||||
|
||||
sprintf(s, "%s%s%s", (zs ? zs : ""), (zs ? ": " : ""), ss);
|
||||
err->str = s;
|
||||
|
||||
return s;
|
||||
}
|
||||
}
|
66
externals/libzip/libzip/lib/zip_error_to_str.c
vendored
Executable file
66
externals/libzip/libzip/lib/zip_error_to_str.c
vendored
Executable file
@@ -0,0 +1,66 @@
|
||||
/*
|
||||
zip_error_to_str.c -- get string representation of zip error code
|
||||
Copyright (C) 1999-2018 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 <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#define _ZIP_COMPILING_DEPRECATED
|
||||
#include "zipint.h"
|
||||
|
||||
|
||||
ZIP_EXTERN int
|
||||
zip_error_to_str(char *buf, zip_uint64_t len, int ze, int se) {
|
||||
const char *zs, *ss;
|
||||
|
||||
if (ze < 0 || ze >= _zip_nerr_str)
|
||||
return snprintf(buf, len, "Unknown error %d", ze);
|
||||
|
||||
zs = _zip_err_str[ze];
|
||||
|
||||
switch (_zip_err_type[ze]) {
|
||||
case ZIP_ET_SYS:
|
||||
ss = strerror(se);
|
||||
break;
|
||||
|
||||
case ZIP_ET_ZLIB:
|
||||
ss = zError(se);
|
||||
break;
|
||||
|
||||
default:
|
||||
ss = NULL;
|
||||
}
|
||||
|
||||
return snprintf(buf, len, "%s%s%s", zs, (ss ? ": " : ""), (ss ? ss : ""));
|
||||
}
|
426
externals/libzip/libzip/lib/zip_extra_field.c
vendored
Executable file
426
externals/libzip/libzip/lib/zip_extra_field.c
vendored
Executable file
@@ -0,0 +1,426 @@
|
||||
/*
|
||||
zip_extra_field.c -- manipulate extra fields
|
||||
Copyright (C) 2012-2018 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_extra_field_t *
|
||||
_zip_ef_clone(const zip_extra_field_t *ef, zip_error_t *error) {
|
||||
zip_extra_field_t *head, *prev, *def;
|
||||
|
||||
head = prev = NULL;
|
||||
|
||||
while (ef) {
|
||||
if ((def = _zip_ef_new(ef->id, ef->size, ef->data, ef->flags)) == NULL) {
|
||||
zip_error_set(error, ZIP_ER_MEMORY, 0);
|
||||
_zip_ef_free(head);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (head == NULL)
|
||||
head = def;
|
||||
if (prev)
|
||||
prev->next = def;
|
||||
prev = def;
|
||||
|
||||
ef = ef->next;
|
||||
}
|
||||
|
||||
return head;
|
||||
}
|
||||
|
||||
|
||||
zip_extra_field_t *
|
||||
_zip_ef_delete_by_id(zip_extra_field_t *ef, zip_uint16_t id, zip_uint16_t id_idx, zip_flags_t flags) {
|
||||
zip_extra_field_t *head, *prev;
|
||||
int i;
|
||||
|
||||
i = 0;
|
||||
head = ef;
|
||||
prev = NULL;
|
||||
for (; ef; ef = (prev ? prev->next : head)) {
|
||||
if ((ef->flags & flags & ZIP_EF_BOTH) && ((ef->id == id) || (id == ZIP_EXTRA_FIELD_ALL))) {
|
||||
if (id_idx == ZIP_EXTRA_FIELD_ALL || i == id_idx) {
|
||||
ef->flags &= ~(flags & ZIP_EF_BOTH);
|
||||
if ((ef->flags & ZIP_EF_BOTH) == 0) {
|
||||
if (prev)
|
||||
prev->next = ef->next;
|
||||
else
|
||||
head = ef->next;
|
||||
ef->next = NULL;
|
||||
_zip_ef_free(ef);
|
||||
|
||||
if (id_idx == ZIP_EXTRA_FIELD_ALL)
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
i++;
|
||||
if (i > id_idx)
|
||||
break;
|
||||
}
|
||||
prev = ef;
|
||||
}
|
||||
|
||||
return head;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
_zip_ef_free(zip_extra_field_t *ef) {
|
||||
zip_extra_field_t *ef2;
|
||||
|
||||
while (ef) {
|
||||
ef2 = ef->next;
|
||||
free(ef->data);
|
||||
free(ef);
|
||||
ef = ef2;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
const zip_uint8_t *
|
||||
_zip_ef_get_by_id(const zip_extra_field_t *ef, zip_uint16_t *lenp, zip_uint16_t id, zip_uint16_t id_idx, zip_flags_t flags, zip_error_t *error) {
|
||||
static const zip_uint8_t empty[1] = {'\0'};
|
||||
|
||||
int i;
|
||||
|
||||
i = 0;
|
||||
for (; ef; ef = ef->next) {
|
||||
if (ef->id == id && (ef->flags & flags & ZIP_EF_BOTH)) {
|
||||
if (i < id_idx) {
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (lenp)
|
||||
*lenp = ef->size;
|
||||
if (ef->size > 0)
|
||||
return ef->data;
|
||||
else
|
||||
return empty;
|
||||
}
|
||||
}
|
||||
|
||||
zip_error_set(error, ZIP_ER_NOENT, 0);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
zip_extra_field_t *
|
||||
_zip_ef_merge(zip_extra_field_t *to, zip_extra_field_t *from) {
|
||||
zip_extra_field_t *ef2, *tt, *tail;
|
||||
int duplicate;
|
||||
|
||||
if (to == NULL)
|
||||
return from;
|
||||
|
||||
for (tail = to; tail->next; tail = tail->next)
|
||||
;
|
||||
|
||||
for (; from; from = ef2) {
|
||||
ef2 = from->next;
|
||||
|
||||
duplicate = 0;
|
||||
for (tt = to; tt; tt = tt->next) {
|
||||
if (tt->id == from->id && tt->size == from->size && (tt->size == 0 || memcmp(tt->data, from->data, tt->size) == 0)) {
|
||||
tt->flags |= (from->flags & ZIP_EF_BOTH);
|
||||
duplicate = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
from->next = NULL;
|
||||
if (duplicate)
|
||||
_zip_ef_free(from);
|
||||
else
|
||||
tail = tail->next = from;
|
||||
}
|
||||
|
||||
return to;
|
||||
}
|
||||
|
||||
|
||||
zip_extra_field_t *
|
||||
_zip_ef_new(zip_uint16_t id, zip_uint16_t size, const zip_uint8_t *data, zip_flags_t flags) {
|
||||
zip_extra_field_t *ef;
|
||||
|
||||
if ((ef = (zip_extra_field_t *)malloc(sizeof(*ef))) == NULL)
|
||||
return NULL;
|
||||
|
||||
ef->next = NULL;
|
||||
ef->flags = flags;
|
||||
ef->id = id;
|
||||
ef->size = size;
|
||||
if (size > 0) {
|
||||
if ((ef->data = (zip_uint8_t *)_zip_memdup(data, size, NULL)) == NULL) {
|
||||
free(ef);
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
else
|
||||
ef->data = NULL;
|
||||
|
||||
return ef;
|
||||
}
|
||||
|
||||
|
||||
bool
|
||||
_zip_ef_parse(const zip_uint8_t *data, zip_uint16_t len, zip_flags_t flags, zip_extra_field_t **ef_head_p, zip_error_t *error) {
|
||||
zip_buffer_t *buffer;
|
||||
zip_extra_field_t *ef, *ef2, *ef_head;
|
||||
|
||||
if ((buffer = _zip_buffer_new((zip_uint8_t *)data, len)) == NULL) {
|
||||
zip_error_set(error, ZIP_ER_MEMORY, 0);
|
||||
return false;
|
||||
}
|
||||
|
||||
ef_head = ef = NULL;
|
||||
|
||||
while (_zip_buffer_ok(buffer) && _zip_buffer_left(buffer) >= 4) {
|
||||
zip_uint16_t fid, flen;
|
||||
zip_uint8_t *ef_data;
|
||||
|
||||
fid = _zip_buffer_get_16(buffer);
|
||||
flen = _zip_buffer_get_16(buffer);
|
||||
ef_data = _zip_buffer_get(buffer, flen);
|
||||
|
||||
if (ef_data == NULL) {
|
||||
zip_error_set(error, ZIP_ER_INCONS, 0);
|
||||
_zip_buffer_free(buffer);
|
||||
_zip_ef_free(ef_head);
|
||||
return false;
|
||||
}
|
||||
|
||||
if ((ef2 = _zip_ef_new(fid, flen, ef_data, flags)) == NULL) {
|
||||
zip_error_set(error, ZIP_ER_MEMORY, 0);
|
||||
_zip_buffer_free(buffer);
|
||||
_zip_ef_free(ef_head);
|
||||
return false;
|
||||
}
|
||||
|
||||
if (ef_head) {
|
||||
ef->next = ef2;
|
||||
ef = ef2;
|
||||
}
|
||||
else
|
||||
ef_head = ef = ef2;
|
||||
}
|
||||
|
||||
if (!_zip_buffer_eof(buffer)) {
|
||||
/* Android APK files align stored file data with padding in extra fields; ignore. */
|
||||
/* see https://android.googlesource.com/platform/build/+/master/tools/zipalign/ZipAlign.cpp */
|
||||
size_t glen = _zip_buffer_left(buffer);
|
||||
zip_uint8_t *garbage;
|
||||
garbage = _zip_buffer_get(buffer, glen);
|
||||
if (glen >= 4 || garbage == NULL || memcmp(garbage, "\0\0\0", glen) != 0) {
|
||||
zip_error_set(error, ZIP_ER_INCONS, 0);
|
||||
_zip_buffer_free(buffer);
|
||||
_zip_ef_free(ef_head);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
_zip_buffer_free(buffer);
|
||||
|
||||
if (ef_head_p) {
|
||||
*ef_head_p = ef_head;
|
||||
}
|
||||
else {
|
||||
_zip_ef_free(ef_head);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
zip_extra_field_t *
|
||||
_zip_ef_remove_internal(zip_extra_field_t *ef) {
|
||||
zip_extra_field_t *ef_head;
|
||||
zip_extra_field_t *prev, *next;
|
||||
|
||||
ef_head = ef;
|
||||
prev = NULL;
|
||||
|
||||
while (ef) {
|
||||
if (ZIP_EF_IS_INTERNAL(ef->id)) {
|
||||
next = ef->next;
|
||||
if (ef_head == ef)
|
||||
ef_head = next;
|
||||
ef->next = NULL;
|
||||
_zip_ef_free(ef);
|
||||
if (prev)
|
||||
prev->next = next;
|
||||
ef = next;
|
||||
}
|
||||
else {
|
||||
prev = ef;
|
||||
ef = ef->next;
|
||||
}
|
||||
}
|
||||
|
||||
return ef_head;
|
||||
}
|
||||
|
||||
|
||||
zip_uint16_t
|
||||
_zip_ef_size(const zip_extra_field_t *ef, zip_flags_t flags) {
|
||||
zip_uint16_t size;
|
||||
|
||||
size = 0;
|
||||
for (; ef; ef = ef->next) {
|
||||
if (ef->flags & flags & ZIP_EF_BOTH)
|
||||
size = (zip_uint16_t)(size + 4 + ef->size);
|
||||
}
|
||||
|
||||
return size;
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
_zip_ef_write(zip_t *za, const zip_extra_field_t *ef, zip_flags_t flags) {
|
||||
zip_uint8_t b[4];
|
||||
zip_buffer_t *buffer = _zip_buffer_new(b, sizeof(b));
|
||||
|
||||
if (buffer == NULL) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
for (; ef; ef = ef->next) {
|
||||
if (ef->flags & flags & ZIP_EF_BOTH) {
|
||||
_zip_buffer_set_offset(buffer, 0);
|
||||
_zip_buffer_put_16(buffer, ef->id);
|
||||
_zip_buffer_put_16(buffer, ef->size);
|
||||
if (!_zip_buffer_ok(buffer)) {
|
||||
zip_error_set(&za->error, ZIP_ER_INTERNAL, 0);
|
||||
_zip_buffer_free(buffer);
|
||||
return -1;
|
||||
}
|
||||
if (_zip_write(za, b, 4) < 0) {
|
||||
_zip_buffer_free(buffer);
|
||||
return -1;
|
||||
}
|
||||
if (ef->size > 0) {
|
||||
if (_zip_write(za, ef->data, ef->size) < 0) {
|
||||
_zip_buffer_free(buffer);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
_zip_buffer_free(buffer);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
_zip_read_local_ef(zip_t *za, zip_uint64_t idx) {
|
||||
zip_entry_t *e;
|
||||
unsigned char b[4];
|
||||
zip_buffer_t *buffer;
|
||||
zip_uint16_t fname_len, ef_len;
|
||||
|
||||
if (idx >= za->nentry) {
|
||||
zip_error_set(&za->error, ZIP_ER_INVAL, 0);
|
||||
return -1;
|
||||
}
|
||||
|
||||
e = za->entry + idx;
|
||||
|
||||
if (e->orig == NULL || e->orig->local_extra_fields_read)
|
||||
return 0;
|
||||
|
||||
if (e->orig->offset + 26 > ZIP_INT64_MAX) {
|
||||
zip_error_set(&za->error, ZIP_ER_SEEK, EFBIG);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (zip_source_seek(za->src, (zip_int64_t)(e->orig->offset + 26), SEEK_SET) < 0) {
|
||||
_zip_error_set_from_source(&za->error, za->src);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if ((buffer = _zip_buffer_new_from_source(za->src, sizeof(b), b, &za->error)) == NULL) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
fname_len = _zip_buffer_get_16(buffer);
|
||||
ef_len = _zip_buffer_get_16(buffer);
|
||||
|
||||
if (!_zip_buffer_eof(buffer)) {
|
||||
_zip_buffer_free(buffer);
|
||||
zip_error_set(&za->error, ZIP_ER_INTERNAL, 0);
|
||||
return -1;
|
||||
}
|
||||
|
||||
_zip_buffer_free(buffer);
|
||||
|
||||
if (ef_len > 0) {
|
||||
zip_extra_field_t *ef;
|
||||
zip_uint8_t *ef_raw;
|
||||
|
||||
if (zip_source_seek(za->src, fname_len, SEEK_CUR) < 0) {
|
||||
zip_error_set(&za->error, ZIP_ER_SEEK, errno);
|
||||
return -1;
|
||||
}
|
||||
|
||||
ef_raw = _zip_read_data(NULL, za->src, ef_len, 0, &za->error);
|
||||
|
||||
if (ef_raw == NULL)
|
||||
return -1;
|
||||
|
||||
if (!_zip_ef_parse(ef_raw, ef_len, ZIP_EF_LOCAL, &ef, &za->error)) {
|
||||
free(ef_raw);
|
||||
return -1;
|
||||
}
|
||||
free(ef_raw);
|
||||
|
||||
if (ef) {
|
||||
ef = _zip_ef_remove_internal(ef);
|
||||
e->orig->extra_fields = _zip_ef_merge(e->orig->extra_fields, ef);
|
||||
}
|
||||
}
|
||||
|
||||
e->orig->local_extra_fields_read = 1;
|
||||
|
||||
if (e->changes && e->changes->local_extra_fields_read == 0) {
|
||||
e->changes->extra_fields = e->orig->extra_fields;
|
||||
e->changes->local_extra_fields_read = 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
355
externals/libzip/libzip/lib/zip_extra_field_api.c
vendored
Executable file
355
externals/libzip/libzip/lib/zip_extra_field_api.c
vendored
Executable file
@@ -0,0 +1,355 @@
|
||||
/*
|
||||
zip_extra_field_api.c -- public extra fields API functions
|
||||
Copyright (C) 2012-2018 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_file_extra_field_delete(zip_t *za, zip_uint64_t idx, zip_uint16_t ef_idx, zip_flags_t flags) {
|
||||
zip_dirent_t *de;
|
||||
|
||||
if ((flags & ZIP_EF_BOTH) == 0) {
|
||||
zip_error_set(&za->error, ZIP_ER_INVAL, 0);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (((flags & ZIP_EF_BOTH) == ZIP_EF_BOTH) && (ef_idx != ZIP_EXTRA_FIELD_ALL)) {
|
||||
zip_error_set(&za->error, ZIP_ER_INVAL, 0);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (_zip_get_dirent(za, idx, 0, NULL) == NULL)
|
||||
return -1;
|
||||
|
||||
if (ZIP_IS_RDONLY(za)) {
|
||||
zip_error_set(&za->error, ZIP_ER_RDONLY, 0);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (_zip_file_extra_field_prepare_for_change(za, idx) < 0)
|
||||
return -1;
|
||||
|
||||
de = za->entry[idx].changes;
|
||||
|
||||
de->extra_fields = _zip_ef_delete_by_id(de->extra_fields, ZIP_EXTRA_FIELD_ALL, ef_idx, flags);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
ZIP_EXTERN int
|
||||
zip_file_extra_field_delete_by_id(zip_t *za, zip_uint64_t idx, zip_uint16_t ef_id, zip_uint16_t ef_idx, zip_flags_t flags) {
|
||||
zip_dirent_t *de;
|
||||
|
||||
if ((flags & ZIP_EF_BOTH) == 0) {
|
||||
zip_error_set(&za->error, ZIP_ER_INVAL, 0);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (((flags & ZIP_EF_BOTH) == ZIP_EF_BOTH) && (ef_idx != ZIP_EXTRA_FIELD_ALL)) {
|
||||
zip_error_set(&za->error, ZIP_ER_INVAL, 0);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (_zip_get_dirent(za, idx, 0, NULL) == NULL)
|
||||
return -1;
|
||||
|
||||
if (ZIP_IS_RDONLY(za)) {
|
||||
zip_error_set(&za->error, ZIP_ER_RDONLY, 0);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (_zip_file_extra_field_prepare_for_change(za, idx) < 0)
|
||||
return -1;
|
||||
|
||||
de = za->entry[idx].changes;
|
||||
|
||||
de->extra_fields = _zip_ef_delete_by_id(de->extra_fields, ef_id, ef_idx, flags);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
ZIP_EXTERN const zip_uint8_t *
|
||||
zip_file_extra_field_get(zip_t *za, zip_uint64_t idx, zip_uint16_t ef_idx, zip_uint16_t *idp, zip_uint16_t *lenp, zip_flags_t flags) {
|
||||
static const zip_uint8_t empty[1] = {'\0'};
|
||||
|
||||
zip_dirent_t *de;
|
||||
zip_extra_field_t *ef;
|
||||
int i;
|
||||
|
||||
if ((flags & ZIP_EF_BOTH) == 0) {
|
||||
zip_error_set(&za->error, ZIP_ER_INVAL, 0);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if ((de = _zip_get_dirent(za, idx, flags, &za->error)) == NULL)
|
||||
return NULL;
|
||||
|
||||
if (flags & ZIP_FL_LOCAL)
|
||||
if (_zip_read_local_ef(za, idx) < 0)
|
||||
return NULL;
|
||||
|
||||
i = 0;
|
||||
for (ef = de->extra_fields; ef; ef = ef->next) {
|
||||
if (ef->flags & flags & ZIP_EF_BOTH) {
|
||||
if (i < ef_idx) {
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (idp)
|
||||
*idp = ef->id;
|
||||
if (lenp)
|
||||
*lenp = ef->size;
|
||||
if (ef->size > 0)
|
||||
return ef->data;
|
||||
else
|
||||
return empty;
|
||||
}
|
||||
}
|
||||
|
||||
zip_error_set(&za->error, ZIP_ER_NOENT, 0);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
ZIP_EXTERN const zip_uint8_t *
|
||||
zip_file_extra_field_get_by_id(zip_t *za, zip_uint64_t idx, zip_uint16_t ef_id, zip_uint16_t ef_idx, zip_uint16_t *lenp, zip_flags_t flags) {
|
||||
zip_dirent_t *de;
|
||||
|
||||
if ((flags & ZIP_EF_BOTH) == 0) {
|
||||
zip_error_set(&za->error, ZIP_ER_INVAL, 0);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if ((de = _zip_get_dirent(za, idx, flags, &za->error)) == NULL)
|
||||
return NULL;
|
||||
|
||||
if (flags & ZIP_FL_LOCAL)
|
||||
if (_zip_read_local_ef(za, idx) < 0)
|
||||
return NULL;
|
||||
|
||||
return _zip_ef_get_by_id(de->extra_fields, lenp, ef_id, ef_idx, flags, &za->error);
|
||||
}
|
||||
|
||||
|
||||
ZIP_EXTERN zip_int16_t
|
||||
zip_file_extra_fields_count(zip_t *za, zip_uint64_t idx, zip_flags_t flags) {
|
||||
zip_dirent_t *de;
|
||||
zip_extra_field_t *ef;
|
||||
zip_uint16_t n;
|
||||
|
||||
if ((flags & ZIP_EF_BOTH) == 0) {
|
||||
zip_error_set(&za->error, ZIP_ER_INVAL, 0);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if ((de = _zip_get_dirent(za, idx, flags, &za->error)) == NULL)
|
||||
return -1;
|
||||
|
||||
if (flags & ZIP_FL_LOCAL)
|
||||
if (_zip_read_local_ef(za, idx) < 0)
|
||||
return -1;
|
||||
|
||||
n = 0;
|
||||
for (ef = de->extra_fields; ef; ef = ef->next)
|
||||
if (ef->flags & flags & ZIP_EF_BOTH)
|
||||
n++;
|
||||
|
||||
return (zip_int16_t)n;
|
||||
}
|
||||
|
||||
|
||||
ZIP_EXTERN zip_int16_t
|
||||
zip_file_extra_fields_count_by_id(zip_t *za, zip_uint64_t idx, zip_uint16_t ef_id, zip_flags_t flags) {
|
||||
zip_dirent_t *de;
|
||||
zip_extra_field_t *ef;
|
||||
zip_uint16_t n;
|
||||
|
||||
if ((flags & ZIP_EF_BOTH) == 0) {
|
||||
zip_error_set(&za->error, ZIP_ER_INVAL, 0);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if ((de = _zip_get_dirent(za, idx, flags, &za->error)) == NULL)
|
||||
return -1;
|
||||
|
||||
if (flags & ZIP_FL_LOCAL)
|
||||
if (_zip_read_local_ef(za, idx) < 0)
|
||||
return -1;
|
||||
|
||||
n = 0;
|
||||
for (ef = de->extra_fields; ef; ef = ef->next)
|
||||
if (ef->id == ef_id && (ef->flags & flags & ZIP_EF_BOTH))
|
||||
n++;
|
||||
|
||||
return (zip_int16_t)n;
|
||||
}
|
||||
|
||||
|
||||
ZIP_EXTERN int
|
||||
zip_file_extra_field_set(zip_t *za, zip_uint64_t idx, zip_uint16_t ef_id, zip_uint16_t ef_idx, const zip_uint8_t *data, zip_uint16_t len, zip_flags_t flags) {
|
||||
zip_dirent_t *de;
|
||||
zip_uint16_t ls, cs;
|
||||
zip_extra_field_t *ef, *ef_prev, *ef_new;
|
||||
int i, found, new_len;
|
||||
|
||||
if ((flags & ZIP_EF_BOTH) == 0) {
|
||||
zip_error_set(&za->error, ZIP_ER_INVAL, 0);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (_zip_get_dirent(za, idx, 0, NULL) == NULL)
|
||||
return -1;
|
||||
|
||||
if (ZIP_IS_RDONLY(za)) {
|
||||
zip_error_set(&za->error, ZIP_ER_RDONLY, 0);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (ZIP_EF_IS_INTERNAL(ef_id)) {
|
||||
zip_error_set(&za->error, ZIP_ER_INVAL, 0);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (_zip_file_extra_field_prepare_for_change(za, idx) < 0)
|
||||
return -1;
|
||||
|
||||
de = za->entry[idx].changes;
|
||||
|
||||
ef = de->extra_fields;
|
||||
ef_prev = NULL;
|
||||
i = 0;
|
||||
found = 0;
|
||||
|
||||
for (; ef; ef = ef->next) {
|
||||
if (ef->id == ef_id && (ef->flags & flags & ZIP_EF_BOTH)) {
|
||||
if (i == ef_idx) {
|
||||
found = 1;
|
||||
break;
|
||||
}
|
||||
i++;
|
||||
}
|
||||
ef_prev = ef;
|
||||
}
|
||||
|
||||
if (i < ef_idx && ef_idx != ZIP_EXTRA_FIELD_NEW) {
|
||||
zip_error_set(&za->error, ZIP_ER_INVAL, 0);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (flags & ZIP_EF_LOCAL)
|
||||
ls = _zip_ef_size(de->extra_fields, ZIP_EF_LOCAL);
|
||||
else
|
||||
ls = 0;
|
||||
if (flags & ZIP_EF_CENTRAL)
|
||||
cs = _zip_ef_size(de->extra_fields, ZIP_EF_CENTRAL);
|
||||
else
|
||||
cs = 0;
|
||||
|
||||
new_len = ls > cs ? ls : cs;
|
||||
if (found)
|
||||
new_len -= ef->size + 4;
|
||||
new_len += len + 4;
|
||||
|
||||
if (new_len > ZIP_UINT16_MAX) {
|
||||
zip_error_set(&za->error, ZIP_ER_INVAL, 0);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if ((ef_new = _zip_ef_new(ef_id, len, data, flags)) == NULL) {
|
||||
zip_error_set(&za->error, ZIP_ER_MEMORY, 0);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (found) {
|
||||
if ((ef->flags & ZIP_EF_BOTH) == (flags & ZIP_EF_BOTH)) {
|
||||
ef_new->next = ef->next;
|
||||
ef->next = NULL;
|
||||
_zip_ef_free(ef);
|
||||
if (ef_prev)
|
||||
ef_prev->next = ef_new;
|
||||
else
|
||||
de->extra_fields = ef_new;
|
||||
}
|
||||
else {
|
||||
ef->flags &= ~(flags & ZIP_EF_BOTH);
|
||||
ef_new->next = ef->next;
|
||||
ef->next = ef_new;
|
||||
}
|
||||
}
|
||||
else if (ef_prev) {
|
||||
ef_new->next = ef_prev->next;
|
||||
ef_prev->next = ef_new;
|
||||
}
|
||||
else
|
||||
de->extra_fields = ef_new;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
_zip_file_extra_field_prepare_for_change(zip_t *za, zip_uint64_t idx) {
|
||||
zip_entry_t *e;
|
||||
|
||||
if (idx >= za->nentry) {
|
||||
zip_error_set(&za->error, ZIP_ER_INVAL, 0);
|
||||
return -1;
|
||||
}
|
||||
|
||||
e = za->entry + idx;
|
||||
|
||||
if (e->changes && (e->changes->changed & ZIP_DIRENT_EXTRA_FIELD))
|
||||
return 0;
|
||||
|
||||
if (e->orig) {
|
||||
if (_zip_read_local_ef(za, idx) < 0)
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (e->changes == NULL) {
|
||||
if ((e->changes = _zip_dirent_clone(e->orig)) == NULL) {
|
||||
zip_error_set(&za->error, ZIP_ER_MEMORY, 0);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
if (e->orig && e->orig->extra_fields) {
|
||||
if ((e->changes->extra_fields = _zip_ef_clone(e->orig->extra_fields, &za->error)) == NULL)
|
||||
return -1;
|
||||
}
|
||||
e->changes->changed |= ZIP_DIRENT_EXTRA_FIELD;
|
||||
|
||||
return 0;
|
||||
}
|
54
externals/libzip/libzip/lib/zip_fclose.c
vendored
Executable file
54
externals/libzip/libzip/lib/zip_fclose.c
vendored
Executable file
@@ -0,0 +1,54 @@
|
||||
/*
|
||||
zip_fclose.c -- close file in zip archive
|
||||
Copyright (C) 1999-2018 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 int
|
||||
zip_fclose(zip_file_t *zf) {
|
||||
int ret;
|
||||
|
||||
if (zf->src)
|
||||
zip_source_free(zf->src);
|
||||
|
||||
ret = 0;
|
||||
if (zf->error.zip_err)
|
||||
ret = zf->error.zip_err;
|
||||
|
||||
zip_error_fini(&zf->error);
|
||||
free(zf);
|
||||
return ret;
|
||||
}
|
86
externals/libzip/libzip/lib/zip_fdopen.c
vendored
Executable file
86
externals/libzip/libzip/lib/zip_fdopen.c
vendored
Executable file
@@ -0,0 +1,86 @@
|
||||
/*
|
||||
zip_fdopen.c -- open read-only archive from file descriptor
|
||||
Copyright (C) 2009-2018 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 zip_t *
|
||||
zip_fdopen(int fd_orig, int _flags, int *zep) {
|
||||
int fd;
|
||||
FILE *fp;
|
||||
zip_t *za;
|
||||
zip_source_t *src;
|
||||
struct zip_error error;
|
||||
|
||||
if (_flags < 0 || (_flags & ~(ZIP_CHECKCONS | ZIP_RDONLY))) {
|
||||
_zip_set_open_error(zep, NULL, ZIP_ER_INVAL);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* 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) {
|
||||
_zip_set_open_error(zep, NULL, ZIP_ER_OPEN);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if ((fp = fdopen(fd, "rb")) == NULL) {
|
||||
close(fd);
|
||||
_zip_set_open_error(zep, NULL, ZIP_ER_OPEN);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
zip_error_init(&error);
|
||||
if ((src = zip_source_filep_create(fp, 0, -1, &error)) == NULL) {
|
||||
fclose(fp);
|
||||
_zip_set_open_error(zep, &error, 0);
|
||||
zip_error_fini(&error);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if ((za = zip_open_from_source(src, _flags, &error)) == NULL) {
|
||||
zip_source_free(src);
|
||||
_zip_set_open_error(zep, &error, 0);
|
||||
zip_error_fini(&error);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
zip_error_fini(&error);
|
||||
close(fd_orig);
|
||||
return za;
|
||||
}
|
52
externals/libzip/libzip/lib/zip_file_add.c
vendored
Executable file
52
externals/libzip/libzip/lib/zip_file_add.c
vendored
Executable file
@@ -0,0 +1,52 @@
|
||||
/*
|
||||
zip_file_add.c -- add file via callback function
|
||||
Copyright (C) 1999-2018 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"
|
||||
|
||||
/*
|
||||
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_file_add(zip_t *za, const char *name, zip_source_t *source, zip_flags_t flags) {
|
||||
if (name == NULL || source == NULL) {
|
||||
zip_error_set(&za->error, ZIP_ER_INVAL, 0);
|
||||
return -1;
|
||||
}
|
||||
|
||||
return _zip_file_replace(za, ZIP_UINT64_MAX, name, source, flags);
|
||||
}
|
44
externals/libzip/libzip/lib/zip_file_error_clear.c
vendored
Executable file
44
externals/libzip/libzip/lib/zip_file_error_clear.c
vendored
Executable file
@@ -0,0 +1,44 @@
|
||||
/*
|
||||
zip_file_error_clear.c -- clear zip file error
|
||||
Copyright (C) 1999-2018 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_file_error_clear(zip_file_t *zf) {
|
||||
if (zf == NULL)
|
||||
return;
|
||||
|
||||
_zip_error_clear(&zf->error);
|
||||
}
|
41
externals/libzip/libzip/lib/zip_file_error_get.c
vendored
Executable file
41
externals/libzip/libzip/lib/zip_file_error_get.c
vendored
Executable file
@@ -0,0 +1,41 @@
|
||||
/*
|
||||
zip_file_error_get.c -- get zip file error
|
||||
Copyright (C) 1999-2018 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.
|
||||
*/
|
||||
|
||||
#define _ZIP_COMPILING_DEPRECATED
|
||||
#include "zipint.h"
|
||||
|
||||
|
||||
ZIP_EXTERN void
|
||||
zip_file_error_get(zip_file_t *zf, int *zep, int *sep) {
|
||||
_zip_error_get(&zf->error, zep, sep);
|
||||
}
|
55
externals/libzip/libzip/lib/zip_file_get_comment.c
vendored
Executable file
55
externals/libzip/libzip/lib/zip_file_get_comment.c
vendored
Executable file
@@ -0,0 +1,55 @@
|
||||
/*
|
||||
zip_file_get_comment.c -- get file comment
|
||||
Copyright (C) 2006-2018 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"
|
||||
|
||||
/* lenp is 32 bit because converted comment can be longer than ZIP_UINT16_MAX */
|
||||
|
||||
ZIP_EXTERN const char *
|
||||
zip_file_get_comment(zip_t *za, zip_uint64_t idx, zip_uint32_t *lenp, zip_flags_t flags) {
|
||||
zip_dirent_t *de;
|
||||
zip_uint32_t len;
|
||||
const zip_uint8_t *str;
|
||||
|
||||
if ((de = _zip_get_dirent(za, idx, flags, NULL)) == NULL)
|
||||
return NULL;
|
||||
|
||||
if ((str = _zip_string_get(de->comment, &len, flags, &za->error)) == NULL)
|
||||
return NULL;
|
||||
|
||||
if (lenp)
|
||||
*lenp = len;
|
||||
|
||||
return (const char *)str;
|
||||
}
|
50
externals/libzip/libzip/lib/zip_file_get_external_attributes.c
vendored
Executable file
50
externals/libzip/libzip/lib/zip_file_get_external_attributes.c
vendored
Executable file
@@ -0,0 +1,50 @@
|
||||
/*
|
||||
zip_file_get_external_attributes.c -- get opsys/external attributes
|
||||
Copyright (C) 2013-2018 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"
|
||||
|
||||
int
|
||||
zip_file_get_external_attributes(zip_t *za, zip_uint64_t idx, zip_flags_t flags, zip_uint8_t *opsys, zip_uint32_t *attributes) {
|
||||
zip_dirent_t *de;
|
||||
|
||||
if ((de = _zip_get_dirent(za, idx, flags, NULL)) == NULL)
|
||||
return -1;
|
||||
|
||||
if (opsys)
|
||||
*opsys = (zip_uint8_t)((de->version_madeby >> 8) & 0xff);
|
||||
|
||||
if (attributes)
|
||||
*attributes = de->ext_attrib;
|
||||
|
||||
return 0;
|
||||
}
|
120
externals/libzip/libzip/lib/zip_file_get_offset.c
vendored
Executable file
120
externals/libzip/libzip/lib/zip_file_get_offset.c
vendored
Executable file
@@ -0,0 +1,120 @@
|
||||
/*
|
||||
zip_file_get_offset.c -- get offset of file data in archive.
|
||||
Copyright (C) 1999-2018 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 <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <sys/stat.h>
|
||||
#include <sys/types.h>
|
||||
|
||||
#include "zipint.h"
|
||||
|
||||
|
||||
/* _zip_file_get_offset(za, ze):
|
||||
Returns the offset of the file data for entry ze.
|
||||
|
||||
On error, fills in za->error and returns 0.
|
||||
*/
|
||||
|
||||
zip_uint64_t
|
||||
_zip_file_get_offset(const zip_t *za, zip_uint64_t idx, zip_error_t *error) {
|
||||
zip_uint64_t offset;
|
||||
zip_int32_t size;
|
||||
|
||||
if (za->entry[idx].orig == NULL) {
|
||||
zip_error_set(error, ZIP_ER_INTERNAL, 0);
|
||||
return 0;
|
||||
}
|
||||
|
||||
offset = za->entry[idx].orig->offset;
|
||||
|
||||
if (zip_source_seek(za->src, (zip_int64_t)offset, SEEK_SET) < 0) {
|
||||
_zip_error_set_from_source(error, za->src);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* TODO: cache? */
|
||||
if ((size = _zip_dirent_size(za->src, ZIP_EF_LOCAL, error)) < 0)
|
||||
return 0;
|
||||
|
||||
if (offset + (zip_uint32_t)size > ZIP_INT64_MAX) {
|
||||
zip_error_set(error, ZIP_ER_SEEK, EFBIG);
|
||||
return 0;
|
||||
}
|
||||
|
||||
return offset + (zip_uint32_t)size;
|
||||
}
|
||||
|
||||
zip_uint64_t
|
||||
_zip_file_get_end(const zip_t *za, zip_uint64_t index, zip_error_t *error) {
|
||||
zip_uint64_t offset;
|
||||
zip_dirent_t *entry;
|
||||
|
||||
if ((offset = _zip_file_get_offset(za, index, error)) == 0) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
entry = za->entry[index].orig;
|
||||
|
||||
if (offset + entry->comp_size < offset || offset + entry->comp_size > ZIP_INT64_MAX) {
|
||||
zip_error_set(error, ZIP_ER_SEEK, EFBIG);
|
||||
return 0;
|
||||
}
|
||||
offset += entry->comp_size;
|
||||
|
||||
if (entry->bitflags & ZIP_GPBF_DATA_DESCRIPTOR) {
|
||||
zip_uint8_t buf[4];
|
||||
if (zip_source_seek(za->src, (zip_int64_t)offset, SEEK_SET) < 0) {
|
||||
_zip_error_set_from_source(error, za->src);
|
||||
return 0;
|
||||
}
|
||||
if (zip_source_read(za->src, buf, 4) != 4) {
|
||||
_zip_error_set_from_source(error, za->src);
|
||||
return 0;
|
||||
}
|
||||
if (memcmp(buf, DATADES_MAGIC, 4) == 0) {
|
||||
offset += 4;
|
||||
}
|
||||
offset += 12;
|
||||
if (_zip_dirent_needs_zip64(entry, 0)) {
|
||||
offset += 8;
|
||||
}
|
||||
if (offset > ZIP_INT64_MAX) {
|
||||
zip_error_set(error, ZIP_ER_SEEK, EFBIG);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
return offset;
|
||||
}
|
67
externals/libzip/libzip/lib/zip_file_rename.c
vendored
Executable file
67
externals/libzip/libzip/lib/zip_file_rename.c
vendored
Executable file
@@ -0,0 +1,67 @@
|
||||
/*
|
||||
zip_file_rename.c -- rename file in zip archive
|
||||
Copyright (C) 1999-2018 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 <string.h>
|
||||
|
||||
#include "zipint.h"
|
||||
|
||||
|
||||
ZIP_EXTERN int
|
||||
zip_file_rename(zip_t *za, zip_uint64_t idx, const char *name, zip_flags_t flags) {
|
||||
const char *old_name;
|
||||
int old_is_dir, new_is_dir;
|
||||
|
||||
if (idx >= za->nentry || (name != NULL && strlen(name) > ZIP_UINT16_MAX)) {
|
||||
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;
|
||||
|
||||
new_is_dir = (name != NULL && name[strlen(name) - 1] == '/');
|
||||
old_is_dir = (old_name[strlen(old_name) - 1] == '/');
|
||||
|
||||
if (new_is_dir != old_is_dir) {
|
||||
zip_error_set(&za->error, ZIP_ER_INVAL, 0);
|
||||
return -1;
|
||||
}
|
||||
|
||||
return _zip_set_name(za, idx, name, flags);
|
||||
}
|
105
externals/libzip/libzip/lib/zip_file_replace.c
vendored
Executable file
105
externals/libzip/libzip/lib/zip_file_replace.c
vendored
Executable file
@@ -0,0 +1,105 @@
|
||||
/*
|
||||
zip_file_replace.c -- replace file via callback function
|
||||
Copyright (C) 1999-2018 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_file_replace(zip_t *za, zip_uint64_t idx, zip_source_t *source, zip_flags_t flags) {
|
||||
if (idx >= za->nentry || source == NULL) {
|
||||
zip_error_set(&za->error, ZIP_ER_INVAL, 0);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (_zip_file_replace(za, idx, NULL, source, flags) == -1)
|
||||
return -1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/* NOTE: Signed due to -1 on error. See zip_add.c for more details. */
|
||||
|
||||
zip_int64_t
|
||||
_zip_file_replace(zip_t *za, zip_uint64_t idx, const char *name, zip_source_t *source, zip_flags_t flags) {
|
||||
zip_uint64_t za_nentry_prev;
|
||||
|
||||
if (ZIP_IS_RDONLY(za)) {
|
||||
zip_error_set(&za->error, ZIP_ER_RDONLY, 0);
|
||||
return -1;
|
||||
}
|
||||
|
||||
za_nentry_prev = za->nentry;
|
||||
if (idx == ZIP_UINT64_MAX) {
|
||||
zip_int64_t i = -1;
|
||||
|
||||
if (flags & ZIP_FL_OVERWRITE)
|
||||
i = _zip_name_locate(za, name, flags, NULL);
|
||||
|
||||
if (i == -1) {
|
||||
/* create and use new entry, used by zip_add */
|
||||
if ((i = _zip_add_entry(za)) < 0)
|
||||
return -1;
|
||||
}
|
||||
idx = (zip_uint64_t)i;
|
||||
}
|
||||
|
||||
if (name && _zip_set_name(za, idx, name, flags) != 0) {
|
||||
if (za->nentry != za_nentry_prev) {
|
||||
_zip_entry_finalize(za->entry + idx);
|
||||
za->nentry = za_nentry_prev;
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* does not change any name related data, so we can do it here;
|
||||
* needed for a double add of the same file name */
|
||||
_zip_unchange_data(za->entry + idx);
|
||||
|
||||
if (za->entry[idx].orig != NULL && (za->entry[idx].changes == NULL || (za->entry[idx].changes->changed & ZIP_DIRENT_COMP_METHOD) == 0)) {
|
||||
if (za->entry[idx].changes == NULL) {
|
||||
if ((za->entry[idx].changes = _zip_dirent_clone(za->entry[idx].orig)) == NULL) {
|
||||
zip_error_set(&za->error, ZIP_ER_MEMORY, 0);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
za->entry[idx].changes->comp_method = ZIP_CM_REPLACED_DEFAULT;
|
||||
za->entry[idx].changes->changed |= ZIP_DIRENT_COMP_METHOD;
|
||||
}
|
||||
|
||||
za->entry[idx].source = source;
|
||||
|
||||
return (zip_int64_t)idx;
|
||||
}
|
101
externals/libzip/libzip/lib/zip_file_set_comment.c
vendored
Executable file
101
externals/libzip/libzip/lib/zip_file_set_comment.c
vendored
Executable file
@@ -0,0 +1,101 @@
|
||||
/*
|
||||
zip_file_set_comment.c -- set comment for file in archive
|
||||
Copyright (C) 2006-2018 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 int
|
||||
zip_file_set_comment(zip_t *za, zip_uint64_t idx, const char *comment, zip_uint16_t len, zip_flags_t flags) {
|
||||
zip_entry_t *e;
|
||||
zip_string_t *cstr;
|
||||
int changed;
|
||||
|
||||
if (_zip_get_dirent(za, idx, 0, NULL) == NULL)
|
||||
return -1;
|
||||
|
||||
if (ZIP_IS_RDONLY(za)) {
|
||||
zip_error_set(&za->error, ZIP_ER_RDONLY, 0);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (len > 0 && comment == NULL) {
|
||||
zip_error_set(&za->error, ZIP_ER_INVAL, 0);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (len > 0) {
|
||||
if ((cstr = _zip_string_new((const zip_uint8_t *)comment, len, flags, &za->error)) == NULL)
|
||||
return -1;
|
||||
if ((flags & ZIP_FL_ENCODING_ALL) == ZIP_FL_ENC_GUESS && _zip_guess_encoding(cstr, ZIP_ENCODING_UNKNOWN) == ZIP_ENCODING_UTF8_GUESSED)
|
||||
cstr->encoding = ZIP_ENCODING_UTF8_KNOWN;
|
||||
}
|
||||
else
|
||||
cstr = NULL;
|
||||
|
||||
e = za->entry + idx;
|
||||
|
||||
if (e->changes) {
|
||||
_zip_string_free(e->changes->comment);
|
||||
e->changes->comment = NULL;
|
||||
e->changes->changed &= ~ZIP_DIRENT_COMMENT;
|
||||
}
|
||||
|
||||
if (e->orig && e->orig->comment)
|
||||
changed = !_zip_string_equal(e->orig->comment, cstr);
|
||||
else
|
||||
changed = (cstr != NULL);
|
||||
|
||||
if (changed) {
|
||||
if (e->changes == NULL) {
|
||||
if ((e->changes = _zip_dirent_clone(e->orig)) == NULL) {
|
||||
zip_error_set(&za->error, ZIP_ER_MEMORY, 0);
|
||||
_zip_string_free(cstr);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
e->changes->comment = cstr;
|
||||
e->changes->changed |= ZIP_DIRENT_COMMENT;
|
||||
}
|
||||
else {
|
||||
_zip_string_free(cstr);
|
||||
if (e->changes && e->changes->changed == 0) {
|
||||
_zip_dirent_free(e->changes);
|
||||
e->changes = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
116
externals/libzip/libzip/lib/zip_file_set_encryption.c
vendored
Executable file
116
externals/libzip/libzip/lib/zip_file_set_encryption.c
vendored
Executable file
@@ -0,0 +1,116 @@
|
||||
/*
|
||||
zip_file_set_encryption.c -- set encryption for file in archive
|
||||
Copyright (C) 2016-2018 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"
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
ZIP_EXTERN int
|
||||
zip_file_set_encryption(zip_t *za, zip_uint64_t idx, zip_uint16_t method, const char *password) {
|
||||
zip_entry_t *e;
|
||||
zip_uint16_t old_method;
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
if (method != ZIP_EM_NONE && _zip_get_encryption_implementation(method, ZIP_CODEC_ENCODE) == NULL) {
|
||||
zip_error_set(&za->error, ZIP_ER_ENCRNOTSUPP, 0);
|
||||
return -1;
|
||||
}
|
||||
|
||||
e = za->entry + idx;
|
||||
|
||||
old_method = (e->orig == NULL ? ZIP_EM_NONE : e->orig->encryption_method);
|
||||
|
||||
if (method == old_method && password == NULL) {
|
||||
if (e->changes) {
|
||||
if (e->changes->changed & ZIP_DIRENT_PASSWORD) {
|
||||
_zip_crypto_clear(e->changes->password, strlen(e->changes->password));
|
||||
free(e->changes->password);
|
||||
e->changes->password = (e->orig == NULL ? NULL : e->orig->password);
|
||||
}
|
||||
e->changes->changed &= ~(ZIP_DIRENT_ENCRYPTION_METHOD | ZIP_DIRENT_PASSWORD);
|
||||
if (e->changes->changed == 0) {
|
||||
_zip_dirent_free(e->changes);
|
||||
e->changes = NULL;
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
char *our_password = NULL;
|
||||
|
||||
if (password) {
|
||||
if ((our_password = strdup(password)) == NULL) {
|
||||
zip_error_set(&za->error, ZIP_ER_MEMORY, 0);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
if (e->changes == NULL) {
|
||||
if ((e->changes = _zip_dirent_clone(e->orig)) == NULL) {
|
||||
if (our_password) {
|
||||
_zip_crypto_clear(our_password, strlen(our_password));
|
||||
}
|
||||
free(our_password);
|
||||
zip_error_set(&za->error, ZIP_ER_MEMORY, 0);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
e->changes->encryption_method = method;
|
||||
e->changes->changed |= ZIP_DIRENT_ENCRYPTION_METHOD;
|
||||
if (password) {
|
||||
e->changes->password = our_password;
|
||||
e->changes->changed |= ZIP_DIRENT_PASSWORD;
|
||||
}
|
||||
else {
|
||||
if (e->changes->changed & ZIP_DIRENT_PASSWORD) {
|
||||
_zip_crypto_clear(e->changes->password, strlen(e->changes->password));
|
||||
free(e->changes->password);
|
||||
e->changes->password = e->orig ? e->orig->password : NULL;
|
||||
e->changes->changed &= ~ZIP_DIRENT_PASSWORD;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
82
externals/libzip/libzip/lib/zip_file_set_external_attributes.c
vendored
Executable file
82
externals/libzip/libzip/lib/zip_file_set_external_attributes.c
vendored
Executable file
@@ -0,0 +1,82 @@
|
||||
/*
|
||||
zip_file_set_external_attributes.c -- set external attributes for entry
|
||||
Copyright (C) 2013-2018 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_file_set_external_attributes(zip_t *za, zip_uint64_t idx, zip_flags_t flags, zip_uint8_t opsys, zip_uint32_t attributes) {
|
||||
zip_entry_t *e;
|
||||
int changed;
|
||||
zip_uint8_t unchanged_opsys;
|
||||
zip_uint32_t unchanged_attributes;
|
||||
|
||||
if (_zip_get_dirent(za, idx, 0, NULL) == NULL)
|
||||
return -1;
|
||||
|
||||
if (ZIP_IS_RDONLY(za)) {
|
||||
zip_error_set(&za->error, ZIP_ER_RDONLY, 0);
|
||||
return -1;
|
||||
}
|
||||
|
||||
e = za->entry + idx;
|
||||
|
||||
unchanged_opsys = (e->orig ? (zip_uint8_t)(e->orig->version_madeby >> 8) : (zip_uint8_t)ZIP_OPSYS_DEFAULT);
|
||||
unchanged_attributes = e->orig ? e->orig->ext_attrib : ZIP_EXT_ATTRIB_DEFAULT;
|
||||
|
||||
changed = (opsys != unchanged_opsys || attributes != unchanged_attributes);
|
||||
|
||||
if (changed) {
|
||||
if (e->changes == NULL) {
|
||||
if ((e->changes = _zip_dirent_clone(e->orig)) == NULL) {
|
||||
zip_error_set(&za->error, ZIP_ER_MEMORY, 0);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
e->changes->version_madeby = (zip_uint16_t)((opsys << 8) | (e->changes->version_madeby & 0xff));
|
||||
e->changes->ext_attrib = attributes;
|
||||
e->changes->changed |= ZIP_DIRENT_ATTRIBUTES;
|
||||
}
|
||||
else if (e->changes) {
|
||||
e->changes->changed &= ~ZIP_DIRENT_ATTRIBUTES;
|
||||
if (e->changes->changed == 0) {
|
||||
_zip_dirent_free(e->changes);
|
||||
e->changes = NULL;
|
||||
}
|
||||
else {
|
||||
e->changes->version_madeby = (zip_uint16_t)((unchanged_opsys << 8) | (e->changes->version_madeby & 0xff));
|
||||
e->changes->ext_attrib = unchanged_attributes;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
74
externals/libzip/libzip/lib/zip_file_set_mtime.c
vendored
Executable file
74
externals/libzip/libzip/lib/zip_file_set_mtime.c
vendored
Executable file
@@ -0,0 +1,74 @@
|
||||
/*
|
||||
zip_file_set_mtime.c -- set modification time of entry.
|
||||
Copyright (C) 2014-2018 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_file_set_mtime(zip_t *za, zip_uint64_t idx, time_t mtime, zip_flags_t flags) {
|
||||
zip_entry_t *e;
|
||||
int changed;
|
||||
|
||||
if (_zip_get_dirent(za, idx, 0, NULL) == NULL)
|
||||
return -1;
|
||||
|
||||
if (ZIP_IS_RDONLY(za)) {
|
||||
zip_error_set(&za->error, ZIP_ER_RDONLY, 0);
|
||||
return -1;
|
||||
}
|
||||
|
||||
e = za->entry + idx;
|
||||
|
||||
changed = e->orig == NULL || mtime != e->orig->last_mod;
|
||||
|
||||
if (changed) {
|
||||
if (e->changes == NULL) {
|
||||
if ((e->changes = _zip_dirent_clone(e->orig)) == NULL) {
|
||||
zip_error_set(&za->error, ZIP_ER_MEMORY, 0);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
e->changes->last_mod = mtime;
|
||||
e->changes->changed |= ZIP_DIRENT_LAST_MOD;
|
||||
}
|
||||
else {
|
||||
if (e->changes) {
|
||||
e->changes->changed &= ~ZIP_DIRENT_LAST_MOD;
|
||||
if (e->changes->changed == 0) {
|
||||
_zip_dirent_free(e->changes);
|
||||
e->changes = NULL;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
41
externals/libzip/libzip/lib/zip_file_strerror.c
vendored
Executable file
41
externals/libzip/libzip/lib/zip_file_strerror.c
vendored
Executable file
@@ -0,0 +1,41 @@
|
||||
/*
|
||||
zip_file_sterror.c -- get string representation of zip file error
|
||||
Copyright (C) 1999-2018 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 const char *
|
||||
zip_file_strerror(zip_file_t *zf) {
|
||||
return zip_error_strerror(&zf->error);
|
||||
}
|
84
externals/libzip/libzip/lib/zip_filerange_crc.c
vendored
Executable file
84
externals/libzip/libzip/lib/zip_filerange_crc.c
vendored
Executable file
@@ -0,0 +1,84 @@
|
||||
/*
|
||||
zip_filerange_crc.c -- compute CRC32 for a range of a file
|
||||
Copyright (C) 2008-2018 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 <stdio.h>
|
||||
|
||||
#include "zipint.h"
|
||||
|
||||
|
||||
int
|
||||
_zip_filerange_crc(zip_source_t *src, zip_uint64_t start, zip_uint64_t len, uLong *crcp, zip_error_t *error) {
|
||||
DEFINE_BYTE_ARRAY(buf, BUFSIZE);
|
||||
|
||||
zip_int64_t n;
|
||||
|
||||
*crcp = crc32(0L, Z_NULL, 0);
|
||||
|
||||
if (start > ZIP_INT64_MAX) {
|
||||
zip_error_set(error, ZIP_ER_SEEK, EFBIG);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (zip_source_seek(src, (zip_int64_t)start, SEEK_SET) != 0) {
|
||||
_zip_error_set_from_source(error, src);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (!byte_array_init(buf, BUFSIZE)) {
|
||||
zip_error_set(error, ZIP_ER_MEMORY, 0);
|
||||
return -1;
|
||||
}
|
||||
|
||||
while (len > 0) {
|
||||
n = (zip_int64_t)(len > BUFSIZE ? BUFSIZE : len);
|
||||
if ((n = zip_source_read(src, buf, (zip_uint64_t)n)) < 0) {
|
||||
_zip_error_set_from_source(error, src);
|
||||
byte_array_fini(buf);
|
||||
return -1;
|
||||
}
|
||||
if (n == 0) {
|
||||
zip_error_set(error, ZIP_ER_EOF, 0);
|
||||
byte_array_fini(buf);
|
||||
return -1;
|
||||
}
|
||||
|
||||
*crcp = crc32(*crcp, buf, (uInt)n);
|
||||
|
||||
len -= (zip_uint64_t)n;
|
||||
}
|
||||
|
||||
byte_array_fini(buf);
|
||||
|
||||
return 0;
|
||||
}
|
46
externals/libzip/libzip/lib/zip_fopen.c
vendored
Executable file
46
externals/libzip/libzip/lib/zip_fopen.c
vendored
Executable file
@@ -0,0 +1,46 @@
|
||||
/*
|
||||
zip_fopen.c -- open file in zip archive for reading
|
||||
Copyright (C) 1999-2018 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_file_t *
|
||||
zip_fopen(zip_t *za, const char *fname, zip_flags_t flags) {
|
||||
zip_int64_t idx;
|
||||
|
||||
if ((idx = zip_name_locate(za, fname, flags)) < 0)
|
||||
return NULL;
|
||||
|
||||
return zip_fopen_index_encrypted(za, (zip_uint64_t)idx, flags, za->default_password);
|
||||
}
|
46
externals/libzip/libzip/lib/zip_fopen_encrypted.c
vendored
Executable file
46
externals/libzip/libzip/lib/zip_fopen_encrypted.c
vendored
Executable file
@@ -0,0 +1,46 @@
|
||||
/*
|
||||
zip_fopen_encrypted.c -- open file for reading with password
|
||||
Copyright (C) 1999-2018 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_file_t *
|
||||
zip_fopen_encrypted(zip_t *za, const char *fname, zip_flags_t flags, const char *password) {
|
||||
zip_int64_t idx;
|
||||
|
||||
if ((idx = zip_name_locate(za, fname, flags)) < 0)
|
||||
return NULL;
|
||||
|
||||
return zip_fopen_index_encrypted(za, (zip_uint64_t)idx, flags, password);
|
||||
}
|
44
externals/libzip/libzip/lib/zip_fopen_index.c
vendored
Executable file
44
externals/libzip/libzip/lib/zip_fopen_index.c
vendored
Executable file
@@ -0,0 +1,44 @@
|
||||
/*
|
||||
zip_fopen_index.c -- open file in zip archive for reading by index
|
||||
Copyright (C) 1999-2018 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 <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#include "zipint.h"
|
||||
|
||||
|
||||
ZIP_EXTERN zip_file_t *
|
||||
zip_fopen_index(zip_t *za, zip_uint64_t index, zip_flags_t flags) {
|
||||
return zip_fopen_index_encrypted(za, index, flags, za->default_password);
|
||||
}
|
83
externals/libzip/libzip/lib/zip_fopen_index_encrypted.c
vendored
Executable file
83
externals/libzip/libzip/lib/zip_fopen_index_encrypted.c
vendored
Executable file
@@ -0,0 +1,83 @@
|
||||
/*
|
||||
zip_fopen_index_encrypted.c -- open file for reading by index w/ password
|
||||
Copyright (C) 1999-2018 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 <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#include "zipint.h"
|
||||
|
||||
static zip_file_t *_zip_file_new(zip_t *za);
|
||||
|
||||
|
||||
ZIP_EXTERN zip_file_t *
|
||||
zip_fopen_index_encrypted(zip_t *za, zip_uint64_t index, zip_flags_t flags, const char *password) {
|
||||
zip_file_t *zf;
|
||||
zip_source_t *src;
|
||||
|
||||
if ((src = _zip_source_zip_new(za, za, index, flags, 0, 0, password)) == NULL)
|
||||
return NULL;
|
||||
|
||||
if (zip_source_open(src) < 0) {
|
||||
_zip_error_set_from_source(&za->error, src);
|
||||
zip_source_free(src);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if ((zf = _zip_file_new(za)) == NULL) {
|
||||
zip_source_free(src);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
zf->src = src;
|
||||
|
||||
return zf;
|
||||
}
|
||||
|
||||
|
||||
static zip_file_t *
|
||||
_zip_file_new(zip_t *za) {
|
||||
zip_file_t *zf;
|
||||
|
||||
if ((zf = (zip_file_t *)malloc(sizeof(struct zip_file))) == NULL) {
|
||||
zip_error_set(&za->error, ZIP_ER_MEMORY, 0);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
zf->za = za;
|
||||
zip_error_init(&zf->error);
|
||||
zf->eof = 0;
|
||||
zf->src = NULL;
|
||||
|
||||
return zf;
|
||||
}
|
62
externals/libzip/libzip/lib/zip_fread.c
vendored
Executable file
62
externals/libzip/libzip/lib/zip_fread.c
vendored
Executable file
@@ -0,0 +1,62 @@
|
||||
/*
|
||||
zip_fread.c -- read from file
|
||||
Copyright (C) 1999-2018 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_fread(zip_file_t *zf, void *outbuf, zip_uint64_t toread) {
|
||||
zip_int64_t n;
|
||||
|
||||
if (!zf)
|
||||
return -1;
|
||||
|
||||
if (zf->error.zip_err != 0)
|
||||
return -1;
|
||||
|
||||
if (toread > ZIP_INT64_MAX) {
|
||||
zip_error_set(&zf->error, ZIP_ER_INVAL, 0);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if ((zf->eof) || (toread == 0))
|
||||
return 0;
|
||||
|
||||
if ((n = zip_source_read(zf->src, outbuf, toread)) < 0) {
|
||||
_zip_error_set_from_source(&zf->error, zf->src);
|
||||
return -1;
|
||||
}
|
||||
|
||||
return n;
|
||||
}
|
52
externals/libzip/libzip/lib/zip_fseek.c
vendored
Executable file
52
externals/libzip/libzip/lib/zip_fseek.c
vendored
Executable file
@@ -0,0 +1,52 @@
|
||||
/*
|
||||
zip_fseek.c -- seek in file
|
||||
Copyright (C) 2016-2018 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"
|
||||
#include <stdio.h>
|
||||
|
||||
ZIP_EXTERN zip_int8_t
|
||||
zip_fseek(zip_file_t *zf, zip_int64_t offset, int whence) {
|
||||
if (!zf)
|
||||
return -1;
|
||||
|
||||
if (zf->error.zip_err != 0)
|
||||
return -1;
|
||||
|
||||
if (zip_source_seek(zf->src, offset, whence) < 0) {
|
||||
_zip_error_set_from_source(&zf->error, zf->src);
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
55
externals/libzip/libzip/lib/zip_ftell.c
vendored
Executable file
55
externals/libzip/libzip/lib/zip_ftell.c
vendored
Executable file
@@ -0,0 +1,55 @@
|
||||
/*
|
||||
zip_ftell.c -- tell position in file
|
||||
Copyright (C) 2016-2018 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"
|
||||
#include <stdio.h>
|
||||
|
||||
ZIP_EXTERN zip_int64_t
|
||||
zip_ftell(zip_file_t *zf) {
|
||||
zip_int64_t res;
|
||||
|
||||
if (!zf)
|
||||
return -1;
|
||||
|
||||
if (zf->error.zip_err != 0)
|
||||
return -1;
|
||||
|
||||
res = zip_source_tell(zf->src);
|
||||
if (res < 0) {
|
||||
_zip_error_set_from_source(&zf->error, zf->src);
|
||||
return -1;
|
||||
}
|
||||
|
||||
return res;
|
||||
}
|
58
externals/libzip/libzip/lib/zip_get_archive_comment.c
vendored
Executable file
58
externals/libzip/libzip/lib/zip_get_archive_comment.c
vendored
Executable file
@@ -0,0 +1,58 @@
|
||||
/*
|
||||
zip_get_archive_comment.c -- get archive comment
|
||||
Copyright (C) 2006-2018 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 <string.h>
|
||||
|
||||
#include "zipint.h"
|
||||
|
||||
|
||||
ZIP_EXTERN const char *
|
||||
zip_get_archive_comment(zip_t *za, int *lenp, zip_flags_t flags) {
|
||||
zip_string_t *comment;
|
||||
zip_uint32_t len;
|
||||
const zip_uint8_t *str;
|
||||
|
||||
if ((flags & ZIP_FL_UNCHANGED) || (za->comment_changes == NULL))
|
||||
comment = za->comment_orig;
|
||||
else
|
||||
comment = za->comment_changes;
|
||||
|
||||
if ((str = _zip_string_get(comment, &len, flags, &za->error)) == NULL)
|
||||
return NULL;
|
||||
|
||||
if (lenp)
|
||||
*lenp = (int)len;
|
||||
|
||||
return (const char *)str;
|
||||
}
|
45
externals/libzip/libzip/lib/zip_get_archive_flag.c
vendored
Executable file
45
externals/libzip/libzip/lib/zip_get_archive_flag.c
vendored
Executable file
@@ -0,0 +1,45 @@
|
||||
/*
|
||||
zip_get_archive_flag.c -- get archive global flag
|
||||
Copyright (C) 2008-2018 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_get_archive_flag(zip_t *za, zip_flags_t flag, zip_flags_t flags) {
|
||||
unsigned int fl;
|
||||
|
||||
fl = (flags & ZIP_FL_UNCHANGED) ? za->flags : za->ch_flags;
|
||||
|
||||
return (fl & flag) ? 1 : 0;
|
||||
}
|
57
externals/libzip/libzip/lib/zip_get_encryption_implementation.c
vendored
Executable file
57
externals/libzip/libzip/lib/zip_get_encryption_implementation.c
vendored
Executable file
@@ -0,0 +1,57 @@
|
||||
/*
|
||||
zip_get_encryption_implementation.c -- get encryption implementation
|
||||
Copyright (C) 2009-2018 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_encryption_implementation
|
||||
_zip_get_encryption_implementation(zip_uint16_t em, int operation) {
|
||||
switch (em) {
|
||||
case ZIP_EM_TRAD_PKWARE:
|
||||
if (operation == ZIP_CODEC_ENCODE) {
|
||||
return NULL;
|
||||
}
|
||||
return zip_source_pkware;
|
||||
|
||||
#if defined(HAVE_CRYPTO)
|
||||
case ZIP_EM_AES_128:
|
||||
case ZIP_EM_AES_192:
|
||||
case ZIP_EM_AES_256:
|
||||
return operation == ZIP_CODEC_DECODE ? zip_source_winzip_aes_decode : zip_source_winzip_aes_encode;
|
||||
#endif
|
||||
|
||||
default:
|
||||
return NULL;
|
||||
}
|
||||
}
|
50
externals/libzip/libzip/lib/zip_get_file_comment.c
vendored
Executable file
50
externals/libzip/libzip/lib/zip_get_file_comment.c
vendored
Executable file
@@ -0,0 +1,50 @@
|
||||
/*
|
||||
zip_get_file_comment.c -- get file comment
|
||||
Copyright (C) 2006-2018 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.
|
||||
*/
|
||||
|
||||
|
||||
#define _ZIP_COMPILING_DEPRECATED
|
||||
#include "zipint.h"
|
||||
|
||||
|
||||
ZIP_EXTERN const char *
|
||||
zip_get_file_comment(zip_t *za, zip_uint64_t idx, int *lenp, int flags) {
|
||||
zip_uint32_t len;
|
||||
const char *s;
|
||||
|
||||
if ((s = zip_file_get_comment(za, idx, &len, (zip_flags_t)flags)) != NULL) {
|
||||
if (lenp)
|
||||
*lenp = (int)len;
|
||||
}
|
||||
|
||||
return s;
|
||||
}
|
58
externals/libzip/libzip/lib/zip_get_name.c
vendored
Executable file
58
externals/libzip/libzip/lib/zip_get_name.c
vendored
Executable file
@@ -0,0 +1,58 @@
|
||||
/*
|
||||
zip_get_name.c -- get filename for a file in zip file
|
||||
Copyright (C) 1999-2018 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 <string.h>
|
||||
|
||||
#include "zipint.h"
|
||||
|
||||
|
||||
ZIP_EXTERN const char *
|
||||
zip_get_name(zip_t *za, zip_uint64_t idx, zip_flags_t flags) {
|
||||
return _zip_get_name(za, idx, flags, &za->error);
|
||||
}
|
||||
|
||||
|
||||
const char *
|
||||
_zip_get_name(zip_t *za, zip_uint64_t idx, zip_flags_t flags, zip_error_t *error) {
|
||||
zip_dirent_t *de;
|
||||
const zip_uint8_t *str;
|
||||
|
||||
if ((de = _zip_get_dirent(za, idx, flags, error)) == NULL)
|
||||
return NULL;
|
||||
|
||||
if ((str = _zip_string_get(de->filename, NULL, flags, error)) == NULL)
|
||||
return NULL;
|
||||
|
||||
return (const char *)str;
|
||||
}
|
52
externals/libzip/libzip/lib/zip_get_num_entries.c
vendored
Executable file
52
externals/libzip/libzip/lib/zip_get_num_entries.c
vendored
Executable file
@@ -0,0 +1,52 @@
|
||||
/*
|
||||
zip_get_num_entries.c -- get number of entries in archive
|
||||
Copyright (C) 1999-2018 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_get_num_entries(zip_t *za, zip_flags_t flags) {
|
||||
zip_uint64_t n;
|
||||
|
||||
if (za == NULL)
|
||||
return -1;
|
||||
|
||||
if (flags & ZIP_FL_UNCHANGED) {
|
||||
n = za->nentry;
|
||||
while (n > 0 && za->entry[n - 1].orig == NULL)
|
||||
--n;
|
||||
return (zip_int64_t)n;
|
||||
}
|
||||
return (zip_int64_t)za->nentry;
|
||||
}
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user