Update vendor/libarchive to git d6b1bb9f7ea7bc153b7356e8e345c9e48005821a
Release 3.3.1 Notable vendor changes: PR #501: improvements in ACL path handling PR #724: fix hang when reading malformed cpio files PR #864: fix out of bounds read with malformed GNU tar archives Test suite improvements New options to bsdtar that enable or disable reading and/or writing of: Access Control Lists (--acls, --no-acls) Extended file flags (--fflags, --no-fflags) Extended attributes (--xattrs, --no-xattrs)
This commit is contained in:
parent
b2ee1181b4
commit
4b729aff5b
@ -15,7 +15,7 @@ endif()
|
||||
# RelWithDebInfo : Release build with Debug Info
|
||||
# MinSizeRel : Release Min Size build
|
||||
IF(NOT CMAKE_BUILD_TYPE)
|
||||
SET(CMAKE_BUILD_TYPE "Debug" CACHE STRING "Build Type" FORCE)
|
||||
SET(CMAKE_BUILD_TYPE "Release" CACHE STRING "Build Type" FORCE)
|
||||
ENDIF(NOT CMAKE_BUILD_TYPE)
|
||||
# Set a value type to properly display CMAKE_BUILD_TYPE on GUI if the
|
||||
# value type is "UNINITIALIZED".
|
||||
@ -44,13 +44,13 @@ SET(CMAKE_MACOSX_RPATH ON)
|
||||
#
|
||||
FILE(STRINGS ${CMAKE_CURRENT_SOURCE_DIR}/build/version _version)
|
||||
STRING(REGEX REPLACE
|
||||
"^([0-9])[0-9][0-9][0-9][0-9][0-9][0-9][a-z]?$" "\\1" _major ${_version})
|
||||
"^([0-9])[0-9][0-9][0-9][0-9][0-9][0-9][a-z]*$" "\\1" _major ${_version})
|
||||
STRING(REGEX REPLACE
|
||||
"^[0-9]([0-9][0-9][0-9])[0-9][0-9][0-9][a-z]?$" "\\1" _minor ${_version})
|
||||
"^[0-9]([0-9][0-9][0-9])[0-9][0-9][0-9][a-z]*$" "\\1" _minor ${_version})
|
||||
STRING(REGEX REPLACE
|
||||
"^[0-9][0-9][0-9][0-9]([0-9][0-9][0-9])[a-z]?$" "\\1" _revision ${_version})
|
||||
"^[0-9][0-9][0-9][0-9]([0-9][0-9][0-9])[a-z]*$" "\\1" _revision ${_version})
|
||||
STRING(REGEX REPLACE
|
||||
"^[0-9][0-9][0-9][0-9][0-9][0-9][0-9]([a-z]?)$" "\\1" _quality ${_version})
|
||||
"^[0-9][0-9][0-9][0-9][0-9][0-9][0-9]([a-z]*)$" "\\1" _quality ${_version})
|
||||
SET(_version_number ${_major}${_minor}${_revision})
|
||||
STRING(REGEX REPLACE "[0]*([^0]*[0-9])$" "\\1" _trimmed_minor ${_minor})
|
||||
STRING(REGEX REPLACE "[0]*([^0]*[0-9])$" "\\1" _trimmed_revision ${_revision})
|
||||
@ -462,6 +462,8 @@ ENDIF()
|
||||
IF(LIBLZMA_FOUND)
|
||||
SET(HAVE_LIBLZMA 1)
|
||||
SET(HAVE_LZMA_H 1)
|
||||
SET(CMAKE_REQUIRED_INCLUDES ${LIBLZMA_INCLUDE_DIR})
|
||||
SET(CMAKE_REQUIRED_LIBRARIES ${LIBLZMA_LIBRARIES})
|
||||
INCLUDE_DIRECTORIES(${LIBLZMA_INCLUDE_DIRS})
|
||||
LIST(APPEND ADDITIONAL_LIBS ${LIBLZMA_LIBRARIES})
|
||||
# Test if a macro is needed for the library.
|
||||
@ -570,6 +572,11 @@ LA_CHECK_INCLUDE_FILE("limits.h" HAVE_LIMITS_H)
|
||||
LA_CHECK_INCLUDE_FILE("linux/types.h" HAVE_LINUX_TYPES_H)
|
||||
LA_CHECK_INCLUDE_FILE("linux/fiemap.h" HAVE_LINUX_FIEMAP_H)
|
||||
LA_CHECK_INCLUDE_FILE("linux/fs.h" HAVE_LINUX_FS_H)
|
||||
|
||||
CHECK_C_SOURCE_COMPILES("#include <sys/ioctl.h>
|
||||
#include <linux/fs.h>
|
||||
int main(void) { return FS_IOC_GETFLAGS; }" HAVE_WORKING_FS_IOC_GETFLAGS)
|
||||
|
||||
LA_CHECK_INCLUDE_FILE("linux/magic.h" HAVE_LINUX_MAGIC_H)
|
||||
LA_CHECK_INCLUDE_FILE("locale.h" HAVE_LOCALE_H)
|
||||
LA_CHECK_INCLUDE_FILE("memory.h" HAVE_MEMORY_H)
|
||||
|
27
Makefile.am
27
Makefile.am
@ -23,7 +23,7 @@ TESTS_ENVIRONMENT= $(libarchive_TESTS_ENVIRONMENT) $(bsdtar_TESTS_ENVIRONMENT) $
|
||||
DISTCHECK_CONFIGURE_FLAGS = --enable-bsdtar --enable-bsdcpio
|
||||
# The next line is commented out by default in shipping libarchive releases.
|
||||
# It is uncommented by default in trunk.
|
||||
DEV_CFLAGS=-Werror -Wextra -Wunused -Wshadow -Wmissing-prototypes -Wcast-qual -g
|
||||
# DEV_CFLAGS=-Werror -Wextra -Wunused -Wshadow -Wmissing-prototypes -Wcast-qual -g
|
||||
AM_CFLAGS=$(DEV_CFLAGS)
|
||||
PLATFORMCPPFLAGS = @PLATFORMCPPFLAGS@
|
||||
AM_CPPFLAGS=$(PLATFORMCPPFLAGS)
|
||||
@ -310,7 +310,9 @@ pkgconfig_DATA = build/pkgconfig/libarchive.pc
|
||||
# Sources needed by all test programs
|
||||
test_utils_SOURCES= \
|
||||
test_utils/test_utils.c \
|
||||
test_utils/test_utils.h
|
||||
test_utils/test_utils.h \
|
||||
test_utils/test_main.c \
|
||||
test_utils/test_common.h
|
||||
|
||||
#
|
||||
#
|
||||
@ -320,7 +322,6 @@ test_utils_SOURCES= \
|
||||
libarchive_test_SOURCES= \
|
||||
$(libarchive_la_SOURCES) \
|
||||
$(test_utils_SOURCES) \
|
||||
libarchive/test/main.c \
|
||||
libarchive/test/read_open_memory.c \
|
||||
libarchive/test/test.h \
|
||||
libarchive/test/test_acl_nfs4.c \
|
||||
@ -586,7 +587,13 @@ libarchive_test_SOURCES= \
|
||||
libarchive/test/test_write_read_format_zip.c \
|
||||
libarchive/test/test_zip_filename_encoding.c
|
||||
|
||||
libarchive_test_CPPFLAGS= -I$(top_srcdir)/libarchive -I$(top_srcdir)/test_utils -I$(top_builddir)/libarchive/test -DLIBARCHIVE_STATIC $(PLATFORMCPPFLAGS)
|
||||
libarchive_test_CPPFLAGS= \
|
||||
-I$(top_srcdir)/libarchive \
|
||||
-I$(top_srcdir)/libarchive/test \
|
||||
-I$(top_srcdir)/test_utils \
|
||||
-I$(top_builddir)/libarchive/test \
|
||||
-DLIBARCHIVE_STATIC $(PLATFORMCPPFLAGS)
|
||||
|
||||
libarchive_test_LDADD= $(LTLIBICONV)
|
||||
|
||||
# The "list.h" file just lists all of the tests defined in all of the sources.
|
||||
@ -918,7 +925,6 @@ endif
|
||||
|
||||
bsdtar_test_SOURCES= \
|
||||
$(test_utils_SOURCES) \
|
||||
tar/test/main.c \
|
||||
tar/test/test.h \
|
||||
tar/test/test_0.c \
|
||||
tar/test/test_basic.c \
|
||||
@ -981,7 +987,8 @@ bsdtar_test_SOURCES= \
|
||||
bsdtar_test_CPPFLAGS=\
|
||||
-I$(top_srcdir)/libarchive -I$(top_srcdir)/libarchive_fe \
|
||||
-I$(top_srcdir)/test_utils \
|
||||
-I$(top_srcdir)/tar -I$(top_builddir)/tar/test \
|
||||
-I$(top_srcdir)/tar -I$(top_srcdir)/tar/test \
|
||||
-I$(top_builddir)/tar/test \
|
||||
$(PLATFORMCPPFLAGS)
|
||||
|
||||
tar/test/list.h: Makefile
|
||||
@ -1076,7 +1083,6 @@ endif
|
||||
bsdcpio_test_SOURCES= \
|
||||
$(test_utils_SOURCES) \
|
||||
cpio/cmdline.c \
|
||||
cpio/test/main.c \
|
||||
cpio/test/test.h \
|
||||
cpio/test/test_0.c \
|
||||
cpio/test/test_basic.c \
|
||||
@ -1128,7 +1134,8 @@ bsdcpio_test_SOURCES= \
|
||||
bsdcpio_test_CPPFLAGS= \
|
||||
-I$(top_srcdir)/libarchive -I$(top_srcdir)/libarchive_fe \
|
||||
-I$(top_srcdir)/test_utils \
|
||||
-I$(top_srcdir)/cpio -I$(top_builddir)/cpio/test \
|
||||
-I$(top_srcdir)/cpio -I$(top_srcdir)/cpio/test \
|
||||
-I$(top_builddir)/cpio/test \
|
||||
$(PLATFORMCPPFLAGS)
|
||||
bsdcpio_test_LDADD=libarchive_fe.la
|
||||
|
||||
@ -1223,7 +1230,6 @@ endif
|
||||
|
||||
bsdcat_test_SOURCES= \
|
||||
$(test_utils_SOURCES) \
|
||||
cat/test/main.c \
|
||||
cat/test/test.h \
|
||||
cat/test/test_0.c \
|
||||
cat/test/test_empty_gz.c \
|
||||
@ -1244,7 +1250,8 @@ bsdcat_test_SOURCES= \
|
||||
bsdcat_test_CPPFLAGS= \
|
||||
-I$(top_srcdir)/libarchive -I$(top_srcdir)/libarchive_fe \
|
||||
-I$(top_srcdir)/test_utils \
|
||||
-I$(top_srcdir)/cat -I$(top_builddir)/cat/test \
|
||||
-I$(top_srcdir)/cat -I$(top_srcdir)/cat/test \
|
||||
-I$(top_builddir)/cat/test \
|
||||
$(PLATFORMCPPFLAGS)
|
||||
bsdcat_test_LDADD=libarchive_fe.la
|
||||
|
||||
|
8
NEWS
8
NEWS
@ -1,3 +1,9 @@
|
||||
Feb 26, 2017: libarchive 3.3.1 released
|
||||
Security & Feature release
|
||||
|
||||
Feb 19, 2017: libarchive 3.3.0 released
|
||||
Security & Feature release
|
||||
|
||||
Jan 29, 2017: Limited NFSv4 ACL support for Mac OS (Darwin)
|
||||
|
||||
Jan 10, 2017: POSIX.1e and NFSv4 ACL support for Solaris and derivates
|
||||
@ -5,6 +11,8 @@ Jan 10, 2017: POSIX.1e and NFSv4 ACL support for Solaris and derivates
|
||||
Dec 27, 2016: NFSv4 ACL read and write support for pax
|
||||
Deprecated functions: archive_entry_acl_text(), archive_entry_acl_text_w()
|
||||
|
||||
Nov, 2016: libarchive is now being tested by the OSS-Fuzz project
|
||||
|
||||
Oct 26, 2016: Remove liblzmadec support
|
||||
|
||||
Oct 23, 2016: libarchive 3.2.2 released
|
||||
|
@ -51,6 +51,7 @@ perl -p -i -e 's/(m4_define\(\[LIBARCHIVE_VERSION_N\]),.*\)/$1,['"$VN"'])/' conf
|
||||
# Remove developer CFLAGS if a release build is being made
|
||||
if [ -n "${MAKE_LIBARCHIVE_RELEASE}" ]; then
|
||||
perl -p -i -e "s/^(DEV_CFLAGS.*)/# \$1/" Makefile.am
|
||||
perl -p -i -e 's/CMAKE_BUILD_TYPE "[A-Za-z]*"/CMAKE_BUILD_TYPE "Release"/' CMakeLists.txt
|
||||
fi
|
||||
|
||||
set -xe
|
||||
|
@ -1099,6 +1099,9 @@ typedef uint64_t uintmax_t;
|
||||
/* Define to 1 if you have a working EXT2_IOC_GETFLAGS */
|
||||
#cmakedefine HAVE_WORKING_EXT2_IOC_GETFLAGS 1
|
||||
|
||||
/* Define to 1 if you have a working FS_IOC_GETFLAGS */
|
||||
#cmakedefine HAVE_WORKING_FS_IOC_GETFLAGS 1
|
||||
|
||||
/* Define to 1 if you have the <zlib.h> header file. */
|
||||
#cmakedefine HAVE_ZLIB_H 1
|
||||
|
||||
|
@ -1 +1 @@
|
||||
3002002
|
||||
3003001
|
||||
|
@ -6,7 +6,7 @@
|
||||
IF(ENABLE_CAT AND ENABLE_TEST)
|
||||
SET(bsdcat_test_SOURCES
|
||||
../../test_utils/test_utils.c
|
||||
main.c
|
||||
../../test_utils/test_main.c
|
||||
test.h
|
||||
test_0.c
|
||||
test_empty_gz.c
|
||||
@ -54,6 +54,7 @@ IF(ENABLE_CAT AND ENABLE_TEST)
|
||||
INCLUDE(${CMAKE_CURRENT_BINARY_DIR}/list.h)
|
||||
INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR})
|
||||
INCLUDE_DIRECTORIES(${PROJECT_SOURCE_DIR}/test_utils)
|
||||
INCLUDE_DIRECTORIES(${PROJECT_SOURCE_DIR}/cat/test)
|
||||
|
||||
# Experimental new test handling
|
||||
ADD_CUSTOM_TARGET(run_bsdcat_test
|
||||
|
3072
cat/test/main.c
3072
cat/test/main.c
File diff suppressed because it is too large
Load Diff
334
cat/test/test.h
334
cat/test/test.h
@ -27,328 +27,14 @@
|
||||
|
||||
/* Every test program should #include "test.h" as the first thing. */
|
||||
|
||||
/*
|
||||
* The goal of this file (and the matching test.c) is to
|
||||
* simplify the very repetitive test-*.c test programs.
|
||||
*/
|
||||
#if defined(HAVE_CONFIG_H)
|
||||
/* Most POSIX platforms use the 'configure' script to build config.h */
|
||||
#include "config.h"
|
||||
#elif defined(__FreeBSD__)
|
||||
/* Building as part of FreeBSD system requires a pre-built config.h. */
|
||||
#include "config_freebsd.h"
|
||||
#elif defined(_WIN32) && !defined(__CYGWIN__)
|
||||
/* Win32 can't run the 'configure' script. */
|
||||
#include "config_windows.h"
|
||||
#else
|
||||
/* Warn if the library hasn't been (automatically or manually) configured. */
|
||||
#error Oops: No config.h and no pre-built configuration in test.h.
|
||||
#endif
|
||||
#define KNOWNREF "test_expand.Z.uu"
|
||||
#define ENVBASE "BSDCAT" /* Prefix for environment variables. */
|
||||
#define PROGRAM "bsdcat" /* Name of program being tested. */
|
||||
#define PROGRAM_ALIAS "cat" /* Generic alias for program */
|
||||
#undef LIBRARY /* Not testing a library. */
|
||||
#undef EXTRA_DUMP /* How to dump extra data */
|
||||
#undef EXTRA_ERRNO /* How to dump errno */
|
||||
/* How to generate extra version info. */
|
||||
#define EXTRA_VERSION (systemf("%s --version", testprog) ? "" : "")
|
||||
|
||||
#include <sys/types.h> /* Windows requires this before sys/stat.h */
|
||||
#include <sys/stat.h>
|
||||
|
||||
#if HAVE_DIRENT_H
|
||||
#include <dirent.h>
|
||||
#endif
|
||||
#ifdef HAVE_DIRECT_H
|
||||
#include <direct.h>
|
||||
#define dirent direct
|
||||
#endif
|
||||
#include <errno.h>
|
||||
#include <fcntl.h>
|
||||
#ifdef HAVE_IO_H
|
||||
#include <io.h>
|
||||
#endif
|
||||
#ifdef HAVE_STDINT_H
|
||||
#include <stdint.h>
|
||||
#endif
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <ctype.h>
|
||||
#include <time.h>
|
||||
#ifdef HAVE_UNISTD_H
|
||||
#include <unistd.h>
|
||||
#endif
|
||||
#include <wchar.h>
|
||||
#ifdef HAVE_WINDOWS_H
|
||||
#include <windows.h>
|
||||
#endif
|
||||
|
||||
/*
|
||||
* System-specific tweaks. We really want to minimize these
|
||||
* as much as possible, since they make it harder to understand
|
||||
* the mainline code.
|
||||
*/
|
||||
|
||||
/* Windows (including Visual Studio and MinGW but not Cygwin) */
|
||||
#if defined(_WIN32) && !defined(__CYGWIN__)
|
||||
#if !defined(__BORLANDC__)
|
||||
#undef chdir
|
||||
#define chdir _chdir
|
||||
#define strdup _strdup
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/* Visual Studio */
|
||||
#if defined(_MSC_VER) && _MSC_VER < 1900
|
||||
#define snprintf sprintf_s
|
||||
#endif
|
||||
|
||||
#if defined(__BORLANDC__)
|
||||
#pragma warn -8068 /* Constant out of range in comparison. */
|
||||
#endif
|
||||
|
||||
/* Haiku OS and QNX */
|
||||
#if defined(__HAIKU__) || defined(__QNXNTO__)
|
||||
/* Haiku and QNX have typedefs in stdint.h (needed for int64_t) */
|
||||
#include <stdint.h>
|
||||
#endif
|
||||
|
||||
/* Get a real definition for __FBSDID if we can */
|
||||
#if HAVE_SYS_CDEFS_H
|
||||
#include <sys/cdefs.h>
|
||||
#endif
|
||||
|
||||
/* If not, define it so as to avoid dangling semicolons. */
|
||||
#ifndef __FBSDID
|
||||
#define __FBSDID(a) struct _undefined_hack
|
||||
#endif
|
||||
|
||||
#ifndef O_BINARY
|
||||
#define O_BINARY 0
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Redefine DEFINE_TEST for use in defining the test functions.
|
||||
*/
|
||||
#undef DEFINE_TEST
|
||||
#define DEFINE_TEST(name) void name(void); void name(void)
|
||||
|
||||
/* An implementation of the standard assert() macro */
|
||||
#define assert(e) assertion_assert(__FILE__, __LINE__, (e), #e, NULL)
|
||||
/* chdir() and error if it fails */
|
||||
#define assertChdir(path) \
|
||||
assertion_chdir(__FILE__, __LINE__, path)
|
||||
/* Assert two integers are the same. Reports value of each one if not. */
|
||||
#define assertEqualInt(v1,v2) \
|
||||
assertion_equal_int(__FILE__, __LINE__, (v1), #v1, (v2), #v2, NULL)
|
||||
/* Assert two strings are the same. Reports value of each one if not. */
|
||||
#define assertEqualString(v1,v2) \
|
||||
assertion_equal_string(__FILE__, __LINE__, (v1), #v1, (v2), #v2, NULL, 0)
|
||||
#define assertEqualUTF8String(v1,v2) \
|
||||
assertion_equal_string(__FILE__, __LINE__, (v1), #v1, (v2), #v2, NULL, 1)
|
||||
/* As above, but v1 and v2 are wchar_t * */
|
||||
#define assertEqualWString(v1,v2) \
|
||||
assertion_equal_wstring(__FILE__, __LINE__, (v1), #v1, (v2), #v2, NULL)
|
||||
/* As above, but raw blocks of bytes. */
|
||||
#define assertEqualMem(v1, v2, l) \
|
||||
assertion_equal_mem(__FILE__, __LINE__, (v1), #v1, (v2), #v2, (l), #l, NULL)
|
||||
/* Assert that memory is full of a specified byte */
|
||||
#define assertMemoryFilledWith(v1, l, b) \
|
||||
assertion_memory_filled_with(__FILE__, __LINE__, (v1), #v1, (l), #l, (b), #b, NULL)
|
||||
/* Assert two files are the same. */
|
||||
#define assertEqualFile(f1, f2) \
|
||||
assertion_equal_file(__FILE__, __LINE__, (f1), (f2))
|
||||
/* Assert that a file is empty. */
|
||||
#define assertEmptyFile(pathname) \
|
||||
assertion_empty_file(__FILE__, __LINE__, (pathname))
|
||||
/* Assert that a file is not empty. */
|
||||
#define assertNonEmptyFile(pathname) \
|
||||
assertion_non_empty_file(__FILE__, __LINE__, (pathname))
|
||||
#define assertFileAtime(pathname, sec, nsec) \
|
||||
assertion_file_atime(__FILE__, __LINE__, pathname, sec, nsec)
|
||||
#define assertFileAtimeRecent(pathname) \
|
||||
assertion_file_atime_recent(__FILE__, __LINE__, pathname)
|
||||
#define assertFileBirthtime(pathname, sec, nsec) \
|
||||
assertion_file_birthtime(__FILE__, __LINE__, pathname, sec, nsec)
|
||||
#define assertFileBirthtimeRecent(pathname) \
|
||||
assertion_file_birthtime_recent(__FILE__, __LINE__, pathname)
|
||||
/* Assert that a file exists; supports printf-style arguments. */
|
||||
#define assertFileExists(pathname) \
|
||||
assertion_file_exists(__FILE__, __LINE__, pathname)
|
||||
/* Assert that a file exists. */
|
||||
#define assertFileNotExists(pathname) \
|
||||
assertion_file_not_exists(__FILE__, __LINE__, pathname)
|
||||
/* Assert that file contents match a string. */
|
||||
#define assertFileContents(data, data_size, pathname) \
|
||||
assertion_file_contents(__FILE__, __LINE__, data, data_size, pathname)
|
||||
/* Verify that a file does not contain invalid strings */
|
||||
#define assertFileContainsNoInvalidStrings(pathname, strings) \
|
||||
assertion_file_contains_no_invalid_strings(__FILE__, __LINE__, pathname, strings)
|
||||
#define assertFileMtime(pathname, sec, nsec) \
|
||||
assertion_file_mtime(__FILE__, __LINE__, pathname, sec, nsec)
|
||||
#define assertFileMtimeRecent(pathname) \
|
||||
assertion_file_mtime_recent(__FILE__, __LINE__, pathname)
|
||||
#define assertFileNLinks(pathname, nlinks) \
|
||||
assertion_file_nlinks(__FILE__, __LINE__, pathname, nlinks)
|
||||
#define assertFileSize(pathname, size) \
|
||||
assertion_file_size(__FILE__, __LINE__, pathname, size)
|
||||
#define assertFileMode(pathname, mode) \
|
||||
assertion_file_mode(__FILE__, __LINE__, pathname, mode)
|
||||
#define assertTextFileContents(text, pathname) \
|
||||
assertion_text_file_contents(__FILE__, __LINE__, text, pathname)
|
||||
#define assertFileContainsLinesAnyOrder(pathname, lines) \
|
||||
assertion_file_contains_lines_any_order(__FILE__, __LINE__, pathname, lines)
|
||||
#define assertIsDir(pathname, mode) \
|
||||
assertion_is_dir(__FILE__, __LINE__, pathname, mode)
|
||||
#define assertIsHardlink(path1, path2) \
|
||||
assertion_is_hardlink(__FILE__, __LINE__, path1, path2)
|
||||
#define assertIsNotHardlink(path1, path2) \
|
||||
assertion_is_not_hardlink(__FILE__, __LINE__, path1, path2)
|
||||
#define assertIsReg(pathname, mode) \
|
||||
assertion_is_reg(__FILE__, __LINE__, pathname, mode)
|
||||
#define assertIsSymlink(pathname, contents) \
|
||||
assertion_is_symlink(__FILE__, __LINE__, pathname, contents)
|
||||
/* Create a directory, report error if it fails. */
|
||||
#define assertMakeDir(dirname, mode) \
|
||||
assertion_make_dir(__FILE__, __LINE__, dirname, mode)
|
||||
#define assertMakeFile(path, mode, contents) \
|
||||
assertion_make_file(__FILE__, __LINE__, path, mode, -1, contents)
|
||||
#define assertMakeBinFile(path, mode, csize, contents) \
|
||||
assertion_make_file(__FILE__, __LINE__, path, mode, csize, contents)
|
||||
#define assertMakeHardlink(newfile, oldfile) \
|
||||
assertion_make_hardlink(__FILE__, __LINE__, newfile, oldfile)
|
||||
#define assertMakeSymlink(newfile, linkto) \
|
||||
assertion_make_symlink(__FILE__, __LINE__, newfile, linkto)
|
||||
#define assertNodump(path) \
|
||||
assertion_nodump(__FILE__, __LINE__, path)
|
||||
#define assertUmask(mask) \
|
||||
assertion_umask(__FILE__, __LINE__, mask)
|
||||
#define assertUtimes(pathname, atime, atime_nsec, mtime, mtime_nsec) \
|
||||
assertion_utimes(__FILE__, __LINE__, pathname, atime, atime_nsec, mtime, mtime_nsec)
|
||||
|
||||
/*
|
||||
* This would be simple with C99 variadic macros, but I don't want to
|
||||
* require that. Instead, I insert a function call before each
|
||||
* skipping() call to pass the file and line information down. Crude,
|
||||
* but effective.
|
||||
*/
|
||||
#define skipping \
|
||||
skipping_setup(__FILE__, __LINE__);test_skipping
|
||||
|
||||
/* Function declarations. These are defined in test_utility.c. */
|
||||
void failure(const char *fmt, ...);
|
||||
int assertion_assert(const char *, int, int, const char *, void *);
|
||||
int assertion_chdir(const char *, int, const char *);
|
||||
int assertion_empty_file(const char *, int, const char *);
|
||||
int assertion_equal_file(const char *, int, const char *, const char *);
|
||||
int assertion_equal_int(const char *, int, long long, const char *, long long, const char *, void *);
|
||||
int assertion_equal_mem(const char *, int, const void *, const char *, const void *, const char *, size_t, const char *, void *);
|
||||
int assertion_memory_filled_with(const char *, int, const void *, const char *, size_t, const char *, char, const char *, void *);
|
||||
int assertion_equal_string(const char *, int, const char *v1, const char *, const char *v2, const char *, void *, int);
|
||||
int assertion_equal_wstring(const char *, int, const wchar_t *v1, const char *, const wchar_t *v2, const char *, void *);
|
||||
int assertion_file_atime(const char *, int, const char *, long, long);
|
||||
int assertion_file_atime_recent(const char *, int, const char *);
|
||||
int assertion_file_birthtime(const char *, int, const char *, long, long);
|
||||
int assertion_file_birthtime_recent(const char *, int, const char *);
|
||||
int assertion_file_contains_lines_any_order(const char *, int, const char *, const char **);
|
||||
int assertion_file_contains_no_invalid_strings(const char *, int, const char *, const char **);
|
||||
int assertion_file_contents(const char *, int, const void *, int, const char *);
|
||||
int assertion_file_exists(const char *, int, const char *);
|
||||
int assertion_file_mode(const char *, int, const char *, int);
|
||||
int assertion_file_mtime(const char *, int, const char *, long, long);
|
||||
int assertion_file_mtime_recent(const char *, int, const char *);
|
||||
int assertion_file_nlinks(const char *, int, const char *, int);
|
||||
int assertion_file_not_exists(const char *, int, const char *);
|
||||
int assertion_file_size(const char *, int, const char *, long);
|
||||
int assertion_is_dir(const char *, int, const char *, int);
|
||||
int assertion_is_hardlink(const char *, int, const char *, const char *);
|
||||
int assertion_is_not_hardlink(const char *, int, const char *, const char *);
|
||||
int assertion_is_reg(const char *, int, const char *, int);
|
||||
int assertion_is_symlink(const char *, int, const char *, const char *);
|
||||
int assertion_make_dir(const char *, int, const char *, int);
|
||||
int assertion_make_file(const char *, int, const char *, int, int, const void *);
|
||||
int assertion_make_hardlink(const char *, int, const char *newpath, const char *);
|
||||
int assertion_make_symlink(const char *, int, const char *newpath, const char *);
|
||||
int assertion_nodump(const char *, int, const char *);
|
||||
int assertion_non_empty_file(const char *, int, const char *);
|
||||
int assertion_text_file_contents(const char *, int, const char *buff, const char *f);
|
||||
int assertion_umask(const char *, int, int);
|
||||
int assertion_utimes(const char *, int, const char *, long, long, long, long );
|
||||
|
||||
void skipping_setup(const char *, int);
|
||||
void test_skipping(const char *fmt, ...);
|
||||
|
||||
/* Like sprintf, then system() */
|
||||
int systemf(const char * fmt, ...);
|
||||
|
||||
/* Delay until time() returns a value after this. */
|
||||
void sleepUntilAfter(time_t);
|
||||
|
||||
/* Return true if this platform can create symlinks. */
|
||||
int canSymlink(void);
|
||||
|
||||
/* Return true if this platform can run the "bzip2" program. */
|
||||
int canBzip2(void);
|
||||
|
||||
/* Return true if this platform can run the "grzip" program. */
|
||||
int canGrzip(void);
|
||||
|
||||
/* Return true if this platform can run the "gzip" program. */
|
||||
int canGzip(void);
|
||||
|
||||
/* Return true if this platform can run the specified command. */
|
||||
int canRunCommand(const char *);
|
||||
|
||||
/* Return true if this platform can run the "lrzip" program. */
|
||||
int canLrzip(void);
|
||||
|
||||
/* Return true if this platform can run the "lz4" program. */
|
||||
int canLz4(void);
|
||||
|
||||
/* Return true if this platform can run the "lzip" program. */
|
||||
int canLzip(void);
|
||||
|
||||
/* Return true if this platform can run the "lzma" program. */
|
||||
int canLzma(void);
|
||||
|
||||
/* Return true if this platform can run the "lzop" program. */
|
||||
int canLzop(void);
|
||||
|
||||
/* Return true if this platform can run the "xz" program. */
|
||||
int canXz(void);
|
||||
|
||||
/* Return true if this filesystem can handle nodump flags. */
|
||||
int canNodump(void);
|
||||
|
||||
/* Return true if the file has large i-node number(>0xffffffff). */
|
||||
int is_LargeInode(const char *);
|
||||
|
||||
/* Suck file into string allocated via malloc(). Call free() when done. */
|
||||
/* Supports printf-style args: slurpfile(NULL, "%s/myfile", refdir); */
|
||||
char *slurpfile(size_t *, const char *fmt, ...);
|
||||
|
||||
/* Dump block of bytes to a file. */
|
||||
void dumpfile(const char *filename, void *, size_t);
|
||||
|
||||
/* Extracts named reference file to the current directory. */
|
||||
void extract_reference_file(const char *);
|
||||
/* Copies named reference file to the current directory. */
|
||||
void copy_reference_file(const char *);
|
||||
|
||||
/* Extracts a list of files to the current directory.
|
||||
* List must be NULL terminated.
|
||||
*/
|
||||
void extract_reference_files(const char **);
|
||||
|
||||
/* Subtract umask from mode */
|
||||
mode_t umasked(mode_t expected_mode);
|
||||
|
||||
/* Path to working directory for current test */
|
||||
extern const char *testworkdir;
|
||||
|
||||
/*
|
||||
* Special interfaces for program test harness.
|
||||
*/
|
||||
|
||||
/* Pathname of exe to be tested. */
|
||||
extern const char *testprogfile;
|
||||
/* Name of exe to use in printf-formatted command strings. */
|
||||
/* On Windows, this includes leading/trailing quotes. */
|
||||
extern const char *testprog;
|
||||
|
||||
#ifdef USE_DMALLOC
|
||||
#include <dmalloc.h>
|
||||
#endif
|
||||
#include "test_common.h"
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*-
|
||||
* Copyright (c) 2003-2007 Tim Kientzle
|
||||
* Copyright (c) 2003-2017 Tim Kientzle
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
@ -30,68 +30,5 @@
|
||||
|
||||
DEFINE_TEST(test_version)
|
||||
{
|
||||
int r;
|
||||
char *p, *q;
|
||||
size_t s;
|
||||
|
||||
|
||||
r = systemf("%s --version >version.stdout 2>version.stderr", testprog);
|
||||
failure("Unable to run %s --version", testprog);
|
||||
if (!assert(r == 0))
|
||||
return;
|
||||
|
||||
/* --version should generate nothing to stdout. */
|
||||
assertEmptyFile("version.stderr");
|
||||
/* Verify format of version message. */
|
||||
q = p = slurpfile(&s, "version.stdout");
|
||||
/* Version message should start with name of program, then space. */
|
||||
assert(s > 6);
|
||||
failure("Version must start with 'bsdcat': ``%s''", p);
|
||||
if (!assertEqualMem(q, "bsdcat ", 7))
|
||||
return;
|
||||
q += 7; s -= 7;
|
||||
/* Version number is a series of digits and periods. */
|
||||
while (s > 0 && (*q == '.' || (*q >= '0' && *q <= '9'))) {
|
||||
++q;
|
||||
--s;
|
||||
}
|
||||
/* Version number terminated by space. */
|
||||
failure("No space after bsdcat version: ``%s''", p);
|
||||
assert(s > 1);
|
||||
/* Skip a single trailing a,b,c, or d. */
|
||||
if (*q == 'a' || *q == 'b' || *q == 'c' || *q == 'd')
|
||||
++q;
|
||||
failure("No space after bsdcat version: ``%s''", p);
|
||||
assert(*q == ' ');
|
||||
++q; --s;
|
||||
/* Separator. */
|
||||
failure("No `-' between bsdcat and libarchive versions: ``%s''", p);
|
||||
assertEqualMem(q, "- ", 2);
|
||||
q += 2; s -= 2;
|
||||
/* libarchive name and version number */
|
||||
failure("Not long enough for libarchive version: ``%s''", p);
|
||||
assert(s > 11);
|
||||
failure("Libarchive version must start with `libarchive': ``%s''", p);
|
||||
assertEqualMem(q, "libarchive ", 11);
|
||||
q += 11; s -= 11;
|
||||
/* Version number is a series of digits and periods. */
|
||||
while (s > 0 && (*q == '.' || (*q >= '0' && *q <= '9'))) {
|
||||
++q;
|
||||
--s;
|
||||
}
|
||||
/* Skip a single trailing a,b,c, or d. */
|
||||
if (*q == 'a' || *q == 'b' || *q == 'c' || *q == 'd')
|
||||
++q;
|
||||
/* Skip arbitrary third-party version numbers. */
|
||||
while (s > 0 && (*q == ' ' || *q == '-' || *q == '/' || *q == '.' || isalnum(*q))) {
|
||||
++q;
|
||||
--s;
|
||||
}
|
||||
/* All terminated by end-of-line. */
|
||||
assert(s >= 1);
|
||||
/* Skip an optional CR character (e.g., Windows) */
|
||||
failure("Version output must end with \\n or \\r\\n");
|
||||
if (*q == '\r') { ++q; --s; }
|
||||
assertEqualMem(q, "\n", 1);
|
||||
free(p);
|
||||
assertVersion(testprog, "bsdcat");
|
||||
}
|
||||
|
19
configure.ac
19
configure.ac
@ -4,8 +4,8 @@ dnl First, define all of the version numbers up front.
|
||||
dnl In particular, this allows the version macro to be used in AC_INIT
|
||||
|
||||
dnl These first two version numbers are updated automatically on each release.
|
||||
m4_define([LIBARCHIVE_VERSION_S],[3.2.2])
|
||||
m4_define([LIBARCHIVE_VERSION_N],[3002002])
|
||||
m4_define([LIBARCHIVE_VERSION_S],[3.3.1])
|
||||
m4_define([LIBARCHIVE_VERSION_N],[3003001])
|
||||
|
||||
dnl bsdtar and bsdcpio versioning tracks libarchive
|
||||
m4_define([BSDTAR_VERSION_S],LIBARCHIVE_VERSION_S())
|
||||
@ -270,6 +270,19 @@ AS_VAR_IF([ac_cv_have_decl_EXT2_IOC_GETFLAGS], [yes],
|
||||
|
||||
AC_CHECK_HEADERS([inttypes.h io.h langinfo.h limits.h])
|
||||
AC_CHECK_HEADERS([linux/fiemap.h linux/fs.h linux/magic.h linux/types.h])
|
||||
|
||||
AC_CACHE_CHECK([whether FS_IOC_GETFLAGS is usable],
|
||||
[ac_cv_have_decl_FS_IOC_GETFLAGS],
|
||||
[AC_COMPILE_IFELSE([AC_LANG_PROGRAM([@%:@include <sys/ioctl.h>
|
||||
@%:@include <linux/fs.h>],
|
||||
[int x = FS_IOC_GETFLAGS])],
|
||||
[AS_VAR_SET([ac_cv_have_decl_FS_IOC_GETFLAGS], [yes])],
|
||||
[AS_VAR_SET([ac_cv_have_decl_FS_IOC_GETFLAGS], [no])])])
|
||||
|
||||
AS_VAR_IF([ac_cv_have_decl_FS_IOC_GETFLAGS], [yes],
|
||||
[AC_DEFINE_UNQUOTED([HAVE_WORKING_FS_IOC_GETFLAGS], [1],
|
||||
[Define to 1 if you have a working FS_IOC_GETFLAGS])])
|
||||
|
||||
AC_CHECK_HEADERS([locale.h paths.h poll.h pthread.h pwd.h])
|
||||
AC_CHECK_HEADERS([readpassphrase.h signal.h spawn.h])
|
||||
AC_CHECK_HEADERS([stdarg.h stdint.h stdlib.h string.h])
|
||||
@ -381,7 +394,7 @@ fi
|
||||
AC_ARG_WITH([lzo2],
|
||||
AS_HELP_STRING([--with-lzo2], [Build with LZO support from liblzo2]))
|
||||
|
||||
if test "x$with_lzo2" == "xyes"; then
|
||||
if test "x$with_lzo2" = "xyes"; then
|
||||
AC_CHECK_HEADERS([lzo/lzoconf.h lzo/lzo1x.h])
|
||||
AC_CHECK_LIB(lzo2,lzo1x_decompress_safe)
|
||||
fi
|
||||
|
@ -8,7 +8,7 @@ IF(ENABLE_CPIO AND ENABLE_TEST)
|
||||
../cmdline.c
|
||||
../../libarchive_fe/err.c
|
||||
../../test_utils/test_utils.c
|
||||
main.c
|
||||
../../test_utils/test_main.c
|
||||
test.h
|
||||
test_0.c
|
||||
test_basic.c
|
||||
@ -87,6 +87,7 @@ IF(ENABLE_CPIO AND ENABLE_TEST)
|
||||
INCLUDE(${CMAKE_CURRENT_BINARY_DIR}/list.h)
|
||||
INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR})
|
||||
INCLUDE_DIRECTORIES(${PROJECT_SOURCE_DIR}/test_utils)
|
||||
INCLUDE_DIRECTORIES(${PROJECT_SOURCE_DIR}/cpio/test)
|
||||
|
||||
# Experimental new test handling
|
||||
ADD_CUSTOM_TARGET(run_bsdcpio_test
|
||||
|
3073
cpio/test/main.c
3073
cpio/test/main.c
File diff suppressed because it is too large
Load Diff
338
cpio/test/test.h
338
cpio/test/test.h
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2003-2006 Tim Kientzle
|
||||
* Copyright (c) 2003-2017 Tim Kientzle
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
@ -22,333 +22,19 @@
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
||||
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* $FreeBSD: src/usr.bin/cpio/test/test.h,v 1.2 2008/06/21 02:17:18 kientzle Exp $
|
||||
* $FreeBSD$
|
||||
*/
|
||||
|
||||
/* Every test program should #include "test.h" as the first thing. */
|
||||
|
||||
/*
|
||||
* The goal of this file (and the matching test.c) is to
|
||||
* simplify the very repetitive test-*.c test programs.
|
||||
*/
|
||||
#if defined(HAVE_CONFIG_H)
|
||||
/* Most POSIX platforms use the 'configure' script to build config.h */
|
||||
#include "config.h"
|
||||
#elif defined(__FreeBSD__)
|
||||
/* Building as part of FreeBSD system requires a pre-built config.h. */
|
||||
#include "config_freebsd.h"
|
||||
#elif defined(_WIN32) && !defined(__CYGWIN__)
|
||||
/* Win32 can't run the 'configure' script. */
|
||||
#include "config_windows.h"
|
||||
#else
|
||||
/* Warn if the library hasn't been (automatically or manually) configured. */
|
||||
#error Oops: No config.h and no pre-built configuration in test.h.
|
||||
#endif
|
||||
#define KNOWNREF "test_option_f.cpio.uu"
|
||||
#define ENVBASE "BSDCPIO" /* Prefix for environment variables. */
|
||||
#define PROGRAM "bsdcpio" /* Name of program being tested. */
|
||||
#define PROGRAM_ALIAS "cpio" /* Generic alias for program */
|
||||
#undef LIBRARY /* Not testing a library. */
|
||||
#undef EXTRA_DUMP /* How to dump extra data */
|
||||
#undef EXTRA_ERRNO /* How to dump errno */
|
||||
/* How to generate extra version info. */
|
||||
#define EXTRA_VERSION (systemf("%s --version", testprog) ? "" : "")
|
||||
|
||||
#include <sys/types.h> /* Windows requires this before sys/stat.h */
|
||||
#include <sys/stat.h>
|
||||
|
||||
#if HAVE_DIRENT_H
|
||||
#include <dirent.h>
|
||||
#endif
|
||||
#ifdef HAVE_DIRECT_H
|
||||
#include <direct.h>
|
||||
#define dirent direct
|
||||
#endif
|
||||
#include <errno.h>
|
||||
#include <fcntl.h>
|
||||
#ifdef HAVE_IO_H
|
||||
#include <io.h>
|
||||
#endif
|
||||
#ifdef HAVE_STDINT_H
|
||||
#include <stdint.h>
|
||||
#endif
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <ctype.h>
|
||||
#include <time.h>
|
||||
#ifdef HAVE_UNISTD_H
|
||||
#include <unistd.h>
|
||||
#endif
|
||||
#include <wchar.h>
|
||||
#ifdef HAVE_WINDOWS_H
|
||||
#include <windows.h>
|
||||
#endif
|
||||
|
||||
/*
|
||||
* System-specific tweaks. We really want to minimize these
|
||||
* as much as possible, since they make it harder to understand
|
||||
* the mainline code.
|
||||
*/
|
||||
|
||||
/* Windows (including Visual Studio and MinGW but not Cygwin) */
|
||||
#if defined(_WIN32) && !defined(__CYGWIN__)
|
||||
#if !defined(__BORLANDC__)
|
||||
#undef chdir
|
||||
#define chdir _chdir
|
||||
#define strdup _strdup
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/* Visual Studio */
|
||||
#if defined(_MSC_VER) && _MSC_VER < 1900
|
||||
#define snprintf sprintf_s
|
||||
#endif
|
||||
|
||||
#if defined(__BORLANDC__)
|
||||
#pragma warn -8068 /* Constant out of range in comparison. */
|
||||
#endif
|
||||
|
||||
/* Haiku OS and QNX */
|
||||
#if defined(__HAIKU__) || defined(__QNXNTO__)
|
||||
/* Haiku and QNX have typedefs in stdint.h (needed for int64_t) */
|
||||
#include <stdint.h>
|
||||
#endif
|
||||
|
||||
/* Get a real definition for __FBSDID if we can */
|
||||
#if HAVE_SYS_CDEFS_H
|
||||
#include <sys/cdefs.h>
|
||||
#endif
|
||||
|
||||
/* If not, define it so as to avoid dangling semicolons. */
|
||||
#ifndef __FBSDID
|
||||
#define __FBSDID(a) struct _undefined_hack
|
||||
#endif
|
||||
|
||||
#ifndef O_BINARY
|
||||
#define O_BINARY 0
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Redefine DEFINE_TEST for use in defining the test functions.
|
||||
*/
|
||||
#undef DEFINE_TEST
|
||||
#define DEFINE_TEST(name) void name(void); void name(void)
|
||||
|
||||
/* An implementation of the standard assert() macro */
|
||||
#define assert(e) assertion_assert(__FILE__, __LINE__, (e), #e, NULL)
|
||||
/* chdir() and error if it fails */
|
||||
#define assertChdir(path) \
|
||||
assertion_chdir(__FILE__, __LINE__, path)
|
||||
/* Assert two integers are the same. Reports value of each one if not. */
|
||||
#define assertEqualInt(v1,v2) \
|
||||
assertion_equal_int(__FILE__, __LINE__, (v1), #v1, (v2), #v2, NULL)
|
||||
/* Assert two strings are the same. Reports value of each one if not. */
|
||||
#define assertEqualString(v1,v2) \
|
||||
assertion_equal_string(__FILE__, __LINE__, (v1), #v1, (v2), #v2, NULL, 0)
|
||||
#define assertEqualUTF8String(v1,v2) \
|
||||
assertion_equal_string(__FILE__, __LINE__, (v1), #v1, (v2), #v2, NULL, 1)
|
||||
/* As above, but v1 and v2 are wchar_t * */
|
||||
#define assertEqualWString(v1,v2) \
|
||||
assertion_equal_wstring(__FILE__, __LINE__, (v1), #v1, (v2), #v2, NULL)
|
||||
/* As above, but raw blocks of bytes. */
|
||||
#define assertEqualMem(v1, v2, l) \
|
||||
assertion_equal_mem(__FILE__, __LINE__, (v1), #v1, (v2), #v2, (l), #l, NULL)
|
||||
/* Assert that memory is full of a specified byte */
|
||||
#define assertMemoryFilledWith(v1, l, b) \
|
||||
assertion_memory_filled_with(__FILE__, __LINE__, (v1), #v1, (l), #l, (b), #b, NULL)
|
||||
/* Assert two files are the same. */
|
||||
#define assertEqualFile(f1, f2) \
|
||||
assertion_equal_file(__FILE__, __LINE__, (f1), (f2))
|
||||
/* Assert that a file is empty. */
|
||||
#define assertEmptyFile(pathname) \
|
||||
assertion_empty_file(__FILE__, __LINE__, (pathname))
|
||||
/* Assert that a file is not empty. */
|
||||
#define assertNonEmptyFile(pathname) \
|
||||
assertion_non_empty_file(__FILE__, __LINE__, (pathname))
|
||||
#define assertFileAtime(pathname, sec, nsec) \
|
||||
assertion_file_atime(__FILE__, __LINE__, pathname, sec, nsec)
|
||||
#define assertFileAtimeRecent(pathname) \
|
||||
assertion_file_atime_recent(__FILE__, __LINE__, pathname)
|
||||
#define assertFileBirthtime(pathname, sec, nsec) \
|
||||
assertion_file_birthtime(__FILE__, __LINE__, pathname, sec, nsec)
|
||||
#define assertFileBirthtimeRecent(pathname) \
|
||||
assertion_file_birthtime_recent(__FILE__, __LINE__, pathname)
|
||||
/* Assert that a file exists; supports printf-style arguments. */
|
||||
#define assertFileExists(pathname) \
|
||||
assertion_file_exists(__FILE__, __LINE__, pathname)
|
||||
/* Assert that a file exists. */
|
||||
#define assertFileNotExists(pathname) \
|
||||
assertion_file_not_exists(__FILE__, __LINE__, pathname)
|
||||
/* Assert that file contents match a string. */
|
||||
#define assertFileContents(data, data_size, pathname) \
|
||||
assertion_file_contents(__FILE__, __LINE__, data, data_size, pathname)
|
||||
/* Verify that a file does not contain invalid strings */
|
||||
#define assertFileContainsNoInvalidStrings(pathname, strings) \
|
||||
assertion_file_contains_no_invalid_strings(__FILE__, __LINE__, pathname, strings)
|
||||
#define assertFileMtime(pathname, sec, nsec) \
|
||||
assertion_file_mtime(__FILE__, __LINE__, pathname, sec, nsec)
|
||||
#define assertFileMtimeRecent(pathname) \
|
||||
assertion_file_mtime_recent(__FILE__, __LINE__, pathname)
|
||||
#define assertFileNLinks(pathname, nlinks) \
|
||||
assertion_file_nlinks(__FILE__, __LINE__, pathname, nlinks)
|
||||
#define assertFileSize(pathname, size) \
|
||||
assertion_file_size(__FILE__, __LINE__, pathname, size)
|
||||
#define assertFileMode(pathname, mode) \
|
||||
assertion_file_mode(__FILE__, __LINE__, pathname, mode)
|
||||
#define assertTextFileContents(text, pathname) \
|
||||
assertion_text_file_contents(__FILE__, __LINE__, text, pathname)
|
||||
#define assertFileContainsLinesAnyOrder(pathname, lines) \
|
||||
assertion_file_contains_lines_any_order(__FILE__, __LINE__, pathname, lines)
|
||||
#define assertIsDir(pathname, mode) \
|
||||
assertion_is_dir(__FILE__, __LINE__, pathname, mode)
|
||||
#define assertIsHardlink(path1, path2) \
|
||||
assertion_is_hardlink(__FILE__, __LINE__, path1, path2)
|
||||
#define assertIsNotHardlink(path1, path2) \
|
||||
assertion_is_not_hardlink(__FILE__, __LINE__, path1, path2)
|
||||
#define assertIsReg(pathname, mode) \
|
||||
assertion_is_reg(__FILE__, __LINE__, pathname, mode)
|
||||
#define assertIsSymlink(pathname, contents) \
|
||||
assertion_is_symlink(__FILE__, __LINE__, pathname, contents)
|
||||
/* Create a directory, report error if it fails. */
|
||||
#define assertMakeDir(dirname, mode) \
|
||||
assertion_make_dir(__FILE__, __LINE__, dirname, mode)
|
||||
#define assertMakeFile(path, mode, contents) \
|
||||
assertion_make_file(__FILE__, __LINE__, path, mode, -1, contents)
|
||||
#define assertMakeBinFile(path, mode, csize, contents) \
|
||||
assertion_make_file(__FILE__, __LINE__, path, mode, csize, contents)
|
||||
#define assertMakeHardlink(newfile, oldfile) \
|
||||
assertion_make_hardlink(__FILE__, __LINE__, newfile, oldfile)
|
||||
#define assertMakeSymlink(newfile, linkto) \
|
||||
assertion_make_symlink(__FILE__, __LINE__, newfile, linkto)
|
||||
#define assertNodump(path) \
|
||||
assertion_nodump(__FILE__, __LINE__, path)
|
||||
#define assertUmask(mask) \
|
||||
assertion_umask(__FILE__, __LINE__, mask)
|
||||
#define assertUtimes(pathname, atime, atime_nsec, mtime, mtime_nsec) \
|
||||
assertion_utimes(__FILE__, __LINE__, pathname, atime, atime_nsec, mtime, mtime_nsec)
|
||||
|
||||
/*
|
||||
* This would be simple with C99 variadic macros, but I don't want to
|
||||
* require that. Instead, I insert a function call before each
|
||||
* skipping() call to pass the file and line information down. Crude,
|
||||
* but effective.
|
||||
*/
|
||||
#define skipping \
|
||||
skipping_setup(__FILE__, __LINE__);test_skipping
|
||||
|
||||
/* Function declarations. These are defined in test_utility.c. */
|
||||
void failure(const char *fmt, ...);
|
||||
int assertion_assert(const char *, int, int, const char *, void *);
|
||||
int assertion_chdir(const char *, int, const char *);
|
||||
int assertion_empty_file(const char *, int, const char *);
|
||||
int assertion_equal_file(const char *, int, const char *, const char *);
|
||||
int assertion_equal_int(const char *, int, long long, const char *, long long, const char *, void *);
|
||||
int assertion_equal_mem(const char *, int, const void *, const char *, const void *, const char *, size_t, const char *, void *);
|
||||
int assertion_memory_filled_with(const char *, int, const void *, const char *, size_t, const char *, char, const char *, void *);
|
||||
int assertion_equal_string(const char *, int, const char *v1, const char *, const char *v2, const char *, void *, int);
|
||||
int assertion_equal_wstring(const char *, int, const wchar_t *v1, const char *, const wchar_t *v2, const char *, void *);
|
||||
int assertion_file_atime(const char *, int, const char *, long, long);
|
||||
int assertion_file_atime_recent(const char *, int, const char *);
|
||||
int assertion_file_birthtime(const char *, int, const char *, long, long);
|
||||
int assertion_file_birthtime_recent(const char *, int, const char *);
|
||||
int assertion_file_contains_lines_any_order(const char *, int, const char *, const char **);
|
||||
int assertion_file_contains_no_invalid_strings(const char *, int, const char *, const char **);
|
||||
int assertion_file_contents(const char *, int, const void *, int, const char *);
|
||||
int assertion_file_exists(const char *, int, const char *);
|
||||
int assertion_file_mode(const char *, int, const char *, int);
|
||||
int assertion_file_mtime(const char *, int, const char *, long, long);
|
||||
int assertion_file_mtime_recent(const char *, int, const char *);
|
||||
int assertion_file_nlinks(const char *, int, const char *, int);
|
||||
int assertion_file_not_exists(const char *, int, const char *);
|
||||
int assertion_file_size(const char *, int, const char *, long);
|
||||
int assertion_is_dir(const char *, int, const char *, int);
|
||||
int assertion_is_hardlink(const char *, int, const char *, const char *);
|
||||
int assertion_is_not_hardlink(const char *, int, const char *, const char *);
|
||||
int assertion_is_reg(const char *, int, const char *, int);
|
||||
int assertion_is_symlink(const char *, int, const char *, const char *);
|
||||
int assertion_make_dir(const char *, int, const char *, int);
|
||||
int assertion_make_file(const char *, int, const char *, int, int, const void *);
|
||||
int assertion_make_hardlink(const char *, int, const char *newpath, const char *);
|
||||
int assertion_make_symlink(const char *, int, const char *newpath, const char *);
|
||||
int assertion_nodump(const char *, int, const char *);
|
||||
int assertion_non_empty_file(const char *, int, const char *);
|
||||
int assertion_text_file_contents(const char *, int, const char *buff, const char *f);
|
||||
int assertion_umask(const char *, int, int);
|
||||
int assertion_utimes(const char *, int, const char *, long, long, long, long );
|
||||
|
||||
void skipping_setup(const char *, int);
|
||||
void test_skipping(const char *fmt, ...);
|
||||
|
||||
/* Like sprintf, then system() */
|
||||
int systemf(const char * fmt, ...);
|
||||
|
||||
/* Delay until time() returns a value after this. */
|
||||
void sleepUntilAfter(time_t);
|
||||
|
||||
/* Return true if this platform can create symlinks. */
|
||||
int canSymlink(void);
|
||||
|
||||
/* Return true if this platform can run the "bzip2" program. */
|
||||
int canBzip2(void);
|
||||
|
||||
/* Return true if this platform can run the "grzip" program. */
|
||||
int canGrzip(void);
|
||||
|
||||
/* Return true if this platform can run the "gzip" program. */
|
||||
int canGzip(void);
|
||||
|
||||
/* Return true if this platform can run the specified command. */
|
||||
int canRunCommand(const char *);
|
||||
|
||||
/* Return true if this platform can run the "lrzip" program. */
|
||||
int canLrzip(void);
|
||||
|
||||
/* Return true if this platform can run the "lz4" program. */
|
||||
int canLz4(void);
|
||||
|
||||
/* Return true if this platform can run the "lzip" program. */
|
||||
int canLzip(void);
|
||||
|
||||
/* Return true if this platform can run the "lzma" program. */
|
||||
int canLzma(void);
|
||||
|
||||
/* Return true if this platform can run the "lzop" program. */
|
||||
int canLzop(void);
|
||||
|
||||
/* Return true if this platform can run the "xz" program. */
|
||||
int canXz(void);
|
||||
|
||||
/* Return true if this filesystem can handle nodump flags. */
|
||||
int canNodump(void);
|
||||
|
||||
/* Return true if the file has large i-node number(>0xffffffff). */
|
||||
int is_LargeInode(const char *);
|
||||
|
||||
/* Suck file into string allocated via malloc(). Call free() when done. */
|
||||
/* Supports printf-style args: slurpfile(NULL, "%s/myfile", refdir); */
|
||||
char *slurpfile(size_t *, const char *fmt, ...);
|
||||
|
||||
/* Dump block of bytes to a file. */
|
||||
void dumpfile(const char *filename, void *, size_t);
|
||||
|
||||
/* Extracts named reference file to the current directory. */
|
||||
void extract_reference_file(const char *);
|
||||
/* Copies named reference file to the current directory. */
|
||||
void copy_reference_file(const char *);
|
||||
|
||||
/* Extracts a list of files to the current directory.
|
||||
* List must be NULL terminated.
|
||||
*/
|
||||
void extract_reference_files(const char **);
|
||||
|
||||
/* Subtract umask from mode */
|
||||
mode_t umasked(mode_t expected_mode);
|
||||
|
||||
/* Path to working directory for current test */
|
||||
extern const char *testworkdir;
|
||||
|
||||
/*
|
||||
* Special interfaces for program test harness.
|
||||
*/
|
||||
|
||||
/* Pathname of exe to be tested. */
|
||||
extern const char *testprogfile;
|
||||
/* Name of exe to use in printf-formatted command strings. */
|
||||
/* On Windows, this includes leading/trailing quotes. */
|
||||
extern const char *testprog;
|
||||
|
||||
#ifdef USE_DMALLOC
|
||||
#include <dmalloc.h>
|
||||
#endif
|
||||
#include "test_common.h"
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*-
|
||||
* Copyright (c) 2003-2007 Tim Kientzle
|
||||
* Copyright (c) 2003-2017 Tim Kientzle
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
@ -23,92 +23,8 @@
|
||||
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
#include "test.h"
|
||||
__FBSDID("$FreeBSD$");
|
||||
|
||||
/*
|
||||
* Test that --version option works and generates reasonable output.
|
||||
*/
|
||||
|
||||
static void
|
||||
verify(const char *p, size_t s)
|
||||
{
|
||||
const char *q = p;
|
||||
|
||||
/* Version message should start with name of program, then space. */
|
||||
failure("version message too short:", p);
|
||||
if (!assert(s > 6))
|
||||
return;
|
||||
failure("Version message should begin with 'bsdcpio': %s", p);
|
||||
if (!assertEqualMem(q, "bsdcpio ", 8))
|
||||
/* If we're not testing bsdcpio, don't keep going. */
|
||||
return;
|
||||
q += 8; s -= 8;
|
||||
/* Version number is a series of digits and periods. */
|
||||
while (s > 0 && (*q == '.' || (*q >= '0' && *q <= '9'))) {
|
||||
++q;
|
||||
--s;
|
||||
}
|
||||
/* Version number terminated by space. */
|
||||
failure("Version: %s", p);
|
||||
assert(s > 1);
|
||||
/* Skip a single trailing a,b,c, or d. */
|
||||
if (*q == 'a' || *q == 'b' || *q == 'c' || *q == 'd')
|
||||
++q;
|
||||
failure("Version: %s", p);
|
||||
assert(*q == ' ');
|
||||
++q; --s;
|
||||
/* Separator. */
|
||||
failure("Version: %s", p);
|
||||
assertEqualMem(q, "- ", 2);
|
||||
q += 2; s -= 2;
|
||||
/* libarchive name and version number */
|
||||
assert(s > 11);
|
||||
failure("Version: %s", p);
|
||||
assertEqualMem(q, "libarchive ", 11);
|
||||
q += 11; s -= 11;
|
||||
/* Version number is a series of digits and periods. */
|
||||
while (s > 0 && (*q == '.' || (*q >= '0' && *q <= '9'))) {
|
||||
++q;
|
||||
--s;
|
||||
}
|
||||
/* Skip a single trailing a,b,c, or d. */
|
||||
if (*q == 'a' || *q == 'b' || *q == 'c' || *q == 'd')
|
||||
++q;
|
||||
/* Skip arbitrary third-party version numbers. */
|
||||
while (s > 0 && (*q == ' ' || *q == '-' || *q == '/' || *q == '.' || isalnum(*q))) {
|
||||
++q;
|
||||
--s;
|
||||
}
|
||||
/* All terminated by end-of-line: \r, \r\n, or \n */
|
||||
assert(s >= 1);
|
||||
failure("Version: %s", p);
|
||||
if (*q == '\x0d') {
|
||||
if (q[1] != '\0')
|
||||
assertEqualMem(q, "\x0d\x0a", 2);
|
||||
} else
|
||||
assertEqualMem(q, "\x0a", 1);
|
||||
}
|
||||
|
||||
|
||||
DEFINE_TEST(test_option_version)
|
||||
{
|
||||
int r;
|
||||
char *p;
|
||||
size_t s;
|
||||
|
||||
r = systemf("%s --version >version.stdout 2>version.stderr", testprog);
|
||||
if (r != 0)
|
||||
r = systemf("%s -W version >version.stdout 2>version.stderr",
|
||||
testprog);
|
||||
failure("Unable to run either %s --version or %s -W version",
|
||||
testprog, testprog);
|
||||
if (!assert(r == 0))
|
||||
return;
|
||||
|
||||
/* --version should generate nothing to stderr. */
|
||||
assertEmptyFile("version.stderr");
|
||||
/* Verify format of version message. */
|
||||
p = slurpfile(&s, "version.stdout");
|
||||
verify(p, s);
|
||||
free(p);
|
||||
assertVersion(testprog, "bsdcpio");
|
||||
}
|
||||
|
@ -36,7 +36,7 @@
|
||||
* assert that ARCHIVE_VERSION_NUMBER >= 2012108.
|
||||
*/
|
||||
/* Note: Compiler will complain if this does not match archive_entry.h! */
|
||||
#define ARCHIVE_VERSION_NUMBER 3002002
|
||||
#define ARCHIVE_VERSION_NUMBER 3003001
|
||||
|
||||
#include <sys/stat.h>
|
||||
#include <stddef.h> /* for wchar_t */
|
||||
@ -155,7 +155,7 @@ __LA_DECL int archive_version_number(void);
|
||||
/*
|
||||
* Textual name/version of the library, useful for version displays.
|
||||
*/
|
||||
#define ARCHIVE_VERSION_ONLY_STRING "3.2.2"
|
||||
#define ARCHIVE_VERSION_ONLY_STRING "3.3.1"
|
||||
#define ARCHIVE_VERSION_STRING "libarchive " ARCHIVE_VERSION_ONLY_STRING
|
||||
__LA_DECL const char * archive_version_string(void);
|
||||
|
||||
@ -1001,6 +1001,10 @@ __LA_DECL int archive_read_disk_set_atime_restored(struct archive *);
|
||||
#define ARCHIVE_READDISK_NO_TRAVERSE_MOUNTS (0x0008)
|
||||
/* Default: Xattrs are read from disk. */
|
||||
#define ARCHIVE_READDISK_NO_XATTR (0x0010)
|
||||
/* Default: ACLs are read from disk. */
|
||||
#define ARCHIVE_READDISK_NO_ACL (0x0020)
|
||||
/* Default: File flags are read from disk. */
|
||||
#define ARCHIVE_READDISK_NO_FFLAGS (0x0040)
|
||||
|
||||
__LA_DECL int archive_read_disk_set_behavior(struct archive *,
|
||||
int flags);
|
||||
|
@ -143,6 +143,7 @@
|
||||
defined(ARCHIVE_CRYPTO_SHA256_WIN) ||\
|
||||
defined(ARCHIVE_CRYPTO_SHA384_WIN) ||\
|
||||
defined(ARCHIVE_CRYPTO_SHA512_WIN)
|
||||
#include <windows.h>
|
||||
#include <wincrypt.h>
|
||||
typedef struct {
|
||||
int valid;
|
||||
|
@ -1649,7 +1649,10 @@ static struct flag {
|
||||
{ "nosappnd", L"nosappnd", SF_APPEND, 0 },
|
||||
{ "nosappend", L"nosappend", SF_APPEND, 0 },
|
||||
#endif
|
||||
#ifdef EXT2_APPEND_FL /* 'a' */
|
||||
#if defined(FS_APPEND_FL) /* 'a' */
|
||||
{ "nosappnd", L"nosappnd", FS_APPEND_FL, 0 },
|
||||
{ "nosappend", L"nosappend", FS_APPEND_FL, 0 },
|
||||
#elif defined(EXT2_APPEND_FL) /* 'a' */
|
||||
{ "nosappnd", L"nosappnd", EXT2_APPEND_FL, 0 },
|
||||
{ "nosappend", L"nosappend", EXT2_APPEND_FL, 0 },
|
||||
#endif
|
||||
@ -1662,7 +1665,11 @@ static struct flag {
|
||||
{ "noschange", L"noschange", SF_IMMUTABLE, 0 },
|
||||
{ "nosimmutable", L"nosimmutable", SF_IMMUTABLE, 0 },
|
||||
#endif
|
||||
#ifdef EXT2_IMMUTABLE_FL /* 'i' */
|
||||
#if defined(FS_IMMUTABLE_FL) /* 'i' */
|
||||
{ "noschg", L"noschg", FS_IMMUTABLE_FL, 0 },
|
||||
{ "noschange", L"noschange", FS_IMMUTABLE_FL, 0 },
|
||||
{ "nosimmutable", L"nosimmutable", FS_IMMUTABLE_FL, 0 },
|
||||
#elif defined(EXT2_IMMUTABLE_FL) /* 'i' */
|
||||
{ "noschg", L"noschg", EXT2_IMMUTABLE_FL, 0 },
|
||||
{ "noschange", L"noschange", EXT2_IMMUTABLE_FL, 0 },
|
||||
{ "nosimmutable", L"nosimmutable", EXT2_IMMUTABLE_FL, 0 },
|
||||
@ -1686,7 +1693,9 @@ static struct flag {
|
||||
#ifdef UF_NODUMP
|
||||
{ "nodump", L"nodump", 0, UF_NODUMP},
|
||||
#endif
|
||||
#ifdef EXT2_NODUMP_FL /* 'd' */
|
||||
#if defined(FS_NODUMP_FL) /* 'd' */
|
||||
{ "nodump", L"nodump", 0, FS_NODUMP_FL},
|
||||
#elif defined(EXT2_NODUMP_FL) /* 'd' */
|
||||
{ "nodump", L"nodump", 0, EXT2_NODUMP_FL},
|
||||
#endif
|
||||
#ifdef UF_OPAQUE
|
||||
@ -1699,65 +1708,124 @@ static struct flag {
|
||||
#ifdef UF_COMPRESSED
|
||||
{ "nocompressed",L"nocompressed", UF_COMPRESSED, 0 },
|
||||
#endif
|
||||
#ifdef EXT2_UNRM_FL
|
||||
#if defined(FS_UNRM_FL)
|
||||
{ "nouunlink", L"nouunlink", FS_UNRM_FL, 0},
|
||||
#elif defined(EXT2_UNRM_FL)
|
||||
{ "nouunlink", L"nouunlink", EXT2_UNRM_FL, 0},
|
||||
#endif
|
||||
|
||||
#ifdef EXT2_BTREE_FL
|
||||
#if defined(FS_BTREE_FL)
|
||||
{ "nobtree", L"nobtree", FS_BTREE_FL, 0 },
|
||||
#elif defined(EXT2_BTREE_FL)
|
||||
{ "nobtree", L"nobtree", EXT2_BTREE_FL, 0 },
|
||||
#endif
|
||||
|
||||
#ifdef EXT2_ECOMPR_FL
|
||||
#if defined(FS_ECOMPR_FL)
|
||||
{ "nocomperr", L"nocomperr", FS_ECOMPR_FL, 0 },
|
||||
#elif defined(EXT2_ECOMPR_FL)
|
||||
{ "nocomperr", L"nocomperr", EXT2_ECOMPR_FL, 0 },
|
||||
#endif
|
||||
|
||||
#ifdef EXT2_COMPR_FL /* 'c' */
|
||||
#if defined(FS_COMPR_FL) /* 'c' */
|
||||
{ "nocompress", L"nocompress", FS_COMPR_FL, 0 },
|
||||
#elif defined(EXT2_COMPR_FL) /* 'c' */
|
||||
{ "nocompress", L"nocompress", EXT2_COMPR_FL, 0 },
|
||||
#endif
|
||||
|
||||
#ifdef EXT2_NOATIME_FL /* 'A' */
|
||||
#if defined(FS_NOATIME_FL) /* 'A' */
|
||||
{ "noatime", L"noatime", 0, FS_NOATIME_FL},
|
||||
#elif defined(EXT2_NOATIME_FL) /* 'A' */
|
||||
{ "noatime", L"noatime", 0, EXT2_NOATIME_FL},
|
||||
#endif
|
||||
|
||||
#ifdef EXT2_DIRTY_FL
|
||||
#if defined(FS_DIRTY_FL)
|
||||
{ "nocompdirty",L"nocompdirty", FS_DIRTY_FL, 0},
|
||||
#elif defined(EXT2_DIRTY_FL)
|
||||
{ "nocompdirty",L"nocompdirty", EXT2_DIRTY_FL, 0},
|
||||
#endif
|
||||
|
||||
#ifdef EXT2_COMPRBLK_FL
|
||||
#ifdef EXT2_NOCOMPR_FL
|
||||
#if defined(FS_COMPRBLK_FL)
|
||||
#if defined(FS_NOCOMPR_FL)
|
||||
{ "nocomprblk", L"nocomprblk", FS_COMPRBLK_FL, FS_NOCOMPR_FL},
|
||||
#else
|
||||
{ "nocomprblk", L"nocomprblk", FS_COMPRBLK_FL, 0},
|
||||
#endif
|
||||
#elif defined(EXT2_COMPRBLK_FL)
|
||||
#if defined(EXT2_NOCOMPR_FL)
|
||||
{ "nocomprblk", L"nocomprblk", EXT2_COMPRBLK_FL, EXT2_NOCOMPR_FL},
|
||||
#else
|
||||
{ "nocomprblk", L"nocomprblk", EXT2_COMPRBLK_FL, 0},
|
||||
#endif
|
||||
#endif
|
||||
#ifdef EXT2_DIRSYNC_FL
|
||||
#if defined(FS_DIRSYNC_FL)
|
||||
{ "nodirsync", L"nodirsync", FS_DIRSYNC_FL, 0},
|
||||
#elif defined(EXT2_DIRSYNC_FL)
|
||||
{ "nodirsync", L"nodirsync", EXT2_DIRSYNC_FL, 0},
|
||||
#endif
|
||||
#ifdef EXT2_INDEX_FL
|
||||
#if defined(FS_INDEX_FL)
|
||||
{ "nohashidx", L"nohashidx", FS_INDEX_FL, 0},
|
||||
#elif defined(EXT2_INDEX_FL)
|
||||
{ "nohashidx", L"nohashidx", EXT2_INDEX_FL, 0},
|
||||
#endif
|
||||
#ifdef EXT2_IMAGIC_FL
|
||||
#if defined(FS_IMAGIC_FL)
|
||||
{ "noimagic", L"noimagic", FS_IMAGIC_FL, 0},
|
||||
#elif defined(EXT2_IMAGIC_FL)
|
||||
{ "noimagic", L"noimagic", EXT2_IMAGIC_FL, 0},
|
||||
#endif
|
||||
#ifdef EXT3_JOURNAL_DATA_FL
|
||||
#if defined(FS_JOURNAL_DATA_FL)
|
||||
{ "nojournal", L"nojournal", FS_JOURNAL_DATA_FL, 0},
|
||||
#elif defined(EXT3_JOURNAL_DATA_FL)
|
||||
{ "nojournal", L"nojournal", EXT3_JOURNAL_DATA_FL, 0},
|
||||
#endif
|
||||
#ifdef EXT2_SECRM_FL
|
||||
#if defined(FS_SECRM_FL)
|
||||
{ "nosecuredeletion",L"nosecuredeletion",FS_SECRM_FL, 0},
|
||||
#elif defined(EXT2_SECRM_FL)
|
||||
{ "nosecuredeletion",L"nosecuredeletion",EXT2_SECRM_FL, 0},
|
||||
#endif
|
||||
#ifdef EXT2_SYNC_FL
|
||||
#if defined(FS_SYNC_FL)
|
||||
{ "nosync", L"nosync", FS_SYNC_FL, 0},
|
||||
#elif defined(EXT2_SYNC_FL)
|
||||
{ "nosync", L"nosync", EXT2_SYNC_FL, 0},
|
||||
#endif
|
||||
#ifdef EXT2_NOTAIL_FL
|
||||
#if defined(FS_NOTAIL_FL)
|
||||
{ "notail", L"notail", 0, FS_NOTAIL_FL},
|
||||
#elif defined(EXT2_NOTAIL_FL)
|
||||
{ "notail", L"notail", 0, EXT2_NOTAIL_FL},
|
||||
#endif
|
||||
#ifdef EXT2_TOPDIR_FL
|
||||
#if defined(FS_TOPDIR_FL)
|
||||
{ "notopdir", L"notopdir", FS_TOPDIR_FL, 0},
|
||||
#elif defined(EXT2_TOPDIR_FL)
|
||||
{ "notopdir", L"notopdir", EXT2_TOPDIR_FL, 0},
|
||||
#endif
|
||||
#ifdef EXT2_RESERVED_FL
|
||||
#ifdef FS_ENCRYPT_FL
|
||||
{ "noencrypt", L"noencrypt", FS_ENCRYPT_FL, 0},
|
||||
#endif
|
||||
#ifdef FS_HUGE_FILE_FL
|
||||
{ "nohugefile", L"nohugefile", FS_HUGE_FILE_FL, 0},
|
||||
#endif
|
||||
#ifdef FS_EXTENT_FL
|
||||
{ "noextent", L"noextent", FS_EXTENT_FL, 0},
|
||||
#endif
|
||||
#ifdef FS_EA_INODE_FL
|
||||
{ "noeainode", L"noeainode", FS_EA_INODE_FL, 0},
|
||||
#endif
|
||||
#ifdef FS_EOFBLOCKS_FL
|
||||
{ "noeofblocks",L"noeofblocks", FS_EOFBLOCKS_FL, 0},
|
||||
#endif
|
||||
#ifdef FS_NOCOW_FL
|
||||
{ "nocow", L"nocow", FS_NOCOW_FL, 0},
|
||||
#endif
|
||||
#ifdef FS_INLINE_DATA_FL
|
||||
{ "noinlinedata",L"noinlinedata", FS_INLINE_DATA_FL, 0},
|
||||
#endif
|
||||
#ifdef FS_PROJINHERIT_FL
|
||||
{ "noprojinherit",L"noprojinherit", FS_PROJINHERIT_FL, 0},
|
||||
#endif
|
||||
#if defined(FS_RESERVED_FL)
|
||||
{ "noreserved", L"noreserved", FS_RESERVED_FL, 0},
|
||||
#elif defined(EXT2_RESERVED_FL)
|
||||
{ "noreserved", L"noreserved", EXT2_RESERVED_FL, 0},
|
||||
#endif
|
||||
|
||||
{ NULL, NULL, 0, 0 }
|
||||
};
|
||||
|
||||
|
@ -30,7 +30,7 @@
|
||||
#define ARCHIVE_ENTRY_H_INCLUDED
|
||||
|
||||
/* Note: Compiler will complain if this does not match archive.h! */
|
||||
#define ARCHIVE_VERSION_NUMBER 3002002
|
||||
#define ARCHIVE_VERSION_NUMBER 3003001
|
||||
|
||||
/*
|
||||
* Note: archive_entry.h is for use outside of libarchive; the
|
||||
@ -66,6 +66,27 @@ typedef int64_t la_int64_t;
|
||||
# endif
|
||||
#endif
|
||||
|
||||
/* The la_ssize_t should match the type used in 'struct stat' */
|
||||
#if !defined(__LA_SSIZE_T_DEFINED)
|
||||
/* Older code relied on the __LA_SSIZE_T macro; after 4.0 we'll switch to the typedef exclusively. */
|
||||
# if ARCHIVE_VERSION_NUMBER < 4000000
|
||||
#define __LA_SSIZE_T la_ssize_t
|
||||
# endif
|
||||
#define __LA_SSIZE_T_DEFINED
|
||||
# if defined(_WIN32) && !defined(__CYGWIN__) && !defined(__WATCOMC__)
|
||||
# if defined(_SSIZE_T_DEFINED) || defined(_SSIZE_T_)
|
||||
typedef ssize_t la_ssize_t;
|
||||
# elif defined(_WIN64)
|
||||
typedef __int64 la_ssize_t;
|
||||
# else
|
||||
typedef long la_ssize_t;
|
||||
# endif
|
||||
# else
|
||||
# include <unistd.h> /* ssize_t */
|
||||
typedef ssize_t la_ssize_t;
|
||||
# endif
|
||||
#endif
|
||||
|
||||
/* Get a suitable definition for mode_t */
|
||||
#if ARCHIVE_VERSION_NUMBER >= 3999000
|
||||
/* Switch to plain 'int' for libarchive 4.0. It's less broken than 'mode_t' */
|
||||
@ -526,9 +547,9 @@ __LA_DECL int archive_entry_acl_next_w(struct archive_entry *, int /* want_type
|
||||
#define ARCHIVE_ENTRY_ACL_STYLE_COMPACT 0x00000010
|
||||
|
||||
__LA_DECL wchar_t *archive_entry_acl_to_text_w(struct archive_entry *,
|
||||
ssize_t * /* len */, int /* flags */);
|
||||
la_ssize_t * /* len */, int /* flags */);
|
||||
__LA_DECL char *archive_entry_acl_to_text(struct archive_entry *,
|
||||
ssize_t * /* len */, int /* flags */);
|
||||
la_ssize_t * /* len */, int /* flags */);
|
||||
__LA_DECL int archive_entry_acl_from_text_w(struct archive_entry *,
|
||||
const wchar_t * /* wtext */, int /* type */);
|
||||
__LA_DECL int archive_entry_acl_from_text(struct archive_entry *,
|
||||
|
@ -76,6 +76,10 @@ __hmac_sha1_cleanup(archive_hmac_sha1_ctx *ctx)
|
||||
|
||||
#elif defined(_WIN32) && !defined(__CYGWIN__) && defined(HAVE_BCRYPT_H)
|
||||
|
||||
#ifndef BCRYPT_HASH_REUSABLE_FLAG
|
||||
# define BCRYPT_HASH_REUSABLE_FLAG 0x00000020
|
||||
#endif
|
||||
|
||||
static int
|
||||
__hmac_sha1_init(archive_hmac_sha1_ctx *ctx, const uint8_t *key, size_t key_len)
|
||||
{
|
||||
|
@ -203,15 +203,17 @@ archive_read_disk_entry_from_file(struct archive *_a,
|
||||
#ifdef HAVE_STRUCT_STAT_ST_FLAGS
|
||||
/* On FreeBSD, we get flags for free with the stat. */
|
||||
/* TODO: Does this belong in copy_stat()? */
|
||||
if (st->st_flags != 0)
|
||||
if ((a->flags & ARCHIVE_READDISK_NO_FFLAGS) == 0 && st->st_flags != 0)
|
||||
archive_entry_set_fflags(entry, st->st_flags, 0);
|
||||
#endif
|
||||
|
||||
#if defined(EXT2_IOC_GETFLAGS) && defined(HAVE_WORKING_EXT2_IOC_GETFLAGS)
|
||||
#if (defined(FS_IOC_GETFLAGS) && defined(HAVE_WORKING_FS_IOC_GETFLAGS)) || \
|
||||
(defined(EXT2_IOC_GETFLAGS) && defined(HAVE_WORKING_EXT2_IOC_GETFLAGS))
|
||||
/* Linux requires an extra ioctl to pull the flags. Although
|
||||
* this is an extra step, it has a nice side-effect: We get an
|
||||
* open file descriptor which we can use in the subsequent lookups. */
|
||||
if ((S_ISREG(st->st_mode) || S_ISDIR(st->st_mode))) {
|
||||
if ((a->flags & ARCHIVE_READDISK_NO_FFLAGS) == 0 &&
|
||||
(S_ISREG(st->st_mode) || S_ISDIR(st->st_mode))) {
|
||||
if (fd < 0) {
|
||||
if (a->tree != NULL)
|
||||
fd = a->open_on_current_dir(a->tree, path,
|
||||
@ -223,7 +225,13 @@ archive_read_disk_entry_from_file(struct archive *_a,
|
||||
}
|
||||
if (fd >= 0) {
|
||||
int stflags;
|
||||
r = ioctl(fd, EXT2_IOC_GETFLAGS, &stflags);
|
||||
r = ioctl(fd,
|
||||
#if defined(FS_IOC_GETFLAGS)
|
||||
FS_IOC_GETFLAGS,
|
||||
#else
|
||||
EXT2_IOC_GETFLAGS,
|
||||
#endif
|
||||
&stflags);
|
||||
if (r == 0 && stflags != 0)
|
||||
archive_entry_set_fflags(entry, stflags, 0);
|
||||
}
|
||||
@ -269,13 +277,15 @@ archive_read_disk_entry_from_file(struct archive *_a,
|
||||
}
|
||||
#endif /* HAVE_READLINK || HAVE_READLINKAT */
|
||||
|
||||
r = setup_acls(a, entry, &fd);
|
||||
if (!a->suppress_xattr) {
|
||||
r = 0;
|
||||
if ((a->flags & ARCHIVE_READDISK_NO_ACL) == 0)
|
||||
r = setup_acls(a, entry, &fd);
|
||||
if ((a->flags & ARCHIVE_READDISK_NO_XATTR) == 0) {
|
||||
r1 = setup_xattrs(a, entry, &fd);
|
||||
if (r1 < r)
|
||||
r = r1;
|
||||
}
|
||||
if (a->enable_copyfile) {
|
||||
if (a->flags & ARCHIVE_READDISK_MAC_COPYFILE) {
|
||||
r1 = setup_mac_metadata(a, entry, &fd);
|
||||
if (r1 < r)
|
||||
r = r1;
|
||||
@ -321,20 +331,17 @@ setup_mac_metadata(struct archive_read_disk *a,
|
||||
name = archive_entry_sourcepath(entry);
|
||||
if (name == NULL)
|
||||
name = archive_entry_pathname(entry);
|
||||
else if (a->tree != NULL && a->tree_enter_working_dir(a->tree) != 0) {
|
||||
archive_set_error(&a->archive, errno,
|
||||
"Can't change dir to read extended attributes");
|
||||
return (ARCHIVE_FAILED);
|
||||
}
|
||||
if (name == NULL) {
|
||||
archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC,
|
||||
"Can't open file to read extended attributes: No name");
|
||||
return (ARCHIVE_WARN);
|
||||
}
|
||||
|
||||
if (a->tree != NULL) {
|
||||
if (a->tree_enter_working_dir(a->tree) != 0) {
|
||||
archive_set_error(&a->archive, errno,
|
||||
"Couldn't change dir");
|
||||
return (ARCHIVE_FAILED);
|
||||
}
|
||||
}
|
||||
|
||||
/* Short-circuit if there's nothing to do. */
|
||||
have_attrs = copyfile(name, NULL, 0, copyfile_flags | COPYFILE_CHECK);
|
||||
if (have_attrs == -1) {
|
||||
@ -453,21 +460,32 @@ setup_acls(struct archive_read_disk *a,
|
||||
#endif
|
||||
int r;
|
||||
|
||||
accpath = archive_entry_sourcepath(entry);
|
||||
if (accpath == NULL)
|
||||
accpath = archive_entry_pathname(entry);
|
||||
accpath = NULL;
|
||||
|
||||
if (*fd < 0 && a->tree != NULL) {
|
||||
if (a->follow_symlinks ||
|
||||
archive_entry_filetype(entry) != AE_IFLNK)
|
||||
#if HAVE_SUN_ACL || HAVE_DARWIN_ACL || HAVE_ACL_GET_FD_NP
|
||||
if (*fd < 0)
|
||||
#else
|
||||
/* For default ACLs on Linux we need reachable accpath */
|
||||
if (*fd < 0 || S_ISDIR(archive_entry_mode(entry)))
|
||||
#endif
|
||||
{
|
||||
accpath = archive_entry_sourcepath(entry);
|
||||
if (accpath == NULL || (a->tree != NULL &&
|
||||
a->tree_enter_working_dir(a->tree) != 0))
|
||||
accpath = archive_entry_pathname(entry);
|
||||
if (accpath == NULL) {
|
||||
archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC,
|
||||
"Couldn't determine file path to read ACLs");
|
||||
return (ARCHIVE_WARN);
|
||||
}
|
||||
if (a->tree != NULL &&
|
||||
#if !HAVE_SUN_ACL && !HAVE_DARWIN_ACL && !HAVE_ACL_GET_FD_NP
|
||||
*fd < 0 &&
|
||||
#endif
|
||||
(a->follow_symlinks ||
|
||||
archive_entry_filetype(entry) != AE_IFLNK)) {
|
||||
*fd = a->open_on_current_dir(a->tree,
|
||||
accpath, O_RDONLY | O_NONBLOCK);
|
||||
if (*fd < 0) {
|
||||
if (a->tree_enter_working_dir(a->tree) != 0) {
|
||||
archive_set_error(&a->archive, errno,
|
||||
"Couldn't access %s", accpath);
|
||||
return (ARCHIVE_FAILED);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -530,11 +548,11 @@ setup_acls(struct archive_read_disk *a,
|
||||
acl_free(acl);
|
||||
if (r != ARCHIVE_OK) {
|
||||
archive_set_error(&a->archive, errno,
|
||||
#if HAVE_SUN_ACL
|
||||
"Couldn't translate ACLs: %s", accpath);
|
||||
#else
|
||||
"Couldn't translate NFSv4 ACLs: %s", accpath);
|
||||
"Couldn't translate "
|
||||
#if !HAVE_SUN_ACL
|
||||
"NFSv4 "
|
||||
#endif
|
||||
"ACLs");
|
||||
}
|
||||
#if HAVE_DARWIN_ACL
|
||||
/*
|
||||
@ -543,8 +561,8 @@ setup_acls(struct archive_read_disk *a,
|
||||
* the archive entry. Otherwise extraction on non-Mac platforms
|
||||
* would lead to an invalid file mode.
|
||||
*/
|
||||
if (archive_entry_acl_count(entry,
|
||||
ARCHIVE_ENTRY_ACL_TYPE_NFS4) > 0)
|
||||
if ((archive_entry_acl_types(entry) &
|
||||
ARCHIVE_ENTRY_ACL_TYPE_NFS4) != 0)
|
||||
add_trivial_nfs4_acl(entry);
|
||||
#endif
|
||||
return (r);
|
||||
@ -586,7 +604,7 @@ setup_acls(struct archive_read_disk *a,
|
||||
acl = NULL;
|
||||
if (r != ARCHIVE_OK) {
|
||||
archive_set_error(&a->archive, errno,
|
||||
"Couldn't translate access ACLs: %s", accpath);
|
||||
"Couldn't translate access ACLs");
|
||||
return (r);
|
||||
}
|
||||
}
|
||||
@ -605,8 +623,7 @@ setup_acls(struct archive_read_disk *a,
|
||||
acl_free(acl);
|
||||
if (r != ARCHIVE_OK) {
|
||||
archive_set_error(&a->archive, errno,
|
||||
"Couldn't translate default ACLs: %s",
|
||||
accpath);
|
||||
"Couldn't translate default ACLs");
|
||||
return (r);
|
||||
}
|
||||
}
|
||||
@ -1411,15 +1428,10 @@ setup_acls(struct archive_read_disk *a,
|
||||
|
||||
static int
|
||||
setup_xattr(struct archive_read_disk *a,
|
||||
struct archive_entry *entry, const char *name, int fd)
|
||||
struct archive_entry *entry, const char *name, int fd, const char *accpath)
|
||||
{
|
||||
ssize_t size;
|
||||
void *value = NULL;
|
||||
const char *accpath;
|
||||
|
||||
accpath = archive_entry_sourcepath(entry);
|
||||
if (accpath == NULL)
|
||||
accpath = archive_entry_pathname(entry);
|
||||
|
||||
#if HAVE_FGETXATTR
|
||||
if (fd >= 0)
|
||||
@ -1484,21 +1496,23 @@ setup_xattrs(struct archive_read_disk *a,
|
||||
const char *path;
|
||||
ssize_t list_size;
|
||||
|
||||
path = archive_entry_sourcepath(entry);
|
||||
if (path == NULL)
|
||||
path = archive_entry_pathname(entry);
|
||||
path = NULL;
|
||||
|
||||
if (*fd < 0 && a->tree != NULL) {
|
||||
if (a->follow_symlinks ||
|
||||
archive_entry_filetype(entry) != AE_IFLNK)
|
||||
*fd = a->open_on_current_dir(a->tree, path,
|
||||
O_RDONLY | O_NONBLOCK);
|
||||
if (*fd < 0) {
|
||||
if (a->tree_enter_working_dir(a->tree) != 0) {
|
||||
archive_set_error(&a->archive, errno,
|
||||
"Couldn't access %s", path);
|
||||
return (ARCHIVE_FAILED);
|
||||
}
|
||||
if (*fd < 0) {
|
||||
path = archive_entry_sourcepath(entry);
|
||||
if (path == NULL || (a->tree != NULL &&
|
||||
a->tree_enter_working_dir(a->tree) != 0))
|
||||
path = archive_entry_pathname(entry);
|
||||
if (path == NULL) {
|
||||
archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC,
|
||||
"Couldn't determine file path to read "
|
||||
"extended attributes");
|
||||
return (ARCHIVE_WARN);
|
||||
}
|
||||
if (a->tree != NULL && (a->follow_symlinks ||
|
||||
archive_entry_filetype(entry) != AE_IFLNK)) {
|
||||
*fd = a->open_on_current_dir(a->tree,
|
||||
path, O_RDONLY | O_NONBLOCK);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1561,7 +1575,7 @@ setup_xattrs(struct archive_read_disk *a,
|
||||
if (strncmp(p, "system.", 7) == 0 ||
|
||||
strncmp(p, "xfsroot.", 8) == 0)
|
||||
continue;
|
||||
setup_xattr(a, entry, p, *fd);
|
||||
setup_xattr(a, entry, p, *fd, path);
|
||||
}
|
||||
|
||||
free(list);
|
||||
@ -1582,19 +1596,16 @@ setup_xattrs(struct archive_read_disk *a,
|
||||
*/
|
||||
static int
|
||||
setup_xattr(struct archive_read_disk *a, struct archive_entry *entry,
|
||||
int namespace, const char *name, const char *fullname, int fd);
|
||||
int namespace, const char *name, const char *fullname, int fd,
|
||||
const char *path);
|
||||
|
||||
static int
|
||||
setup_xattr(struct archive_read_disk *a, struct archive_entry *entry,
|
||||
int namespace, const char *name, const char *fullname, int fd)
|
||||
int namespace, const char *name, const char *fullname, int fd,
|
||||
const char *accpath)
|
||||
{
|
||||
ssize_t size;
|
||||
void *value = NULL;
|
||||
const char *accpath;
|
||||
|
||||
accpath = archive_entry_sourcepath(entry);
|
||||
if (accpath == NULL)
|
||||
accpath = archive_entry_pathname(entry);
|
||||
|
||||
if (fd >= 0)
|
||||
size = extattr_get_fd(fd, namespace, name, NULL, 0);
|
||||
@ -1644,21 +1655,23 @@ setup_xattrs(struct archive_read_disk *a,
|
||||
const char *path;
|
||||
int namespace = EXTATTR_NAMESPACE_USER;
|
||||
|
||||
path = archive_entry_sourcepath(entry);
|
||||
if (path == NULL)
|
||||
path = archive_entry_pathname(entry);
|
||||
path = NULL;
|
||||
|
||||
if (*fd < 0 && a->tree != NULL) {
|
||||
if (a->follow_symlinks ||
|
||||
archive_entry_filetype(entry) != AE_IFLNK)
|
||||
*fd = a->open_on_current_dir(a->tree, path,
|
||||
O_RDONLY | O_NONBLOCK);
|
||||
if (*fd < 0) {
|
||||
if (a->tree_enter_working_dir(a->tree) != 0) {
|
||||
archive_set_error(&a->archive, errno,
|
||||
"Couldn't access %s", path);
|
||||
return (ARCHIVE_FAILED);
|
||||
}
|
||||
if (*fd < 0) {
|
||||
path = archive_entry_sourcepath(entry);
|
||||
if (path == NULL || (a->tree != NULL &&
|
||||
a->tree_enter_working_dir(a->tree) != 0))
|
||||
path = archive_entry_pathname(entry);
|
||||
if (path == NULL) {
|
||||
archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC,
|
||||
"Couldn't determine file path to read "
|
||||
"extended attributes");
|
||||
return (ARCHIVE_WARN);
|
||||
}
|
||||
if (a->tree != NULL && (a->follow_symlinks ||
|
||||
archive_entry_filetype(entry) != AE_IFLNK)) {
|
||||
*fd = a->open_on_current_dir(a->tree,
|
||||
path, O_RDONLY | O_NONBLOCK);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1708,7 +1721,7 @@ setup_xattrs(struct archive_read_disk *a,
|
||||
name = buff + strlen(buff);
|
||||
memcpy(name, p + 1, len);
|
||||
name[len] = '\0';
|
||||
setup_xattr(a, entry, namespace, name, buff, *fd);
|
||||
setup_xattr(a, entry, namespace, name, buff, *fd, path);
|
||||
p += 1 + len;
|
||||
}
|
||||
|
||||
|
@ -465,8 +465,7 @@ archive_read_disk_new(void)
|
||||
a->entry = archive_entry_new2(&a->archive);
|
||||
a->lookup_uname = trivial_lookup_uname;
|
||||
a->lookup_gname = trivial_lookup_gname;
|
||||
a->enable_copyfile = 1;
|
||||
a->traverse_mount_points = 1;
|
||||
a->flags = ARCHIVE_READDISK_MAC_COPYFILE;
|
||||
a->open_on_current_dir = open_on_current_dir;
|
||||
a->tree_current_dir_fd = tree_current_dir_fd;
|
||||
a->tree_enter_working_dir = tree_enter_working_dir;
|
||||
@ -563,25 +562,19 @@ archive_read_disk_set_symlink_hybrid(struct archive *_a)
|
||||
int
|
||||
archive_read_disk_set_atime_restored(struct archive *_a)
|
||||
{
|
||||
#ifndef HAVE_UTIMES
|
||||
static int warning_done = 0;
|
||||
#endif
|
||||
struct archive_read_disk *a = (struct archive_read_disk *)_a;
|
||||
archive_check_magic(_a, ARCHIVE_READ_DISK_MAGIC,
|
||||
ARCHIVE_STATE_ANY, "archive_read_disk_restore_atime");
|
||||
#ifdef HAVE_UTIMES
|
||||
a->restore_time = 1;
|
||||
a->flags |= ARCHIVE_READDISK_RESTORE_ATIME;
|
||||
if (a->tree != NULL)
|
||||
a->tree->flags |= needsRestoreTimes;
|
||||
return (ARCHIVE_OK);
|
||||
#else
|
||||
if (warning_done)
|
||||
/* Warning was already emitted; suppress further warnings. */
|
||||
return (ARCHIVE_OK);
|
||||
|
||||
/* Display warning and unset flag */
|
||||
archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC,
|
||||
"Cannot restore access time on this system");
|
||||
warning_done = 1;
|
||||
a->flags &= ~ARCHIVE_READDISK_RESTORE_ATIME;
|
||||
return (ARCHIVE_WARN);
|
||||
#endif
|
||||
}
|
||||
@ -595,29 +588,14 @@ archive_read_disk_set_behavior(struct archive *_a, int flags)
|
||||
archive_check_magic(_a, ARCHIVE_READ_DISK_MAGIC,
|
||||
ARCHIVE_STATE_ANY, "archive_read_disk_honor_nodump");
|
||||
|
||||
a->flags = flags;
|
||||
|
||||
if (flags & ARCHIVE_READDISK_RESTORE_ATIME)
|
||||
r = archive_read_disk_set_atime_restored(_a);
|
||||
else {
|
||||
a->restore_time = 0;
|
||||
if (a->tree != NULL)
|
||||
a->tree->flags &= ~needsRestoreTimes;
|
||||
}
|
||||
if (flags & ARCHIVE_READDISK_HONOR_NODUMP)
|
||||
a->honor_nodump = 1;
|
||||
else
|
||||
a->honor_nodump = 0;
|
||||
if (flags & ARCHIVE_READDISK_MAC_COPYFILE)
|
||||
a->enable_copyfile = 1;
|
||||
else
|
||||
a->enable_copyfile = 0;
|
||||
if (flags & ARCHIVE_READDISK_NO_TRAVERSE_MOUNTS)
|
||||
a->traverse_mount_points = 0;
|
||||
else
|
||||
a->traverse_mount_points = 1;
|
||||
if (flags & ARCHIVE_READDISK_NO_XATTR)
|
||||
a->suppress_xattr = 1;
|
||||
else
|
||||
a->suppress_xattr = 0;
|
||||
return (r);
|
||||
}
|
||||
|
||||
@ -918,7 +896,7 @@ next_entry(struct archive_read_disk *a, struct tree *t,
|
||||
} while (lst == NULL);
|
||||
|
||||
#ifdef __APPLE__
|
||||
if (a->enable_copyfile) {
|
||||
if (a->flags & ARCHIVE_READDISK_MAC_COPYFILE) {
|
||||
/* If we're using copyfile(), ignore "._XXX" files. */
|
||||
const char *bname = strrchr(tree_current_path(t), '/');
|
||||
if (bname == NULL)
|
||||
@ -989,7 +967,7 @@ next_entry(struct archive_read_disk *a, struct tree *t,
|
||||
}
|
||||
if (t->initial_filesystem_id == -1)
|
||||
t->initial_filesystem_id = t->current_filesystem_id;
|
||||
if (!a->traverse_mount_points) {
|
||||
if (a->flags & ARCHIVE_READDISK_NO_TRAVERSE_MOUNTS) {
|
||||
if (t->initial_filesystem_id != t->current_filesystem_id)
|
||||
descend = 0;
|
||||
}
|
||||
@ -999,12 +977,14 @@ next_entry(struct archive_read_disk *a, struct tree *t,
|
||||
* Honor nodump flag.
|
||||
* If the file is marked with nodump flag, do not return this entry.
|
||||
*/
|
||||
if (a->honor_nodump) {
|
||||
if (a->flags & ARCHIVE_READDISK_HONOR_NODUMP) {
|
||||
#if defined(HAVE_STRUCT_STAT_ST_FLAGS) && defined(UF_NODUMP)
|
||||
if (st->st_flags & UF_NODUMP)
|
||||
return (ARCHIVE_RETRY);
|
||||
#elif defined(EXT2_IOC_GETFLAGS) && defined(EXT2_NODUMP_FL) &&\
|
||||
defined(HAVE_WORKING_EXT2_IOC_GETFLAGS)
|
||||
#elif (defined(FS_IOC_GETFLAGS) && defined(FS_NODUMP_FL) && \
|
||||
defined(HAVE_WORKING_FS_IOC_GETFLAGS)) || \
|
||||
(defined(EXT2_IOC_GETFLAGS) && defined(EXT2_NODUMP_FL) && \
|
||||
defined(HAVE_WORKING_EXT2_IOC_GETFLAGS))
|
||||
if (S_ISREG(st->st_mode) || S_ISDIR(st->st_mode)) {
|
||||
int stflags;
|
||||
|
||||
@ -1013,9 +993,18 @@ next_entry(struct archive_read_disk *a, struct tree *t,
|
||||
O_RDONLY | O_NONBLOCK | O_CLOEXEC);
|
||||
__archive_ensure_cloexec_flag(t->entry_fd);
|
||||
if (t->entry_fd >= 0) {
|
||||
r = ioctl(t->entry_fd, EXT2_IOC_GETFLAGS,
|
||||
r = ioctl(t->entry_fd,
|
||||
#ifdef FS_IOC_GETFLAGS
|
||||
FS_IOC_GETFLAGS,
|
||||
#else
|
||||
EXT2_IOC_GETFLAGS,
|
||||
#endif
|
||||
&stflags);
|
||||
#ifdef FS_NODUMP_FL
|
||||
if (r == 0 && (stflags & FS_NODUMP_FL) != 0)
|
||||
#else
|
||||
if (r == 0 && (stflags & EXT2_NODUMP_FL) != 0)
|
||||
#endif
|
||||
return (ARCHIVE_RETRY);
|
||||
}
|
||||
}
|
||||
@ -1340,10 +1329,11 @@ _archive_read_disk_open(struct archive *_a, const char *pathname)
|
||||
struct archive_read_disk *a = (struct archive_read_disk *)_a;
|
||||
|
||||
if (a->tree != NULL)
|
||||
a->tree = tree_reopen(a->tree, pathname, a->restore_time);
|
||||
a->tree = tree_reopen(a->tree, pathname,
|
||||
a->flags & ARCHIVE_READDISK_RESTORE_ATIME);
|
||||
else
|
||||
a->tree = tree_open(pathname, a->symlink_mode,
|
||||
a->restore_time);
|
||||
a->flags & ARCHIVE_READDISK_RESTORE_ATIME);
|
||||
if (a->tree == NULL) {
|
||||
archive_set_error(&a->archive, ENOMEM,
|
||||
"Can't allocate tar data");
|
||||
@ -2132,7 +2122,7 @@ tree_open(const char *path, int symlink_mode, int restore_time)
|
||||
static struct tree *
|
||||
tree_reopen(struct tree *t, const char *path, int restore_time)
|
||||
{
|
||||
t->flags = (restore_time)?needsRestoreTimes:0;
|
||||
t->flags = (restore_time != 0)?needsRestoreTimes:0;
|
||||
t->flags |= onInitialDir;
|
||||
t->visit_type = 0;
|
||||
t->tree_errno = 0;
|
||||
|
@ -63,16 +63,8 @@ struct archive_read_disk {
|
||||
int (*tree_current_dir_fd)(struct tree*);
|
||||
int (*tree_enter_working_dir)(struct tree*);
|
||||
|
||||
/* Set 1 if users request to restore atime . */
|
||||
int restore_time;
|
||||
/* Set 1 if users request to honor nodump flag . */
|
||||
int honor_nodump;
|
||||
/* Set 1 if users request to enable mac copyfile. */
|
||||
int enable_copyfile;
|
||||
/* Set 1 if users request to traverse mount points. */
|
||||
int traverse_mount_points;
|
||||
/* Set 1 if users want to suppress xattr information. */
|
||||
int suppress_xattr;
|
||||
/* Bitfield with ARCHIVE_READDISK_* tunables */
|
||||
int flags;
|
||||
|
||||
const char * (*lookup_gname)(void *private, int64_t gid);
|
||||
void (*cleanup_gname)(void *private);
|
||||
|
@ -398,8 +398,7 @@ archive_read_disk_new(void)
|
||||
a->entry = archive_entry_new2(&a->archive);
|
||||
a->lookup_uname = trivial_lookup_uname;
|
||||
a->lookup_gname = trivial_lookup_gname;
|
||||
a->enable_copyfile = 1;
|
||||
a->traverse_mount_points = 1;
|
||||
a->flags = ARCHIVE_READDISK_MAC_COPYFILE;
|
||||
return (&a->archive);
|
||||
}
|
||||
|
||||
@ -495,7 +494,7 @@ archive_read_disk_set_atime_restored(struct archive *_a)
|
||||
struct archive_read_disk *a = (struct archive_read_disk *)_a;
|
||||
archive_check_magic(_a, ARCHIVE_READ_DISK_MAGIC,
|
||||
ARCHIVE_STATE_ANY, "archive_read_disk_restore_atime");
|
||||
a->restore_time = 1;
|
||||
a->flags |= ARCHIVE_READDISK_RESTORE_ATIME;
|
||||
if (a->tree != NULL)
|
||||
a->tree->flags |= needsRestoreTimes;
|
||||
return (ARCHIVE_OK);
|
||||
@ -510,25 +509,14 @@ archive_read_disk_set_behavior(struct archive *_a, int flags)
|
||||
archive_check_magic(_a, ARCHIVE_READ_DISK_MAGIC,
|
||||
ARCHIVE_STATE_ANY, "archive_read_disk_honor_nodump");
|
||||
|
||||
a->flags = flags;
|
||||
|
||||
if (flags & ARCHIVE_READDISK_RESTORE_ATIME)
|
||||
r = archive_read_disk_set_atime_restored(_a);
|
||||
else {
|
||||
a->restore_time = 0;
|
||||
if (a->tree != NULL)
|
||||
a->tree->flags &= ~needsRestoreTimes;
|
||||
}
|
||||
if (flags & ARCHIVE_READDISK_HONOR_NODUMP)
|
||||
a->honor_nodump = 1;
|
||||
else
|
||||
a->honor_nodump = 0;
|
||||
if (flags & ARCHIVE_READDISK_MAC_COPYFILE)
|
||||
a->enable_copyfile = 1;
|
||||
else
|
||||
a->enable_copyfile = 0;
|
||||
if (flags & ARCHIVE_READDISK_NO_TRAVERSE_MOUNTS)
|
||||
a->traverse_mount_points = 0;
|
||||
else
|
||||
a->traverse_mount_points = 1;
|
||||
return (r);
|
||||
}
|
||||
|
||||
@ -852,7 +840,7 @@ next_entry(struct archive_read_disk *a, struct tree *t,
|
||||
}
|
||||
if (t->initial_filesystem_id == -1)
|
||||
t->initial_filesystem_id = t->current_filesystem_id;
|
||||
if (!a->traverse_mount_points) {
|
||||
if (a->flags & ARCHIVE_READDISK_NO_TRAVERSE_MOUNTS) {
|
||||
if (t->initial_filesystem_id != t->current_filesystem_id)
|
||||
return (ARCHIVE_RETRY);
|
||||
}
|
||||
@ -1219,9 +1207,11 @@ _archive_read_disk_open_w(struct archive *_a, const wchar_t *pathname)
|
||||
struct archive_read_disk *a = (struct archive_read_disk *)_a;
|
||||
|
||||
if (a->tree != NULL)
|
||||
a->tree = tree_reopen(a->tree, pathname, a->restore_time);
|
||||
a->tree = tree_reopen(a->tree, pathname,
|
||||
a->flags & ARCHIVE_READDISK_RESTORE_ATIME);
|
||||
else
|
||||
a->tree = tree_open(pathname, a->symlink_mode, a->restore_time);
|
||||
a->tree = tree_open(pathname, a->symlink_mode,
|
||||
a->flags & ARCHIVE_READDISK_RESTORE_ATIME);
|
||||
if (a->tree == NULL) {
|
||||
archive_set_error(&a->archive, ENOMEM,
|
||||
"Can't allocate directory traversal data");
|
||||
@ -1519,7 +1509,7 @@ tree_reopen(struct tree *t, const wchar_t *path, int restore_time)
|
||||
struct archive_wstring ws;
|
||||
wchar_t *pathname, *p, *base;
|
||||
|
||||
t->flags = (restore_time)?needsRestoreTimes:0;
|
||||
t->flags = (restore_time != 0)?needsRestoreTimes:0;
|
||||
t->visit_type = 0;
|
||||
t->tree_errno = 0;
|
||||
t->full_path_dir_length = 0;
|
||||
|
@ -847,9 +847,9 @@ tar_read_header(struct archive_read *a, struct tar *tar,
|
||||
tar->sparse_gnu_pending = 0;
|
||||
/* Read initial sparse map. */
|
||||
bytes_read = gnu_sparse_10_read(a, tar, unconsumed);
|
||||
tar->entry_bytes_remaining -= bytes_read;
|
||||
if (bytes_read < 0)
|
||||
return ((int)bytes_read);
|
||||
tar->entry_bytes_remaining -= bytes_read;
|
||||
} else {
|
||||
archive_set_error(&a->archive,
|
||||
ARCHIVE_ERRNO_MISC,
|
||||
@ -2487,6 +2487,9 @@ gnu_sparse_10_read(struct archive_read *a, struct tar *tar, size_t *unconsumed)
|
||||
tar_flush_unconsumed(a, unconsumed);
|
||||
bytes_read = (ssize_t)(tar->entry_bytes_remaining - remaining);
|
||||
to_skip = 0x1ff & -bytes_read;
|
||||
/* Fail if tar->entry_bytes_remaing would get negative */
|
||||
if (to_skip > remaining)
|
||||
return (ARCHIVE_FATAL);
|
||||
if (to_skip != __archive_read_consume(a, to_skip))
|
||||
return (ARCHIVE_FATAL);
|
||||
return ((ssize_t)(bytes_read + to_skip));
|
||||
|
@ -543,7 +543,7 @@ xstrpisotime(const char *s, char **endptr)
|
||||
|
||||
/* as a courtesy to our callers, and since this is a non-standard
|
||||
* routine, we skip leading whitespace */
|
||||
while (isblank((unsigned char)*s))
|
||||
while (*s == ' ' || *s == '\t')
|
||||
++s;
|
||||
|
||||
/* read year */
|
||||
@ -589,6 +589,7 @@ static unsigned int
|
||||
_warc_rdver(const char *buf, size_t bsz)
|
||||
{
|
||||
static const char magic[] = "WARC/";
|
||||
const char *c;
|
||||
unsigned int ver = 0U;
|
||||
unsigned int end = 0U;
|
||||
|
||||
@ -615,11 +616,12 @@ _warc_rdver(const char *buf, size_t bsz)
|
||||
* WARC below version 0.12 has a space-separated header
|
||||
* WARC 0.12 and above terminates the version with a CRLF
|
||||
*/
|
||||
c = buf + 3U + end;
|
||||
if (ver >= 1200U) {
|
||||
if (memcmp(buf + 3U + end, "\r\n", 2U) != 0)
|
||||
if (memcmp(c, "\r\n", 2U) != 0)
|
||||
ver = 0U;
|
||||
} else if (ver < 1200U) {
|
||||
if (!isblank(*(buf + 3U + end)))
|
||||
if (*c != ' ' && *c != '\t')
|
||||
ver = 0U;
|
||||
}
|
||||
}
|
||||
@ -643,7 +645,7 @@ _warc_rdtyp(const char *buf, size_t bsz)
|
||||
}
|
||||
|
||||
/* overread whitespace */
|
||||
while (val < eol && isblank((unsigned char)*val))
|
||||
while (val < eol && (*val == ' ' || *val == '\t'))
|
||||
++val;
|
||||
|
||||
if (val + 8U == eol) {
|
||||
@ -673,7 +675,7 @@ _warc_rduri(const char *buf, size_t bsz)
|
||||
return res;
|
||||
}
|
||||
|
||||
while (val < eol && isblank((unsigned char)*val))
|
||||
while (val < eol && (*val == ' ' || *val == '\t'))
|
||||
++val;
|
||||
|
||||
/* overread URL designators */
|
||||
@ -731,7 +733,7 @@ _warc_rdlen(const char *buf, size_t bsz)
|
||||
}
|
||||
|
||||
/* skip leading whitespace */
|
||||
while (val < eol && isblank(*val))
|
||||
while (val < eol && (*val == ' ' || *val == '\t'))
|
||||
val++;
|
||||
/* there must be at least one digit */
|
||||
if (!isdigit(*val))
|
||||
|
@ -1712,7 +1712,8 @@ _archive_write_disk_finish_entry(struct archive *_a)
|
||||
const void *metadata;
|
||||
size_t metadata_size;
|
||||
metadata = archive_entry_mac_metadata(a->entry, &metadata_size);
|
||||
if (metadata == NULL || metadata_size == 0) {
|
||||
if ((a->todo & TODO_MAC_METADATA) == 0 ||
|
||||
metadata == NULL || metadata_size == 0) {
|
||||
#endif
|
||||
r2 = archive_write_disk_set_acls(&a->archive, a->fd,
|
||||
archive_entry_pathname(a->entry),
|
||||
@ -2067,6 +2068,7 @@ create_filesystem_object(struct archive_write_disk *a)
|
||||
int r;
|
||||
/* these for check_symlinks_fsobj */
|
||||
char *linkname_copy; /* non-const copy of linkname */
|
||||
struct stat st;
|
||||
struct archive_string error_string;
|
||||
int error_number;
|
||||
|
||||
@ -2131,11 +2133,20 @@ create_filesystem_object(struct archive_write_disk *a)
|
||||
a->todo = 0;
|
||||
a->deferred = 0;
|
||||
} else if (r == 0 && a->filesize > 0) {
|
||||
a->fd = open(a->name, O_WRONLY | O_TRUNC | O_BINARY
|
||||
| O_CLOEXEC | O_NOFOLLOW);
|
||||
__archive_ensure_cloexec_flag(a->fd);
|
||||
if (a->fd < 0)
|
||||
#ifdef HAVE_LSTAT
|
||||
r = lstat(a->name, &st);
|
||||
#else
|
||||
r = stat(a->name, &st);
|
||||
#endif
|
||||
if (r != 0)
|
||||
r = errno;
|
||||
else if ((st.st_mode & AE_IFMT) == AE_IFREG) {
|
||||
a->fd = open(a->name, O_WRONLY | O_TRUNC |
|
||||
O_BINARY | O_CLOEXEC | O_NOFOLLOW);
|
||||
__archive_ensure_cloexec_flag(a->fd);
|
||||
if (a->fd < 0)
|
||||
r = errno;
|
||||
}
|
||||
}
|
||||
return (r);
|
||||
#endif
|
||||
@ -2283,7 +2294,8 @@ _archive_write_disk_close(struct archive *_a)
|
||||
chmod(p->name, p->mode);
|
||||
if (p->fixup & TODO_ACLS)
|
||||
#ifdef HAVE_DARWIN_ACL
|
||||
if (p->mac_metadata == NULL ||
|
||||
if ((p->fixup & TODO_MAC_METADATA) == 0 ||
|
||||
p->mac_metadata == NULL ||
|
||||
p->mac_metadata_size == 0)
|
||||
#endif
|
||||
archive_write_disk_set_acls(&a->archive,
|
||||
@ -3455,12 +3467,19 @@ set_fflags(struct archive_write_disk *a)
|
||||
#ifdef UF_APPEND
|
||||
critical_flags |= UF_APPEND;
|
||||
#endif
|
||||
#ifdef EXT2_APPEND_FL
|
||||
#if defined(FS_APPEND_FL)
|
||||
critical_flags |= FS_APPEND_FL;
|
||||
#elif defined(EXT2_APPEND_FL)
|
||||
critical_flags |= EXT2_APPEND_FL;
|
||||
#endif
|
||||
#ifdef EXT2_IMMUTABLE_FL
|
||||
#if defined(FS_IMMUTABLE_FL)
|
||||
critical_flags |= FS_IMMUTABLE_FL;
|
||||
#elif defined(EXT2_IMMUTABLE_FL)
|
||||
critical_flags |= EXT2_IMMUTABLE_FL;
|
||||
#endif
|
||||
#ifdef FS_JOURNAL_DATA_FL
|
||||
critical_flags |= FS_JOURNAL_DATA_FL;
|
||||
#endif
|
||||
|
||||
if (a->todo & TODO_FFLAGS) {
|
||||
archive_entry_fflags(a->entry, &set, &clear);
|
||||
@ -3572,7 +3591,10 @@ set_fflags_platform(struct archive_write_disk *a, int fd, const char *name,
|
||||
return (ARCHIVE_WARN);
|
||||
}
|
||||
|
||||
#elif defined(EXT2_IOC_GETFLAGS) && defined(EXT2_IOC_SETFLAGS) && defined(HAVE_WORKING_EXT2_IOC_GETFLAGS)
|
||||
#elif (defined(FS_IOC_GETFLAGS) && defined(FS_IOC_SETFLAGS) && \
|
||||
defined(HAVE_WORKING_FS_IOC_GETFLAGS)) || \
|
||||
(defined(EXT2_IOC_GETFLAGS) && defined(EXT2_IOC_SETFLAGS) && \
|
||||
defined(HAVE_WORKING_EXT2_IOC_GETFLAGS))
|
||||
/*
|
||||
* Linux uses ioctl() to read and write file flags.
|
||||
*/
|
||||
@ -3585,7 +3607,7 @@ set_fflags_platform(struct archive_write_disk *a, int fd, const char *name,
|
||||
int newflags, oldflags;
|
||||
int sf_mask = 0;
|
||||
|
||||
if (set == 0 && clear == 0)
|
||||
if (set == 0 && clear == 0)
|
||||
return (ARCHIVE_OK);
|
||||
/* Only regular files and dirs can have flags. */
|
||||
if (!S_ISREG(mode) && !S_ISDIR(mode))
|
||||
@ -3606,11 +3628,18 @@ set_fflags_platform(struct archive_write_disk *a, int fd, const char *name,
|
||||
* defines. (?) The code below degrades reasonably gracefully
|
||||
* if sf_mask is incomplete.
|
||||
*/
|
||||
#ifdef EXT2_IMMUTABLE_FL
|
||||
#if defined(FS_IMMUTABLE_FL)
|
||||
sf_mask |= FS_IMMUTABLE_FL;
|
||||
#elif defined(EXT2_IMMUTABLE_FL)
|
||||
sf_mask |= EXT2_IMMUTABLE_FL;
|
||||
#endif
|
||||
#ifdef EXT2_APPEND_FL
|
||||
#if defined(FS_APPEND_FL)
|
||||
sf_mask |= FS_APPEND_FL;
|
||||
#elif defined(EXT2_APPEND_FL)
|
||||
sf_mask |= EXT2_APPEND_FL;
|
||||
#endif
|
||||
#if defined(FS_JOURNAL_DATA_FL)
|
||||
sf_mask |= FS_JOURNAL_DATA_FL;
|
||||
#endif
|
||||
/*
|
||||
* XXX As above, this would be way simpler if we didn't have
|
||||
@ -3619,12 +3648,24 @@ set_fflags_platform(struct archive_write_disk *a, int fd, const char *name,
|
||||
ret = ARCHIVE_OK;
|
||||
|
||||
/* Read the current file flags. */
|
||||
if (ioctl(myfd, EXT2_IOC_GETFLAGS, &oldflags) < 0)
|
||||
if (ioctl(myfd,
|
||||
#ifdef FS_IOC_GETFLAGS
|
||||
FS_IOC_GETFLAGS,
|
||||
#else
|
||||
EXT2_IOC_GETFLAGS,
|
||||
#endif
|
||||
&oldflags) < 0)
|
||||
goto fail;
|
||||
|
||||
/* Try setting the flags as given. */
|
||||
newflags = (oldflags & ~clear) | set;
|
||||
if (ioctl(myfd, EXT2_IOC_SETFLAGS, &newflags) >= 0)
|
||||
if (ioctl(myfd,
|
||||
#ifdef FS_IOC_SETFLAGS
|
||||
FS_IOC_SETFLAGS,
|
||||
#else
|
||||
EXT2_IOC_SETFLAGS,
|
||||
#endif
|
||||
&newflags) >= 0)
|
||||
goto cleanup;
|
||||
if (errno != EPERM)
|
||||
goto fail;
|
||||
@ -3633,7 +3674,13 @@ set_fflags_platform(struct archive_write_disk *a, int fd, const char *name,
|
||||
newflags &= ~sf_mask;
|
||||
oldflags &= sf_mask;
|
||||
newflags |= oldflags;
|
||||
if (ioctl(myfd, EXT2_IOC_SETFLAGS, &newflags) >= 0)
|
||||
if (ioctl(myfd,
|
||||
#ifdef FS_IOC_SETFLAGS
|
||||
FS_IOC_SETFLAGS,
|
||||
#else
|
||||
EXT2_IOC_SETFLAGS,
|
||||
#endif
|
||||
&newflags) >= 0)
|
||||
goto cleanup;
|
||||
|
||||
/* We couldn't set the flags, so report the failure. */
|
||||
|
@ -4074,8 +4074,10 @@ write_information_block(struct archive_write *a)
|
||||
memset(info.s, 0, info_size);
|
||||
opt = 0;
|
||||
#if defined(HAVE__CTIME64_S)
|
||||
__time64_t iso9660_birth_time_tmp = (__time64_t) iso9660->birth_time; //time_t may be shorter than 64 bits
|
||||
_ctime64_s(buf, sizeof(buf), &(iso9660_birth_time_tmp));
|
||||
{
|
||||
__time64_t iso9660_birth_time_tmp = (__time64_t) iso9660->birth_time; //time_t may be shorter than 64 bits
|
||||
_ctime64_s(buf, sizeof(buf), &(iso9660_birth_time_tmp));
|
||||
}
|
||||
#elif defined(HAVE_CTIME_R)
|
||||
ctime_r(&(iso9660->birth_time), buf);
|
||||
#else
|
||||
|
@ -6,7 +6,7 @@
|
||||
IF(ENABLE_TEST)
|
||||
SET(libarchive_test_SOURCES
|
||||
../../test_utils/test_utils.c
|
||||
main.c
|
||||
../../test_utils/test_main.c
|
||||
read_open_memory.c
|
||||
test.h
|
||||
test_acl_nfs4.c
|
||||
@ -303,6 +303,7 @@ IF(ENABLE_TEST)
|
||||
INCLUDE(${CMAKE_CURRENT_BINARY_DIR}/list.h)
|
||||
INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR})
|
||||
INCLUDE_DIRECTORIES(${PROJECT_SOURCE_DIR}/test_utils)
|
||||
INCLUDE_DIRECTORIES(${PROJECT_SOURCE_DIR}/libarchive/test)
|
||||
|
||||
# Experimental new test handling
|
||||
ADD_CUSTOM_TARGET(run_libarchive_test
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2003-2006 Tim Kientzle
|
||||
* Copyright (c) 2003-2017 Tim Kientzle
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
@ -21,388 +21,16 @@
|
||||
* 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.
|
||||
*
|
||||
* $FreeBSD: head/lib/libarchive/test/test.h 201247 2009-12-30 05:59:21Z kientzle $
|
||||
*/
|
||||
|
||||
/* Every test program should #include "test.h" as the first thing. */
|
||||
|
||||
/*
|
||||
* The goal of this file (and the matching test.c) is to
|
||||
* simplify the very repetitive test-*.c test programs.
|
||||
*/
|
||||
#if defined(HAVE_CONFIG_H)
|
||||
/* Most POSIX platforms use the 'configure' script to build config.h */
|
||||
#include "config.h"
|
||||
#elif defined(__FreeBSD__)
|
||||
/* Building as part of FreeBSD system requires a pre-built config.h. */
|
||||
#include "config_freebsd.h"
|
||||
#elif defined(_WIN32) && !defined(__CYGWIN__)
|
||||
/* Win32 can't run the 'configure' script. */
|
||||
#include "config_windows.h"
|
||||
#else
|
||||
/* Warn if the library hasn't been (automatically or manually) configured. */
|
||||
#error Oops: No config.h and no pre-built configuration in test.h.
|
||||
#endif
|
||||
#define KNOWNREF "test_compat_gtar_1.tar.uu"
|
||||
#define ENVBASE "LIBARCHIVE" /* Prefix for environment variables. */
|
||||
#undef PROGRAM /* Testing a library, not a program. */
|
||||
#define LIBRARY "libarchive"
|
||||
#define EXTRA_DUMP(x) archive_error_string((struct archive *)(x))
|
||||
#define EXTRA_ERRNO(x) archive_errno((struct archive *)(x))
|
||||
#define EXTRA_VERSION archive_version_details()
|
||||
|
||||
#include <sys/types.h> /* Windows requires this before sys/stat.h */
|
||||
#include <sys/stat.h>
|
||||
|
||||
#if HAVE_DIRENT_H
|
||||
#include <dirent.h>
|
||||
#endif
|
||||
#ifdef HAVE_DIRECT_H
|
||||
#include <direct.h>
|
||||
#define dirent direct
|
||||
#endif
|
||||
#include <errno.h>
|
||||
#include <fcntl.h>
|
||||
#ifdef HAVE_IO_H
|
||||
#include <io.h>
|
||||
#endif
|
||||
#ifdef HAVE_STDINT_H
|
||||
#include <stdint.h>
|
||||
#endif
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <ctype.h>
|
||||
#include <time.h>
|
||||
#ifdef HAVE_UNISTD_H
|
||||
#include <unistd.h>
|
||||
#endif
|
||||
#include <wchar.h>
|
||||
#ifdef HAVE_WINDOWS_H
|
||||
#include <windows.h>
|
||||
#endif
|
||||
|
||||
/*
|
||||
* System-specific tweaks. We really want to minimize these
|
||||
* as much as possible, since they make it harder to understand
|
||||
* the mainline code.
|
||||
*/
|
||||
|
||||
/* Windows (including Visual Studio and MinGW but not Cygwin) */
|
||||
#if defined(_WIN32) && !defined(__CYGWIN__)
|
||||
#if !defined(__BORLANDC__)
|
||||
#undef chdir
|
||||
#define chdir _chdir
|
||||
#define strdup _strdup
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/* Visual Studio */
|
||||
#if defined(_MSC_VER) && _MSC_VER < 1900
|
||||
#define snprintf sprintf_s
|
||||
#endif
|
||||
|
||||
#if defined(__BORLANDC__)
|
||||
#pragma warn -8068 /* Constant out of range in comparison. */
|
||||
#endif
|
||||
|
||||
/* Haiku OS and QNX */
|
||||
#if defined(__HAIKU__) || defined(__QNXNTO__)
|
||||
/* Haiku and QNX have typedefs in stdint.h (needed for int64_t) */
|
||||
#include <stdint.h>
|
||||
#endif
|
||||
|
||||
/* Get a real definition for __FBSDID if we can */
|
||||
#if HAVE_SYS_CDEFS_H
|
||||
#include <sys/cdefs.h>
|
||||
#endif
|
||||
|
||||
/* If not, define it so as to avoid dangling semicolons. */
|
||||
#ifndef __FBSDID
|
||||
#define __FBSDID(a) struct _undefined_hack
|
||||
#endif
|
||||
|
||||
#ifndef O_BINARY
|
||||
#define O_BINARY 0
|
||||
#endif
|
||||
|
||||
/*
|
||||
* If this platform has <sys/acl.h>, acl_create(), acl_init(),
|
||||
* acl_set_file(), and ACL_USER, we assume it has the rest of the
|
||||
* POSIX.1e draft functions used in archive_read_extract.c.
|
||||
*/
|
||||
#if HAVE_SYS_ACL_H && HAVE_ACL_CREATE_ENTRY && HAVE_ACL_INIT && HAVE_ACL_SET_FILE
|
||||
#if HAVE_ACL_USER
|
||||
#define HAVE_POSIX_ACL 1
|
||||
#elif HAVE_ACL_TYPE_EXTENDED
|
||||
#define HAVE_DARWIN_ACL 1
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/*
|
||||
* If this platform has <sys/acl.h>, acl_get(), facl_get(), acl_set(),
|
||||
* facl_set() and types aclent_t and ace_t it uses Solaris-style ACL functions
|
||||
*/
|
||||
#if HAVE_SYS_ACL_H && HAVE_ACL_GET && HAVE_FACL_GET && HAVE_ACL_SET && HAVE_FACL_SET && HAVE_ACLENT_T && HAVE_ACE_T
|
||||
#define HAVE_SUN_ACL 1
|
||||
#endif
|
||||
|
||||
/* Define if platform supports NFSv4 ACLs */
|
||||
#if (HAVE_POSIX_ACL && HAVE_ACL_TYPE_NFS4) || HAVE_SUN_ACL || HAVE_DARWIN_ACL
|
||||
#define HAVE_NFS4_ACL 1
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Redefine DEFINE_TEST for use in defining the test functions.
|
||||
*/
|
||||
#undef DEFINE_TEST
|
||||
#define DEFINE_TEST(name) void name(void); void name(void)
|
||||
|
||||
/* An implementation of the standard assert() macro */
|
||||
#define assert(e) assertion_assert(__FILE__, __LINE__, (e), #e, NULL)
|
||||
/* chdir() and error if it fails */
|
||||
#define assertChdir(path) \
|
||||
assertion_chdir(__FILE__, __LINE__, path)
|
||||
/* Assert two integers are the same. Reports value of each one if not. */
|
||||
#define assertEqualInt(v1,v2) \
|
||||
assertion_equal_int(__FILE__, __LINE__, (v1), #v1, (v2), #v2, NULL)
|
||||
/* Assert two strings are the same. Reports value of each one if not. */
|
||||
#define assertEqualString(v1,v2) \
|
||||
assertion_equal_string(__FILE__, __LINE__, (v1), #v1, (v2), #v2, NULL, 0)
|
||||
#define assertEqualUTF8String(v1,v2) \
|
||||
assertion_equal_string(__FILE__, __LINE__, (v1), #v1, (v2), #v2, NULL, 1)
|
||||
/* As above, but v1 and v2 are wchar_t * */
|
||||
#define assertEqualWString(v1,v2) \
|
||||
assertion_equal_wstring(__FILE__, __LINE__, (v1), #v1, (v2), #v2, NULL)
|
||||
/* As above, but raw blocks of bytes. */
|
||||
#define assertEqualMem(v1, v2, l) \
|
||||
assertion_equal_mem(__FILE__, __LINE__, (v1), #v1, (v2), #v2, (l), #l, NULL)
|
||||
/* Assert that memory is full of a specified byte */
|
||||
#define assertMemoryFilledWith(v1, l, b) \
|
||||
assertion_memory_filled_with(__FILE__, __LINE__, (v1), #v1, (l), #l, (b), #b, NULL)
|
||||
/* Assert two files are the same. */
|
||||
#define assertEqualFile(f1, f2) \
|
||||
assertion_equal_file(__FILE__, __LINE__, (f1), (f2))
|
||||
/* Assert that a file is empty. */
|
||||
#define assertEmptyFile(pathname) \
|
||||
assertion_empty_file(__FILE__, __LINE__, (pathname))
|
||||
/* Assert that a file is not empty. */
|
||||
#define assertNonEmptyFile(pathname) \
|
||||
assertion_non_empty_file(__FILE__, __LINE__, (pathname))
|
||||
#define assertFileAtime(pathname, sec, nsec) \
|
||||
assertion_file_atime(__FILE__, __LINE__, pathname, sec, nsec)
|
||||
#define assertFileAtimeRecent(pathname) \
|
||||
assertion_file_atime_recent(__FILE__, __LINE__, pathname)
|
||||
#define assertFileBirthtime(pathname, sec, nsec) \
|
||||
assertion_file_birthtime(__FILE__, __LINE__, pathname, sec, nsec)
|
||||
#define assertFileBirthtimeRecent(pathname) \
|
||||
assertion_file_birthtime_recent(__FILE__, __LINE__, pathname)
|
||||
/* Assert that a file exists; supports printf-style arguments. */
|
||||
#define assertFileExists(pathname) \
|
||||
assertion_file_exists(__FILE__, __LINE__, pathname)
|
||||
/* Assert that a file exists. */
|
||||
#define assertFileNotExists(pathname) \
|
||||
assertion_file_not_exists(__FILE__, __LINE__, pathname)
|
||||
/* Assert that file contents match a string. */
|
||||
#define assertFileContents(data, data_size, pathname) \
|
||||
assertion_file_contents(__FILE__, __LINE__, data, data_size, pathname)
|
||||
/* Verify that a file does not contain invalid strings */
|
||||
#define assertFileContainsNoInvalidStrings(pathname, strings) \
|
||||
assertion_file_contains_no_invalid_strings(__FILE__, __LINE__, pathname, strings)
|
||||
#define assertFileMtime(pathname, sec, nsec) \
|
||||
assertion_file_mtime(__FILE__, __LINE__, pathname, sec, nsec)
|
||||
#define assertFileMtimeRecent(pathname) \
|
||||
assertion_file_mtime_recent(__FILE__, __LINE__, pathname)
|
||||
#define assertFileNLinks(pathname, nlinks) \
|
||||
assertion_file_nlinks(__FILE__, __LINE__, pathname, nlinks)
|
||||
#define assertFileSize(pathname, size) \
|
||||
assertion_file_size(__FILE__, __LINE__, pathname, size)
|
||||
#define assertFileMode(pathname, mode) \
|
||||
assertion_file_mode(__FILE__, __LINE__, pathname, mode)
|
||||
#define assertTextFileContents(text, pathname) \
|
||||
assertion_text_file_contents(__FILE__, __LINE__, text, pathname)
|
||||
#define assertFileContainsLinesAnyOrder(pathname, lines) \
|
||||
assertion_file_contains_lines_any_order(__FILE__, __LINE__, pathname, lines)
|
||||
#define assertIsDir(pathname, mode) \
|
||||
assertion_is_dir(__FILE__, __LINE__, pathname, mode)
|
||||
#define assertIsHardlink(path1, path2) \
|
||||
assertion_is_hardlink(__FILE__, __LINE__, path1, path2)
|
||||
#define assertIsNotHardlink(path1, path2) \
|
||||
assertion_is_not_hardlink(__FILE__, __LINE__, path1, path2)
|
||||
#define assertIsReg(pathname, mode) \
|
||||
assertion_is_reg(__FILE__, __LINE__, pathname, mode)
|
||||
#define assertIsSymlink(pathname, contents) \
|
||||
assertion_is_symlink(__FILE__, __LINE__, pathname, contents)
|
||||
/* Create a directory, report error if it fails. */
|
||||
#define assertMakeDir(dirname, mode) \
|
||||
assertion_make_dir(__FILE__, __LINE__, dirname, mode)
|
||||
#define assertMakeFile(path, mode, contents) \
|
||||
assertion_make_file(__FILE__, __LINE__, path, mode, -1, contents)
|
||||
#define assertMakeBinFile(path, mode, csize, contents) \
|
||||
assertion_make_file(__FILE__, __LINE__, path, mode, csize, contents)
|
||||
#define assertMakeHardlink(newfile, oldfile) \
|
||||
assertion_make_hardlink(__FILE__, __LINE__, newfile, oldfile)
|
||||
#define assertMakeSymlink(newfile, linkto) \
|
||||
assertion_make_symlink(__FILE__, __LINE__, newfile, linkto)
|
||||
#define assertNodump(path) \
|
||||
assertion_nodump(__FILE__, __LINE__, path)
|
||||
#define assertUmask(mask) \
|
||||
assertion_umask(__FILE__, __LINE__, mask)
|
||||
#define assertUtimes(pathname, atime, atime_nsec, mtime, mtime_nsec) \
|
||||
assertion_utimes(__FILE__, __LINE__, pathname, atime, atime_nsec, mtime, mtime_nsec)
|
||||
|
||||
/*
|
||||
* This would be simple with C99 variadic macros, but I don't want to
|
||||
* require that. Instead, I insert a function call before each
|
||||
* skipping() call to pass the file and line information down. Crude,
|
||||
* but effective.
|
||||
*/
|
||||
#define skipping \
|
||||
skipping_setup(__FILE__, __LINE__);test_skipping
|
||||
|
||||
/* Function declarations. These are defined in test_utility.c. */
|
||||
void failure(const char *fmt, ...);
|
||||
int assertion_assert(const char *, int, int, const char *, void *);
|
||||
int assertion_chdir(const char *, int, const char *);
|
||||
int assertion_empty_file(const char *, int, const char *);
|
||||
int assertion_equal_file(const char *, int, const char *, const char *);
|
||||
int assertion_equal_int(const char *, int, long long, const char *, long long, const char *, void *);
|
||||
int assertion_equal_mem(const char *, int, const void *, const char *, const void *, const char *, size_t, const char *, void *);
|
||||
int assertion_memory_filled_with(const char *, int, const void *, const char *, size_t, const char *, char, const char *, void *);
|
||||
int assertion_equal_string(const char *, int, const char *v1, const char *, const char *v2, const char *, void *, int);
|
||||
int assertion_equal_wstring(const char *, int, const wchar_t *v1, const char *, const wchar_t *v2, const char *, void *);
|
||||
int assertion_file_atime(const char *, int, const char *, long, long);
|
||||
int assertion_file_atime_recent(const char *, int, const char *);
|
||||
int assertion_file_birthtime(const char *, int, const char *, long, long);
|
||||
int assertion_file_birthtime_recent(const char *, int, const char *);
|
||||
int assertion_file_contains_lines_any_order(const char *, int, const char *, const char **);
|
||||
int assertion_file_contains_no_invalid_strings(const char *, int, const char *, const char **);
|
||||
int assertion_file_contents(const char *, int, const void *, int, const char *);
|
||||
int assertion_file_exists(const char *, int, const char *);
|
||||
int assertion_file_mode(const char *, int, const char *, int);
|
||||
int assertion_file_mtime(const char *, int, const char *, long, long);
|
||||
int assertion_file_mtime_recent(const char *, int, const char *);
|
||||
int assertion_file_nlinks(const char *, int, const char *, int);
|
||||
int assertion_file_not_exists(const char *, int, const char *);
|
||||
int assertion_file_size(const char *, int, const char *, long);
|
||||
int assertion_is_dir(const char *, int, const char *, int);
|
||||
int assertion_is_hardlink(const char *, int, const char *, const char *);
|
||||
int assertion_is_not_hardlink(const char *, int, const char *, const char *);
|
||||
int assertion_is_reg(const char *, int, const char *, int);
|
||||
int assertion_is_symlink(const char *, int, const char *, const char *);
|
||||
int assertion_make_dir(const char *, int, const char *, int);
|
||||
int assertion_make_file(const char *, int, const char *, int, int, const void *);
|
||||
int assertion_make_hardlink(const char *, int, const char *newpath, const char *);
|
||||
int assertion_make_symlink(const char *, int, const char *newpath, const char *);
|
||||
int assertion_nodump(const char *, int, const char *);
|
||||
int assertion_non_empty_file(const char *, int, const char *);
|
||||
int assertion_text_file_contents(const char *, int, const char *buff, const char *f);
|
||||
int assertion_umask(const char *, int, int);
|
||||
int assertion_utimes(const char *, int, const char *, long, long, long, long );
|
||||
|
||||
void skipping_setup(const char *, int);
|
||||
void test_skipping(const char *fmt, ...);
|
||||
|
||||
/* Like sprintf, then system() */
|
||||
int systemf(const char * fmt, ...);
|
||||
|
||||
/* Delay until time() returns a value after this. */
|
||||
void sleepUntilAfter(time_t);
|
||||
|
||||
/* Return true if this platform can create symlinks. */
|
||||
int canSymlink(void);
|
||||
|
||||
/* Return true if this platform can run the "bzip2" program. */
|
||||
int canBzip2(void);
|
||||
|
||||
/* Return true if this platform can run the "grzip" program. */
|
||||
int canGrzip(void);
|
||||
|
||||
/* Return true if this platform can run the "gzip" program. */
|
||||
int canGzip(void);
|
||||
|
||||
/* Return true if this platform can run the specified command. */
|
||||
int canRunCommand(const char *);
|
||||
|
||||
/* Return true if this platform can run the "lrzip" program. */
|
||||
int canLrzip(void);
|
||||
|
||||
/* Return true if this platform can run the "lz4" program. */
|
||||
int canLz4(void);
|
||||
|
||||
/* Return true if this platform can run the "lzip" program. */
|
||||
int canLzip(void);
|
||||
|
||||
/* Return true if this platform can run the "lzma" program. */
|
||||
int canLzma(void);
|
||||
|
||||
/* Return true if this platform can run the "lzop" program. */
|
||||
int canLzop(void);
|
||||
|
||||
/* Return true if this platform can run the "xz" program. */
|
||||
int canXz(void);
|
||||
|
||||
/* Return true if this filesystem can handle nodump flags. */
|
||||
int canNodump(void);
|
||||
|
||||
/* Return true if the file has large i-node number(>0xffffffff). */
|
||||
int is_LargeInode(const char *);
|
||||
|
||||
/* Suck file into string allocated via malloc(). Call free() when done. */
|
||||
/* Supports printf-style args: slurpfile(NULL, "%s/myfile", refdir); */
|
||||
char *slurpfile(size_t *, const char *fmt, ...);
|
||||
|
||||
/* Dump block of bytes to a file. */
|
||||
void dumpfile(const char *filename, void *, size_t);
|
||||
|
||||
/* Extracts named reference file to the current directory. */
|
||||
void extract_reference_file(const char *);
|
||||
/* Copies named reference file to the current directory. */
|
||||
void copy_reference_file(const char *);
|
||||
|
||||
/* Extracts a list of files to the current directory.
|
||||
* List must be NULL terminated.
|
||||
*/
|
||||
void extract_reference_files(const char **);
|
||||
|
||||
/* Subtract umask from mode */
|
||||
mode_t umasked(mode_t expected_mode);
|
||||
|
||||
/* Path to working directory for current test */
|
||||
extern const char *testworkdir;
|
||||
|
||||
/*
|
||||
* Special interfaces for libarchive test harness.
|
||||
*/
|
||||
|
||||
#include "archive.h"
|
||||
#include "archive_entry.h"
|
||||
|
||||
/* ACL structure */
|
||||
struct archive_test_acl_t {
|
||||
int type; /* Type of ACL */
|
||||
int permset; /* Permissions for this class of users. */
|
||||
int tag; /* Owner, User, Owning group, group, other, etc. */
|
||||
int qual; /* GID or UID of user/group, depending on tag. */
|
||||
const char *name; /* Name of user/group, depending on tag. */
|
||||
};
|
||||
|
||||
/* Set ACLs */
|
||||
void archive_test_set_acls(struct archive_entry *, struct archive_test_acl_t *,
|
||||
int);
|
||||
|
||||
/* Compare ACLs */
|
||||
void archive_test_compare_acls(struct archive_entry *,
|
||||
struct archive_test_acl_t *, int, int, int);
|
||||
|
||||
/* Special customized read-from-memory interface. */
|
||||
int read_open_memory(struct archive *, const void *, size_t, size_t);
|
||||
/* _minimal version exercises a slightly different set of libarchive APIs. */
|
||||
int read_open_memory_minimal(struct archive *, const void *, size_t, size_t);
|
||||
/* _seek version produces a seekable file. */
|
||||
int read_open_memory_seek(struct archive *, const void *, size_t, size_t);
|
||||
|
||||
/* Versions of above that accept an archive argument for additional info. */
|
||||
#define assertA(e) assertion_assert(__FILE__, __LINE__, (e), #e, (a))
|
||||
#define assertEqualIntA(a,v1,v2) \
|
||||
assertion_equal_int(__FILE__, __LINE__, (v1), #v1, (v2), #v2, (a))
|
||||
#define assertEqualStringA(a,v1,v2) \
|
||||
assertion_equal_string(__FILE__, __LINE__, (v1), #v1, (v2), #v2, (a), 0)
|
||||
|
||||
#ifdef USE_DMALLOC
|
||||
#include <dmalloc.h>
|
||||
#endif
|
||||
#include "test_common.h"
|
||||
|
@ -159,7 +159,7 @@ DEFINE_TEST(test_acl_nfs4)
|
||||
archive_entry_set_mode(ae, S_IFREG | 0777);
|
||||
|
||||
/* Store and read back some basic ACL entries. */
|
||||
archive_test_set_acls(ae, acls1, sizeof(acls1)/sizeof(acls1[0]));
|
||||
assertEntrySetAcls(ae, acls1, sizeof(acls1)/sizeof(acls1[0]));
|
||||
|
||||
/* Check that entry contains only NFSv4 types */
|
||||
assert((archive_entry_acl_types(ae) &
|
||||
@ -169,21 +169,21 @@ DEFINE_TEST(test_acl_nfs4)
|
||||
|
||||
assertEqualInt(4,
|
||||
archive_entry_acl_reset(ae, ARCHIVE_ENTRY_ACL_TYPE_NFS4));
|
||||
archive_test_compare_acls(ae, acls1, sizeof(acls1)/sizeof(acls1[0]),
|
||||
assertEntryCompareAcls(ae, acls1, sizeof(acls1)/sizeof(acls1[0]),
|
||||
ARCHIVE_ENTRY_ACL_TYPE_NFS4, 0);
|
||||
|
||||
/* A more extensive set of ACLs. */
|
||||
archive_test_set_acls(ae, acls2, sizeof(acls2)/sizeof(acls2[0]));
|
||||
assertEntrySetAcls(ae, acls2, sizeof(acls2)/sizeof(acls2[0]));
|
||||
assertEqualInt(32,
|
||||
archive_entry_acl_reset(ae, ARCHIVE_ENTRY_ACL_TYPE_NFS4));
|
||||
archive_test_compare_acls(ae, acls2, sizeof(acls2)/sizeof(acls2[0]),
|
||||
assertEntryCompareAcls(ae, acls2, sizeof(acls2)/sizeof(acls2[0]),
|
||||
ARCHIVE_ENTRY_ACL_TYPE_NFS4, 0);
|
||||
|
||||
/*
|
||||
* Check that clearing ACLs gets rid of them all by repeating
|
||||
* the first test.
|
||||
*/
|
||||
archive_test_set_acls(ae, acls1, sizeof(acls1)/sizeof(acls1[0]));
|
||||
assertEntrySetAcls(ae, acls1, sizeof(acls1)/sizeof(acls1[0]));
|
||||
failure("Basic ACLs shouldn't be stored as extended ACLs");
|
||||
assertEqualInt(4,
|
||||
archive_entry_acl_reset(ae, ARCHIVE_ENTRY_ACL_TYPE_NFS4));
|
||||
@ -192,7 +192,7 @@ DEFINE_TEST(test_acl_nfs4)
|
||||
* Different types of malformed ACL entries that should
|
||||
* fail when added to existing NFS4 ACLs.
|
||||
*/
|
||||
archive_test_set_acls(ae, acls2, sizeof(acls2)/sizeof(acls2[0]));
|
||||
assertEntrySetAcls(ae, acls2, sizeof(acls2)/sizeof(acls2[0]));
|
||||
for (i = 0; i < (int)(sizeof(acls_bad)/sizeof(acls_bad[0])); ++i) {
|
||||
struct archive_test_acl_t *p = &acls_bad[i];
|
||||
failure("Malformed ACL test #%d", i);
|
||||
|
@ -238,23 +238,22 @@ DEFINE_TEST(test_acl_pax_posix1e)
|
||||
archive_entry_set_mode(ae, S_IFREG | 0777);
|
||||
|
||||
/* Basic owner/owning group should just update mode bits. */
|
||||
archive_test_set_acls(ae, acls0, sizeof(acls0)/sizeof(acls0[0]));
|
||||
assertEntrySetAcls(ae, acls0, sizeof(acls0)/sizeof(acls0[0]));
|
||||
assertA(0 == archive_write_header(a, ae));
|
||||
|
||||
/* With any extended ACL entry, we should read back a full set. */
|
||||
archive_test_set_acls(ae, acls1, sizeof(acls1)/sizeof(acls1[0]));
|
||||
assertEntrySetAcls(ae, acls1, sizeof(acls1)/sizeof(acls1[0]));
|
||||
assertA(0 == archive_write_header(a, ae));
|
||||
|
||||
|
||||
/* A more extensive set of ACLs. */
|
||||
archive_test_set_acls(ae, acls2, sizeof(acls2)/sizeof(acls2[0]));
|
||||
assertEntrySetAcls(ae, acls2, sizeof(acls2)/sizeof(acls2[0]));
|
||||
assertA(0 == archive_write_header(a, ae));
|
||||
|
||||
/*
|
||||
* Check that clearing ACLs gets rid of them all by repeating
|
||||
* the first test.
|
||||
*/
|
||||
archive_test_set_acls(ae, acls0, sizeof(acls0)/sizeof(acls0[0]));
|
||||
assertEntrySetAcls(ae, acls0, sizeof(acls0)/sizeof(acls0[0]));
|
||||
assertA(0 == archive_write_header(a, ae));
|
||||
archive_entry_free(ae);
|
||||
|
||||
@ -296,7 +295,7 @@ DEFINE_TEST(test_acl_pax_posix1e)
|
||||
assertA(0 == archive_read_next_header(a, &ae));
|
||||
failure("One extended ACL should flag all ACLs to be returned.");
|
||||
assert(4 == archive_entry_acl_reset(ae, ARCHIVE_ENTRY_ACL_TYPE_ACCESS));
|
||||
archive_test_compare_acls(ae, acls1, sizeof(acls1)/sizeof(acls1[0]),
|
||||
assertEntryCompareAcls(ae, acls1, sizeof(acls1)/sizeof(acls1[0]),
|
||||
ARCHIVE_ENTRY_ACL_TYPE_ACCESS, 0142);
|
||||
failure("Basic ACLs should set mode to 0142, not %04o",
|
||||
archive_entry_mode(ae)&0777);
|
||||
@ -306,7 +305,7 @@ DEFINE_TEST(test_acl_pax_posix1e)
|
||||
assertA(0 == archive_read_next_header(a, &ae));
|
||||
assertEqualInt(6, archive_entry_acl_reset(ae,
|
||||
ARCHIVE_ENTRY_ACL_TYPE_ACCESS));
|
||||
archive_test_compare_acls(ae, acls2, sizeof(acls2)/sizeof(acls2[0]),
|
||||
assertEntryCompareAcls(ae, acls2, sizeof(acls2)/sizeof(acls2[0]),
|
||||
ARCHIVE_ENTRY_ACL_TYPE_ACCESS, 0543);
|
||||
failure("Basic ACLs should set mode to 0543, not %04o",
|
||||
archive_entry_mode(ae)&0777);
|
||||
@ -350,15 +349,15 @@ DEFINE_TEST(test_acl_pax_nfs4)
|
||||
archive_entry_set_mode(ae, S_IFREG | 0777);
|
||||
|
||||
/* NFS4 ACLs mirroring 0754 file mode */
|
||||
archive_test_set_acls(ae, acls3, sizeof(acls3)/sizeof(acls3[0]));
|
||||
assertEntrySetAcls(ae, acls3, sizeof(acls3)/sizeof(acls3[0]));
|
||||
assertA(0 == archive_write_header(a, ae));
|
||||
|
||||
/* A more extensive set of NFS4 ACLs. */
|
||||
archive_test_set_acls(ae, acls4, sizeof(acls4)/sizeof(acls4[0]));
|
||||
assertEntrySetAcls(ae, acls4, sizeof(acls4)/sizeof(acls4[0]));
|
||||
assertA(0 == archive_write_header(a, ae));
|
||||
|
||||
/* Set with special (audit, alarm) NFS4 ACLs. */
|
||||
archive_test_set_acls(ae, acls5, sizeof(acls5)/sizeof(acls5[0]));
|
||||
assertEntrySetAcls(ae, acls5, sizeof(acls5)/sizeof(acls5[0]));
|
||||
assertA(0 == archive_write_header(a, ae));
|
||||
|
||||
archive_entry_free(ae);
|
||||
@ -393,21 +392,21 @@ DEFINE_TEST(test_acl_pax_nfs4)
|
||||
assertA(0 == archive_read_next_header(a, &ae));
|
||||
assertEqualInt(3, archive_entry_acl_reset(ae,
|
||||
ARCHIVE_ENTRY_ACL_TYPE_ALLOW));
|
||||
archive_test_compare_acls(ae, acls3, sizeof(acls3)/sizeof(acls3[0]),
|
||||
assertEntryCompareAcls(ae, acls3, sizeof(acls3)/sizeof(acls3[0]),
|
||||
ARCHIVE_ENTRY_ACL_TYPE_ALLOW, 0);
|
||||
|
||||
/* Second item has has more fine-grained NFS4 ACLs */
|
||||
assertA(0 == archive_read_next_header(a, &ae));
|
||||
assertEqualInt(6, archive_entry_acl_reset(ae,
|
||||
ARCHIVE_ENTRY_ACL_TYPE_NFS4));
|
||||
archive_test_compare_acls(ae, acls4, sizeof(acls4)/sizeof(acls4[0]),
|
||||
assertEntryCompareAcls(ae, acls4, sizeof(acls4)/sizeof(acls4[0]),
|
||||
ARCHIVE_ENTRY_ACL_TYPE_NFS4, 0);
|
||||
|
||||
/* Third item has has audit and alarm NFS4 ACLs */
|
||||
assertA(0 == archive_read_next_header(a, &ae));
|
||||
assertEqualInt(6, archive_entry_acl_reset(ae,
|
||||
ARCHIVE_ENTRY_ACL_TYPE_NFS4));
|
||||
archive_test_compare_acls(ae, acls5, sizeof(acls5)/sizeof(acls5[0]),
|
||||
assertEntryCompareAcls(ae, acls5, sizeof(acls5)/sizeof(acls5[0]),
|
||||
ARCHIVE_ENTRY_ACL_TYPE_NFS4, 0);
|
||||
|
||||
/* Close the archive. */
|
||||
|
@ -393,7 +393,7 @@ DEFINE_TEST(test_acl_platform_posix1e_restore)
|
||||
archive_entry_set_pathname(ae, "test0");
|
||||
archive_entry_set_mtime(ae, 123456, 7890);
|
||||
archive_entry_set_size(ae, 0);
|
||||
archive_test_set_acls(ae, acls2, sizeof(acls2)/sizeof(acls2[0]));
|
||||
assertEntrySetAcls(ae, acls2, sizeof(acls2)/sizeof(acls2[0]));
|
||||
assertEqualIntA(a, ARCHIVE_OK, archive_write_header(a, ae));
|
||||
archive_entry_free(ae);
|
||||
|
||||
@ -571,8 +571,8 @@ DEFINE_TEST(test_acl_platform_posix1e_read)
|
||||
assertEqualInt(0, n);
|
||||
close(fd);
|
||||
|
||||
/* Create directory d2 with default ACLs */
|
||||
assertMakeDir("d2", 0755);
|
||||
/* Create nested directory d2 with default ACLs */
|
||||
assertMakeDir("d/d2", 0755);
|
||||
|
||||
#if HAVE_SUN_ACL
|
||||
acl3_text = "user::rwx,"
|
||||
@ -604,10 +604,10 @@ DEFINE_TEST(test_acl_platform_posix1e_read)
|
||||
|
||||
#if HAVE_SUN_ACL
|
||||
func = "acl_set()";
|
||||
n = acl_set("d2", acl3);
|
||||
n = acl_set("d/d2", acl3);
|
||||
#else
|
||||
func = "acl_set_file()";
|
||||
n = acl_set_file("d2", ACL_TYPE_DEFAULT, acl3);
|
||||
n = acl_set_file("d/d2", ACL_TYPE_DEFAULT, acl3);
|
||||
#endif
|
||||
acl_free(acl3);
|
||||
|
||||
@ -640,7 +640,7 @@ DEFINE_TEST(test_acl_platform_posix1e_read)
|
||||
acl_text = archive_entry_acl_to_text(ae, NULL, flags);
|
||||
assertEqualString(acl_text, acl2_text);
|
||||
free(acl_text);
|
||||
} else if (strcmp(archive_entry_pathname(ae), "./d2") == 0) {
|
||||
} else if (strcmp(archive_entry_pathname(ae), "./d/d2") == 0) {
|
||||
acl_text = archive_entry_acl_to_text(ae, NULL, dflags);
|
||||
assertEqualString(acl_text, acl3_text);
|
||||
free(acl_text);
|
||||
|
@ -116,16 +116,15 @@ DEFINE_TEST(test_acl_posix1e)
|
||||
* triggering unnecessary extensions. It's better to identify
|
||||
* trivial ACLs at the point they are being read from disk.
|
||||
*/
|
||||
archive_test_set_acls(ae, acls0, sizeof(acls0)/sizeof(acls0[0]));
|
||||
assertEntrySetAcls(ae, acls0, sizeof(acls0)/sizeof(acls0[0]));
|
||||
failure("Basic ACLs shouldn't be stored as extended ACLs");
|
||||
assert(0 == archive_entry_acl_reset(ae, ARCHIVE_ENTRY_ACL_TYPE_ACCESS));
|
||||
failure("Basic ACLs should set mode to 0142, not %04o",
|
||||
archive_entry_mode(ae)&0777);
|
||||
assert((archive_entry_mode(ae) & 0777) == 0142);
|
||||
|
||||
|
||||
/* With any extended ACL entry, we should read back a full set. */
|
||||
archive_test_set_acls(ae, acls1, sizeof(acls1)/sizeof(acls1[0]));
|
||||
assertEntrySetAcls(ae, acls1, sizeof(acls1)/sizeof(acls1[0]));
|
||||
failure("One extended ACL should flag all ACLs to be returned.");
|
||||
|
||||
/* Check that entry contains only POSIX.1e types */
|
||||
@ -135,7 +134,7 @@ DEFINE_TEST(test_acl_posix1e)
|
||||
ARCHIVE_ENTRY_ACL_TYPE_POSIX1E) != 0);
|
||||
|
||||
assert(4 == archive_entry_acl_reset(ae, ARCHIVE_ENTRY_ACL_TYPE_ACCESS));
|
||||
archive_test_compare_acls(ae, acls1, sizeof(acls1)/sizeof(acls1[0]),
|
||||
assertEntryCompareAcls(ae, acls1, sizeof(acls1)/sizeof(acls1[0]),
|
||||
ARCHIVE_ENTRY_ACL_TYPE_ACCESS, 0142);
|
||||
failure("Basic ACLs should set mode to 0142, not %04o",
|
||||
archive_entry_mode(ae)&0777);
|
||||
@ -143,9 +142,9 @@ DEFINE_TEST(test_acl_posix1e)
|
||||
|
||||
|
||||
/* A more extensive set of ACLs. */
|
||||
archive_test_set_acls(ae, acls2, sizeof(acls2)/sizeof(acls2[0]));
|
||||
assertEntrySetAcls(ae, acls2, sizeof(acls2)/sizeof(acls2[0]));
|
||||
assertEqualInt(6, archive_entry_acl_reset(ae, ARCHIVE_ENTRY_ACL_TYPE_ACCESS));
|
||||
archive_test_compare_acls(ae, acls2, sizeof(acls2)/sizeof(acls2[0]),
|
||||
assertEntryCompareAcls(ae, acls2, sizeof(acls2)/sizeof(acls2[0]),
|
||||
ARCHIVE_ENTRY_ACL_TYPE_ACCESS, 0543);
|
||||
failure("Basic ACLs should set mode to 0543, not %04o",
|
||||
archive_entry_mode(ae)&0777);
|
||||
@ -155,7 +154,7 @@ DEFINE_TEST(test_acl_posix1e)
|
||||
* Check that clearing ACLs gets rid of them all by repeating
|
||||
* the first test.
|
||||
*/
|
||||
archive_test_set_acls(ae, acls0, sizeof(acls0)/sizeof(acls0[0]));
|
||||
assertEntrySetAcls(ae, acls0, sizeof(acls0)/sizeof(acls0[0]));
|
||||
failure("Basic ACLs shouldn't be stored as extended ACLs");
|
||||
assert(0 == archive_entry_acl_reset(ae, ARCHIVE_ENTRY_ACL_TYPE_ACCESS));
|
||||
failure("Basic ACLs should set mode to 0142, not %04o",
|
||||
@ -166,7 +165,7 @@ DEFINE_TEST(test_acl_posix1e)
|
||||
* Different types of malformed ACL entries that should
|
||||
* fail when added to existing POSIX.1e ACLs.
|
||||
*/
|
||||
archive_test_set_acls(ae, acls2, sizeof(acls2)/sizeof(acls2[0]));
|
||||
assertEntrySetAcls(ae, acls2, sizeof(acls2)/sizeof(acls2[0]));
|
||||
for (i = 0; i < (int)(sizeof(acls_nfs4)/sizeof(acls_nfs4[0])); ++i) {
|
||||
struct archive_test_acl_t *p = &acls_nfs4[i];
|
||||
failure("Malformed ACL test #%d", i);
|
||||
|
@ -282,7 +282,7 @@ DEFINE_TEST(test_acl_from_text)
|
||||
assertEqualInt(ARCHIVE_OK,
|
||||
archive_entry_acl_from_text(ae, acltext[5],
|
||||
ARCHIVE_ENTRY_ACL_TYPE_ACCESS));
|
||||
archive_test_compare_acls(ae, acls0, sizeof(acls0)/sizeof(acls0[0]),
|
||||
assertEntryCompareAcls(ae, acls0, sizeof(acls0)/sizeof(acls0[0]),
|
||||
ARCHIVE_ENTRY_ACL_TYPE_ACCESS, 0755);
|
||||
assertEqualInt(6, archive_entry_acl_reset(ae,
|
||||
ARCHIVE_ENTRY_ACL_TYPE_ACCESS));
|
||||
@ -291,7 +291,7 @@ DEFINE_TEST(test_acl_from_text)
|
||||
assertEqualInt(ARCHIVE_OK,
|
||||
archive_entry_acl_from_text(ae, acltext[7],
|
||||
ARCHIVE_ENTRY_ACL_TYPE_DEFAULT));
|
||||
archive_test_compare_acls(ae, acls0, sizeof(acls0)/sizeof(acls0[0]),
|
||||
assertEntryCompareAcls(ae, acls0, sizeof(acls0)/sizeof(acls0[0]),
|
||||
ARCHIVE_ENTRY_ACL_TYPE_POSIX1E, 0755);
|
||||
assertEqualInt(11, archive_entry_acl_reset(ae,
|
||||
ARCHIVE_ENTRY_ACL_TYPE_POSIX1E));
|
||||
@ -303,7 +303,7 @@ DEFINE_TEST(test_acl_from_text)
|
||||
assertEqualInt(ARCHIVE_OK,
|
||||
archive_entry_acl_from_text_w(ae, ws,
|
||||
ARCHIVE_ENTRY_ACL_TYPE_ACCESS));
|
||||
archive_test_compare_acls(ae, acls0, sizeof(acls0)/sizeof(acls0[0]),
|
||||
assertEntryCompareAcls(ae, acls0, sizeof(acls0)/sizeof(acls0[0]),
|
||||
ARCHIVE_ENTRY_ACL_TYPE_ACCESS, 0755);
|
||||
assertEqualInt(6, archive_entry_acl_reset(ae,
|
||||
ARCHIVE_ENTRY_ACL_TYPE_ACCESS));
|
||||
@ -314,7 +314,7 @@ DEFINE_TEST(test_acl_from_text)
|
||||
assertEqualInt(ARCHIVE_OK,
|
||||
archive_entry_acl_from_text_w(ae, ws,
|
||||
ARCHIVE_ENTRY_ACL_TYPE_DEFAULT));
|
||||
archive_test_compare_acls(ae, acls0, sizeof(acls0)/sizeof(acls0[0]),
|
||||
assertEntryCompareAcls(ae, acls0, sizeof(acls0)/sizeof(acls0[0]),
|
||||
ARCHIVE_ENTRY_ACL_TYPE_POSIX1E, 0755);
|
||||
assertEqualInt(11, archive_entry_acl_reset(ae,
|
||||
ARCHIVE_ENTRY_ACL_TYPE_POSIX1E));
|
||||
@ -324,7 +324,7 @@ DEFINE_TEST(test_acl_from_text)
|
||||
assertEqualInt(ARCHIVE_OK,
|
||||
archive_entry_acl_from_text(ae, acltext[7],
|
||||
ARCHIVE_ENTRY_ACL_TYPE_DEFAULT));
|
||||
archive_test_compare_acls(ae, acls0, sizeof(acls0)/sizeof(acls0[0]),
|
||||
assertEntryCompareAcls(ae, acls0, sizeof(acls0)/sizeof(acls0[0]),
|
||||
ARCHIVE_ENTRY_ACL_TYPE_DEFAULT, 0);
|
||||
assertEqualInt(5, archive_entry_acl_reset(ae,
|
||||
ARCHIVE_ENTRY_ACL_TYPE_DEFAULT));
|
||||
@ -334,7 +334,7 @@ DEFINE_TEST(test_acl_from_text)
|
||||
assertEqualInt(ARCHIVE_OK,
|
||||
archive_entry_acl_from_text_w(ae, ws,
|
||||
ARCHIVE_ENTRY_ACL_TYPE_DEFAULT));
|
||||
archive_test_compare_acls(ae, acls0, sizeof(acls0)/sizeof(acls0[0]),
|
||||
assertEntryCompareAcls(ae, acls0, sizeof(acls0)/sizeof(acls0[0]),
|
||||
ARCHIVE_ENTRY_ACL_TYPE_DEFAULT, 0);
|
||||
assertEqualInt(5, archive_entry_acl_reset(ae,
|
||||
ARCHIVE_ENTRY_ACL_TYPE_DEFAULT));
|
||||
@ -344,7 +344,7 @@ DEFINE_TEST(test_acl_from_text)
|
||||
assertEqualInt(ARCHIVE_OK,
|
||||
archive_entry_acl_from_text(ae, acltext[1],
|
||||
ARCHIVE_ENTRY_ACL_TYPE_POSIX1E));
|
||||
archive_test_compare_acls(ae, acls0, sizeof(acls0)/sizeof(acls0[0]),
|
||||
assertEntryCompareAcls(ae, acls0, sizeof(acls0)/sizeof(acls0[0]),
|
||||
ARCHIVE_ENTRY_ACL_TYPE_POSIX1E, 0755);
|
||||
assertEqualInt(11, archive_entry_acl_reset(ae,
|
||||
ARCHIVE_ENTRY_ACL_TYPE_POSIX1E));
|
||||
@ -355,7 +355,7 @@ DEFINE_TEST(test_acl_from_text)
|
||||
assertEqualInt(ARCHIVE_OK,
|
||||
archive_entry_acl_from_text_w(ae, ws,
|
||||
ARCHIVE_ENTRY_ACL_TYPE_POSIX1E));
|
||||
archive_test_compare_acls(ae, acls0, sizeof(acls0)/sizeof(acls0[0]),
|
||||
assertEntryCompareAcls(ae, acls0, sizeof(acls0)/sizeof(acls0[0]),
|
||||
ARCHIVE_ENTRY_ACL_TYPE_POSIX1E, 0755);
|
||||
assertEqualInt(11, archive_entry_acl_reset(ae,
|
||||
ARCHIVE_ENTRY_ACL_TYPE_POSIX1E));
|
||||
@ -365,7 +365,7 @@ DEFINE_TEST(test_acl_from_text)
|
||||
assertEqualInt(ARCHIVE_OK,
|
||||
archive_entry_acl_from_text(ae, acltext[2],
|
||||
ARCHIVE_ENTRY_ACL_TYPE_POSIX1E));
|
||||
archive_test_compare_acls(ae, acls0, sizeof(acls0)/sizeof(acls0[0]),
|
||||
assertEntryCompareAcls(ae, acls0, sizeof(acls0)/sizeof(acls0[0]),
|
||||
ARCHIVE_ENTRY_ACL_TYPE_POSIX1E, 0755);
|
||||
assertEqualInt(11, archive_entry_acl_reset(ae,
|
||||
ARCHIVE_ENTRY_ACL_TYPE_POSIX1E));
|
||||
@ -376,7 +376,7 @@ DEFINE_TEST(test_acl_from_text)
|
||||
assertEqualInt(ARCHIVE_OK,
|
||||
archive_entry_acl_from_text_w(ae, ws,
|
||||
ARCHIVE_ENTRY_ACL_TYPE_POSIX1E));
|
||||
archive_test_compare_acls(ae, acls0, sizeof(acls0)/sizeof(acls0[0]),
|
||||
assertEntryCompareAcls(ae, acls0, sizeof(acls0)/sizeof(acls0[0]),
|
||||
ARCHIVE_ENTRY_ACL_TYPE_POSIX1E, 0755);
|
||||
assertEqualInt(11, archive_entry_acl_reset(ae,
|
||||
ARCHIVE_ENTRY_ACL_TYPE_POSIX1E));
|
||||
@ -386,7 +386,7 @@ DEFINE_TEST(test_acl_from_text)
|
||||
assertEqualInt(ARCHIVE_OK,
|
||||
archive_entry_acl_from_text(ae, acltext[10],
|
||||
ARCHIVE_ENTRY_ACL_TYPE_NFS4));
|
||||
archive_test_compare_acls(ae, acls1, sizeof(acls1)/sizeof(acls1[0]),
|
||||
assertEntryCompareAcls(ae, acls1, sizeof(acls1)/sizeof(acls1[0]),
|
||||
ARCHIVE_ENTRY_ACL_TYPE_NFS4, 0);
|
||||
assertEqualInt(6, archive_entry_acl_reset(ae,
|
||||
ARCHIVE_ENTRY_ACL_TYPE_NFS4));
|
||||
@ -398,7 +398,7 @@ DEFINE_TEST(test_acl_from_text)
|
||||
assertEqualInt(ARCHIVE_OK,
|
||||
archive_entry_acl_from_text_w(ae, ws,
|
||||
ARCHIVE_ENTRY_ACL_TYPE_NFS4));
|
||||
archive_test_compare_acls(ae, acls1, sizeof(acls1)/sizeof(acls1[0]),
|
||||
assertEntryCompareAcls(ae, acls1, sizeof(acls1)/sizeof(acls1[0]),
|
||||
ARCHIVE_ENTRY_ACL_TYPE_NFS4, 0);
|
||||
assertEqualInt(6, archive_entry_acl_reset(ae,
|
||||
ARCHIVE_ENTRY_ACL_TYPE_NFS4));
|
||||
@ -416,7 +416,7 @@ DEFINE_TEST(test_acl_to_text)
|
||||
assert((ae = archive_entry_new()) != NULL);
|
||||
|
||||
/* Write POSIX.1e ACLs */
|
||||
archive_test_set_acls(ae, acls0, sizeof(acls0)/sizeof(acls0[0]));
|
||||
assertEntrySetAcls(ae, acls0, sizeof(acls0)/sizeof(acls0[0]));
|
||||
|
||||
/* No flags should give output like getfacl(1) on linux */
|
||||
compare_acl_text(ae, 0, acltext[0]);
|
||||
@ -457,7 +457,7 @@ DEFINE_TEST(test_acl_to_text)
|
||||
ARCHIVE_ENTRY_ACL_STYLE_MARK_DEFAULT, acltext[8]);
|
||||
|
||||
/* Write NFSv4 ACLs */
|
||||
archive_test_set_acls(ae, acls1, sizeof(acls1)/sizeof(acls1[0]));
|
||||
assertEntrySetAcls(ae, acls1, sizeof(acls1)/sizeof(acls1[0]));
|
||||
|
||||
/* NFSv4 ACLs like getfacl(1) on FreeBSD */
|
||||
compare_acl_text(ae, 0, acltext[9]);
|
||||
|
@ -42,8 +42,12 @@ DEFINE_TEST(test_archive_api_feature)
|
||||
if (strlen(buff) < strlen(archive_version_string())) {
|
||||
p = archive_version_string() + strlen(buff);
|
||||
failure("Version string is: %s", archive_version_string());
|
||||
assert(*p == 'a' || *p == 'b' || *p == 'c' || *p == 'd');
|
||||
++p;
|
||||
if (p[0] == 'd'&& p[1] == 'e' && p[2] == 'v')
|
||||
p += 3;
|
||||
else {
|
||||
assert(*p == 'a' || *p == 'b' || *p == 'c' || *p == 'd');
|
||||
++p;
|
||||
}
|
||||
failure("Version string is: %s", archive_version_string());
|
||||
assert(*p == '\0');
|
||||
}
|
||||
|
@ -227,7 +227,7 @@ DEFINE_TEST(test_compat_solaris_tar_acl)
|
||||
failure("One extended ACL should flag all ACLs to be returned.");
|
||||
assertEqualInt(7, archive_entry_acl_reset(ae,
|
||||
ARCHIVE_ENTRY_ACL_TYPE_ACCESS));
|
||||
archive_test_compare_acls(ae, acls0, sizeof(acls0)/sizeof(acls0[0]),
|
||||
assertEntryCompareAcls(ae, acls0, sizeof(acls0)/sizeof(acls0[0]),
|
||||
ARCHIVE_ENTRY_ACL_TYPE_ACCESS, 0644);
|
||||
failure("Basic ACLs should set mode to 0644, not %04o",
|
||||
archive_entry_mode(ae)&0777);
|
||||
@ -237,28 +237,28 @@ DEFINE_TEST(test_compat_solaris_tar_acl)
|
||||
assertA(0 == archive_read_next_header(a, &ae));
|
||||
assertEqualInt(6, archive_entry_acl_reset(ae,
|
||||
ARCHIVE_ENTRY_ACL_TYPE_ACCESS));
|
||||
archive_test_compare_acls(ae, acls1, sizeof(acls1)/sizeof(acls1[0]),
|
||||
assertEntryCompareAcls(ae, acls1, sizeof(acls1)/sizeof(acls1[0]),
|
||||
ARCHIVE_ENTRY_ACL_TYPE_ACCESS, 0750);
|
||||
failure("Basic ACLs should set mode to 0750, not %04o",
|
||||
archive_entry_mode(ae)&0777);
|
||||
assert((archive_entry_mode(ae) & 0777) == 0750);
|
||||
assertEqualInt(6, archive_entry_acl_reset(ae,
|
||||
ARCHIVE_ENTRY_ACL_TYPE_DEFAULT));
|
||||
archive_test_compare_acls(ae, acls2, sizeof(acls2)/sizeof(acls2[0]),
|
||||
assertEntryCompareAcls(ae, acls2, sizeof(acls2)/sizeof(acls2[0]),
|
||||
ARCHIVE_ENTRY_ACL_TYPE_DEFAULT, 0750);
|
||||
|
||||
/* Third item has NFS4 ACLs */
|
||||
assertA(0 == archive_read_next_header(a, &ae));
|
||||
assertEqualInt(6, archive_entry_acl_reset(ae,
|
||||
ARCHIVE_ENTRY_ACL_TYPE_NFS4));
|
||||
archive_test_compare_acls(ae, acls3, sizeof(acls3)/sizeof(acls3[0]),
|
||||
assertEntryCompareAcls(ae, acls3, sizeof(acls3)/sizeof(acls3[0]),
|
||||
ARCHIVE_ENTRY_ACL_TYPE_NFS4, 0);
|
||||
|
||||
/* Fourth item has NFS4 ACLs and inheritance flags */
|
||||
assertA(0 == archive_read_next_header(a, &ae));
|
||||
assertEqualInt(5, archive_entry_acl_reset(ae,
|
||||
ARCHIVE_ENTRY_ACL_TYPE_NFS4));
|
||||
archive_test_compare_acls(ae, acls4, sizeof(acls4)/sizeof(acls0[4]),
|
||||
assertEntryCompareAcls(ae, acls4, sizeof(acls4)/sizeof(acls0[4]),
|
||||
ARCHIVE_ENTRY_ACL_TYPE_NFS4, 0);
|
||||
|
||||
/* Close the archive. */
|
||||
|
@ -249,7 +249,7 @@ DEFINE_TEST(test_compat_star_acl_posix1e)
|
||||
failure("One extended ACL should flag all ACLs to be returned.");
|
||||
assertEqualInt(5, archive_entry_acl_reset(ae,
|
||||
ARCHIVE_ENTRY_ACL_TYPE_ACCESS));
|
||||
archive_test_compare_acls(ae, acls0, sizeof(acls0)/sizeof(acls0[0]),
|
||||
assertEntryCompareAcls(ae, acls0, sizeof(acls0)/sizeof(acls0[0]),
|
||||
ARCHIVE_ENTRY_ACL_TYPE_ACCESS, 0142);
|
||||
failure("Basic ACLs should set mode to 0142, not %04o",
|
||||
archive_entry_mode(ae)&0777);
|
||||
@ -259,7 +259,7 @@ DEFINE_TEST(test_compat_star_acl_posix1e)
|
||||
assertA(0 == archive_read_next_header(a, &ae));
|
||||
assertEqualInt(7, archive_entry_acl_reset(ae,
|
||||
ARCHIVE_ENTRY_ACL_TYPE_ACCESS));
|
||||
archive_test_compare_acls(ae, acls1, sizeof(acls1)/sizeof(acls1[0]),
|
||||
assertEntryCompareAcls(ae, acls1, sizeof(acls1)/sizeof(acls1[0]),
|
||||
ARCHIVE_ENTRY_ACL_TYPE_ACCESS, 0543);
|
||||
failure("Basic ACLs should set mode to 0543, not %04o",
|
||||
archive_entry_mode(ae)&0777);
|
||||
@ -269,7 +269,7 @@ DEFINE_TEST(test_compat_star_acl_posix1e)
|
||||
assertA(0 == archive_read_next_header(a, &ae));
|
||||
assertEqualInt(6, archive_entry_acl_reset(ae,
|
||||
ARCHIVE_ENTRY_ACL_TYPE_DEFAULT));
|
||||
archive_test_compare_acls(ae, acls2, sizeof(acls2)/sizeof(acls2[0]),
|
||||
assertEntryCompareAcls(ae, acls2, sizeof(acls2)/sizeof(acls2[0]),
|
||||
ARCHIVE_ENTRY_ACL_TYPE_DEFAULT, 0142);
|
||||
failure("Basic ACLs should set mode to 0142, not %04o",
|
||||
archive_entry_mode(ae)&0777);
|
||||
@ -298,21 +298,21 @@ DEFINE_TEST(test_compat_star_acl_nfs4)
|
||||
assertA(0 == archive_read_next_header(a, &ae));
|
||||
assertEqualInt(3, archive_entry_acl_reset(ae,
|
||||
ARCHIVE_ENTRY_ACL_TYPE_ALLOW));
|
||||
archive_test_compare_acls(ae, acls3, sizeof(acls3)/sizeof(acls3[0]),
|
||||
assertEntryCompareAcls(ae, acls3, sizeof(acls3)/sizeof(acls3[0]),
|
||||
ARCHIVE_ENTRY_ACL_TYPE_ALLOW, 0);
|
||||
|
||||
/* Second item has has fine-grained NFS4 ACLs */
|
||||
assertA(0 == archive_read_next_header(a, &ae));
|
||||
assertEqualInt(6, archive_entry_acl_reset(ae,
|
||||
ARCHIVE_ENTRY_ACL_TYPE_NFS4));
|
||||
archive_test_compare_acls(ae, acls4, sizeof(acls4)/sizeof(acls0[4]),
|
||||
assertEntryCompareAcls(ae, acls4, sizeof(acls4)/sizeof(acls0[4]),
|
||||
ARCHIVE_ENTRY_ACL_TYPE_NFS4, 0);
|
||||
|
||||
/* Third item has file and directory inheritance NFS4 ACLs */
|
||||
assertA(0 == archive_read_next_header(a, &ae));
|
||||
assertEqualInt(5, archive_entry_acl_reset(ae,
|
||||
ARCHIVE_ENTRY_ACL_TYPE_NFS4));
|
||||
archive_test_compare_acls(ae, acls5, sizeof(acls5)/sizeof(acls5[0]),
|
||||
assertEntryCompareAcls(ae, acls5, sizeof(acls5)/sizeof(acls5[0]),
|
||||
ARCHIVE_ENTRY_ACL_TYPE_NFS4, 0);
|
||||
|
||||
/* Close the archive. */
|
||||
|
@ -110,8 +110,9 @@ test_fuzz(const struct files *filesets)
|
||||
} else {
|
||||
for (i = 0; filesets[n].names[i] != NULL; ++i)
|
||||
{
|
||||
char *newraw;
|
||||
tmp = slurpfile(&size, filesets[n].names[i]);
|
||||
char *newraw = realloc(rawimage, oldsize + size);
|
||||
newraw = realloc(rawimage, oldsize + size);
|
||||
if (!assert(newraw != NULL))
|
||||
{
|
||||
free(rawimage);
|
||||
|
@ -61,6 +61,7 @@ uname_lookup(void *d, int64_t u)
|
||||
return ("NOTFOO");
|
||||
}
|
||||
|
||||
#if !defined(__CYGWIN__) && !defined(__HAIKU__)
|
||||
/* We test GID lookup by looking up the name of group number zero and
|
||||
* checking it against the following list. If your system uses a
|
||||
* different conventional name for group number zero, please extend
|
||||
@ -71,13 +72,16 @@ static const char *zero_groups[] = {
|
||||
"root", /* Linux */
|
||||
"wheel" /* BSD */
|
||||
};
|
||||
#endif
|
||||
|
||||
DEFINE_TEST(test_read_disk)
|
||||
{
|
||||
struct archive *a;
|
||||
int gmagic = 0x13579, umagic = 0x1234;
|
||||
#if !defined(__CYGWIN__) && !defined(__HAIKU__)
|
||||
const char *p;
|
||||
size_t i;
|
||||
#endif
|
||||
|
||||
assert((a = archive_read_disk_new()) != NULL);
|
||||
|
||||
@ -115,8 +119,6 @@ DEFINE_TEST(test_read_disk)
|
||||
/* Some platforms don't have predictable names for
|
||||
* uid=0, so we skip this part of the test. */
|
||||
skipping("standard uname/gname lookup");
|
||||
i = 0;
|
||||
p = zero_groups[0]; /* avoid unused warnings */
|
||||
#else
|
||||
/* XXX Someday, we may need to generalize this the
|
||||
* same way we generalized the group name check below.
|
||||
|
@ -1228,8 +1228,8 @@ test_restore_atime(void)
|
||||
assertEqualInt(ARCHIVE_OK, archive_read_close(a));
|
||||
|
||||
/*
|
||||
* Test4: Traversals with archive_read_disk_set_atime_restored() and
|
||||
* archive_read_disk_honor_nodump().
|
||||
* Test4: Traversals with ARCHIVE_READDISK_RESTORE_ATIME and
|
||||
* ARCHIVE_READDISK_HONOR_NODUMP
|
||||
*/
|
||||
assertNodump("at/f1");
|
||||
assertNodump("at/f2");
|
||||
@ -1460,7 +1460,7 @@ test_nodump(void)
|
||||
assert((a = archive_read_disk_new()) != NULL);
|
||||
|
||||
/*
|
||||
* Test1: Traversals without archive_read_disk_honor_nodump().
|
||||
* Test1: Traversals without ARCHIVE_READDISK_HONOR_NODUMP
|
||||
*/
|
||||
failure("Directory traversals should work as well");
|
||||
assertEqualIntA(a, ARCHIVE_OK, archive_read_disk_open(a, "nd"));
|
||||
@ -1513,7 +1513,7 @@ test_nodump(void)
|
||||
assertEqualInt(ARCHIVE_OK, archive_read_close(a));
|
||||
|
||||
/*
|
||||
* Test2: Traversals with archive_read_disk_honor_nodump().
|
||||
* Test2: Traversals with ARCHIVE_READDISK_HONOR_NODUMP
|
||||
*/
|
||||
assertUtimes("nd/f1", 886600, 0, 886600, 0);
|
||||
assertUtimes("nd/f2", 886611, 0, 886611, 0);
|
||||
|
108
tar/bsdtar.1
108
tar/bsdtar.1
@ -1,4 +1,5 @@
|
||||
.\" Copyright (c) 2003-2007 Tim Kientzle
|
||||
.\" Copyright (c) 2017 Martin Matuska
|
||||
.\" All rights reserved.
|
||||
.\"
|
||||
.\" Redistribution and use in source and binary forms, with or without
|
||||
@ -24,7 +25,7 @@
|
||||
.\"
|
||||
.\" $FreeBSD$
|
||||
.\"
|
||||
.Dd September 16, 2014
|
||||
.Dd February 24, 2017
|
||||
.Dt TAR 1
|
||||
.Os
|
||||
.Sh NAME
|
||||
@ -124,7 +125,7 @@ Unless specifically stated otherwise, options are applicable in
|
||||
all operating modes.
|
||||
.Bl -tag -width indent
|
||||
.It Cm @ Ns Pa archive
|
||||
(c and r mode only)
|
||||
(c and r modes only)
|
||||
The specified archive is opened and the entries
|
||||
in it will be appended to the current archive.
|
||||
As a simple example,
|
||||
@ -164,6 +165,16 @@ and gzip compression,
|
||||
.Dl Nm Fl a Fl jcf Pa archive.xxx source.c source.h
|
||||
if it is unknown suffix or no suffix, creates a new archive with
|
||||
restricted pax format and bzip2 compression.
|
||||
.It Fl Fl acls
|
||||
(c, r, u, x modes only)
|
||||
Archive or extract POSIX.1e or NFSv4 ACLs. This is the reverse of
|
||||
.Fl Fl no-acls
|
||||
and the default behavior in c, r, and u modes (except Mac OS X) or if
|
||||
.Nm
|
||||
is run in x mode as root. On Mac OS X this option translates extended ACLs
|
||||
to NFSv4 ACLs. To store extended ACLs the
|
||||
.Fl Fl mac-metadata
|
||||
option is preferred.
|
||||
.It Fl B , Fl Fl read-full-blocks
|
||||
Ignored for compatibility with other
|
||||
.Xr tar 1
|
||||
@ -188,15 +199,18 @@ options and before extracting any files.
|
||||
(x mode only)
|
||||
Before removing file system objects to replace them, clear platform-specific
|
||||
file flags that might prevent removal.
|
||||
.It Fl Fl disable-copyfile
|
||||
Mac OS X specific.
|
||||
Disable the use of
|
||||
.Xr copyfile 3 .
|
||||
.It Fl Fl exclude Ar pattern
|
||||
Do not process files or directories that match the
|
||||
specified pattern.
|
||||
Note that exclusions take precedence over patterns or filenames
|
||||
specified on the command line.
|
||||
.It Fl Fl fflags
|
||||
(c, r, u, x modes only)
|
||||
Archive or extract file flags. This is the reverse of
|
||||
.Fl Fl no-fflags
|
||||
and the default behavior in c, r, and u modes or if
|
||||
.Nm
|
||||
is run in x mode as root.
|
||||
.It Fl Fl format Ar format
|
||||
(c, r, u mode only)
|
||||
Use the specified format for the created archive.
|
||||
@ -245,11 +259,11 @@ On create, this sets the group name that will be stored
|
||||
in the archive;
|
||||
the name will not be verified against the system group database.
|
||||
.It Fl H
|
||||
(c and r mode only)
|
||||
(c and r modes only)
|
||||
Symbolic links named on the command line will be followed; the
|
||||
target of the link will be archived, not the link itself.
|
||||
.It Fl h
|
||||
(c and r mode only)
|
||||
(c and r modes only)
|
||||
Synonym for
|
||||
.Fl L .
|
||||
.It Fl I
|
||||
@ -259,7 +273,8 @@ Synonym for
|
||||
Show usage.
|
||||
.It Fl Fl hfsCompression
|
||||
(x mode only)
|
||||
Mac OS X specific(v10.6 or later). Compress extracted regular files with HFS+ compression.
|
||||
Mac OS X specific (v10.6 or later). Compress extracted regular files with HFS+
|
||||
compression.
|
||||
.It Fl Fl ignore-zeros
|
||||
An alias of
|
||||
.Fl Fl options Cm read_concatenated_archives
|
||||
@ -310,7 +325,7 @@ later copies will not overwrite earlier copies.
|
||||
Do not overwrite existing files that are newer than the
|
||||
versions appearing in the archive being extracted.
|
||||
.It Fl L , Fl Fl dereference
|
||||
(c and r mode only)
|
||||
(c and r modes only)
|
||||
All symbolic links will be followed.
|
||||
Normally, symbolic links are archived as such.
|
||||
With this option, the target of the link will be archived instead.
|
||||
@ -345,6 +360,16 @@ In extract or list modes, this option is ignored.
|
||||
(x mode only)
|
||||
Do not extract modification time.
|
||||
By default, the modification time is set to the time stored in the archive.
|
||||
.It Fl Fl mac-metadata
|
||||
(c, r, u and x mode only)
|
||||
Mac OS X specific. Archive or extract extended ACLs and extended attributes
|
||||
using
|
||||
.Xr copyfile 3
|
||||
in AppleDouble format. This is the reverse of
|
||||
.Fl Fl no-mac-metadata .
|
||||
and the default behavior in c, r, and u modes or if
|
||||
.Nm
|
||||
is run in x mode as root.
|
||||
.It Fl n , Fl Fl norecurse , Fl Fl no-recursion
|
||||
(c, r, u modes only)
|
||||
Do not recursively archive the contents of directories.
|
||||
@ -385,6 +410,30 @@ This is often used to read filenames output by the
|
||||
.Fl print0
|
||||
option to
|
||||
.Xr find 1 .
|
||||
.It Fl Fl no-acls
|
||||
(c, r, u, x modes only)
|
||||
Do not archive or extract POSIX.1e or NFSv4 ACLs. This is the reverse of
|
||||
.Fl Fl acls
|
||||
and the default behavior if
|
||||
.Nm
|
||||
is run as non-root in x mode (on Mac OS X also in c, r and u modes).
|
||||
.It Fl Fl no-fflags
|
||||
(c, r, u, x modes only)
|
||||
Do not archive or extract file flags. This is the reverse of
|
||||
.Fl Fl fflags
|
||||
and the default behavior if
|
||||
.Nm
|
||||
is run as non-root in x mode.
|
||||
.It Fl Fl no-mac-metadata
|
||||
(x mode only)
|
||||
Mac OS X specific. Do not archive or extract ACLs and extended attributes using
|
||||
.Xr copyfile 3
|
||||
in AppleDouble format. This is the reverse of
|
||||
.Fl Fl mac-metadata .
|
||||
and the default behavior if
|
||||
.Nm
|
||||
is run as non-root in x mode.
|
||||
.It Fl n , Fl Fl norecurse , Fl Fl no-recursion
|
||||
.It Fl Fl no-same-owner
|
||||
(x mode only)
|
||||
Do not extract owner and group IDs.
|
||||
@ -401,7 +450,21 @@ This is the reverse of
|
||||
.Fl p
|
||||
and the default behavior if
|
||||
.Nm
|
||||
is run as non-root.
|
||||
is run as non-root and can be overridden by also specifying
|
||||
.Fl Fl acls ,
|
||||
.Fl Fl fflags ,
|
||||
.Fl Fl mac-metadata,
|
||||
.Fl Fl same-owner ,
|
||||
.Fl Fl same-permissions
|
||||
and
|
||||
.Fl Fl xattrs .
|
||||
.It Fl Fl no-xattrs
|
||||
(c, r, u, x modes only)
|
||||
Do not archive or extract extended attributes. This is the reverse of
|
||||
.Fl Fl xattrs
|
||||
and the default behavior if
|
||||
.Nm
|
||||
is run as non-root in x mode.
|
||||
.It Fl Fl numeric-owner
|
||||
This is equivalent to
|
||||
.Fl Fl uname
|
||||
@ -583,14 +646,18 @@ This option suppresses these behaviors.
|
||||
.It Fl p , Fl Fl insecure , Fl Fl preserve-permissions
|
||||
(x mode only)
|
||||
Preserve file permissions.
|
||||
Attempt to restore the full permissions, including owner, file modes, file
|
||||
flags and ACLs, if available, for each item extracted from the archive.
|
||||
This is the default, if
|
||||
Attempt to restore the full permissions, including owner, file modes, ACLs,
|
||||
extended atributes and extended file flags, if available, for each item
|
||||
extracted from the archive. This is the default, if
|
||||
.Nm
|
||||
is being run by root and can be overridden by also specifying
|
||||
.Fl Fl no-same-owner
|
||||
.Fl Fl no-acls ,
|
||||
.Fl Fl no-fflags ,
|
||||
.Fl Fl no-mac-metadata,
|
||||
.Fl Fl no-same-owner ,
|
||||
.Fl Fl no-same-permissions
|
||||
and
|
||||
.Fl Fl no-same-permissions .
|
||||
.Fl Fl no-xattrs .
|
||||
.It Fl Fl passphrase Ar passphrase
|
||||
The
|
||||
.Pa passphrase
|
||||
@ -692,7 +759,7 @@ you probably want to use
|
||||
.Fl n
|
||||
as well.
|
||||
.It Fl Fl totals
|
||||
(c, r, u mode only)
|
||||
(c, r, u modes only)
|
||||
After archiving all files, print a summary to stderr.
|
||||
.It Fl U , Fl Fl unlink , Fl Fl unlink-first
|
||||
(x mode only)
|
||||
@ -754,6 +821,13 @@ Read a list of exclusion patterns from the specified file.
|
||||
See
|
||||
.Fl Fl exclude
|
||||
for more information about the handling of exclusions.
|
||||
.It Fl Fl xattrs
|
||||
(c, r, u, x modes only)
|
||||
Archive or extract extended attributes. This is the reverse of
|
||||
.Fl Fl no-xattrs
|
||||
and the default behavior in c, r, and u modes or if
|
||||
.Nm
|
||||
is run in x mode as root.
|
||||
.It Fl y
|
||||
(c mode only)
|
||||
Compress the resulting archive with
|
||||
|
119
tar/bsdtar.c
119
tar/bsdtar.c
@ -137,7 +137,6 @@ main(int argc, char **argv)
|
||||
char compression, compression2;
|
||||
const char *compression_name, *compression2_name;
|
||||
const char *compress_program;
|
||||
char option_a, option_o;
|
||||
char possible_help_request;
|
||||
char buff[16];
|
||||
|
||||
@ -150,7 +149,7 @@ main(int argc, char **argv)
|
||||
bsdtar->fd = -1; /* Mark as "unused" */
|
||||
bsdtar->gid = -1;
|
||||
bsdtar->uid = -1;
|
||||
option_a = option_o = 0;
|
||||
bsdtar->flags = 0;
|
||||
compression = compression2 = '\0';
|
||||
compression_name = compression2_name = NULL;
|
||||
compress_program = NULL;
|
||||
@ -233,6 +232,14 @@ main(int argc, char **argv)
|
||||
if (getenv(COPYFILE_DISABLE_VAR))
|
||||
bsdtar->readdisk_flags &= ~ARCHIVE_READDISK_MAC_COPYFILE;
|
||||
#endif
|
||||
#if defined(__APPLE__)
|
||||
/*
|
||||
* On Mac OS ACLs are archived with copyfile() (--mac-metadata)
|
||||
* Translation to NFSv4 ACLs has to be requested explicitly with --acls
|
||||
*/
|
||||
bsdtar->readdisk_flags |= ARCHIVE_READDISK_NO_ACL;
|
||||
#endif
|
||||
|
||||
bsdtar->matching = archive_match_new();
|
||||
if (bsdtar->matching == NULL)
|
||||
lafe_errc(1, errno, "Out of memory");
|
||||
@ -252,7 +259,12 @@ main(int argc, char **argv)
|
||||
while ((opt = bsdtar_getopt(bsdtar)) != -1) {
|
||||
switch (opt) {
|
||||
case 'a': /* GNU tar */
|
||||
option_a = 1; /* Record it and resolve it later. */
|
||||
bsdtar->flags |= OPTFLAG_AUTO_COMPRESS;
|
||||
break;
|
||||
case OPTION_ACLS: /* GNU tar */
|
||||
bsdtar->extract_flags |= ARCHIVE_EXTRACT_ACL;
|
||||
bsdtar->readdisk_flags &= ~ARCHIVE_READDISK_NO_ACL;
|
||||
bsdtar->flags |= OPTFLAG_ACLS;
|
||||
break;
|
||||
case 'B': /* GNU tar */
|
||||
/* libarchive doesn't need this; just ignore it. */
|
||||
@ -285,24 +297,26 @@ main(int argc, char **argv)
|
||||
set_mode(bsdtar, opt);
|
||||
break;
|
||||
case OPTION_CHECK_LINKS: /* GNU tar */
|
||||
bsdtar->option_warn_links = 1;
|
||||
bsdtar->flags |= OPTFLAG_WARN_LINKS;
|
||||
break;
|
||||
case OPTION_CHROOT: /* NetBSD */
|
||||
bsdtar->option_chroot = 1;
|
||||
bsdtar->flags |= OPTFLAG_CHROOT;
|
||||
break;
|
||||
case OPTION_CLEAR_NOCHANGE_FFLAGS:
|
||||
bsdtar->extract_flags |=
|
||||
ARCHIVE_EXTRACT_CLEAR_NOCHANGE_FFLAGS;
|
||||
break;
|
||||
case OPTION_DISABLE_COPYFILE: /* Mac OS X */
|
||||
bsdtar->readdisk_flags &= ~ARCHIVE_READDISK_MAC_COPYFILE;
|
||||
break;
|
||||
case OPTION_EXCLUDE: /* GNU tar */
|
||||
if (archive_match_exclude_pattern(
|
||||
bsdtar->matching, bsdtar->argument) != ARCHIVE_OK)
|
||||
lafe_errc(1, 0,
|
||||
"Couldn't exclude %s\n", bsdtar->argument);
|
||||
break;
|
||||
case OPTION_FFLAGS:
|
||||
bsdtar->extract_flags |= ARCHIVE_EXTRACT_FFLAGS;
|
||||
bsdtar->readdisk_flags &= ~ARCHIVE_READDISK_NO_FFLAGS;
|
||||
bsdtar->flags |= OPTFLAG_FFLAGS;
|
||||
break;
|
||||
case OPTION_FORMAT: /* GNU tar, others */
|
||||
cset_set_format(bsdtar->cset, bsdtar->argument);
|
||||
break;
|
||||
@ -344,7 +358,7 @@ main(int argc, char **argv)
|
||||
ARCHIVE_EXTRACT_HFS_COMPRESSION_FORCED;
|
||||
break;
|
||||
case OPTION_IGNORE_ZEROS:
|
||||
bsdtar->option_ignore_zeros = 1;
|
||||
bsdtar->flags |= OPTFLAG_IGNORE_ZEROS;
|
||||
break;
|
||||
case 'I': /* GNU tar */
|
||||
/*
|
||||
@ -398,7 +412,7 @@ main(int argc, char **argv)
|
||||
break;
|
||||
case 'l': /* SUSv2 and GNU tar beginning with 1.16 */
|
||||
/* GNU tar 1.13 used -l for --one-file-system */
|
||||
bsdtar->option_warn_links = 1;
|
||||
bsdtar->flags |= OPTFLAG_WARN_LINKS;
|
||||
break;
|
||||
case OPTION_LRZIP:
|
||||
case OPTION_LZ4:
|
||||
@ -421,8 +435,13 @@ main(int argc, char **argv)
|
||||
case 'm': /* SUSv2 */
|
||||
bsdtar->extract_flags &= ~ARCHIVE_EXTRACT_TIME;
|
||||
break;
|
||||
case OPTION_MAC_METADATA: /* Mac OS X */
|
||||
bsdtar->readdisk_flags |= ARCHIVE_READDISK_MAC_COPYFILE;
|
||||
bsdtar->extract_flags |= ARCHIVE_EXTRACT_MAC_METADATA;
|
||||
bsdtar->flags |= OPTFLAG_MAC_METADATA;
|
||||
break;
|
||||
case 'n': /* GNU tar */
|
||||
bsdtar->option_no_subdirs = 1;
|
||||
bsdtar->flags |= OPTFLAG_NO_SUBDIRS;
|
||||
break;
|
||||
/*
|
||||
* Selecting files by time:
|
||||
@ -466,6 +485,21 @@ main(int argc, char **argv)
|
||||
bsdtar->extract_flags |=
|
||||
ARCHIVE_EXTRACT_NO_HFS_COMPRESSION;
|
||||
break;
|
||||
case OPTION_NO_ACLS: /* GNU tar */
|
||||
bsdtar->extract_flags &= ~ARCHIVE_EXTRACT_ACL;
|
||||
bsdtar->readdisk_flags |= ARCHIVE_READDISK_NO_ACL;
|
||||
bsdtar->flags |= OPTFLAG_NO_ACLS;
|
||||
break;
|
||||
case OPTION_NO_FFLAGS:
|
||||
bsdtar->extract_flags &= ~ARCHIVE_EXTRACT_FFLAGS;
|
||||
bsdtar->readdisk_flags |= ARCHIVE_READDISK_NO_FFLAGS;
|
||||
bsdtar->flags |= OPTFLAG_NO_FFLAGS;
|
||||
break;
|
||||
case OPTION_NO_MAC_METADATA: /* Mac OS X */
|
||||
bsdtar->readdisk_flags &= ~ARCHIVE_READDISK_MAC_COPYFILE;
|
||||
bsdtar->extract_flags &= ~ARCHIVE_EXTRACT_MAC_METADATA;
|
||||
bsdtar->flags |= OPTFLAG_NO_MAC_METADATA;
|
||||
break;
|
||||
case OPTION_NO_SAME_OWNER: /* GNU tar */
|
||||
bsdtar->extract_flags &= ~ARCHIVE_EXTRACT_OWNER;
|
||||
break;
|
||||
@ -476,23 +510,24 @@ main(int argc, char **argv)
|
||||
bsdtar->extract_flags &= ~ARCHIVE_EXTRACT_FFLAGS;
|
||||
bsdtar->extract_flags &= ~ARCHIVE_EXTRACT_MAC_METADATA;
|
||||
break;
|
||||
case OPTION_NO_XATTR: /* Issue #131 */
|
||||
case OPTION_NO_XATTRS: /* GNU tar */
|
||||
bsdtar->extract_flags &= ~ARCHIVE_EXTRACT_XATTR;
|
||||
bsdtar->readdisk_flags |= ARCHIVE_READDISK_NO_XATTR;
|
||||
bsdtar->flags |= OPTFLAG_NO_XATTRS;
|
||||
break;
|
||||
case OPTION_NULL: /* GNU tar */
|
||||
bsdtar->option_null++;
|
||||
bsdtar->flags |= OPTFLAG_NULL;
|
||||
break;
|
||||
case OPTION_NUMERIC_OWNER: /* GNU tar */
|
||||
bsdtar->uname = "";
|
||||
bsdtar->gname = "";
|
||||
bsdtar->option_numeric_owner++;
|
||||
bsdtar->flags |= OPTFLAG_NUMERIC_OWNER;
|
||||
break;
|
||||
case 'O': /* GNU tar */
|
||||
bsdtar->option_stdout = 1;
|
||||
bsdtar->flags |= OPTFLAG_STDOUT;
|
||||
break;
|
||||
case 'o': /* SUSv2 and GNU conflict here, but not fatally */
|
||||
option_o = 1; /* Record it and resolve it later. */
|
||||
bsdtar->flags |= OPTFLAG_O;
|
||||
break;
|
||||
/*
|
||||
* Selecting files by time:
|
||||
@ -548,7 +583,7 @@ main(int argc, char **argv)
|
||||
#endif
|
||||
case 'P': /* GNU tar */
|
||||
bsdtar->extract_flags &= ~SECURITY;
|
||||
bsdtar->option_absolute_paths = 1;
|
||||
bsdtar->flags |= OPTFLAG_ABSOLUTE_PATHS;
|
||||
break;
|
||||
case 'p': /* GNU tar, star */
|
||||
bsdtar->extract_flags |= ARCHIVE_EXTRACT_PERM;
|
||||
@ -564,7 +599,7 @@ main(int argc, char **argv)
|
||||
cset_set_format(bsdtar->cset, "pax");
|
||||
break;
|
||||
case 'q': /* FreeBSD GNU tar --fast-read, NetBSD -q */
|
||||
bsdtar->option_fast_read = 1;
|
||||
bsdtar->flags |= OPTFLAG_FAST_READ;
|
||||
break;
|
||||
case 'r': /* SUSv2 */
|
||||
set_mode(bsdtar, opt);
|
||||
@ -601,11 +636,11 @@ main(int argc, char **argv)
|
||||
bsdtar->verbose++;
|
||||
break;
|
||||
case OPTION_TOTALS: /* GNU tar */
|
||||
bsdtar->option_totals++;
|
||||
bsdtar->flags |= OPTFLAG_TOTALS;
|
||||
break;
|
||||
case 'U': /* GNU tar */
|
||||
bsdtar->extract_flags |= ARCHIVE_EXTRACT_UNLINK;
|
||||
bsdtar->option_unlink_first = 1;
|
||||
bsdtar->flags |= OPTFLAG_UNLINK_FIRST;
|
||||
break;
|
||||
case 'u': /* SUSv2 */
|
||||
set_mode(bsdtar, opt);
|
||||
@ -643,7 +678,7 @@ main(int argc, char **argv)
|
||||
break;
|
||||
#endif
|
||||
case 'w': /* SUSv2 */
|
||||
bsdtar->option_interactive = 1;
|
||||
bsdtar->flags |= OPTFLAG_INTERACTIVE;
|
||||
break;
|
||||
case 'X': /* GNU tar */
|
||||
if (archive_match_exclude_pattern_from_file(
|
||||
@ -655,6 +690,11 @@ main(int argc, char **argv)
|
||||
case 'x': /* SUSv2 */
|
||||
set_mode(bsdtar, opt);
|
||||
break;
|
||||
case OPTION_XATTRS: /* GNU tar */
|
||||
bsdtar->extract_flags |= ARCHIVE_EXTRACT_XATTR;
|
||||
bsdtar->readdisk_flags &= ~ARCHIVE_READDISK_NO_XATTR;
|
||||
bsdtar->flags |= OPTFLAG_XATTRS;
|
||||
break;
|
||||
case 'y': /* FreeBSD version of GNU tar */
|
||||
if (compression != '\0')
|
||||
lafe_errc(1, 0,
|
||||
@ -703,11 +743,11 @@ main(int argc, char **argv)
|
||||
"Must specify one of -c, -r, -t, -u, -x");
|
||||
|
||||
/* Check boolean options only permitted in certain modes. */
|
||||
if (option_a)
|
||||
if (bsdtar->flags & OPTFLAG_AUTO_COMPRESS)
|
||||
only_mode(bsdtar, "-a", "c");
|
||||
if (bsdtar->readdisk_flags & ARCHIVE_READDISK_NO_TRAVERSE_MOUNTS)
|
||||
only_mode(bsdtar, "--one-file-system", "cru");
|
||||
if (bsdtar->option_fast_read)
|
||||
if (bsdtar->flags & OPTFLAG_FAST_READ)
|
||||
only_mode(bsdtar, "--fast-read", "xt");
|
||||
if (bsdtar->extract_flags & ARCHIVE_EXTRACT_HFS_COMPRESSION_FORCED)
|
||||
only_mode(bsdtar, "--hfsCompression", "x");
|
||||
@ -715,9 +755,23 @@ main(int argc, char **argv)
|
||||
only_mode(bsdtar, "--nopreserveHFSCompression", "x");
|
||||
if (bsdtar->readdisk_flags & ARCHIVE_READDISK_HONOR_NODUMP)
|
||||
only_mode(bsdtar, "--nodump", "cru");
|
||||
if (bsdtar->readdisk_flags & ARCHIVE_READDISK_NO_XATTR)
|
||||
only_mode(bsdtar, "--no-xattr", "crux");
|
||||
if (option_o > 0) {
|
||||
if (bsdtar->flags & OPTFLAG_ACLS)
|
||||
only_mode(bsdtar, "--acls", "crux");
|
||||
if (bsdtar->flags & OPTFLAG_NO_ACLS)
|
||||
only_mode(bsdtar, "--no-acls", "crux");
|
||||
if (bsdtar->flags & OPTFLAG_XATTRS)
|
||||
only_mode(bsdtar, "--xattrs", "crux");
|
||||
if (bsdtar->flags & OPTFLAG_NO_XATTRS)
|
||||
only_mode(bsdtar, "--no-xattrs", "crux");
|
||||
if (bsdtar->flags & OPTFLAG_FFLAGS)
|
||||
only_mode(bsdtar, "--fflags", "crux");
|
||||
if (bsdtar->flags & OPTFLAG_NO_FFLAGS)
|
||||
only_mode(bsdtar, "--no-fflags", "crux");
|
||||
if (bsdtar->flags & OPTFLAG_MAC_METADATA)
|
||||
only_mode(bsdtar, "--mac-metadata", "crux");
|
||||
if (bsdtar->flags & OPTFLAG_NO_MAC_METADATA)
|
||||
only_mode(bsdtar, "--no-mac-metadata", "crux");
|
||||
if (bsdtar->flags & OPTFLAG_O) {
|
||||
switch (bsdtar->mode) {
|
||||
case 'c':
|
||||
/*
|
||||
@ -730,7 +784,7 @@ main(int argc, char **argv)
|
||||
break;
|
||||
case 'x':
|
||||
/* POSIX-compatible behavior. */
|
||||
bsdtar->option_no_owner = 1;
|
||||
bsdtar->flags |= OPTFLAG_NO_OWNER;
|
||||
bsdtar->extract_flags &= ~ARCHIVE_EXTRACT_OWNER;
|
||||
break;
|
||||
default:
|
||||
@ -738,16 +792,17 @@ main(int argc, char **argv)
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (bsdtar->option_no_subdirs)
|
||||
if (bsdtar->flags & OPTFLAG_NO_SUBDIRS)
|
||||
only_mode(bsdtar, "-n", "cru");
|
||||
if (bsdtar->option_stdout)
|
||||
if (bsdtar->flags & OPTFLAG_STDOUT)
|
||||
only_mode(bsdtar, "-O", "xt");
|
||||
if (bsdtar->option_unlink_first)
|
||||
if (bsdtar->flags & OPTFLAG_UNLINK_FIRST)
|
||||
only_mode(bsdtar, "-U", "x");
|
||||
if (bsdtar->option_warn_links)
|
||||
if (bsdtar->flags & OPTFLAG_WARN_LINKS)
|
||||
only_mode(bsdtar, "--check-links", "cr");
|
||||
|
||||
if (option_a && cset_auto_compress(bsdtar->cset, bsdtar->filename)) {
|
||||
if ((bsdtar->flags & OPTFLAG_AUTO_COMPRESS) &&
|
||||
cset_auto_compress(bsdtar->cset, bsdtar->filename)) {
|
||||
/* Ignore specified compressions if auto-compress works. */
|
||||
compression = '\0';
|
||||
compression2 = '\0';
|
||||
|
53
tar/bsdtar.h
53
tar/bsdtar.h
@ -50,6 +50,7 @@ struct bsdtar {
|
||||
int bytes_per_block; /* -b block_size */
|
||||
int bytes_in_last_block; /* See -b handling. */
|
||||
int verbose; /* -v */
|
||||
unsigned int flags; /* Bitfield of boolean options */
|
||||
int extract_flags; /* Flags for extract operation */
|
||||
int readdisk_flags; /* Flags for read disk operation */
|
||||
int strip_components; /* Remove this many leading dirs */
|
||||
@ -60,20 +61,7 @@ struct bsdtar {
|
||||
const char *passphrase; /* --passphrase */
|
||||
char mode; /* Program mode: 'c', 't', 'r', 'u', 'x' */
|
||||
char symlink_mode; /* H or L, per BSD conventions */
|
||||
char option_absolute_paths; /* -P */
|
||||
char option_chroot; /* --chroot */
|
||||
char option_fast_read; /* --fast-read */
|
||||
const char *option_options; /* --options */
|
||||
char option_ignore_zeros; /* --ignore-zeros */
|
||||
char option_interactive; /* -w */
|
||||
char option_no_owner; /* -o */
|
||||
char option_no_subdirs; /* -n */
|
||||
char option_numeric_owner; /* --numeric-owner */
|
||||
char option_null; /* --null */
|
||||
char option_stdout; /* -O */
|
||||
char option_totals; /* --totals */
|
||||
char option_unlink_first; /* -U */
|
||||
char option_warn_links; /* --check-links */
|
||||
char day_first; /* show day before month in -tv output */
|
||||
struct creation_set *cset;
|
||||
|
||||
@ -114,14 +102,40 @@ struct bsdtar {
|
||||
char *ppbuff; /* for util.c */
|
||||
};
|
||||
|
||||
/* Options for flags bitfield */
|
||||
#define OPTFLAG_AUTO_COMPRESS (0x00000001) /* -a */
|
||||
#define OPTFLAG_ABSOLUTE_PATHS (0x00000002) /* -P */
|
||||
#define OPTFLAG_CHROOT (0x00000004) /* --chroot */
|
||||
#define OPTFLAG_FAST_READ (0x00000008) /* --fast-read */
|
||||
#define OPTFLAG_IGNORE_ZEROS (0x00000010) /* --ignore-zeros */
|
||||
#define OPTFLAG_INTERACTIVE (0x00000020) /* -w */
|
||||
#define OPTFLAG_NO_OWNER (0x00000040) /* -o */
|
||||
#define OPTFLAG_NO_SUBDIRS (0x00000080) /* -n */
|
||||
#define OPTFLAG_NULL (0x00000100) /* --null */
|
||||
#define OPTFLAG_NUMERIC_OWNER (0x00000200) /* --numeric-owner */
|
||||
#define OPTFLAG_O (0x00000400) /* -o */
|
||||
#define OPTFLAG_STDOUT (0x00000800) /* -O */
|
||||
#define OPTFLAG_TOTALS (0x00001000) /* --totals */
|
||||
#define OPTFLAG_UNLINK_FIRST (0x00002000) /* -U */
|
||||
#define OPTFLAG_WARN_LINKS (0x00004000) /* --check-links */
|
||||
#define OPTFLAG_NO_XATTRS (0x00008000) /* --no-xattrs */
|
||||
#define OPTFLAG_XATTRS (0x00010000) /* --xattrs */
|
||||
#define OPTFLAG_NO_ACLS (0x00020000) /* --no-acls */
|
||||
#define OPTFLAG_ACLS (0x00040000) /* --acls */
|
||||
#define OPTFLAG_NO_FFLAGS (0x00080000) /* --no-fflags */
|
||||
#define OPTFLAG_FFLAGS (0x00100000) /* --fflags */
|
||||
#define OPTFLAG_NO_MAC_METADATA (0x00200000) /* --no-mac-metadata */
|
||||
#define OPTFLAG_MAC_METADATA (0x00400000) /* --mac-metadata */
|
||||
|
||||
/* Fake short equivalents for long options that otherwise lack them. */
|
||||
enum {
|
||||
OPTION_B64ENCODE = 1,
|
||||
OPTION_ACLS = 1,
|
||||
OPTION_B64ENCODE,
|
||||
OPTION_CHECK_LINKS,
|
||||
OPTION_CHROOT,
|
||||
OPTION_CLEAR_NOCHANGE_FFLAGS,
|
||||
OPTION_DISABLE_COPYFILE,
|
||||
OPTION_EXCLUDE,
|
||||
OPTION_FFLAGS,
|
||||
OPTION_FORMAT,
|
||||
OPTION_GID,
|
||||
OPTION_GNAME,
|
||||
@ -136,15 +150,19 @@ enum {
|
||||
OPTION_LZIP,
|
||||
OPTION_LZMA,
|
||||
OPTION_LZOP,
|
||||
OPTION_MAC_METADATA,
|
||||
OPTION_NEWER_CTIME,
|
||||
OPTION_NEWER_CTIME_THAN,
|
||||
OPTION_NEWER_MTIME,
|
||||
OPTION_NEWER_MTIME_THAN,
|
||||
OPTION_NODUMP,
|
||||
OPTION_NOPRESERVE_HFS_COMPRESSION,
|
||||
OPTION_NO_ACLS,
|
||||
OPTION_NO_FFLAGS,
|
||||
OPTION_NO_MAC_METADATA,
|
||||
OPTION_NO_SAME_OWNER,
|
||||
OPTION_NO_SAME_PERMISSIONS,
|
||||
OPTION_NO_XATTR,
|
||||
OPTION_NO_XATTRS,
|
||||
OPTION_NULL,
|
||||
OPTION_NUMERIC_OWNER,
|
||||
OPTION_OLDER_CTIME,
|
||||
@ -162,7 +180,8 @@ enum {
|
||||
OPTION_UNAME,
|
||||
OPTION_USE_COMPRESS_PROGRAM,
|
||||
OPTION_UUENCODE,
|
||||
OPTION_VERSION
|
||||
OPTION_VERSION,
|
||||
OPTION_XATTRS
|
||||
};
|
||||
|
||||
int bsdtar_getopt(struct bsdtar *);
|
||||
|
@ -65,6 +65,7 @@ static const struct bsdtar_option {
|
||||
} tar_longopts[] = {
|
||||
{ "absolute-paths", 0, 'P' },
|
||||
{ "append", 0, 'r' },
|
||||
{ "acls", 0, OPTION_ACLS },
|
||||
{ "auto-compress", 0, 'a' },
|
||||
{ "b64encode", 0, OPTION_B64ENCODE },
|
||||
{ "block-size", 1, 'b' },
|
||||
@ -81,11 +82,12 @@ static const struct bsdtar_option {
|
||||
{ "create", 0, 'c' },
|
||||
{ "dereference", 0, 'L' },
|
||||
{ "directory", 1, 'C' },
|
||||
{ "disable-copyfile", 0, OPTION_DISABLE_COPYFILE },
|
||||
{ "disable-copyfile", 0, OPTION_NO_MAC_METADATA },
|
||||
{ "exclude", 1, OPTION_EXCLUDE },
|
||||
{ "exclude-from", 1, 'X' },
|
||||
{ "extract", 0, 'x' },
|
||||
{ "fast-read", 0, 'q' },
|
||||
{ "fflags", 0, OPTION_FFLAGS },
|
||||
{ "file", 1, 'f' },
|
||||
{ "files-from", 1, 'T' },
|
||||
{ "format", 1, OPTION_FORMAT },
|
||||
@ -108,6 +110,7 @@ static const struct bsdtar_option {
|
||||
{ "lzip", 0, OPTION_LZIP },
|
||||
{ "lzma", 0, OPTION_LZMA },
|
||||
{ "lzop", 0, OPTION_LZOP },
|
||||
{ "mac-metadata", 0, OPTION_MAC_METADATA },
|
||||
{ "modification-time", 0, 'm' },
|
||||
{ "newer", 1, OPTION_NEWER_CTIME },
|
||||
{ "newer-ctime", 1, OPTION_NEWER_CTIME },
|
||||
@ -115,10 +118,14 @@ static const struct bsdtar_option {
|
||||
{ "newer-mtime", 1, OPTION_NEWER_MTIME },
|
||||
{ "newer-mtime-than", 1, OPTION_NEWER_MTIME_THAN },
|
||||
{ "newer-than", 1, OPTION_NEWER_CTIME_THAN },
|
||||
{ "no-acls", 0, OPTION_NO_ACLS },
|
||||
{ "no-fflags", 0, OPTION_NO_FFLAGS },
|
||||
{ "no-mac-metadata", 0, OPTION_NO_MAC_METADATA },
|
||||
{ "no-recursion", 0, 'n' },
|
||||
{ "no-same-owner", 0, OPTION_NO_SAME_OWNER },
|
||||
{ "no-same-permissions", 0, OPTION_NO_SAME_PERMISSIONS },
|
||||
{ "no-xattr", 0, OPTION_NO_XATTR },
|
||||
{ "no-xattr", 0, OPTION_NO_XATTRS },
|
||||
{ "no-xattrs", 0, OPTION_NO_XATTRS },
|
||||
{ "nodump", 0, OPTION_NODUMP },
|
||||
{ "nopreserveHFSCompression",0, OPTION_NOPRESERVE_HFS_COMPRESSION },
|
||||
{ "norecurse", 0, 'n' },
|
||||
@ -151,6 +158,7 @@ static const struct bsdtar_option {
|
||||
{ "uuencode", 0, OPTION_UUENCODE },
|
||||
{ "verbose", 0, 'v' },
|
||||
{ "version", 0, OPTION_VERSION },
|
||||
{ "xattrs", 0, OPTION_XATTRS },
|
||||
{ "xz", 0, 'J' },
|
||||
{ NULL, 0, 0 }
|
||||
};
|
||||
|
19
tar/read.c
19
tar/read.c
@ -105,7 +105,7 @@ tar_mode_x(struct bsdtar *bsdtar)
|
||||
writer = archive_write_disk_new();
|
||||
if (writer == NULL)
|
||||
lafe_errc(1, ENOMEM, "Cannot allocate disk writer object");
|
||||
if (!bsdtar->option_numeric_owner)
|
||||
if ((bsdtar->flags & OPTFLAG_NUMERIC_OWNER) == 0)
|
||||
archive_write_disk_set_standard_lookup(writer);
|
||||
archive_write_disk_set_options(writer, bsdtar->extract_flags);
|
||||
|
||||
@ -177,7 +177,7 @@ read_archive(struct bsdtar *bsdtar, char mode, struct archive *writer)
|
||||
if (bsdtar->names_from_file != NULL)
|
||||
if (archive_match_include_pattern_from_file(
|
||||
bsdtar->matching, bsdtar->names_from_file,
|
||||
bsdtar->option_null) != ARCHIVE_OK)
|
||||
(bsdtar->flags & OPTFLAG_NULL)) != ARCHIVE_OK)
|
||||
lafe_errc(1, 0, "Error inclusion pattern: %s",
|
||||
archive_error_string(bsdtar->matching));
|
||||
|
||||
@ -208,7 +208,7 @@ read_archive(struct bsdtar *bsdtar, char mode, struct archive *writer)
|
||||
}
|
||||
if (ARCHIVE_OK != archive_read_set_options(a, bsdtar->option_options))
|
||||
lafe_errc(1, 0, "%s", archive_error_string(a));
|
||||
if (bsdtar->option_ignore_zeros)
|
||||
if (bsdtar->flags & OPTFLAG_IGNORE_ZEROS)
|
||||
if (archive_read_set_options(a,
|
||||
"read_concatenated_archives") != ARCHIVE_OK)
|
||||
lafe_errc(1, 0, "%s", archive_error_string(a));
|
||||
@ -234,7 +234,7 @@ read_archive(struct bsdtar *bsdtar, char mode, struct archive *writer)
|
||||
&progress_data);
|
||||
}
|
||||
|
||||
if (mode == 'x' && bsdtar->option_chroot) {
|
||||
if (mode == 'x' && (bsdtar->flags & OPTFLAG_CHROOT)) {
|
||||
#if HAVE_CHROOT
|
||||
if (chroot(".") != 0)
|
||||
lafe_errc(1, errno, "Can't chroot to \".\"");
|
||||
@ -245,7 +245,7 @@ read_archive(struct bsdtar *bsdtar, char mode, struct archive *writer)
|
||||
}
|
||||
|
||||
#if defined(_WIN32) && !defined(__CYGWIN__)
|
||||
if (mode == 'x' && bsdtar->option_stdout) {
|
||||
if (mode == 'x' && (bsdtar->flags & OPTFLAG_STDOUT)) {
|
||||
_setmode(1, _O_BINARY);
|
||||
}
|
||||
#endif
|
||||
@ -253,7 +253,7 @@ read_archive(struct bsdtar *bsdtar, char mode, struct archive *writer)
|
||||
for (;;) {
|
||||
/* Support --fast-read option */
|
||||
const char *p;
|
||||
if (bsdtar->option_fast_read &&
|
||||
if ((bsdtar->flags & OPTFLAG_FAST_READ) &&
|
||||
archive_match_path_unmatched_inclusions(bsdtar->matching) == 0)
|
||||
break;
|
||||
|
||||
@ -307,7 +307,8 @@ read_archive(struct bsdtar *bsdtar, char mode, struct archive *writer)
|
||||
if (mode == 't') {
|
||||
/* Perversely, gtar uses -O to mean "send to stderr"
|
||||
* when used with -t. */
|
||||
out = bsdtar->option_stdout ? stderr : stdout;
|
||||
out = (bsdtar->flags & OPTFLAG_STDOUT) ?
|
||||
stderr : stdout;
|
||||
|
||||
/*
|
||||
* TODO: Provide some reasonable way to
|
||||
@ -345,7 +346,7 @@ read_archive(struct bsdtar *bsdtar, char mode, struct archive *writer)
|
||||
if (edit_pathname(bsdtar, entry))
|
||||
continue; /* Excluded by a rewrite failure. */
|
||||
|
||||
if (bsdtar->option_interactive &&
|
||||
if ((bsdtar->flags & OPTFLAG_INTERACTIVE) &&
|
||||
!yes("extract '%s'", archive_entry_pathname(entry)))
|
||||
continue;
|
||||
|
||||
@ -364,7 +365,7 @@ read_archive(struct bsdtar *bsdtar, char mode, struct archive *writer)
|
||||
|
||||
/* TODO siginfo_printinfo(bsdtar, 0); */
|
||||
|
||||
if (bsdtar->option_stdout)
|
||||
if (bsdtar->flags & OPTFLAG_STDOUT)
|
||||
r = archive_read_data_into_fd(a, 1);
|
||||
else
|
||||
r = archive_read_extract2(a, entry, writer);
|
||||
|
@ -6,7 +6,7 @@
|
||||
IF(ENABLE_TAR AND ENABLE_TEST)
|
||||
SET(bsdtar_test_SOURCES
|
||||
../../test_utils/test_utils.c
|
||||
main.c
|
||||
../../test_utils/test_main.c
|
||||
test.h
|
||||
test_0.c
|
||||
test_basic.c
|
||||
@ -96,6 +96,7 @@ IF(ENABLE_TAR AND ENABLE_TEST)
|
||||
INCLUDE(${CMAKE_CURRENT_BINARY_DIR}/list.h)
|
||||
INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR})
|
||||
INCLUDE_DIRECTORIES(${PROJECT_SOURCE_DIR}/test_utils)
|
||||
INCLUDE_DIRECTORIES(${PROJECT_SOURCE_DIR}/tar/test)
|
||||
|
||||
# Experimental new test handling
|
||||
ADD_CUSTOM_TARGET(run_bsdtar_test
|
||||
|
3072
tar/test/main.c
3072
tar/test/main.c
File diff suppressed because it is too large
Load Diff
338
tar/test/test.h
338
tar/test/test.h
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2003-2006 Tim Kientzle
|
||||
* Copyright (c) 2003-2017 Tim Kientzle
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
@ -22,333 +22,19 @@
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
||||
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* $FreeBSD: src/usr.bin/tar/test/test.h,v 1.4 2008/08/21 07:04:57 kientzle Exp $
|
||||
* $FreeBSD$
|
||||
*/
|
||||
|
||||
/* Every test program should #include "test.h" as the first thing. */
|
||||
|
||||
/*
|
||||
* The goal of this file (and the matching test.c) is to
|
||||
* simplify the very repetitive test-*.c test programs.
|
||||
*/
|
||||
#if defined(HAVE_CONFIG_H)
|
||||
/* Most POSIX platforms use the 'configure' script to build config.h */
|
||||
#include "config.h"
|
||||
#elif defined(__FreeBSD__)
|
||||
/* Building as part of FreeBSD system requires a pre-built config.h. */
|
||||
#include "config_freebsd.h"
|
||||
#elif defined(_WIN32) && !defined(__CYGWIN__)
|
||||
/* Win32 can't run the 'configure' script. */
|
||||
#include "config_windows.h"
|
||||
#else
|
||||
/* Warn if the library hasn't been (automatically or manually) configured. */
|
||||
#error Oops: No config.h and no pre-built configuration in test.h.
|
||||
#endif
|
||||
#define KNOWNREF "test_patterns_2.tar.uu"
|
||||
#define ENVBASE "BSDTAR" /* Prefix for environment variables. */
|
||||
#define PROGRAM "bsdtar" /* Name of program being tested. */
|
||||
#define PROGRAM_ALIAS "tar" /* Generic alias for program */
|
||||
#undef LIBRARY /* Not testing a library. */
|
||||
#undef EXTRA_DUMP /* How to dump extra data */
|
||||
#undef EXTRA_ERRNO /* How to dump errno */
|
||||
/* How to generate extra version info. */
|
||||
#define EXTRA_VERSION (systemf("%s --version", testprog) ? "" : "")
|
||||
|
||||
#include <sys/types.h> /* Windows requires this before sys/stat.h */
|
||||
#include <sys/stat.h>
|
||||
|
||||
#if HAVE_DIRENT_H
|
||||
#include <dirent.h>
|
||||
#endif
|
||||
#ifdef HAVE_DIRECT_H
|
||||
#include <direct.h>
|
||||
#define dirent direct
|
||||
#endif
|
||||
#include <errno.h>
|
||||
#include <fcntl.h>
|
||||
#ifdef HAVE_IO_H
|
||||
#include <io.h>
|
||||
#endif
|
||||
#ifdef HAVE_STDINT_H
|
||||
#include <stdint.h>
|
||||
#endif
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <ctype.h>
|
||||
#include <time.h>
|
||||
#ifdef HAVE_UNISTD_H
|
||||
#include <unistd.h>
|
||||
#endif
|
||||
#include <wchar.h>
|
||||
#ifdef HAVE_WINDOWS_H
|
||||
#include <windows.h>
|
||||
#endif
|
||||
|
||||
/*
|
||||
* System-specific tweaks. We really want to minimize these
|
||||
* as much as possible, since they make it harder to understand
|
||||
* the mainline code.
|
||||
*/
|
||||
|
||||
/* Windows (including Visual Studio and MinGW but not Cygwin) */
|
||||
#if defined(_WIN32) && !defined(__CYGWIN__)
|
||||
#if !defined(__BORLANDC__)
|
||||
#undef chdir
|
||||
#define chdir _chdir
|
||||
#define strdup _strdup
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/* Visual Studio */
|
||||
#if defined(_MSC_VER) && _MSC_VER < 1900
|
||||
#define snprintf sprintf_s
|
||||
#endif
|
||||
|
||||
#if defined(__BORLANDC__)
|
||||
#pragma warn -8068 /* Constant out of range in comparison. */
|
||||
#endif
|
||||
|
||||
/* Haiku OS and QNX */
|
||||
#if defined(__HAIKU__) || defined(__QNXNTO__)
|
||||
/* Haiku and QNX have typedefs in stdint.h (needed for int64_t) */
|
||||
#include <stdint.h>
|
||||
#endif
|
||||
|
||||
/* Get a real definition for __FBSDID if we can */
|
||||
#if HAVE_SYS_CDEFS_H
|
||||
#include <sys/cdefs.h>
|
||||
#endif
|
||||
|
||||
/* If not, define it so as to avoid dangling semicolons. */
|
||||
#ifndef __FBSDID
|
||||
#define __FBSDID(a) struct _undefined_hack
|
||||
#endif
|
||||
|
||||
#ifndef O_BINARY
|
||||
#define O_BINARY 0
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Redefine DEFINE_TEST for use in defining the test functions.
|
||||
*/
|
||||
#undef DEFINE_TEST
|
||||
#define DEFINE_TEST(name) void name(void); void name(void)
|
||||
|
||||
/* An implementation of the standard assert() macro */
|
||||
#define assert(e) assertion_assert(__FILE__, __LINE__, (e), #e, NULL)
|
||||
/* chdir() and error if it fails */
|
||||
#define assertChdir(path) \
|
||||
assertion_chdir(__FILE__, __LINE__, path)
|
||||
/* Assert two integers are the same. Reports value of each one if not. */
|
||||
#define assertEqualInt(v1,v2) \
|
||||
assertion_equal_int(__FILE__, __LINE__, (v1), #v1, (v2), #v2, NULL)
|
||||
/* Assert two strings are the same. Reports value of each one if not. */
|
||||
#define assertEqualString(v1,v2) \
|
||||
assertion_equal_string(__FILE__, __LINE__, (v1), #v1, (v2), #v2, NULL, 0)
|
||||
#define assertEqualUTF8String(v1,v2) \
|
||||
assertion_equal_string(__FILE__, __LINE__, (v1), #v1, (v2), #v2, NULL, 1)
|
||||
/* As above, but v1 and v2 are wchar_t * */
|
||||
#define assertEqualWString(v1,v2) \
|
||||
assertion_equal_wstring(__FILE__, __LINE__, (v1), #v1, (v2), #v2, NULL)
|
||||
/* As above, but raw blocks of bytes. */
|
||||
#define assertEqualMem(v1, v2, l) \
|
||||
assertion_equal_mem(__FILE__, __LINE__, (v1), #v1, (v2), #v2, (l), #l, NULL)
|
||||
/* Assert that memory is full of a specified byte */
|
||||
#define assertMemoryFilledWith(v1, l, b) \
|
||||
assertion_memory_filled_with(__FILE__, __LINE__, (v1), #v1, (l), #l, (b), #b, NULL)
|
||||
/* Assert two files are the same. */
|
||||
#define assertEqualFile(f1, f2) \
|
||||
assertion_equal_file(__FILE__, __LINE__, (f1), (f2))
|
||||
/* Assert that a file is empty. */
|
||||
#define assertEmptyFile(pathname) \
|
||||
assertion_empty_file(__FILE__, __LINE__, (pathname))
|
||||
/* Assert that a file is not empty. */
|
||||
#define assertNonEmptyFile(pathname) \
|
||||
assertion_non_empty_file(__FILE__, __LINE__, (pathname))
|
||||
#define assertFileAtime(pathname, sec, nsec) \
|
||||
assertion_file_atime(__FILE__, __LINE__, pathname, sec, nsec)
|
||||
#define assertFileAtimeRecent(pathname) \
|
||||
assertion_file_atime_recent(__FILE__, __LINE__, pathname)
|
||||
#define assertFileBirthtime(pathname, sec, nsec) \
|
||||
assertion_file_birthtime(__FILE__, __LINE__, pathname, sec, nsec)
|
||||
#define assertFileBirthtimeRecent(pathname) \
|
||||
assertion_file_birthtime_recent(__FILE__, __LINE__, pathname)
|
||||
/* Assert that a file exists; supports printf-style arguments. */
|
||||
#define assertFileExists(pathname) \
|
||||
assertion_file_exists(__FILE__, __LINE__, pathname)
|
||||
/* Assert that a file exists. */
|
||||
#define assertFileNotExists(pathname) \
|
||||
assertion_file_not_exists(__FILE__, __LINE__, pathname)
|
||||
/* Assert that file contents match a string. */
|
||||
#define assertFileContents(data, data_size, pathname) \
|
||||
assertion_file_contents(__FILE__, __LINE__, data, data_size, pathname)
|
||||
/* Verify that a file does not contain invalid strings */
|
||||
#define assertFileContainsNoInvalidStrings(pathname, strings) \
|
||||
assertion_file_contains_no_invalid_strings(__FILE__, __LINE__, pathname, strings)
|
||||
#define assertFileMtime(pathname, sec, nsec) \
|
||||
assertion_file_mtime(__FILE__, __LINE__, pathname, sec, nsec)
|
||||
#define assertFileMtimeRecent(pathname) \
|
||||
assertion_file_mtime_recent(__FILE__, __LINE__, pathname)
|
||||
#define assertFileNLinks(pathname, nlinks) \
|
||||
assertion_file_nlinks(__FILE__, __LINE__, pathname, nlinks)
|
||||
#define assertFileSize(pathname, size) \
|
||||
assertion_file_size(__FILE__, __LINE__, pathname, size)
|
||||
#define assertFileMode(pathname, mode) \
|
||||
assertion_file_mode(__FILE__, __LINE__, pathname, mode)
|
||||
#define assertTextFileContents(text, pathname) \
|
||||
assertion_text_file_contents(__FILE__, __LINE__, text, pathname)
|
||||
#define assertFileContainsLinesAnyOrder(pathname, lines) \
|
||||
assertion_file_contains_lines_any_order(__FILE__, __LINE__, pathname, lines)
|
||||
#define assertIsDir(pathname, mode) \
|
||||
assertion_is_dir(__FILE__, __LINE__, pathname, mode)
|
||||
#define assertIsHardlink(path1, path2) \
|
||||
assertion_is_hardlink(__FILE__, __LINE__, path1, path2)
|
||||
#define assertIsNotHardlink(path1, path2) \
|
||||
assertion_is_not_hardlink(__FILE__, __LINE__, path1, path2)
|
||||
#define assertIsReg(pathname, mode) \
|
||||
assertion_is_reg(__FILE__, __LINE__, pathname, mode)
|
||||
#define assertIsSymlink(pathname, contents) \
|
||||
assertion_is_symlink(__FILE__, __LINE__, pathname, contents)
|
||||
/* Create a directory, report error if it fails. */
|
||||
#define assertMakeDir(dirname, mode) \
|
||||
assertion_make_dir(__FILE__, __LINE__, dirname, mode)
|
||||
#define assertMakeFile(path, mode, contents) \
|
||||
assertion_make_file(__FILE__, __LINE__, path, mode, -1, contents)
|
||||
#define assertMakeBinFile(path, mode, csize, contents) \
|
||||
assertion_make_file(__FILE__, __LINE__, path, mode, csize, contents)
|
||||
#define assertMakeHardlink(newfile, oldfile) \
|
||||
assertion_make_hardlink(__FILE__, __LINE__, newfile, oldfile)
|
||||
#define assertMakeSymlink(newfile, linkto) \
|
||||
assertion_make_symlink(__FILE__, __LINE__, newfile, linkto)
|
||||
#define assertNodump(path) \
|
||||
assertion_nodump(__FILE__, __LINE__, path)
|
||||
#define assertUmask(mask) \
|
||||
assertion_umask(__FILE__, __LINE__, mask)
|
||||
#define assertUtimes(pathname, atime, atime_nsec, mtime, mtime_nsec) \
|
||||
assertion_utimes(__FILE__, __LINE__, pathname, atime, atime_nsec, mtime, mtime_nsec)
|
||||
|
||||
/*
|
||||
* This would be simple with C99 variadic macros, but I don't want to
|
||||
* require that. Instead, I insert a function call before each
|
||||
* skipping() call to pass the file and line information down. Crude,
|
||||
* but effective.
|
||||
*/
|
||||
#define skipping \
|
||||
skipping_setup(__FILE__, __LINE__);test_skipping
|
||||
|
||||
/* Function declarations. These are defined in test_utility.c. */
|
||||
void failure(const char *fmt, ...);
|
||||
int assertion_assert(const char *, int, int, const char *, void *);
|
||||
int assertion_chdir(const char *, int, const char *);
|
||||
int assertion_empty_file(const char *, int, const char *);
|
||||
int assertion_equal_file(const char *, int, const char *, const char *);
|
||||
int assertion_equal_int(const char *, int, long long, const char *, long long, const char *, void *);
|
||||
int assertion_equal_mem(const char *, int, const void *, const char *, const void *, const char *, size_t, const char *, void *);
|
||||
int assertion_memory_filled_with(const char *, int, const void *, const char *, size_t, const char *, char, const char *, void *);
|
||||
int assertion_equal_string(const char *, int, const char *v1, const char *, const char *v2, const char *, void *, int);
|
||||
int assertion_equal_wstring(const char *, int, const wchar_t *v1, const char *, const wchar_t *v2, const char *, void *);
|
||||
int assertion_file_atime(const char *, int, const char *, long, long);
|
||||
int assertion_file_atime_recent(const char *, int, const char *);
|
||||
int assertion_file_birthtime(const char *, int, const char *, long, long);
|
||||
int assertion_file_birthtime_recent(const char *, int, const char *);
|
||||
int assertion_file_contains_lines_any_order(const char *, int, const char *, const char **);
|
||||
int assertion_file_contains_no_invalid_strings(const char *, int, const char *, const char **);
|
||||
int assertion_file_contents(const char *, int, const void *, int, const char *);
|
||||
int assertion_file_exists(const char *, int, const char *);
|
||||
int assertion_file_mode(const char *, int, const char *, int);
|
||||
int assertion_file_mtime(const char *, int, const char *, long, long);
|
||||
int assertion_file_mtime_recent(const char *, int, const char *);
|
||||
int assertion_file_nlinks(const char *, int, const char *, int);
|
||||
int assertion_file_not_exists(const char *, int, const char *);
|
||||
int assertion_file_size(const char *, int, const char *, long);
|
||||
int assertion_is_dir(const char *, int, const char *, int);
|
||||
int assertion_is_hardlink(const char *, int, const char *, const char *);
|
||||
int assertion_is_not_hardlink(const char *, int, const char *, const char *);
|
||||
int assertion_is_reg(const char *, int, const char *, int);
|
||||
int assertion_is_symlink(const char *, int, const char *, const char *);
|
||||
int assertion_make_dir(const char *, int, const char *, int);
|
||||
int assertion_make_file(const char *, int, const char *, int, int, const void *);
|
||||
int assertion_make_hardlink(const char *, int, const char *newpath, const char *);
|
||||
int assertion_make_symlink(const char *, int, const char *newpath, const char *);
|
||||
int assertion_nodump(const char *, int, const char *);
|
||||
int assertion_non_empty_file(const char *, int, const char *);
|
||||
int assertion_text_file_contents(const char *, int, const char *buff, const char *f);
|
||||
int assertion_umask(const char *, int, int);
|
||||
int assertion_utimes(const char *, int, const char *, long, long, long, long );
|
||||
|
||||
void skipping_setup(const char *, int);
|
||||
void test_skipping(const char *fmt, ...);
|
||||
|
||||
/* Like sprintf, then system() */
|
||||
int systemf(const char * fmt, ...);
|
||||
|
||||
/* Delay until time() returns a value after this. */
|
||||
void sleepUntilAfter(time_t);
|
||||
|
||||
/* Return true if this platform can create symlinks. */
|
||||
int canSymlink(void);
|
||||
|
||||
/* Return true if this platform can run the "bzip2" program. */
|
||||
int canBzip2(void);
|
||||
|
||||
/* Return true if this platform can run the "grzip" program. */
|
||||
int canGrzip(void);
|
||||
|
||||
/* Return true if this platform can run the "gzip" program. */
|
||||
int canGzip(void);
|
||||
|
||||
/* Return true if this platform can run the specified command. */
|
||||
int canRunCommand(const char *);
|
||||
|
||||
/* Return true if this platform can run the "lrzip" program. */
|
||||
int canLrzip(void);
|
||||
|
||||
/* Return true if this platform can run the "lz4" program. */
|
||||
int canLz4(void);
|
||||
|
||||
/* Return true if this platform can run the "lzip" program. */
|
||||
int canLzip(void);
|
||||
|
||||
/* Return true if this platform can run the "lzma" program. */
|
||||
int canLzma(void);
|
||||
|
||||
/* Return true if this platform can run the "lzop" program. */
|
||||
int canLzop(void);
|
||||
|
||||
/* Return true if this platform can run the "xz" program. */
|
||||
int canXz(void);
|
||||
|
||||
/* Return true if this filesystem can handle nodump flags. */
|
||||
int canNodump(void);
|
||||
|
||||
/* Return true if the file has large i-node number(>0xffffffff). */
|
||||
int is_LargeInode(const char *);
|
||||
|
||||
/* Suck file into string allocated via malloc(). Call free() when done. */
|
||||
/* Supports printf-style args: slurpfile(NULL, "%s/myfile", refdir); */
|
||||
char *slurpfile(size_t *, const char *fmt, ...);
|
||||
|
||||
/* Dump block of bytes to a file. */
|
||||
void dumpfile(const char *filename, void *, size_t);
|
||||
|
||||
/* Extracts named reference file to the current directory. */
|
||||
void extract_reference_file(const char *);
|
||||
/* Copies named reference file to the current directory. */
|
||||
void copy_reference_file(const char *);
|
||||
|
||||
/* Extracts a list of files to the current directory.
|
||||
* List must be NULL terminated.
|
||||
*/
|
||||
void extract_reference_files(const char **);
|
||||
|
||||
/* Subtract umask from mode */
|
||||
mode_t umasked(mode_t expected_mode);
|
||||
|
||||
/* Path to working directory for current test */
|
||||
extern const char *testworkdir;
|
||||
|
||||
/*
|
||||
* Special interfaces for program test harness.
|
||||
*/
|
||||
|
||||
/* Pathname of exe to be tested. */
|
||||
extern const char *testprogfile;
|
||||
/* Name of exe to use in printf-formatted command strings. */
|
||||
/* On Windows, this includes leading/trailing quotes. */
|
||||
extern const char *testprog;
|
||||
|
||||
#ifdef USE_DMALLOC
|
||||
#include <dmalloc.h>
|
||||
#endif
|
||||
#include "test_common.h"
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*-
|
||||
* Copyright (c) 2003-2007 Tim Kientzle
|
||||
* Copyright (c) 2003-2017 Tim Kientzle
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
@ -23,7 +23,6 @@
|
||||
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
#include "test.h"
|
||||
__FBSDID("$FreeBSD: src/usr.bin/tar/test/test_version.c,v 1.2 2008/05/26 17:10:10 kientzle Exp $");
|
||||
|
||||
/*
|
||||
* Test that --version option works and generates reasonable output.
|
||||
@ -31,73 +30,5 @@ __FBSDID("$FreeBSD: src/usr.bin/tar/test/test_version.c,v 1.2 2008/05/26 17:10:1
|
||||
|
||||
DEFINE_TEST(test_version)
|
||||
{
|
||||
int r;
|
||||
char *p, *q;
|
||||
size_t s;
|
||||
|
||||
|
||||
r = systemf("%s --version >version.stdout 2>version.stderr", testprog);
|
||||
if (r != 0)
|
||||
r = systemf("%s -W version >version.stdout 2>version.stderr",
|
||||
testprog);
|
||||
failure("Unable to run either %s --version or %s -W version",
|
||||
testprog, testprog);
|
||||
if (!assert(r == 0))
|
||||
return;
|
||||
|
||||
/* --version should generate nothing to stdout. */
|
||||
assertEmptyFile("version.stderr");
|
||||
/* Verify format of version message. */
|
||||
q = p = slurpfile(&s, "version.stdout");
|
||||
/* Version message should start with name of program, then space. */
|
||||
assert(s > 6);
|
||||
failure("Version must start with 'bsdtar': ``%s''", p);
|
||||
if (!assertEqualMem(q, "bsdtar ", 7))
|
||||
goto done;
|
||||
q += 7; s -= 7;
|
||||
/* Version number is a series of digits and periods. */
|
||||
while (s > 0 && (*q == '.' || (*q >= '0' && *q <= '9'))) {
|
||||
++q;
|
||||
--s;
|
||||
}
|
||||
/* Version number terminated by space. */
|
||||
failure("No space after bsdtar version: ``%s''", p);
|
||||
assert(s > 1);
|
||||
/* Skip a single trailing a,b,c, or d. */
|
||||
if (*q == 'a' || *q == 'b' || *q == 'c' || *q == 'd')
|
||||
++q;
|
||||
failure("No space after bsdtar version: ``%s''", p);
|
||||
assert(*q == ' ');
|
||||
++q; --s;
|
||||
/* Separator. */
|
||||
failure("No `-' between bsdtar and libarchive versions: ``%s''", p);
|
||||
assertEqualMem(q, "- ", 2);
|
||||
q += 2; s -= 2;
|
||||
/* libarchive name and version number */
|
||||
failure("Not long enough for libarchive version: ``%s''", p);
|
||||
assert(s > 11);
|
||||
failure("Libarchive version must start with `libarchive': ``%s''", p);
|
||||
assertEqualMem(q, "libarchive ", 11);
|
||||
q += 11; s -= 11;
|
||||
/* Version number is a series of digits and periods. */
|
||||
while (s > 0 && (*q == '.' || (*q >= '0' && *q <= '9'))) {
|
||||
++q;
|
||||
--s;
|
||||
}
|
||||
/* Skip a single trailing a,b,c, or d. */
|
||||
if (*q == 'a' || *q == 'b' || *q == 'c' || *q == 'd')
|
||||
++q;
|
||||
/* Skip arbitrary third-party version numbers. */
|
||||
while (s > 0 && (*q == ' ' || *q == '-' || *q == '/' || *q == '.' || isalnum(*q))) {
|
||||
++q;
|
||||
--s;
|
||||
}
|
||||
/* All terminated by end-of-line. */
|
||||
assert(s >= 1);
|
||||
/* Skip an optional CR character (e.g., Windows) */
|
||||
failure("Version output must end with \\n or \\r\\n");
|
||||
if (*q == '\r') { ++q; --s; }
|
||||
assertEqualMem(q, "\n", 1);
|
||||
done:
|
||||
free(p);
|
||||
assertVersion(testprog, "bsdtar");
|
||||
}
|
||||
|
@ -534,7 +534,7 @@ edit_pathname(struct bsdtar *bsdtar, struct archive_entry *entry)
|
||||
}
|
||||
}
|
||||
|
||||
if (!bsdtar->option_absolute_paths) {
|
||||
if ((bsdtar->flags & OPTFLAG_ABSOLUTE_PATHS) == 0) {
|
||||
/* By default, don't write or restore absolute pathnames. */
|
||||
name = strip_absolute_path(bsdtar, name);
|
||||
if (*name == '\0')
|
||||
|
21
tar/write.c
21
tar/write.c
@ -583,7 +583,7 @@ cleanup:
|
||||
archive_read_free(bsdtar->diskreader);
|
||||
bsdtar->diskreader = NULL;
|
||||
|
||||
if (bsdtar->option_totals) {
|
||||
if (bsdtar->flags & OPTFLAG_TOTALS) {
|
||||
fprintf(stderr, "Total bytes written: %s\n",
|
||||
tar_i64toa(archive_filter_bytes(a, -1)));
|
||||
}
|
||||
@ -606,7 +606,8 @@ archive_names_from_file(struct bsdtar *bsdtar, struct archive *a)
|
||||
|
||||
bsdtar->next_line_is_dir = 0;
|
||||
|
||||
lr = lafe_line_reader(bsdtar->names_from_file, bsdtar->option_null);
|
||||
lr = lafe_line_reader(bsdtar->names_from_file,
|
||||
(bsdtar->flags & OPTFLAG_NULL));
|
||||
while ((line = lafe_line_reader_next(lr)) != NULL) {
|
||||
if (bsdtar->next_line_is_dir) {
|
||||
if (*line != '\0')
|
||||
@ -617,7 +618,8 @@ archive_names_from_file(struct bsdtar *bsdtar, struct archive *a)
|
||||
bsdtar->return_value = 1;
|
||||
}
|
||||
bsdtar->next_line_is_dir = 0;
|
||||
} else if (!bsdtar->option_null && strcmp(line, "-C") == 0)
|
||||
} else if (((bsdtar->flags & OPTFLAG_NULL) == 0) &&
|
||||
strcmp(line, "-C") == 0)
|
||||
bsdtar->next_line_is_dir = 1;
|
||||
else {
|
||||
if (*line != '/')
|
||||
@ -690,7 +692,7 @@ append_archive(struct bsdtar *bsdtar, struct archive *a, struct archive *ina)
|
||||
while (ARCHIVE_OK == (e = archive_read_next_header(ina, &in_entry))) {
|
||||
if (archive_match_excluded(bsdtar->matching, in_entry))
|
||||
continue;
|
||||
if (bsdtar->option_interactive &&
|
||||
if ((bsdtar->flags & OPTFLAG_INTERACTIVE) &&
|
||||
!yes("copy '%s'", archive_entry_pathname(in_entry)))
|
||||
continue;
|
||||
if (bsdtar->verbose > 1) {
|
||||
@ -809,11 +811,11 @@ excluded_callback(struct archive *a, void *_data, struct archive_entry *entry)
|
||||
{
|
||||
struct bsdtar *bsdtar = (struct bsdtar *)_data;
|
||||
|
||||
if (bsdtar->option_no_subdirs)
|
||||
if (bsdtar->flags & OPTFLAG_NO_SUBDIRS)
|
||||
return;
|
||||
if (!archive_read_disk_can_descend(a))
|
||||
return;
|
||||
if (bsdtar->option_interactive &&
|
||||
if ((bsdtar->flags & OPTFLAG_INTERACTIVE) &&
|
||||
!yes("add '%s'", archive_entry_pathname(entry)))
|
||||
return;
|
||||
archive_read_disk_descend(a);
|
||||
@ -844,12 +846,13 @@ metadata_filter(struct archive *a, void *_data, struct archive_entry *entry)
|
||||
* check would veto this file, we shouldn't bother
|
||||
* the user with it.
|
||||
*/
|
||||
if (bsdtar->option_interactive &&
|
||||
if ((bsdtar->flags & OPTFLAG_INTERACTIVE) &&
|
||||
!yes("add '%s'", archive_entry_pathname(entry)))
|
||||
return (0);
|
||||
|
||||
/* Note: if user vetoes, we won't descend. */
|
||||
if (!bsdtar->option_no_subdirs && archive_read_disk_can_descend(a))
|
||||
if (((bsdtar->flags & OPTFLAG_NO_SUBDIRS) == 0) &&
|
||||
archive_read_disk_can_descend(a))
|
||||
archive_read_disk_descend(a);
|
||||
|
||||
return (1);
|
||||
@ -1010,7 +1013,7 @@ report_write(struct bsdtar *bsdtar, struct archive *a,
|
||||
uncomp = archive_filter_bytes(a, 0);
|
||||
fprintf(stderr, "In: %d files, %s bytes;",
|
||||
archive_file_count(a), tar_i64toa(uncomp));
|
||||
if (comp > uncomp)
|
||||
if (comp >= uncomp)
|
||||
compression = 0;
|
||||
else
|
||||
compression = (int)((uncomp - comp) * 100 / uncomp);
|
||||
|
434
test_utils/test_common.h
Normal file
434
test_utils/test_common.h
Normal file
@ -0,0 +1,434 @@
|
||||
/*
|
||||
* Copyright (c) 2003-2017 Tim Kientzle
|
||||
* All rights reserved.
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
|
||||
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE AUTHOR(S) 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.
|
||||
*
|
||||
* $FreeBSD$
|
||||
*/
|
||||
|
||||
#ifndef TEST_COMMON_H
|
||||
#define TEST_COMMON_H
|
||||
|
||||
/*
|
||||
* The goal of this file (and the matching test.c) is to
|
||||
* simplify the very repetitive test-*.c test programs.
|
||||
*/
|
||||
#if defined(HAVE_CONFIG_H)
|
||||
/* Most POSIX platforms use the 'configure' script to build config.h */
|
||||
#include "config.h"
|
||||
#elif defined(__FreeBSD__)
|
||||
/* Building as part of FreeBSD system requires a pre-built config.h. */
|
||||
#include "config_freebsd.h"
|
||||
#elif defined(_WIN32) && !defined(__CYGWIN__)
|
||||
/* Win32 can't run the 'configure' script. */
|
||||
#include "config_windows.h"
|
||||
#else
|
||||
/* Warn if the library hasn't been (automatically or manually) configured. */
|
||||
#error Oops: No config.h and no pre-built configuration in test.h.
|
||||
#endif
|
||||
|
||||
#include <sys/types.h> /* Windows requires this before sys/stat.h */
|
||||
#include <sys/stat.h>
|
||||
|
||||
#if HAVE_DIRENT_H
|
||||
#include <dirent.h>
|
||||
#endif
|
||||
#ifdef HAVE_DIRECT_H
|
||||
#include <direct.h>
|
||||
#define dirent direct
|
||||
#endif
|
||||
#include <errno.h>
|
||||
#include <fcntl.h>
|
||||
#ifdef HAVE_IO_H
|
||||
#include <io.h>
|
||||
#endif
|
||||
#ifdef HAVE_STDINT_H
|
||||
#include <stdint.h>
|
||||
#endif
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <ctype.h>
|
||||
#include <time.h>
|
||||
#ifdef HAVE_UNISTD_H
|
||||
#include <unistd.h>
|
||||
#endif
|
||||
#include <wchar.h>
|
||||
#ifdef HAVE_WINDOWS_H
|
||||
#include <windows.h>
|
||||
#endif
|
||||
|
||||
/*
|
||||
* System-specific tweaks. We really want to minimize these
|
||||
* as much as possible, since they make it harder to understand
|
||||
* the mainline code.
|
||||
*/
|
||||
|
||||
/* Windows (including Visual Studio and MinGW but not Cygwin) */
|
||||
#if defined(_WIN32) && !defined(__CYGWIN__)
|
||||
#if !defined(__BORLANDC__)
|
||||
#undef chdir
|
||||
#define chdir _chdir
|
||||
#define strdup _strdup
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/* Visual Studio */
|
||||
#if defined(_MSC_VER) && _MSC_VER < 1900
|
||||
#define snprintf sprintf_s
|
||||
#endif
|
||||
|
||||
#if defined(__BORLANDC__)
|
||||
#pragma warn -8068 /* Constant out of range in comparison. */
|
||||
#endif
|
||||
|
||||
/* Haiku OS and QNX */
|
||||
#if defined(__HAIKU__) || defined(__QNXNTO__)
|
||||
/* Haiku and QNX have typedefs in stdint.h (needed for int64_t) */
|
||||
#include <stdint.h>
|
||||
#endif
|
||||
|
||||
/* Get a real definition for __FBSDID if we can */
|
||||
#if HAVE_SYS_CDEFS_H
|
||||
#include <sys/cdefs.h>
|
||||
#endif
|
||||
|
||||
/* If not, define it so as to avoid dangling semicolons. */
|
||||
#ifndef __FBSDID
|
||||
#define __FBSDID(a) struct _undefined_hack
|
||||
#endif
|
||||
|
||||
#ifndef O_BINARY
|
||||
#define O_BINARY 0
|
||||
#endif
|
||||
|
||||
/*
|
||||
* If this platform has <sys/acl.h>, acl_create(), acl_init(),
|
||||
* acl_set_file(), and ACL_USER, we assume it has the rest of the
|
||||
* POSIX.1e draft functions used in archive_read_extract.c.
|
||||
*/
|
||||
#if HAVE_SYS_ACL_H && HAVE_ACL_CREATE_ENTRY && HAVE_ACL_INIT && HAVE_ACL_SET_FILE
|
||||
#if HAVE_ACL_USER
|
||||
#define HAVE_POSIX_ACL 1
|
||||
#elif HAVE_ACL_TYPE_EXTENDED
|
||||
#define HAVE_DARWIN_ACL 1
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/*
|
||||
* If this platform has <sys/acl.h>, acl_get(), facl_get(), acl_set(),
|
||||
* facl_set() and types aclent_t and ace_t it uses Solaris-style ACL functions
|
||||
*/
|
||||
#if HAVE_SYS_ACL_H && HAVE_ACL_GET && HAVE_FACL_GET && HAVE_ACL_SET && HAVE_FACL_SET && HAVE_ACLENT_T && HAVE_ACE_T
|
||||
#define HAVE_SUN_ACL 1
|
||||
#endif
|
||||
|
||||
/* Define if platform supports NFSv4 ACLs */
|
||||
#if (HAVE_POSIX_ACL && HAVE_ACL_TYPE_NFS4) || HAVE_SUN_ACL || HAVE_DARWIN_ACL
|
||||
#define HAVE_NFS4_ACL 1
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Redefine DEFINE_TEST for use in defining the test functions.
|
||||
*/
|
||||
#undef DEFINE_TEST
|
||||
#define DEFINE_TEST(name) void name(void); void name(void)
|
||||
|
||||
/* An implementation of the standard assert() macro */
|
||||
#define assert(e) assertion_assert(__FILE__, __LINE__, (e), #e, NULL)
|
||||
/* chdir() and error if it fails */
|
||||
#define assertChdir(path) \
|
||||
assertion_chdir(__FILE__, __LINE__, path)
|
||||
/* Assert two integers are the same. Reports value of each one if not. */
|
||||
#define assertEqualInt(v1,v2) \
|
||||
assertion_equal_int(__FILE__, __LINE__, (v1), #v1, (v2), #v2, NULL)
|
||||
/* Assert two strings are the same. Reports value of each one if not. */
|
||||
#define assertEqualString(v1,v2) \
|
||||
assertion_equal_string(__FILE__, __LINE__, (v1), #v1, (v2), #v2, NULL, 0)
|
||||
#define assertEqualUTF8String(v1,v2) \
|
||||
assertion_equal_string(__FILE__, __LINE__, (v1), #v1, (v2), #v2, NULL, 1)
|
||||
/* As above, but v1 and v2 are wchar_t * */
|
||||
#define assertEqualWString(v1,v2) \
|
||||
assertion_equal_wstring(__FILE__, __LINE__, (v1), #v1, (v2), #v2, NULL)
|
||||
/* As above, but raw blocks of bytes. */
|
||||
#define assertEqualMem(v1, v2, l) \
|
||||
assertion_equal_mem(__FILE__, __LINE__, (v1), #v1, (v2), #v2, (l), #l, NULL)
|
||||
/* Assert that memory is full of a specified byte */
|
||||
#define assertMemoryFilledWith(v1, l, b) \
|
||||
assertion_memory_filled_with(__FILE__, __LINE__, (v1), #v1, (l), #l, (b), #b, NULL)
|
||||
/* Assert two files are the same. */
|
||||
#define assertEqualFile(f1, f2) \
|
||||
assertion_equal_file(__FILE__, __LINE__, (f1), (f2))
|
||||
/* Assert that a file is empty. */
|
||||
#define assertEmptyFile(pathname) \
|
||||
assertion_empty_file(__FILE__, __LINE__, (pathname))
|
||||
/* Assert that a file is not empty. */
|
||||
#define assertNonEmptyFile(pathname) \
|
||||
assertion_non_empty_file(__FILE__, __LINE__, (pathname))
|
||||
#define assertFileAtime(pathname, sec, nsec) \
|
||||
assertion_file_atime(__FILE__, __LINE__, pathname, sec, nsec)
|
||||
#define assertFileAtimeRecent(pathname) \
|
||||
assertion_file_atime_recent(__FILE__, __LINE__, pathname)
|
||||
#define assertFileBirthtime(pathname, sec, nsec) \
|
||||
assertion_file_birthtime(__FILE__, __LINE__, pathname, sec, nsec)
|
||||
#define assertFileBirthtimeRecent(pathname) \
|
||||
assertion_file_birthtime_recent(__FILE__, __LINE__, pathname)
|
||||
/* Assert that a file exists; supports printf-style arguments. */
|
||||
#define assertFileExists(pathname) \
|
||||
assertion_file_exists(__FILE__, __LINE__, pathname)
|
||||
/* Assert that a file exists. */
|
||||
#define assertFileNotExists(pathname) \
|
||||
assertion_file_not_exists(__FILE__, __LINE__, pathname)
|
||||
/* Assert that file contents match a string. */
|
||||
#define assertFileContents(data, data_size, pathname) \
|
||||
assertion_file_contents(__FILE__, __LINE__, data, data_size, pathname)
|
||||
/* Verify that a file does not contain invalid strings */
|
||||
#define assertFileContainsNoInvalidStrings(pathname, strings) \
|
||||
assertion_file_contains_no_invalid_strings(__FILE__, __LINE__, pathname, strings)
|
||||
#define assertFileMtime(pathname, sec, nsec) \
|
||||
assertion_file_mtime(__FILE__, __LINE__, pathname, sec, nsec)
|
||||
#define assertFileMtimeRecent(pathname) \
|
||||
assertion_file_mtime_recent(__FILE__, __LINE__, pathname)
|
||||
#define assertFileNLinks(pathname, nlinks) \
|
||||
assertion_file_nlinks(__FILE__, __LINE__, pathname, nlinks)
|
||||
#define assertFileSize(pathname, size) \
|
||||
assertion_file_size(__FILE__, __LINE__, pathname, size)
|
||||
#define assertFileMode(pathname, mode) \
|
||||
assertion_file_mode(__FILE__, __LINE__, pathname, mode)
|
||||
#define assertTextFileContents(text, pathname) \
|
||||
assertion_text_file_contents(__FILE__, __LINE__, text, pathname)
|
||||
#define assertFileContainsLinesAnyOrder(pathname, lines) \
|
||||
assertion_file_contains_lines_any_order(__FILE__, __LINE__, pathname, lines)
|
||||
#define assertIsDir(pathname, mode) \
|
||||
assertion_is_dir(__FILE__, __LINE__, pathname, mode)
|
||||
#define assertIsHardlink(path1, path2) \
|
||||
assertion_is_hardlink(__FILE__, __LINE__, path1, path2)
|
||||
#define assertIsNotHardlink(path1, path2) \
|
||||
assertion_is_not_hardlink(__FILE__, __LINE__, path1, path2)
|
||||
#define assertIsReg(pathname, mode) \
|
||||
assertion_is_reg(__FILE__, __LINE__, pathname, mode)
|
||||
#define assertIsSymlink(pathname, contents) \
|
||||
assertion_is_symlink(__FILE__, __LINE__, pathname, contents)
|
||||
/* Create a directory, report error if it fails. */
|
||||
#define assertMakeDir(dirname, mode) \
|
||||
assertion_make_dir(__FILE__, __LINE__, dirname, mode)
|
||||
#define assertMakeFile(path, mode, contents) \
|
||||
assertion_make_file(__FILE__, __LINE__, path, mode, -1, contents)
|
||||
#define assertMakeBinFile(path, mode, csize, contents) \
|
||||
assertion_make_file(__FILE__, __LINE__, path, mode, csize, contents)
|
||||
#define assertMakeHardlink(newfile, oldfile) \
|
||||
assertion_make_hardlink(__FILE__, __LINE__, newfile, oldfile)
|
||||
#define assertMakeSymlink(newfile, linkto) \
|
||||
assertion_make_symlink(__FILE__, __LINE__, newfile, linkto)
|
||||
#define assertNodump(path) \
|
||||
assertion_nodump(__FILE__, __LINE__, path)
|
||||
#define assertUmask(mask) \
|
||||
assertion_umask(__FILE__, __LINE__, mask)
|
||||
#define assertUtimes(pathname, atime, atime_nsec, mtime, mtime_nsec) \
|
||||
assertion_utimes(__FILE__, __LINE__, pathname, atime, atime_nsec, mtime, mtime_nsec)
|
||||
#ifndef PROGRAM
|
||||
#define assertEntrySetAcls(entry, acls, count) \
|
||||
assertion_entry_set_acls(__FILE__, __LINE__, entry, acls, count)
|
||||
#define assertEntryCompareAcls(entry, acls, count, type, mode) \
|
||||
assertion_entry_compare_acls(__FILE__, __LINE__, entry, acls, count, type, mode)
|
||||
#endif
|
||||
|
||||
/*
|
||||
* This would be simple with C99 variadic macros, but I don't want to
|
||||
* require that. Instead, I insert a function call before each
|
||||
* skipping() call to pass the file and line information down. Crude,
|
||||
* but effective.
|
||||
*/
|
||||
#define skipping \
|
||||
skipping_setup(__FILE__, __LINE__);test_skipping
|
||||
|
||||
/* Function declarations. These are defined in test_utility.c. */
|
||||
void failure(const char *fmt, ...);
|
||||
int assertion_assert(const char *, int, int, const char *, void *);
|
||||
int assertion_chdir(const char *, int, const char *);
|
||||
int assertion_empty_file(const char *, int, const char *);
|
||||
int assertion_equal_file(const char *, int, const char *, const char *);
|
||||
int assertion_equal_int(const char *, int, long long, const char *, long long, const char *, void *);
|
||||
int assertion_equal_mem(const char *, int, const void *, const char *, const void *, const char *, size_t, const char *, void *);
|
||||
int assertion_memory_filled_with(const char *, int, const void *, const char *, size_t, const char *, char, const char *, void *);
|
||||
int assertion_equal_string(const char *, int, const char *v1, const char *, const char *v2, const char *, void *, int);
|
||||
int assertion_equal_wstring(const char *, int, const wchar_t *v1, const char *, const wchar_t *v2, const char *, void *);
|
||||
int assertion_file_atime(const char *, int, const char *, long, long);
|
||||
int assertion_file_atime_recent(const char *, int, const char *);
|
||||
int assertion_file_birthtime(const char *, int, const char *, long, long);
|
||||
int assertion_file_birthtime_recent(const char *, int, const char *);
|
||||
int assertion_file_contains_lines_any_order(const char *, int, const char *, const char **);
|
||||
int assertion_file_contains_no_invalid_strings(const char *, int, const char *, const char **);
|
||||
int assertion_file_contents(const char *, int, const void *, int, const char *);
|
||||
int assertion_file_exists(const char *, int, const char *);
|
||||
int assertion_file_mode(const char *, int, const char *, int);
|
||||
int assertion_file_mtime(const char *, int, const char *, long, long);
|
||||
int assertion_file_mtime_recent(const char *, int, const char *);
|
||||
int assertion_file_nlinks(const char *, int, const char *, int);
|
||||
int assertion_file_not_exists(const char *, int, const char *);
|
||||
int assertion_file_size(const char *, int, const char *, long);
|
||||
int assertion_is_dir(const char *, int, const char *, int);
|
||||
int assertion_is_hardlink(const char *, int, const char *, const char *);
|
||||
int assertion_is_not_hardlink(const char *, int, const char *, const char *);
|
||||
int assertion_is_reg(const char *, int, const char *, int);
|
||||
int assertion_is_symlink(const char *, int, const char *, const char *);
|
||||
int assertion_make_dir(const char *, int, const char *, int);
|
||||
int assertion_make_file(const char *, int, const char *, int, int, const void *);
|
||||
int assertion_make_hardlink(const char *, int, const char *newpath, const char *);
|
||||
int assertion_make_symlink(const char *, int, const char *newpath, const char *);
|
||||
int assertion_nodump(const char *, int, const char *);
|
||||
int assertion_non_empty_file(const char *, int, const char *);
|
||||
int assertion_text_file_contents(const char *, int, const char *buff, const char *f);
|
||||
int assertion_umask(const char *, int, int);
|
||||
int assertion_utimes(const char *, int, const char *, long, long, long, long );
|
||||
int assertion_version(const char*, int, const char *, const char *);
|
||||
|
||||
void skipping_setup(const char *, int);
|
||||
void test_skipping(const char *fmt, ...);
|
||||
|
||||
/* Like sprintf, then system() */
|
||||
int systemf(const char * fmt, ...);
|
||||
|
||||
/* Delay until time() returns a value after this. */
|
||||
void sleepUntilAfter(time_t);
|
||||
|
||||
/* Return true if this platform can create symlinks. */
|
||||
int canSymlink(void);
|
||||
|
||||
/* Return true if this platform can run the "bzip2" program. */
|
||||
int canBzip2(void);
|
||||
|
||||
/* Return true if this platform can run the "grzip" program. */
|
||||
int canGrzip(void);
|
||||
|
||||
/* Return true if this platform can run the "gzip" program. */
|
||||
int canGzip(void);
|
||||
|
||||
/* Return true if this platform can run the specified command. */
|
||||
int canRunCommand(const char *);
|
||||
|
||||
/* Return true if this platform can run the "lrzip" program. */
|
||||
int canLrzip(void);
|
||||
|
||||
/* Return true if this platform can run the "lz4" program. */
|
||||
int canLz4(void);
|
||||
|
||||
/* Return true if this platform can run the "lzip" program. */
|
||||
int canLzip(void);
|
||||
|
||||
/* Return true if this platform can run the "lzma" program. */
|
||||
int canLzma(void);
|
||||
|
||||
/* Return true if this platform can run the "lzop" program. */
|
||||
int canLzop(void);
|
||||
|
||||
/* Return true if this platform can run the "xz" program. */
|
||||
int canXz(void);
|
||||
|
||||
/* Return true if this filesystem can handle nodump flags. */
|
||||
int canNodump(void);
|
||||
|
||||
/* Return true if the file has large i-node number(>0xffffffff). */
|
||||
int is_LargeInode(const char *);
|
||||
|
||||
/* Suck file into string allocated via malloc(). Call free() when done. */
|
||||
/* Supports printf-style args: slurpfile(NULL, "%s/myfile", refdir); */
|
||||
char *slurpfile(size_t *, const char *fmt, ...);
|
||||
|
||||
/* Dump block of bytes to a file. */
|
||||
void dumpfile(const char *filename, void *, size_t);
|
||||
|
||||
/* Extracts named reference file to the current directory. */
|
||||
void extract_reference_file(const char *);
|
||||
/* Copies named reference file to the current directory. */
|
||||
void copy_reference_file(const char *);
|
||||
|
||||
/* Extracts a list of files to the current directory.
|
||||
* List must be NULL terminated.
|
||||
*/
|
||||
void extract_reference_files(const char **);
|
||||
|
||||
/* Subtract umask from mode */
|
||||
mode_t umasked(mode_t expected_mode);
|
||||
|
||||
/* Path to working directory for current test */
|
||||
extern const char *testworkdir;
|
||||
|
||||
#ifndef PROGRAM
|
||||
/*
|
||||
* Special interfaces for libarchive test harness.
|
||||
*/
|
||||
|
||||
#include "archive.h"
|
||||
#include "archive_entry.h"
|
||||
|
||||
/* ACL structure */
|
||||
struct archive_test_acl_t {
|
||||
int type; /* Type of ACL */
|
||||
int permset; /* Permissions for this class of users. */
|
||||
int tag; /* Owner, User, Owning group, group, other, etc. */
|
||||
int qual; /* GID or UID of user/group, depending on tag. */
|
||||
const char *name; /* Name of user/group, depending on tag. */
|
||||
};
|
||||
|
||||
/* Set ACLs */
|
||||
int assertion_entry_set_acls(const char *, int, struct archive_entry *,
|
||||
struct archive_test_acl_t *, int);
|
||||
|
||||
/* Compare ACLs */
|
||||
int assertion_entry_compare_acls(const char *, int, struct archive_entry *,
|
||||
struct archive_test_acl_t *, int, int, int);
|
||||
|
||||
/* Special customized read-from-memory interface. */
|
||||
int read_open_memory(struct archive *, const void *, size_t, size_t);
|
||||
/* _minimal version exercises a slightly different set of libarchive APIs. */
|
||||
int read_open_memory_minimal(struct archive *, const void *, size_t, size_t);
|
||||
/* _seek version produces a seekable file. */
|
||||
int read_open_memory_seek(struct archive *, const void *, size_t, size_t);
|
||||
|
||||
/* Versions of above that accept an archive argument for additional info. */
|
||||
#define assertA(e) assertion_assert(__FILE__, __LINE__, (e), #e, (a))
|
||||
#define assertEqualIntA(a,v1,v2) \
|
||||
assertion_equal_int(__FILE__, __LINE__, (v1), #v1, (v2), #v2, (a))
|
||||
#define assertEqualStringA(a,v1,v2) \
|
||||
assertion_equal_string(__FILE__, __LINE__, (v1), #v1, (v2), #v2, (a), 0)
|
||||
|
||||
#else /* defined(PROGRAM) */
|
||||
/*
|
||||
* Special interfaces for program test harness.
|
||||
*/
|
||||
|
||||
/* Pathname of exe to be tested. */
|
||||
extern const char *testprogfile;
|
||||
/* Name of exe to use in printf-formatted command strings. */
|
||||
/* On Windows, this includes leading/trailing quotes. */
|
||||
extern const char *testprog;
|
||||
|
||||
void assertVersion(const char *prog, const char *base);
|
||||
|
||||
#endif /* defined(PROGRAM) */
|
||||
|
||||
#ifdef USE_DMALLOC
|
||||
#include <dmalloc.h>
|
||||
#endif
|
||||
|
||||
#endif /* TEST_COMMON_H */
|
@ -45,6 +45,9 @@
|
||||
#if defined(HAVE_EXT2FS_EXT2_FS_H) && !defined(__CYGWIN__)
|
||||
#include <ext2fs/ext2_fs.h> /* Linux file flags, broken on Cygwin */
|
||||
#endif
|
||||
#ifdef HAVE_LINUX_FS_H
|
||||
#include <linux/fs.h>
|
||||
#endif
|
||||
#include <limits.h>
|
||||
#include <locale.h>
|
||||
#ifdef HAVE_SIGNAL_H
|
||||
@ -53,22 +56,6 @@
|
||||
#include <stdarg.h>
|
||||
#include <time.h>
|
||||
|
||||
/*
|
||||
* This same file is used pretty much verbatim for all test harnesses.
|
||||
*
|
||||
* The next few lines are the only differences.
|
||||
* TODO: Move this into a separate configuration header, have all test
|
||||
* suites share one copy of this file.
|
||||
*/
|
||||
__FBSDID("$FreeBSD: head/lib/libarchive/test/main.c 201247 2009-12-30 05:59:21Z kientzle $");
|
||||
#define KNOWNREF "test_compat_gtar_1.tar.uu"
|
||||
#define ENVBASE "LIBARCHIVE" /* Prefix for environment variables. */
|
||||
#undef PROGRAM /* Testing a library, not a program. */
|
||||
#define LIBRARY "libarchive"
|
||||
#define EXTRA_DUMP(x) archive_error_string((struct archive *)(x))
|
||||
#define EXTRA_ERRNO(x) archive_errno((struct archive *)(x))
|
||||
#define EXTRA_VERSION archive_version_details()
|
||||
|
||||
/*
|
||||
*
|
||||
* Windows support routines
|
||||
@ -1910,8 +1897,10 @@ assertion_nodump(const char *file, int line, const char *pathname)
|
||||
failure_finish(NULL);
|
||||
return (0);
|
||||
}
|
||||
#elif defined(EXT2_IOC_GETFLAGS) && defined(HAVE_WORKING_EXT2_IOC_GETFLAGS)\
|
||||
&& defined(EXT2_NODUMP_FL)
|
||||
#elif (defined(FS_IOC_GETFLAGS) && defined(HAVE_WORKING_FS_IOC_GETFLAGS) && \
|
||||
defined(FS_NODUMP_FL)) || \
|
||||
(defined(EXT2_IOC_GETFLAGS) && defined(HAVE_WORKING_EXT2_IOC_GETFLAGS) \
|
||||
&& defined(EXT2_NODUMP_FL))
|
||||
int fd, r, flags;
|
||||
|
||||
assertion_count(file, line);
|
||||
@ -1921,14 +1910,31 @@ assertion_nodump(const char *file, int line, const char *pathname)
|
||||
failure_finish(NULL);
|
||||
return (0);
|
||||
}
|
||||
r = ioctl(fd, EXT2_IOC_GETFLAGS, &flags);
|
||||
r = ioctl(fd,
|
||||
#ifdef FS_IOC_GETFLAGS
|
||||
FS_IOC_GETFLAGS,
|
||||
#else
|
||||
EXT2_IOC_GETFLAGS,
|
||||
#endif
|
||||
&flags);
|
||||
if (r < 0) {
|
||||
failure_start(file, line, "Can't get flags %s\n", pathname);
|
||||
failure_finish(NULL);
|
||||
return (0);
|
||||
}
|
||||
#ifdef FS_NODUMP_FL
|
||||
flags |= FS_NODUMP_FL;
|
||||
#else
|
||||
flags |= EXT2_NODUMP_FL;
|
||||
r = ioctl(fd, EXT2_IOC_SETFLAGS, &flags);
|
||||
#endif
|
||||
|
||||
r = ioctl(fd,
|
||||
#ifdef FS_IOC_SETFLAGS
|
||||
FS_IOC_SETFLAGS,
|
||||
#else
|
||||
EXT2_IOC_SETFLAGS,
|
||||
#endif
|
||||
&flags);
|
||||
if (r < 0) {
|
||||
failure_start(file, line, "Can't set nodump %s\n", pathname);
|
||||
failure_finish(NULL);
|
||||
@ -1942,6 +1948,117 @@ assertion_nodump(const char *file, int line, const char *pathname)
|
||||
return (1);
|
||||
}
|
||||
|
||||
#ifdef PROGRAM
|
||||
static void assert_version_id(char **qq, size_t *ss)
|
||||
{
|
||||
char *q = *qq;
|
||||
size_t s = *ss;
|
||||
|
||||
/* Version number is a series of digits and periods. */
|
||||
while (s > 0 && (*q == '.' || (*q >= '0' && *q <= '9'))) {
|
||||
++q;
|
||||
--s;
|
||||
}
|
||||
|
||||
if (q[0] == 'd' && q[1] == 'e' && q[2] == 'v') {
|
||||
q += 3;
|
||||
s -= 3;
|
||||
}
|
||||
|
||||
/* Skip a single trailing a,b,c, or d. */
|
||||
if (*q == 'a' || *q == 'b' || *q == 'c' || *q == 'd')
|
||||
++q;
|
||||
|
||||
/* Version number terminated by space. */
|
||||
failure("No space after version: ``%s''", q);
|
||||
assert(s > 1);
|
||||
failure("No space after version: ``%s''", q);
|
||||
assert(*q == ' ');
|
||||
|
||||
++q; --s;
|
||||
|
||||
*qq = q;
|
||||
*ss = s;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Check program version
|
||||
*/
|
||||
void assertVersion(const char *prog, const char *base)
|
||||
{
|
||||
int r;
|
||||
char *p, *q;
|
||||
size_t s;
|
||||
unsigned int prog_len = strlen(base);
|
||||
|
||||
r = systemf("%s --version >version.stdout 2>version.stderr", prog);
|
||||
if (r != 0)
|
||||
r = systemf("%s -W version >version.stdout 2>version.stderr",
|
||||
prog);
|
||||
|
||||
failure("Unable to run either %s --version or %s -W version",
|
||||
prog, prog);
|
||||
if (!assert(r == 0))
|
||||
return;
|
||||
|
||||
/* --version should generate nothing to stdout. */
|
||||
assertEmptyFile("version.stderr");
|
||||
|
||||
/* Verify format of version message. */
|
||||
q = p = slurpfile(&s, "version.stdout");
|
||||
|
||||
/* Version message should start with name of program, then space. */
|
||||
assert(s > prog_len + 1);
|
||||
|
||||
failure("Version must start with '%s': ``%s''", base, p);
|
||||
if (!assertEqualMem(q, base, prog_len)) {
|
||||
free(p);
|
||||
return;
|
||||
}
|
||||
|
||||
q += prog_len; s -= prog_len;
|
||||
|
||||
assert(*q == ' ');
|
||||
q++; s--;
|
||||
|
||||
assert_version_id(&q, &s);
|
||||
|
||||
/* Separator. */
|
||||
failure("No `-' between program name and versions: ``%s''", p);
|
||||
assertEqualMem(q, "- ", 2);
|
||||
q += 2; s -= 2;
|
||||
|
||||
failure("Not long enough for libarchive version: ``%s''", p);
|
||||
assert(s > 11);
|
||||
|
||||
failure("Libarchive version must start with `libarchive': ``%s''", p);
|
||||
assertEqualMem(q, "libarchive ", 11);
|
||||
|
||||
q += 11; s -= 11;
|
||||
|
||||
assert_version_id(&q, &s);
|
||||
|
||||
/* Skip arbitrary third-party version numbers. */
|
||||
while (s > 0 && (*q == ' ' || *q == '-' || *q == '/' || *q == '.' ||
|
||||
isalnum(*q))) {
|
||||
++q;
|
||||
--s;
|
||||
}
|
||||
|
||||
/* All terminated by end-of-line. */
|
||||
assert(s >= 1);
|
||||
|
||||
/* Skip an optional CR character (e.g., Windows) */
|
||||
failure("Version output must end with \\n or \\r\\n");
|
||||
|
||||
if (*q == '\r') { ++q; --s; }
|
||||
assertEqualMem(q, "\n", 1);
|
||||
|
||||
free(p);
|
||||
}
|
||||
#endif /* PROGRAM */
|
||||
|
||||
/*
|
||||
*
|
||||
* UTILITIES for use by tests.
|
||||
@ -2157,9 +2274,10 @@ canNodump(void)
|
||||
return (0);
|
||||
}
|
||||
|
||||
#elif defined(EXT2_IOC_GETFLAGS) && defined(HAVE_WORKING_EXT2_IOC_GETFLAGS)\
|
||||
&& defined(EXT2_NODUMP_FL)
|
||||
|
||||
#elif (defined(FS_IOC_GETFLAGS) && defined(HAVE_WORKING_FS_IOC_GETFLAGS) \
|
||||
&& defined(FS_NODUMP_FL)) || \
|
||||
(defined(EXT2_IOC_GETFLAGS) && defined(HAVE_WORKING_EXT2_IOC_GETFLAGS) \
|
||||
&& defined(EXT2_NODUMP_FL))
|
||||
int
|
||||
canNodump(void)
|
||||
{
|
||||
@ -2170,22 +2288,48 @@ canNodump(void)
|
||||
fd = open(path, O_RDONLY | O_NONBLOCK);
|
||||
if (fd < 0)
|
||||
return (0);
|
||||
r = ioctl(fd, EXT2_IOC_GETFLAGS, &flags);
|
||||
r = ioctl(fd,
|
||||
#ifdef FS_IOC_GETFLAGS
|
||||
FS_IOC_GETFLAGS,
|
||||
#else
|
||||
EXT2_IOC_GETFLAGS,
|
||||
#endif
|
||||
&flags);
|
||||
if (r < 0)
|
||||
return (0);
|
||||
#ifdef FS_NODUMP_FL
|
||||
flags |= FS_NODUMP_FL;
|
||||
#else
|
||||
flags |= EXT2_NODUMP_FL;
|
||||
r = ioctl(fd, EXT2_IOC_SETFLAGS, &flags);
|
||||
#endif
|
||||
r = ioctl(fd,
|
||||
#ifdef FS_IOC_SETFLAGS
|
||||
FS_IOC_SETFLAGS,
|
||||
#else
|
||||
EXT2_IOC_SETFLAGS,
|
||||
#endif
|
||||
&flags);
|
||||
if (r < 0)
|
||||
return (0);
|
||||
close(fd);
|
||||
fd = open(path, O_RDONLY | O_NONBLOCK);
|
||||
if (fd < 0)
|
||||
return (0);
|
||||
r = ioctl(fd, EXT2_IOC_GETFLAGS, &flags);
|
||||
r = ioctl(fd,
|
||||
#ifdef FS_IOC_GETFLAGS
|
||||
FS_IOC_GETFLAGS,
|
||||
#else
|
||||
EXT2_IOC_GETFLAGS,
|
||||
#endif
|
||||
&flags);
|
||||
if (r < 0)
|
||||
return (0);
|
||||
close(fd);
|
||||
#ifdef FS_NODUMP_FL
|
||||
if (flags & FS_NODUMP_FL)
|
||||
#else
|
||||
if (flags & EXT2_NODUMP_FL)
|
||||
#endif
|
||||
return (1);
|
||||
return (0);
|
||||
}
|
||||
@ -2429,23 +2573,33 @@ extract_reference_files(const char **names)
|
||||
extract_reference_file(*names++);
|
||||
}
|
||||
|
||||
#ifndef PROGRAM
|
||||
/* Set ACLs */
|
||||
void
|
||||
archive_test_set_acls(struct archive_entry *ae,
|
||||
int
|
||||
assertion_entry_set_acls(const char *file, int line, struct archive_entry *ae,
|
||||
struct archive_test_acl_t *acls, int n)
|
||||
{
|
||||
int i;
|
||||
int i, r, ret;
|
||||
|
||||
assertion_count(file, line);
|
||||
|
||||
ret = 0;
|
||||
archive_entry_acl_clear(ae);
|
||||
for (i = 0; i < n; i++) {
|
||||
failure("type=%#010x, permset=%#010x, tag=%d, qual=%d name=%s",
|
||||
r = archive_entry_acl_add_entry(ae,
|
||||
acls[i].type, acls[i].permset, acls[i].tag,
|
||||
acls[i].qual, acls[i].name);
|
||||
assertEqualInt(ARCHIVE_OK,
|
||||
archive_entry_acl_add_entry(ae,
|
||||
acls[i].type, acls[i].permset, acls[i].tag,
|
||||
acls[i].qual, acls[i].name));
|
||||
if (r != 0) {
|
||||
ret = 1;
|
||||
failure_start(file, line, "type=%#010x, ",
|
||||
"permset=%#010x, tag=%d, qual=%d name=%s",
|
||||
acls[i].type, acls[i].permset, acls[i].tag,
|
||||
acls[i].qual, acls[i].name);
|
||||
failure_finish(NULL);
|
||||
}
|
||||
}
|
||||
|
||||
return (ret);
|
||||
}
|
||||
|
||||
static int
|
||||
@ -2482,16 +2636,20 @@ archive_test_acl_match(struct archive_test_acl_t *acl, int type, int permset,
|
||||
}
|
||||
|
||||
/* Compare ACLs */
|
||||
void
|
||||
archive_test_compare_acls(struct archive_entry *ae,
|
||||
struct archive_test_acl_t *acls, int cnt, int want_type, int mode)
|
||||
int
|
||||
assertion_entry_compare_acls(const char *file, int line,
|
||||
struct archive_entry *ae, struct archive_test_acl_t *acls, int cnt,
|
||||
int want_type, int mode)
|
||||
{
|
||||
int *marker;
|
||||
int i, r, n;
|
||||
int i, r, n, ret;
|
||||
int type, permset, tag, qual;
|
||||
int matched;
|
||||
const char *name;
|
||||
|
||||
assertion_count(file, line);
|
||||
|
||||
ret = 0;
|
||||
n = 0;
|
||||
marker = malloc(sizeof(marker[0]) * cnt);
|
||||
|
||||
@ -2502,10 +2660,11 @@ archive_test_compare_acls(struct archive_entry *ae,
|
||||
}
|
||||
}
|
||||
|
||||
failure("No ACL's to compare, type mask: %d", want_type);
|
||||
assert(n > 0);
|
||||
if (n == 0)
|
||||
return;
|
||||
if (n == 0) {
|
||||
failure_start(file, line, "No ACL's to compare, type mask: %d",
|
||||
want_type);
|
||||
return (1);
|
||||
}
|
||||
|
||||
while (0 == (r = archive_entry_acl_next(ae, want_type,
|
||||
&type, &permset, &tag, &qual, &name))) {
|
||||
@ -2520,40 +2679,83 @@ archive_test_compare_acls(struct archive_entry *ae,
|
||||
}
|
||||
if (type == ARCHIVE_ENTRY_ACL_TYPE_ACCESS
|
||||
&& tag == ARCHIVE_ENTRY_ACL_USER_OBJ) {
|
||||
if (!matched) printf("No match for user_obj perm\n");
|
||||
failure("USER_OBJ permset (%02o) != user mode (%02o)",
|
||||
permset, 07 & (mode >> 6));
|
||||
assert((permset << 6) == (mode & 0700));
|
||||
if (!matched) {
|
||||
failure_start(file, line, "No match for "
|
||||
"user_obj perm");
|
||||
failure_finish(NULL);
|
||||
ret = 1;
|
||||
}
|
||||
if ((permset << 6) != (mode & 0700)) {
|
||||
failure_start(file, line, "USER_OBJ permset "
|
||||
"(%02o) != user mode (%02o)", permset,
|
||||
07 & (mode >> 6));
|
||||
failure_finish(NULL);
|
||||
ret = 1;
|
||||
}
|
||||
} else if (type == ARCHIVE_ENTRY_ACL_TYPE_ACCESS
|
||||
&& tag == ARCHIVE_ENTRY_ACL_GROUP_OBJ) {
|
||||
if (!matched) printf("No match for group_obj perm\n");
|
||||
failure("GROUP_OBJ permset %02o != group mode %02o",
|
||||
permset, 07 & (mode >> 3));
|
||||
assert((permset << 3) == (mode & 0070));
|
||||
if (!matched) {
|
||||
failure_start(file, line, "No match for "
|
||||
"group_obj perm");
|
||||
failure_finish(NULL);
|
||||
ret = 1;
|
||||
}
|
||||
if ((permset << 3) != (mode & 0070)) {
|
||||
failure_start(file, line, "GROUP_OBJ permset "
|
||||
"(%02o) != group mode (%02o)", permset,
|
||||
07 & (mode >> 3));
|
||||
failure_finish(NULL);
|
||||
ret = 1;
|
||||
}
|
||||
} else if (type == ARCHIVE_ENTRY_ACL_TYPE_ACCESS
|
||||
&& tag == ARCHIVE_ENTRY_ACL_OTHER) {
|
||||
if (!matched) printf("No match for other perm\n");
|
||||
failure("OTHER permset (%02o) != other mode (%02o)",
|
||||
permset, mode & 07);
|
||||
assert((permset << 0) == (mode & 0007));
|
||||
} else {
|
||||
failure("Could not find match for ACL "
|
||||
"(type=%#010x,permset=%#010x,tag=%d,qual=%d,"
|
||||
if (!matched) {
|
||||
failure_start(file, line, "No match for "
|
||||
"other perm");
|
||||
failure_finish(NULL);
|
||||
ret = 1;
|
||||
}
|
||||
if ((permset << 0) != (mode & 0007)) {
|
||||
failure_start(file, line, "OTHER permset "
|
||||
"(%02o) != other mode (%02o)", permset,
|
||||
mode & 07);
|
||||
failure_finish(NULL);
|
||||
ret = 1;
|
||||
}
|
||||
} else if (matched != 1) {
|
||||
failure_start(file, line, "Could not find match for "
|
||||
"ACL (type=%#010x,permset=%#010x,tag=%d,qual=%d,"
|
||||
"name=``%s'')", type, permset, tag, qual, name);
|
||||
assert(matched == 1);
|
||||
failure_finish(NULL);
|
||||
ret = 1;
|
||||
}
|
||||
}
|
||||
assertEqualInt(ARCHIVE_EOF, r);
|
||||
if ((want_type & ARCHIVE_ENTRY_ACL_TYPE_ACCESS) != 0)
|
||||
assert((mode_t)(mode & 0777) == (archive_entry_mode(ae)
|
||||
& 0777));
|
||||
failure("Could not find match for ACL "
|
||||
"(type=%#010x,permset=%#010x,tag=%d,qual=%d,name=``%s'')",
|
||||
acls[marker[0]].type, acls[marker[0]].permset,
|
||||
acls[marker[0]].tag, acls[marker[0]].qual, acls[marker[0]].name);
|
||||
assert(n == 0); /* Number of ACLs not matched should == 0 */
|
||||
if (r != ARCHIVE_EOF) {
|
||||
failure_start(file, line, "Should not exit before EOF");
|
||||
failure_finish(NULL);
|
||||
ret = 1;
|
||||
}
|
||||
if ((want_type & ARCHIVE_ENTRY_ACL_TYPE_ACCESS) != 0 &&
|
||||
(mode_t)(mode & 0777) != (archive_entry_mode(ae) & 0777)) {
|
||||
failure_start(file, line, "Mode (%02o) and entry mode (%02o) "
|
||||
"mismatch", mode, archive_entry_mode(ae));
|
||||
failure_finish(NULL);
|
||||
ret = 1;
|
||||
}
|
||||
if (n != 0) {
|
||||
failure_start(file, line, "Could not find match for ACL "
|
||||
"(type=%#010x,permset=%#010x,tag=%d,qual=%d,name=``%s'')",
|
||||
acls[marker[0]].type, acls[marker[0]].permset,
|
||||
acls[marker[0]].tag, acls[marker[0]].qual,
|
||||
acls[marker[0]].name);
|
||||
failure_finish(NULL);
|
||||
ret = 1;
|
||||
/* Number of ACLs not matched should == 0 */
|
||||
}
|
||||
free(marker);
|
||||
return (ret);
|
||||
}
|
||||
#endif /* !defined(PROGRAM) */
|
||||
|
||||
/*
|
||||
*
|
Loading…
x
Reference in New Issue
Block a user