2adbd7ee43
write a new test to exercise the hardlink strategies used by different archive formats (tar, old cpio, new cpio). This uncovered two problems, both fixed by this commit: 1) Enforce file size when writing files to disk. 2) When restoring hardlink entries, if they have data associated, go ahead and open the file so we can write the data. In particular, this fixes bsdtar/bsdcpio extraction of new cpio formats where the "original" is empty and the subsequent "hardlink" entry actually carries the data. It also provides correct behavior for old cpio archives where hardlinked entries have their bodies stored multiple times in the archive; the last body should always be the one that ends up in the final file. The new pax format also permits (but does not require) hardlinks to carry file data; again, the last contents should always win. Note that with any of these, a size of zero on a hardlink simply means that the hardlink carries no data; it does not mean that the file has zero size. A non-zero size on a hardlink does provide the file size. Thanks to: John Baldwin, for reminding me about this long-standing bug and sending me a simple example archive that prompted this test case
131 lines
3.5 KiB
Makefile
131 lines
3.5 KiB
Makefile
# $FreeBSD$
|
|
|
|
# Where to find the libarchive sources
|
|
LA_SRCDIR=${.CURDIR}/..
|
|
.PATH: ${LA_SRCDIR}
|
|
|
|
# Get a list of all libarchive source files
|
|
LA_SRCS!=make -f ${LA_SRCDIR}/Makefile -V SRCS
|
|
|
|
TESTFILES= \
|
|
test_compat_gtar_1.tgz \
|
|
test_compat_zip_1.zip \
|
|
test_read_format_gtar_sparse_1_13.tgz \
|
|
test_read_format_gtar_sparse_1_17.tgz \
|
|
test_read_format_gtar_sparse_1_17_posix00.tgz \
|
|
test_read_format_gtar_sparse_1_17_posix01.tgz \
|
|
test_read_format_gtar_sparse_1_17_posix10.tgz \
|
|
test_read_format_gtar_sparse_1_17_posix10_modified.tar
|
|
|
|
TESTS= \
|
|
test_acl_basic.c \
|
|
test_acl_pax.c \
|
|
test_archive_api_feature.c \
|
|
test_bad_fd.c \
|
|
test_compat_gtar.c \
|
|
test_compat_zip.c \
|
|
test_empty_write.c \
|
|
test_entry.c \
|
|
test_entry_strmode.c \
|
|
test_read_compress_program.c \
|
|
test_read_data_large.c \
|
|
test_read_extract.c \
|
|
test_read_format_ar.c \
|
|
test_read_format_cpio_bin.c \
|
|
test_read_format_cpio_bin_Z.c \
|
|
test_read_format_cpio_bin_bz2.c \
|
|
test_read_format_cpio_bin_gz.c \
|
|
test_read_format_cpio_odc.c \
|
|
test_read_format_cpio_svr4_gzip.c \
|
|
test_read_format_cpio_svr4c_Z.c \
|
|
test_read_format_empty.c \
|
|
test_read_format_gtar_gz.c \
|
|
test_read_format_gtar_sparse.c \
|
|
test_read_format_iso_gz.c \
|
|
test_read_format_isorr_bz2.c \
|
|
test_read_format_mtree.c \
|
|
test_read_format_pax_bz2.c \
|
|
test_read_format_tar.c \
|
|
test_read_format_tbz.c \
|
|
test_read_format_tgz.c \
|
|
test_read_format_tz.c \
|
|
test_read_format_zip.c \
|
|
test_read_large.c \
|
|
test_read_pax_truncated.c \
|
|
test_read_position.c \
|
|
test_read_truncated.c \
|
|
test_tar_filenames.c \
|
|
test_tar_large.c \
|
|
test_write_compress_program.c \
|
|
test_write_disk.c \
|
|
test_write_disk_hardlink.c \
|
|
test_write_disk_perms.c \
|
|
test_write_disk_secure.c \
|
|
test_write_format_ar.c \
|
|
test_write_format_cpio.c \
|
|
test_write_format_cpio_odc.c \
|
|
test_write_format_cpio_newc.c \
|
|
test_write_format_cpio_empty.c \
|
|
test_write_format_shar_empty.c \
|
|
test_write_format_tar.c \
|
|
test_write_format_tar_empty.c \
|
|
test_write_open_memory.c
|
|
|
|
|
|
# Build the test program using all libarchive sources + the test sources.
|
|
SRCS= ${LA_SRCS} \
|
|
${TESTS} \
|
|
list.h \
|
|
main.c \
|
|
read_open_memory.c
|
|
|
|
CLEANFILES+= list.h archive.h
|
|
|
|
NO_MAN=yes
|
|
|
|
PROG=libarchive_test
|
|
INTERNALPROG=yes # Don't install this; it's just for testing
|
|
DPADD=${LIBBZ2} ${LIBZ}
|
|
CFLAGS+= -DPLATFORM_CONFIG_H=\"config_freebsd.h\"
|
|
LDADD= -lz -lbz2
|
|
CFLAGS+= -static -g
|
|
CFLAGS+= -I${.OBJDIR}
|
|
CFLAGS+= -I${.CURDIR}
|
|
CFLAGS+= -I${LA_SRCDIR}
|
|
# Without this, libarchive source files find archive.h in LA_SRCDIR,
|
|
# which may not be the same as archive.h in the test dir.
|
|
CFLAGS+= -I-
|
|
|
|
# Uncomment to link against dmalloc
|
|
LDADD+= -L/usr/local/lib -ldmalloc
|
|
CFLAGS+= -I/usr/local/include -DUSE_DMALLOC
|
|
WARNS=6
|
|
|
|
# Build libarchive_test and run it.
|
|
check test: libarchive_test ${TESTFILES}
|
|
./libarchive_test
|
|
|
|
.for f in ${TESTFILES}
|
|
${f}: ${f}.uu
|
|
uudecode -p ${.CURDIR}/${f}.uu >${f}
|
|
.endfor
|
|
|
|
INCS=archive.h list.h
|
|
|
|
# Build archive.h, but in our .OBJDIR, not libarchive's
|
|
# This keeps libarchive_test and libarchive builds completely separate.
|
|
archive.h: ${LA_SRCDIR}/archive.h.in ${LA_SRCDIR}/Makefile
|
|
cd ${LA_SRCDIR} && unset MAKEOBJDIRPREFIX && MAKEOBJDIR=${.OBJDIR} make archive.h
|
|
|
|
# list.h is just a list of all tests, as indicated by DEFINE_TEST macro lines
|
|
list.h: ${TESTS} Makefile
|
|
(cd ${.CURDIR}; cat ${TESTS}) | grep DEFINE_TEST > list.h
|
|
|
|
CLEANFILES += *.out *.o *.core *~ list.h archive.h ${TESTFILES}
|
|
|
|
cleantest:
|
|
-chmod -R +w /tmp/libarchive_test.*
|
|
rm -rf /tmp/libarchive_test.*
|
|
|
|
.include <bsd.prog.mk>
|