Skip to content

Commit

Permalink
Import libarchive-2.8.4:
Browse files Browse the repository at this point in the history
- Improved reliability of hash function detection
- Fix issues on ancient FreeBSD, QNX, ancient NetBSD and Minix
  • Loading branch information
joerg committed Jul 9, 2010
1 parent d44d1be commit e262c40
Show file tree
Hide file tree
Showing 101 changed files with 28,454 additions and 30,948 deletions.
244 changes: 176 additions & 68 deletions archivers/libarchive/files/CMakeLists.txt
Expand Up @@ -205,13 +205,11 @@ MACRO (LA_CHECK_INCLUDE_FILE header var)
ENDIF (${var})
ENDMACRO (LA_CHECK_INCLUDE_FILE)

# Few headers that must precede other headers
# Must precede sys/extattr.h on FreeBSD
# Some FreeBSD headers assume sys/types.h was already included.
LA_CHECK_INCLUDE_FILE("sys/types.h" HAVE_SYS_TYPES_H)

# Alphabetize the rest unless there's a compelling reason
LA_CHECK_INCLUDE_FILE("acl/libacl.h" HAVE_ACL_LIBACL_H)
LA_CHECK_INCLUDE_FILE("attr/xattr.h" HAVE_ATTR_XATTR_H)
LA_CHECK_INCLUDE_FILE("ctype.h" HAVE_CTYPE_H)
LA_CHECK_INCLUDE_FILE("direct.h" HAVE_DIRECT_H)
LA_CHECK_INCLUDE_FILE("dlfcn.h" HAVE_DLFCN_H)
Expand Down Expand Up @@ -239,7 +237,6 @@ LA_CHECK_INCLUDE_FILE("string.h" HAVE_STRING_H)
LA_CHECK_INCLUDE_FILE("strings.h" HAVE_STRINGS_H)
LA_CHECK_INCLUDE_FILE("sys/acl.h" HAVE_SYS_ACL_H)
LA_CHECK_INCLUDE_FILE("sys/cdefs.h" HAVE_SYS_CDEFS_H)
LA_CHECK_INCLUDE_FILE("sys/extattr.h" HAVE_SYS_EXTATTR_H)
LA_CHECK_INCLUDE_FILE("sys/ioctl.h" HAVE_SYS_IOCTL_H)
LA_CHECK_INCLUDE_FILE("sys/mkdev.h" HAVE_SYS_MKDEV_H)
LA_CHECK_INCLUDE_FILE("sys/param.h" HAVE_SYS_PARAM_H)
Expand All @@ -266,72 +263,176 @@ LA_CHECK_INCLUDE_FILE("windows.h" HAVE_WINDOWS_H)
#
IF(ENABLE_OPENSSL)
FIND_PACKAGE(OpenSSL)
ELSE()
SET(OPENSSL_FOUND 0)
ENDIF()
IF(OPENSSL_FOUND)
INCLUDE_DIRECTORIES(${OPENSSL_INCLUDE_DIR})
LIST(APPEND ADDITIONAL_LIBS ${OPENSSL_LIBRARIES})
ELSE()
# Block OpenSSL checks and override cached results.
SET(HAVE_OPENSSL_MD5_H 0)
SET(HAVE_OPENSSL_RIPEMD_H 0)
SET(HAVE_OPENSSL_SHA_H 0)
SET(HAVE_OPENSSL_SHA256_INIT 0)
SET(HAVE_OPENSSL_SHA384_INIT 0)
SET(HAVE_OPENSSL_SHA512_INIT 0)
ENDIF()

#
# Check MD5/RMD160/SHA headers
#
LA_CHECK_INCLUDE_FILE("md5.h" HAVE_MD5_H)
LA_CHECK_INCLUDE_FILE("openssl/md5.h" HAVE_OPENSSL_MD5_H)
LA_CHECK_INCLUDE_FILE("openssl/ripemd.h" HAVE_OPENSSL_RIPEMD_H)
LA_CHECK_INCLUDE_FILE("openssl/sha.h" HAVE_OPENSSL_SHA_H)
LA_CHECK_INCLUDE_FILE("ripemd.h" HAVE_RIPEMD_H)
LA_CHECK_INCLUDE_FILE("rmd160.h" HAVE_RMD160_H)
LA_CHECK_INCLUDE_FILE("sha.h" HAVE_SHA_H)
LA_CHECK_INCLUDE_FILE("sha1.h" HAVE_SHA1_H)
LA_CHECK_INCLUDE_FILE("sha2.h" HAVE_SHA2_H)
LA_CHECK_INCLUDE_FILE("sha256.h" HAVE_SHA256_H)

#
# Find MD5/RMD160/SHA library
#
FIND_LIBRARY(CRYPTO_LIBRARY NAMES crypto)
IF(CRYPTO_LIBRARY)
LIST(APPEND ADDITIONAL_LIBS ${CRYPTO_LIBRARY})
ELSE(CRYPTO_LIBRARY)
IF(NOT OPENSSL_FOUND)
FIND_LIBRARY(MD_LIBRARY NAMES md)
IF(MD_LIBRARY)
LIST(APPEND ADDITIONAL_LIBS ${MD_LIBRARY})
ENDIF(MD_LIBRARY)
ENDIF(NOT OPENSSL_FOUND)
ENDIF(CRYPTO_LIBRARY)
#
# Check MD5/RMD160/SHA functions
#
SET(CMAKE_REQUIRED_LIBRARIES ${ADDITIONAL_LIBS})
IF(HAVE_MD5_H)
CHECK_SYMBOL_EXISTS(MD5Init "md5.h" HAVE_MD5INIT)
ENDIF(HAVE_MD5_H)
IF(HAVE_RMD160_H)
CHECK_SYMBOL_EXISTS(RMD160Init "rmd160.h" HAVE_RMD160INIT)
ENDIF(HAVE_RMD160_H)
IF(HAVE_SHA2_H)
CHECK_SYMBOL_EXISTS(SHA256Init "sha2.h" HAVE_SHA256INIT)
CHECK_SYMBOL_EXISTS(SHA384Init "sha2.h" HAVE_SHA384INIT)
CHECK_SYMBOL_EXISTS(SHA512Init "sha2.h" HAVE_SHA512INIT)
CHECK_SYMBOL_EXISTS(SHA256_Init "sha2.h" HAVE_SHA256_INIT)
CHECK_SYMBOL_EXISTS(SHA384_Init "sha2.h" HAVE_SHA384_INIT)
CHECK_SYMBOL_EXISTS(SHA512_Init "sha2.h" HAVE_SHA512_INIT)
ELSEIF(HAVE_OPENSSL_SHA_H)
CHECK_SYMBOL_EXISTS(SHA256_Init "openssl/sha.h" HAVE_OPENSSL_SHA256_INIT)
CHECK_SYMBOL_EXISTS(SHA384_Init "openssl/sha.h" HAVE_OPENSSL_SHA384_INIT)
CHECK_SYMBOL_EXISTS(SHA512_Init "openssl/sha.h" HAVE_OPENSSL_SHA512_INIT)
ENDIF()
SET(CMAKE_REQUIRED_LIBRARIES "")
# How to prove that HASH functions, which have several names on various
# platforms, can be mapped to archive_{hash name}_init,
# archive_{hash name}_update and archive_{hash name}_final through
# archive_hash.h
#
MACRO(CHECK_MD HASH IMPLEMENTATIONS)
IF(HAVE_SYS_TYPES_H)
SET(HASH_HEADER_CONFIG "#define HAVE_SYS_TYPES_H 1\n")
ELSE(HAVE_SYS_TYPES_H)
SET(HASH_HEADER_CONFIG "")
ENDIF(HAVE_SYS_TYPES_H)

FOREACH(IMPLEMENTATION ${IMPLEMENTATIONS})
IF(NOT DEFINED ARCHIVE_HASH_${HASH}_${IMPLEMENTATION})
STRING(TOLOWER "${HASH}" lower_hash)
STRING(TOUPPER "${HASH}" hash)

SET(HASH_REQUIRED_INCLUDES)
SET(TRY_HASH_REQUIRED_INCLUDES
"-DINCLUDE_DIRECTORIES:STRING=${CMAKE_CURRENT_SOURCE_DIR}/libarchive")
SET(HASH_REQUIRED_LIBS)
SET(TRY_HASH_REQUIRED_LIBS)
IF ("${IMPLEMENTATION}" MATCHES "^OPENSSL$" AND OPENSSL_FOUND)
SET(HASH_REQUIRED_INCLUDES ${OPENSSL_INCLUDE_DIR})
SET(TRY_HASH_REQUIRED_INCLUDES
"${TRY_HASH_REQUIRED_INCLUDES};${OPENSSL_INCLUDE_DIR}")
SET(HASH_REQUIRED_LIBS ${OPENSSL_LIBRARIES})
SET(TRY_HASH_REQUIRED_LIBS
"-DLINK_LIBRARIES:STRING=${OPENSSL_LIBRARIES}")
ENDIF ("${IMPLEMENTATION}" MATCHES "^OPENSSL$" AND OPENSSL_FOUND)

SET(SOURCE "#define ${hash}_COMPILE_TEST
#define ARCHIVE_HASH_${hash}_${IMPLEMENTATION}
#define __LIBARCHIVE_BUILD
${HASH_HEADER_CONFIG}
#include \"archive_hash.h\"
int
main(int argc, char **argv)
{
archive_${lower_hash}_ctx ctx;
archive_${lower_hash}_init(&ctx);
archive_${lower_hash}_update(&ctx, *argv, argc);
archive_${lower_hash}_final(&ctx, *argv);
return 0;
}
")

FILE(WRITE "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/check_hash_md.c" "${SOURCE}")
MESSAGE(STATUS "Checking support for ARCHIVE_HASH_${HASH}_${IMPLEMENTATION}")

TRY_COMPILE(ARCHIVE_HASH_${HASH}_${IMPLEMENTATION}
${CMAKE_BINARY_DIR}
${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/check_hash_md.c
CMAKE_FLAGS
"${TRY_HASH_REQUIRED_LIBS}"
"${TRY_HASH_REQUIRED_INCLUDES}"
OUTPUT_VARIABLE OUTPUT)

IF (ARCHIVE_HASH_${HASH}_${IMPLEMENTATION})
MESSAGE(STATUS "Checking support for ARCHIVE_HASH_${HASH}_${IMPLEMENTATION} -- found")
IF (HASH_REQUIRED_INCLUDES)
INCLUDE_DIRECTORIES(${HASH_REQUIRED_INCLUDES})
ENDIF (HASH_REQUIRED_INCLUDES)
IF (HASH_REQUIRED_LIBS)
LIST(APPEND ADDITIONAL_LIBS ${HASH_REQUIRED_LIBS})
LIST(REMOVE_DUPLICATES ADDITIONAL_LIBS)
ENDIF (HASH_REQUIRED_LIBS)
BREAK()
ENDIF (ARCHIVE_HASH_${HASH}_${IMPLEMENTATION})

MESSAGE(STATUS "Checking support for ARCHIVE_HASH_${HASH}_${IMPLEMENTATION} -- not found")
FILE(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeOutput.log
"Checking support for ARCHIVE_HASH_${HASH}_${IMPLEMENTATION} failed with the following output:\n"
"${OUTPUT}\n"
"Source file was:\n${SOURCE}\n")
ELSE(NOT DEFINED ARCHIVE_HASH_${HASH}_${IMPLEMENTATION})
IF(ARCHIVE_HASH_${HASH}_${IMPLEMENTATION})
BREAK()
ENDIF(ARCHIVE_HASH_${HASH}_${IMPLEMENTATION})
ENDIF(NOT DEFINED ARCHIVE_HASH_${HASH}_${IMPLEMENTATION})
ENDFOREACH(IMPLEMENTATION)
ENDMACRO(CHECK_MD HASH IMPLEMENTATIONS)

#
# HASH functions on Windows is defined at archive_windows.c, thus we do not
# need the test what the functions can be mapped to archive_{hash name}_init,
# archive_{hash name}_update and archive_{hash name}_final.
# The functions on Windows use CALG_{hash name} macro to create a crypt object
# and then we need to know what CALG_{hash name} macros is available to show
# ARCHIVE_HASH_{hash name}_WIN macros because Windows 2000 and earlier version
# of Windows XP do not support SHA256, SHA384 and SHA512.
#
MACRO(CHECK_HASH_WIN HASH_LIST)
IF(WIN32 AND NOT CYGWIN)
FOREACH(HASH ${HASH_LIST})
IF(NOT DEFINED ARCHIVE_HASH_${HASH}_WIN)
STRING(TOUPPER "${HASH}" hash)
SET(ALGID "")
IF ("${HASH}" MATCHES "^MD5$")
SET(ALGID "CALG_MD5")
ENDIF ("${HASH}" MATCHES "^MD5$")
IF ("${HASH}" MATCHES "^SHA1$")
SET(ALGID "CALG_SHA1")
ENDIF ("${HASH}" MATCHES "^SHA1$")
IF ("${HASH}" MATCHES "^SHA256$")
SET(ALGID "CALG_SHA_256")
ENDIF ("${HASH}" MATCHES "^SHA256$")
IF ("${HASH}" MATCHES "^SHA384$")
SET(ALGID "CALG_SHA_384")
ENDIF ("${HASH}" MATCHES "^SHA384$")
IF ("${HASH}" MATCHES "^SHA512$")
SET(ALGID "CALG_SHA_512")
ENDIF ("${HASH}" MATCHES "^SHA512$")

SET(SOURCE "#define ${hash}_COMPILE_TEST
#define _WIN32_WINNT ${_WIN32_WINNT}
#define WINVER ${WINVER}
#include <windows.h>
#include <wincrypt.h>
int
main(int argc, char **argv)
{
return ${ALGID};
}
")
SET(SOURCE_FILE "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/check_hash_win.c")

FILE(WRITE "${SOURCE_FILE}" "${SOURCE}")
MESSAGE(STATUS "Checking support for ARCHIVE_HASH_${HASH}_WIN")

TRY_COMPILE(ARCHIVE_HASH_${HASH}_WIN
${CMAKE_BINARY_DIR}
${SOURCE_FILE}
CMAKE_FLAGS "-DINCLUDE_DIRECTORIES:STRING=${CMAKE_CURRENT_SOURCE_DIR}/libarchive"
OUTPUT_VARIABLE OUTPUT)

IF (ARCHIVE_HASH_${HASH}_WIN)
MESSAGE(STATUS
"Checking support for ARCHIVE_HASH_${HASH}_WIN -- found")
ELSE (ARCHIVE_HASH_${HASH}_WIN)
MESSAGE(STATUS
"Checking support for ARCHIVE_HASH_${HASH}_WIN -- not found")
FILE(APPEND
${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeOutput.log
"Checking support for ARCHIVE_HASH_${HASH}_WIN failed with the following output:\n"
"${OUTPUT}\n"
"Source file was:\n${SOURCE}\n")
ENDIF (ARCHIVE_HASH_${HASH}_WIN)

ENDIF(NOT DEFINED ARCHIVE_HASH_${HASH}_WIN)
ENDFOREACH(HASH)
ENDIF(WIN32 AND NOT CYGWIN)
ENDMACRO(CHECK_HASH_WIN HASH_LIST)

#
# Check MD5/RMD160/SHA support
#
CHECK_MD(MD5 "LIBC;LIBSYSTEM;OPENSSL")
CHECK_MD(RMD160 "LIBC;OPENSSL")
CHECK_MD(SHA1 "LIBC;LIBSYSTEM;OPENSSL")
CHECK_MD(SHA256 "LIBC;LIBC2;LIBC3;LIBSYSTEM;OPENSSL")
CHECK_MD(SHA384 "LIBC;LIBC2;LIBC3;LIBSYSTEM;OPENSSL")
CHECK_MD(SHA512 "LIBC;LIBC2;LIBC3;LIBSYSTEM;OPENSSL")
CHECK_HASH_WIN("MD5;SHA1;SHA256;SHA384;SHA512")

#
# Find Libxml2
Expand Down Expand Up @@ -382,6 +483,10 @@ CHECK_FUNCTION_EXISTS_GLIBC(ftruncate HAVE_FTRUNCATE)
CHECK_FUNCTION_EXISTS_GLIBC(futimens HAVE_FUTIMENS)
CHECK_FUNCTION_EXISTS_GLIBC(futimes HAVE_FUTIMES)
CHECK_FUNCTION_EXISTS_GLIBC(geteuid HAVE_GETEUID)
CHECK_FUNCTION_EXISTS_GLIBC(getgrgid_r HAVE_GETGRGID_R)
CHECK_FUNCTION_EXISTS_GLIBC(getgrnam_r HAVE_GETGRNAM_R)
CHECK_FUNCTION_EXISTS_GLIBC(getpwnam_r HAVE_GETPWNAM_R)
CHECK_FUNCTION_EXISTS_GLIBC(getpwuid_r HAVE_GETPWUID_R)
CHECK_FUNCTION_EXISTS_GLIBC(getpid HAVE_GETPID)
CHECK_FUNCTION_EXISTS_GLIBC(lchflags HAVE_LCHFLAGS)
CHECK_FUNCTION_EXISTS_GLIBC(lchmod HAVE_LCHMOD)
Expand Down Expand Up @@ -415,6 +520,7 @@ CHECK_FUNCTION_EXISTS_GLIBC(utimes HAVE_UTIMES)
CHECK_FUNCTION_EXISTS_GLIBC(utimensat HAVE_UTIMENSAT)
CHECK_FUNCTION_EXISTS_GLIBC(vfork HAVE_VFORK)
CHECK_FUNCTION_EXISTS_GLIBC(wcrtomb HAVE_WCRTOMB)
CHECK_FUNCTION_EXISTS_GLIBC(wcscmp HAVE_WCSCMP)
CHECK_FUNCTION_EXISTS_GLIBC(wcscpy HAVE_WCSCPY)
CHECK_FUNCTION_EXISTS_GLIBC(wcslen HAVE_WCSLEN)
CHECK_FUNCTION_EXISTS_GLIBC(wctomb HAVE_WCTOMB)
Expand Down Expand Up @@ -647,10 +753,12 @@ CHECK_FILE_OFFSET_BITS()
IF(ENABLE_XATTR)
LA_CHECK_INCLUDE_FILE(attr/xattr.h HAVE_ATTR_XATTR_H)
LA_CHECK_INCLUDE_FILE(sys/xattr.h HAVE_SYS_XATTR_H)
LA_CHECK_INCLUDE_FILE(sys/extattr.h HAVE_SYS_EXTATTR_H)
CHECK_LIBRARY_EXISTS(attr "setxattr" "" HAVE_ATTR_LIB)
IF(HAVE_ATTR_LIB)
SET(CMAKE_REQUIRED_LIBRARIES "attr")
ENDIF(HAVE_ATTR_LIB)
CHECK_SYMBOL_EXISTS(EXTATTR_NAMESPACE_USER "sys/types.h;sys/extattr.h" HAVE_DECL_EXTATTR_NAMESPACE_USER)
CHECK_FUNCTION_EXISTS_GLIBC(extattr_get_file HAVE_EXTATTR_GET_FILE)
CHECK_FUNCTION_EXISTS_GLIBC(extattr_list_file HAVE_EXTATTR_LIST_FILE)
CHECK_FUNCTION_EXISTS_GLIBC(extattr_set_fd HAVE_EXTATTR_SET_FD)
Expand Down
4 changes: 4 additions & 0 deletions archivers/libarchive/files/Makefile.am
Expand Up @@ -617,6 +617,10 @@ bsdcpio_test_EXTRA_DIST= \
cpio/test/test_gcpio_compat_ref.crc.uu \
cpio/test/test_gcpio_compat_ref.newc.uu \
cpio/test/test_gcpio_compat_ref.ustar.uu \
cpio/test/test_gcpio_compat_ref_nosym.bin.uu \
cpio/test/test_gcpio_compat_ref_nosym.crc.uu \
cpio/test/test_gcpio_compat_ref_nosym.newc.uu \
cpio/test/test_gcpio_compat_ref_nosym.ustar.uu \
cpio/test/test_option_f.cpio.uu \
cpio/test/test_option_m.cpio.uu \
cpio/test/test_option_t.cpio.uu \
Expand Down

0 comments on commit e262c40

Please sign in to comment.