summaryrefslogtreecommitdiffstats
path: root/usr.bin/cpio
diff options
context:
space:
mode:
authormm <mm@FreeBSD.org>2011-12-22 08:42:07 +0000
committermm <mm@FreeBSD.org>2011-12-22 08:42:07 +0000
commit2942879b6ed0f413f59c085747271ea20b06e8f1 (patch)
tree45fc0471cfcb1121eec518837ba50f8c9e108dbe /usr.bin/cpio
parente043036a251d22e3cb85c0db5bd28c8ee58cbd24 (diff)
downloadFreeBSD-src-2942879b6ed0f413f59c085747271ea20b06e8f1.zip
FreeBSD-src-2942879b6ed0f413f59c085747271ea20b06e8f1.tar.gz
Use contrib sources for building libarchive, tar and cpio.
Make "make test" fully operational. MFC after: 2 weeks
Diffstat (limited to 'usr.bin/cpio')
-rw-r--r--usr.bin/cpio/Makefile16
-rw-r--r--usr.bin/cpio/bsdcpio.1405
-rw-r--r--usr.bin/cpio/cmdline.c371
-rw-r--r--usr.bin/cpio/cpio.c1277
-rw-r--r--usr.bin/cpio/cpio.h111
-rw-r--r--usr.bin/cpio/cpio_platform.h77
-rw-r--r--usr.bin/cpio/test/Makefile23
-rw-r--r--usr.bin/cpio/test/main.c2140
-rw-r--r--usr.bin/cpio/test/test.h285
-rw-r--r--usr.bin/cpio/test/test_0.c67
-rw-r--r--usr.bin/cpio/test/test_basic.c173
-rw-r--r--usr.bin/cpio/test/test_cmdline.c107
-rw-r--r--usr.bin/cpio/test/test_format_newc.c294
-rw-r--r--usr.bin/cpio/test/test_gcpio_compat.c108
-rw-r--r--usr.bin/cpio/test/test_gcpio_compat_ref.bin.uu16
-rw-r--r--usr.bin/cpio/test/test_gcpio_compat_ref.crc.uu27
-rw-r--r--usr.bin/cpio/test/test_gcpio_compat_ref.newc.uu27
-rw-r--r--usr.bin/cpio/test/test_gcpio_compat_ref.ustar.uu84
-rw-r--r--usr.bin/cpio/test/test_gcpio_compat_ref_nosym.bin.uu17
-rw-r--r--usr.bin/cpio/test/test_gcpio_compat_ref_nosym.crc.uu17
-rw-r--r--usr.bin/cpio/test/test_gcpio_compat_ref_nosym.newc.uu17
-rw-r--r--usr.bin/cpio/test/test_gcpio_compat_ref_nosym.ustar.uu74
-rw-r--r--usr.bin/cpio/test/test_option_B_upper.c52
-rw-r--r--usr.bin/cpio/test/test_option_C_upper.c62
-rw-r--r--usr.bin/cpio/test/test_option_J_upper.c56
-rw-r--r--usr.bin/cpio/test/test_option_L_upper.c101
-rw-r--r--usr.bin/cpio/test/test_option_Z_upper.c56
-rw-r--r--usr.bin/cpio/test/test_option_a.c154
-rw-r--r--usr.bin/cpio/test/test_option_c.c221
-rw-r--r--usr.bin/cpio/test/test_option_d.c64
-rw-r--r--usr.bin/cpio/test/test_option_f.c76
-rw-r--r--usr.bin/cpio/test/test_option_f.cpio.uu16
-rw-r--r--usr.bin/cpio/test/test_option_help.c84
-rw-r--r--usr.bin/cpio/test/test_option_l.c50
-rw-r--r--usr.bin/cpio/test/test_option_lzma.c56
-rw-r--r--usr.bin/cpio/test/test_option_m.c63
-rw-r--r--usr.bin/cpio/test/test_option_m.cpio.uu16
-rw-r--r--usr.bin/cpio/test/test_option_t.c95
-rw-r--r--usr.bin/cpio/test/test_option_t.cpio.uu16
-rw-r--r--usr.bin/cpio/test/test_option_t.stdout.uu5
-rw-r--r--usr.bin/cpio/test/test_option_tv.stdout.uu6
-rw-r--r--usr.bin/cpio/test/test_option_u.c81
-rw-r--r--usr.bin/cpio/test/test_option_version.c109
-rw-r--r--usr.bin/cpio/test/test_option_y.c57
-rw-r--r--usr.bin/cpio/test/test_option_z.c56
-rw-r--r--usr.bin/cpio/test/test_owner_parse.c122
-rw-r--r--usr.bin/cpio/test/test_passthrough_dotdot.c76
-rw-r--r--usr.bin/cpio/test/test_passthrough_reverse.c85
-rw-r--r--usr.bin/cpio/test/test_pathmatch.c243
49 files changed, 23 insertions, 7788 deletions
diff --git a/usr.bin/cpio/Makefile b/usr.bin/cpio/Makefile
index fb40ef9..f13b626 100644
--- a/usr.bin/cpio/Makefile
+++ b/usr.bin/cpio/Makefile
@@ -2,17 +2,20 @@
.include <bsd.own.mk>
+LIBARCHIVEDIR= ${.CURDIR}/../../contrib/libarchive
+
PROG= bsdcpio
BSDCPIO_VERSION_STRING=2.8.5
+.PATH: ${LIBARCHIVEDIR}/cpio
SRCS= cpio.c cmdline.c
-.PATH: ${.CURDIR}/../../lib/libarchive/libarchive_fe
+.PATH: ${LIBARCHIVEDIR}/libarchive_fe
SRCS+= err.c line_reader.c matching.c pathmatch.c
CFLAGS+= -DBSDCPIO_VERSION_STRING=\"${BSDCPIO_VERSION_STRING}\"
-CFLAGS+= -DPLATFORM_CONFIG_H=\"config_freebsd.h\"
-CFLAGS+= -I${.CURDIR} -I${.CURDIR}/../../lib/libarchive/libarchive_fe
+CFLAGS+= -DPLATFORM_CONFIG_H=\"${.CURDIR}/config_freebsd.h\"
+CFLAGS+= -I${LIBARCHIVEDIR}/cpio -I${LIBARCHIVEDIR}/libarchive_fe
.ifdef RELEASE_CRUNCH
# FreeBSD's installer uses cpio in crunched binaries that are
@@ -32,9 +35,12 @@ LDADD+= -lmd
SYMLINKS=bsdcpio ${BINDIR}/cpio
MLINKS= bsdcpio.1 cpio.1
-.PHONY: check test
+.PHONY: check test clean-test
check test: $(PROG) bsdcpio.1.gz
- cd ${.CURDIR}/test && make clean test
+ cd ${.CURDIR}/test && make obj && make test
+
+clean-test:
+ cd ${.CURDIR}/test && make clean
.include <bsd.prog.mk>
diff --git a/usr.bin/cpio/bsdcpio.1 b/usr.bin/cpio/bsdcpio.1
deleted file mode 100644
index 789ce74..0000000
--- a/usr.bin/cpio/bsdcpio.1
+++ /dev/null
@@ -1,405 +0,0 @@
-.\" Copyright (c) 2003-2007 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 AND CONTRIBUTORS ``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 OR CONTRIBUTORS 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$
-.\"
-.Dd September 5, 2010
-.Dt BSDCPIO 1
-.Os
-.Sh NAME
-.Nm cpio
-.Nd copy files to and from archives
-.Sh SYNOPSIS
-.Nm
-.Brq Fl i
-.Op Ar options
-.Op Ar pattern ...
-.Op Ar < archive
-.Nm
-.Brq Fl o
-.Op Ar options
-.Ar < name-list
-.Op Ar > archive
-.Nm
-.Brq Fl p
-.Op Ar options
-.Ar dest-dir
-.Ar < name-list
-.Sh DESCRIPTION
-.Nm
-copies files between archives and directories.
-This implementation can extract from tar, pax, cpio, zip, jar, ar,
-and ISO 9660 cdrom images and can create tar, pax, cpio, ar,
-and shar archives.
-.Pp
-The first option to
-.Nm
-is a mode indicator from the following list:
-.Bl -tag -compact -width indent
-.It Fl i
-Input.
-Read an archive from standard input (unless overriden) and extract the
-contents to disk or (if the
-.Fl t
-option is specified)
-list the contents to standard output.
-If one or more file patterns are specified, only files matching
-one of the patterns will be extracted.
-.It Fl o
-Output.
-Read a list of filenames from standard input and produce a new archive
-on standard output (unless overriden) containing the specified items.
-.It Fl p
-Pass-through.
-Read a list of filenames from standard input and copy the files to the
-specified directory.
-.El
-.Pp
-.Sh OPTIONS
-Unless specifically stated otherwise, options are applicable in
-all operating modes.
-.Bl -tag -width indent
-.It Fl 0
-Read filenames separated by NUL characters instead of newlines.
-This is necessary if any of the filenames being read might contain newlines.
-.It Fl A
-(o mode only)
-Append to the specified archive.
-(Not yet implemented.)
-.It Fl a
-(o and p modes)
-Reset access times on files after they are read.
-.It Fl B
-(o mode only)
-Block output to records of 5120 bytes.
-.It Fl C Ar size
-(o mode only)
-Block output to records of
-.Ar size
-bytes.
-.It Fl c
-(o mode only)
-Use the old POSIX portable character format.
-Equivalent to
-.Fl -format Ar odc .
-.It Fl d
-(i and p modes)
-Create directories as necessary.
-.It Fl E Ar file
-(i mode only)
-Read list of file name patterns from
-.Ar file
-to list and extract.
-.It Fl F Ar file
-Read archive from or write archive to
-.Ar file .
-.It Fl f Ar pattern
-(i mode only)
-Ignore files that match
-.Ar pattern .
-.It Fl -format Ar format
-(o mode only)
-Produce the output archive in the specified format.
-Supported formats include:
-.Pp
-.Bl -tag -width "iso9660" -compact
-.It Ar cpio
-Synonym for
-.Ar odc .
-.It Ar newc
-The SVR4 portable cpio format.
-.It Ar odc
-The old POSIX.1 portable octet-oriented cpio format.
-.It Ar pax
-The POSIX.1 pax format, an extension of the ustar format.
-.It Ar ustar
-The POSIX.1 tar format.
-.El
-.Pp
-The default format is
-.Ar odc .
-See
-.Xr libarchive-formats 5
-for more complete information about the
-formats currently supported by the underlying
-.Xr libarchive 3
-library.
-.It Fl H Ar format
-Synonym for
-.Fl -format .
-.It Fl h , Fl -help
-Print usage information.
-.It Fl I Ar file
-Read archive from
-.Ar file .
-.It Fl i
-Input mode.
-See above for description.
-.It Fl -insecure
-(i and p mode only)
-Disable security checks during extraction or copying.
-This allows extraction via symbolic links and path names containing
-.Sq ..
-in the name.
-.It Fl J
-(o mode only)
-Compress the file with xz-compatible compression before writing it.
-In input mode, this option is ignored; xz compression is recognized
-automatically on input.
-.It Fl j
-Synonym for
-.Fl y .
-.It Fl L
-(o and p modes)
-All symbolic links will be followed.
-Normally, symbolic links are archived and copied as symbolic links.
-With this option, the target of the link will be archived or copied instead.
-.It Fl l
-(p mode only)
-Create links from the target directory to the original files,
-instead of copying.
-.It Fl lzma
-(o mode only)
-Compress the file with lzma-compatible compression before writing it.
-In input mode, this option is ignored; lzma compression is recognized
-automatically on input.
-.It Fl m
-(i and p modes)
-Set file modification time on created files to match
-those in the source.
-.It Fl n
-(i mode, only with
-.Fl t )
-Display numeric uid and gid.
-By default,
-.Nm
-displays the user and group names when they are provided in the
-archive, or looks up the user and group names in the system
-password database.
-.It Fl no-preserve-owner
-(i mode only)
-Do not attempt to restore file ownership.
-This is the default when run by non-root users.
-.It Fl O Ar file
-Write archive to
-.Ar file .
-.It Fl o
-Output mode.
-See above for description.
-.It Fl p
-Pass-through mode.
-See above for description.
-.It Fl preserve-owner
-(i mode only)
-Restore file ownership.
-This is the default when run by the root user.
-.It Fl -quiet
-Suppress unnecessary messages.
-.It Fl R Oo user Oc Ns Oo : Oc Ns Oo group Oc
-Set the owner and/or group on files in the output.
-If group is specified with no user
-(for example,
-.Fl R Ar :wheel )
-then the group will be set but not the user.
-If the user is specified with a trailing colon and no group
-(for example,
-.Fl R Ar root: )
-then the group will be set to the user's default group.
-If the user is specified with no trailing colon, then
-the user will be set but not the group.
-In
-.Fl i
-and
-.Fl p
-modes, this option can only be used by the super-user.
-(For compatibility, a period can be used in place of the colon.)
-.It Fl r
-(All modes.)
-Rename files interactively.
-For each file, a prompt is written to
-.Pa /dev/tty
-containing the name of the file and a line is read from
-.Pa /dev/tty .
-If the line read is blank, the file is skipped.
-If the line contains a single period, the file is processed normally.
-Otherwise, the line is taken to be the new name of the file.
-.It Fl t
-(i mode only)
-List the contents of the archive to stdout;
-do not restore the contents to disk.
-.It Fl u
-(i and p modes)
-Unconditionally overwrite existing files.
-Ordinarily, an older file will not overwrite a newer file on disk.
-.It Fl v
-Print the name of each file to stderr as it is processed.
-With
-.Fl t ,
-provide a detailed listing of each file.
-.It Fl -version
-Print the program version information and exit.
-.It Fl y
-(o mode only)
-Compress the archive with bzip2-compatible compression before writing it.
-In input mode, this option is ignored;
-bzip2 compression is recognized automatically on input.
-.It Fl Z
-(o mode only)
-Compress the archive with compress-compatible compression before writing it.
-In input mode, this option is ignored;
-compression is recognized automatically on input.
-.It Fl z
-(o mode only)
-Compress the archive with gzip-compatible compression before writing it.
-In input mode, this option is ignored;
-gzip compression is recognized automatically on input.
-.El
-.Sh ENVIRONMENT
-The following environment variables affect the execution of
-.Nm :
-.Bl -tag -width ".Ev BLOCKSIZE"
-.It Ev LANG
-The locale to use.
-See
-.Xr environ 7
-for more information.
-.It Ev TZ
-The timezone to use when displaying dates.
-See
-.Xr environ 7
-for more information.
-.El
-.Sh EXIT STATUS
-.Ex -std
-.Sh EXAMPLES
-The
-.Nm
-command is traditionally used to copy file hierarchies in conjunction
-with the
-.Xr find 1
-command.
-The first example here simply copies all files from
-.Pa src
-to
-.Pa dest :
-.Dl Nm find Pa src | Nm Fl pmud Pa dest
-.Pp
-By carefully selecting options to the
-.Xr find 1
-command and combining it with other standard utilities,
-it is possible to exercise very fine control over which files are copied.
-This next example copies files from
-.Pa src
-to
-.Pa dest
-that are more than 2 days old and whose names match a particular pattern:
-.Dl Nm find Pa src Fl mtime Ar +2 | Nm grep foo[bar] | Nm Fl pdmu Pa dest
-.Pp
-This example copies files from
-.Pa src
-to
-.Pa dest
-that are more than 2 days old and which contain the word
-.Do foobar Dc :
-.Dl Nm find Pa src Fl mtime Ar +2 | Nm xargs Nm grep -l foobar | Nm Fl pdmu Pa dest
-.Sh COMPATIBILITY
-The mode options i, o, and p and the options
-a, B, c, d, f, l, m, r, t, u, and v comply with SUSv2.
-.Pp
-The old POSIX.1 standard specified that only
-.Fl i ,
-.Fl o ,
-and
-.Fl p
-were interpreted as command-line options.
-Each took a single argument of a list of modifier
-characters.
-For example, the standard syntax allows
-.Fl imu
-but does not support
-.Fl miu
-or
-.Fl i Fl m Fl u ,
-since
-.Ar m
-and
-.Ar u
-are only modifiers to
-.Fl i ,
-they are not command-line options in their own right.
-The syntax supported by this implementation is backwards-compatible
-with the standard.
-For best compatibility, scripts should limit themselves to the
-standard syntax.
-.Sh SEE ALSO
-.Xr bzip2 1 ,
-.Xr tar 1 ,
-.Xr gzip 1 ,
-.Xr mt 1 ,
-.Xr pax 1 ,
-.Xr libarchive 3 ,
-.Xr cpio 5 ,
-.Xr libarchive-formats 5 ,
-.Xr tar 5
-.Sh STANDARDS
-There is no current POSIX standard for the cpio command; it appeared
-in
-.St -p1003.1-96
-but was dropped from
-.St -p1003.1-2001 .
-.Pp
-The cpio, ustar, and pax interchange file formats are defined by
-.St -p1003.1-2001
-for the pax command.
-.Sh HISTORY
-The original
-.Nm cpio
-and
-.Nm find
-utilities were written by Dick Haight
-while working in AT&T's Unix Support Group.
-They first appeared in 1977 in PWB/UNIX 1.0, the
-.Dq Programmer's Work Bench
-system developed for use within AT&T.
-They were first released outside of AT&T as part of System III Unix in 1981.
-As a result,
-.Nm cpio
-actually predates
-.Nm tar ,
-even though it was not well-known outside of AT&T until some time later.
-.Pp
-This is a complete re-implementation based on the
-.Xr libarchive 3
-library.
-.Sh BUGS
-The cpio archive format has several basic limitations:
-It does not store user and group names, only numbers.
-As a result, it cannot be reliably used to transfer
-files between systems with dissimilar user and group numbering.
-Older cpio formats limit the user and group numbers to
-16 or 18 bits, which is insufficient for modern systems.
-The cpio archive formats cannot support files over 4 gigabytes,
-except for the
-.Dq odc
-variant, which can support files up to 8 gigabytes.
diff --git a/usr.bin/cpio/cmdline.c b/usr.bin/cpio/cmdline.c
deleted file mode 100644
index 687fa62..0000000
--- a/usr.bin/cpio/cmdline.c
+++ /dev/null
@@ -1,371 +0,0 @@
-/*-
- * Copyright (c) 2003-2007 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
- * in this position and unchanged.
- * 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.
- */
-
-
-#include "cpio_platform.h"
-__FBSDID("$FreeBSD$");
-
-#ifdef HAVE_ERRNO_H
-#include <errno.h>
-#endif
-#ifdef HAVE_GRP_H
-#include <grp.h>
-#endif
-#ifdef HAVE_PWD_H
-#include <pwd.h>
-#endif
-#include <stdio.h>
-#ifdef HAVE_STDLIB_H
-#include <stdlib.h>
-#endif
-#ifdef HAVE_STRING_H
-#include <string.h>
-#endif
-
-#include "cpio.h"
-#include "err.h"
-
-/*
- * Short options for cpio. Please keep this sorted.
- */
-static const char *short_options = "0AaBC:cdE:F:f:H:hI:iJjLlmnO:opR:rtuvW:yZz";
-
-/*
- * Long options for cpio. Please keep this sorted.
- */
-static const struct option {
- const char *name;
- int required; /* 1 if this option requires an argument */
- int equivalent; /* Equivalent short option. */
-} cpio_longopts[] = {
- { "create", 0, 'o' },
- { "extract", 0, 'i' },
- { "file", 1, 'F' },
- { "format", 1, 'H' },
- { "help", 0, 'h' },
- { "insecure", 0, OPTION_INSECURE },
- { "link", 0, 'l' },
- { "list", 0, 't' },
- { "lzma", 0, OPTION_LZMA },
- { "make-directories", 0, 'd' },
- { "no-preserve-owner", 0, OPTION_NO_PRESERVE_OWNER },
- { "null", 0, '0' },
- { "numeric-uid-gid", 0, 'n' },
- { "owner", 1, 'R' },
- { "pass-through", 0, 'p' },
- { "preserve-modification-time", 0, 'm' },
- { "preserve-owner", 0, OPTION_PRESERVE_OWNER },
- { "quiet", 0, OPTION_QUIET },
- { "unconditional", 0, 'u' },
- { "verbose", 0, 'v' },
- { "version", 0, OPTION_VERSION },
- { "xz", 0, 'J' },
- { NULL, 0, 0 }
-};
-
-/*
- * I used to try to select platform-provided getopt() or
- * getopt_long(), but that caused a lot of headaches. In particular,
- * I couldn't consistently use long options in the test harness
- * because not all platforms have getopt_long(). That in turn led to
- * overuse of the -W hack in the test harness, which made it rough to
- * run the test harness against GNU cpio. (I periodically run the
- * test harness here against GNU cpio as a sanity-check. Yes,
- * I've found a couple of bugs in GNU cpio that way.)
- */
-int
-cpio_getopt(struct cpio *cpio)
-{
- enum { state_start = 0, state_next_word, state_short, state_long };
- static int state = state_start;
- static char *opt_word;
-
- const struct option *popt, *match = NULL, *match2 = NULL;
- const char *p, *long_prefix = "--";
- size_t optlength;
- int opt = '?';
- int required = 0;
-
- cpio->optarg = NULL;
-
- /* First time through, initialize everything. */
- if (state == state_start) {
- /* Skip program name. */
- ++cpio->argv;
- --cpio->argc;
- state = state_next_word;
- }
-
- /*
- * We're ready to look at the next word in argv.
- */
- if (state == state_next_word) {
- /* No more arguments, so no more options. */
- if (cpio->argv[0] == NULL)
- return (-1);
- /* Doesn't start with '-', so no more options. */
- if (cpio->argv[0][0] != '-')
- return (-1);
- /* "--" marks end of options; consume it and return. */
- if (strcmp(cpio->argv[0], "--") == 0) {
- ++cpio->argv;
- --cpio->argc;
- return (-1);
- }
- /* Get next word for parsing. */
- opt_word = *cpio->argv++;
- --cpio->argc;
- if (opt_word[1] == '-') {
- /* Set up long option parser. */
- state = state_long;
- opt_word += 2; /* Skip leading '--' */
- } else {
- /* Set up short option parser. */
- state = state_short;
- ++opt_word; /* Skip leading '-' */
- }
- }
-
- /*
- * We're parsing a group of POSIX-style single-character options.
- */
- if (state == state_short) {
- /* Peel next option off of a group of short options. */
- opt = *opt_word++;
- if (opt == '\0') {
- /* End of this group; recurse to get next option. */
- state = state_next_word;
- return cpio_getopt(cpio);
- }
-
- /* Does this option take an argument? */
- p = strchr(short_options, opt);
- if (p == NULL)
- return ('?');
- if (p[1] == ':')
- required = 1;
-
- /* If it takes an argument, parse that. */
- if (required) {
- /* If arg is run-in, opt_word already points to it. */
- if (opt_word[0] == '\0') {
- /* Otherwise, pick up the next word. */
- opt_word = *cpio->argv;
- if (opt_word == NULL) {
- lafe_warnc(0,
- "Option -%c requires an argument",
- opt);
- return ('?');
- }
- ++cpio->argv;
- --cpio->argc;
- }
- if (opt == 'W') {
- state = state_long;
- long_prefix = "-W "; /* For clearer errors. */
- } else {
- state = state_next_word;
- cpio->optarg = opt_word;
- }
- }
- }
-
- /* We're reading a long option, including -W long=arg convention. */
- if (state == state_long) {
- /* After this long option, we'll be starting a new word. */
- state = state_next_word;
-
- /* Option name ends at '=' if there is one. */
- p = strchr(opt_word, '=');
- if (p != NULL) {
- optlength = (size_t)(p - opt_word);
- cpio->optarg = (char *)(uintptr_t)(p + 1);
- } else {
- optlength = strlen(opt_word);
- }
-
- /* Search the table for an unambiguous match. */
- for (popt = cpio_longopts; popt->name != NULL; popt++) {
- /* Short-circuit if first chars don't match. */
- if (popt->name[0] != opt_word[0])
- continue;
- /* If option is a prefix of name in table, record it.*/
- if (strncmp(opt_word, popt->name, optlength) == 0) {
- match2 = match; /* Record up to two matches. */
- match = popt;
- /* If it's an exact match, we're done. */
- if (strlen(popt->name) == optlength) {
- match2 = NULL; /* Forget the others. */
- break;
- }
- }
- }
-
- /* Fail if there wasn't a unique match. */
- if (match == NULL) {
- lafe_warnc(0,
- "Option %s%s is not supported",
- long_prefix, opt_word);
- return ('?');
- }
- if (match2 != NULL) {
- lafe_warnc(0,
- "Ambiguous option %s%s (matches --%s and --%s)",
- long_prefix, opt_word, match->name, match2->name);
- return ('?');
- }
-
- /* We've found a unique match; does it need an argument? */
- if (match->required) {
- /* Argument required: get next word if necessary. */
- if (cpio->optarg == NULL) {
- cpio->optarg = *cpio->argv;
- if (cpio->optarg == NULL) {
- lafe_warnc(0,
- "Option %s%s requires an argument",
- long_prefix, match->name);
- return ('?');
- }
- ++cpio->argv;
- --cpio->argc;
- }
- } else {
- /* Argument forbidden: fail if there is one. */
- if (cpio->optarg != NULL) {
- lafe_warnc(0,
- "Option %s%s does not allow an argument",
- long_prefix, match->name);
- return ('?');
- }
- }
- return (match->equivalent);
- }
-
- return (opt);
-}
-
-
-/*
- * Parse the argument to the -R or --owner flag.
- *
- * The format is one of the following:
- * <username|uid> - Override user but not group
- * <username>: - Override both, group is user's default group
- * <uid>: - Override user but not group
- * <username|uid>:<groupname|gid> - Override both
- * :<groupname|gid> - Override group but not user
- *
- * Where uid/gid are decimal representations and groupname/username
- * are names to be looked up in system database. Note that we try
- * to look up an argument as a name first, then try numeric parsing.
- *
- * A period can be used instead of the colon.
- *
- * Sets uid/gid return as appropriate, -1 indicates uid/gid not specified.
- * TODO: If the spec uses uname/gname, then return those to the caller
- * as well. If the spec provides uid/gid, just return names as NULL.
- *
- * Returns NULL if no error, otherwise returns error string for display.
- *
- */
-const char *
-owner_parse(const char *spec, int *uid, int *gid)
-{
- static char errbuff[128];
- const char *u, *ue, *g;
-
- *uid = -1;
- *gid = -1;
-
- if (spec[0] == '\0')
- return ("Invalid empty user/group spec");
-
- /*
- * Split spec into [user][:.][group]
- * u -> first char of username, NULL if no username
- * ue -> first char after username (colon, period, or \0)
- * g -> first char of group name
- */
- if (*spec == ':' || *spec == '.') {
- /* If spec starts with ':' or '.', then just group. */
- ue = u = NULL;
- g = spec + 1;
- } else {
- /* Otherwise, [user] or [user][:] or [user][:][group] */
- ue = u = spec;
- while (*ue != ':' && *ue != '.' && *ue != '\0')
- ++ue;
- g = ue;
- if (*g != '\0') /* Skip : or . to find first char of group. */
- ++g;
- }
-
- if (u != NULL) {
- /* Look up user: ue is first char after end of user. */
- char *user;
- struct passwd *pwent;
-
- user = (char *)malloc(ue - u + 1);
- if (user == NULL)
- return ("Couldn't allocate memory");
- memcpy(user, u, ue - u);
- user[ue - u] = '\0';
- if ((pwent = getpwnam(user)) != NULL) {
- *uid = pwent->pw_uid;
- if (*ue != '\0')
- *gid = pwent->pw_gid;
- } else {
- char *end;
- errno = 0;
- *uid = strtoul(user, &end, 10);
- if (errno || *end != '\0') {
- snprintf(errbuff, sizeof(errbuff),
- "Couldn't lookup user ``%s''", user);
- errbuff[sizeof(errbuff) - 1] = '\0';
- return (errbuff);
- }
- }
- free(user);
- }
-
- if (*g != '\0') {
- struct group *grp;
- if ((grp = getgrnam(g)) != NULL) {
- *gid = grp->gr_gid;
- } else {
- char *end;
- errno = 0;
- *gid = strtoul(g, &end, 10);
- if (errno || *end != '\0') {
- snprintf(errbuff, sizeof(errbuff),
- "Couldn't lookup group ``%s''", g);
- errbuff[sizeof(errbuff) - 1] = '\0';
- return (errbuff);
- }
- }
- }
- return (NULL);
-}
diff --git a/usr.bin/cpio/cpio.c b/usr.bin/cpio/cpio.c
deleted file mode 100644
index cd81050..0000000
--- a/usr.bin/cpio/cpio.c
+++ /dev/null
@@ -1,1277 +0,0 @@
-/*-
- * Copyright (c) 2003-2007 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
- * in this position and unchanged.
- * 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.
- */
-
-
-#include "cpio_platform.h"
-__FBSDID("$FreeBSD$");
-
-#include <sys/types.h>
-#include <archive.h>
-#include <archive_entry.h>
-
-#ifdef HAVE_SYS_MKDEV_H
-#include <sys/mkdev.h>
-#endif
-#ifdef HAVE_SYS_STAT_H
-#include <sys/stat.h>
-#endif
-#ifdef HAVE_SYS_TIME_H
-#include <sys/time.h>
-#endif
-#ifdef HAVE_ERRNO_H
-#include <errno.h>
-#endif
-#ifdef HAVE_FCNTL_H
-#include <fcntl.h>
-#endif
-#ifdef HAVE_GRP_H
-#include <grp.h>
-#endif
-#ifdef HAVE_PWD_H
-#include <pwd.h>
-#endif
-#ifdef HAVE_STDARG_H
-#include <stdarg.h>
-#endif
-#ifdef HAVE_STDINT_H
-#include <stdint.h>
-#endif
-#include <stdio.h>
-#ifdef HAVE_STDLIB_H
-#include <stdlib.h>
-#endif
-#ifdef HAVE_STRING_H
-#include <string.h>
-#endif
-#ifdef HAVE_UNISTD_H
-#include <unistd.h>
-#endif
-#ifdef HAVE_SYS_TIME_H
-#include <sys/time.h>
-#endif
-#ifdef HAVE_TIME_H
-#include <time.h>
-#endif
-
-#include "cpio.h"
-#include "err.h"
-#include "line_reader.h"
-#include "matching.h"
-
-/* Fixed size of uname/gname caches. */
-#define name_cache_size 101
-
-#ifndef O_BINARY
-#define O_BINARY 0
-#endif
-
-struct name_cache {
- int probes;
- int hits;
- size_t size;
- struct {
- id_t id;
- char *name;
- } cache[name_cache_size];
-};
-
-static int extract_data(struct archive *, struct archive *);
-const char * cpio_i64toa(int64_t);
-static const char *cpio_rename(const char *name);
-static int entry_to_archive(struct cpio *, struct archive_entry *);
-static int file_to_archive(struct cpio *, const char *);
-static void free_cache(struct name_cache *cache);
-static void list_item_verbose(struct cpio *, struct archive_entry *);
-static void long_help(void);
-static const char *lookup_gname(struct cpio *, gid_t gid);
-static int lookup_gname_helper(struct cpio *,
- const char **name, id_t gid);
-static const char *lookup_uname(struct cpio *, uid_t uid);
-static int lookup_uname_helper(struct cpio *,
- const char **name, id_t uid);
-static void mode_in(struct cpio *);
-static void mode_list(struct cpio *);
-static void mode_out(struct cpio *);
-static void mode_pass(struct cpio *, const char *);
-static int restore_time(struct cpio *, struct archive_entry *,
- const char *, int fd);
-static void usage(void);
-static void version(void);
-
-int
-main(int argc, char *argv[])
-{
- static char buff[16384];
- struct cpio _cpio; /* Allocated on stack. */
- struct cpio *cpio;
- const char *errmsg;
- int uid, gid;
- int opt;
-
- cpio = &_cpio;
- memset(cpio, 0, sizeof(*cpio));
- cpio->buff = buff;
- cpio->buff_size = sizeof(buff);
-
- /* Need lafe_progname before calling lafe_warnc. */
- if (*argv == NULL)
- lafe_progname = "bsdcpio";
- else {
-#if defined(_WIN32) && !defined(__CYGWIN__)
- lafe_progname = strrchr(*argv, '\\');
-#else
- lafe_progname = strrchr(*argv, '/');
-#endif
- if (lafe_progname != NULL)
- lafe_progname++;
- else
- lafe_progname = *argv;
- }
-
- cpio->uid_override = -1;
- cpio->gid_override = -1;
- cpio->argv = argv;
- cpio->argc = argc;
- cpio->mode = '\0';
- cpio->verbose = 0;
- cpio->compress = '\0';
- cpio->extract_flags = ARCHIVE_EXTRACT_NO_AUTODIR;
- cpio->extract_flags |= ARCHIVE_EXTRACT_NO_OVERWRITE_NEWER;
- cpio->extract_flags |= ARCHIVE_EXTRACT_SECURE_SYMLINKS;
- cpio->extract_flags |= ARCHIVE_EXTRACT_SECURE_NODOTDOT;
- cpio->extract_flags |= ARCHIVE_EXTRACT_PERM;
- cpio->extract_flags |= ARCHIVE_EXTRACT_FFLAGS;
- cpio->extract_flags |= ARCHIVE_EXTRACT_ACL;
-#if !defined(_WIN32) && !defined(__CYGWIN__)
- if (geteuid() == 0)
- cpio->extract_flags |= ARCHIVE_EXTRACT_OWNER;
-#endif
- cpio->bytes_per_block = 512;
- cpio->filename = NULL;
-
- while ((opt = cpio_getopt(cpio)) != -1) {
- switch (opt) {
- case '0': /* GNU convention: --null, -0 */
- cpio->option_null = 1;
- break;
- case 'A': /* NetBSD/OpenBSD */
- cpio->option_append = 1;
- break;
- case 'a': /* POSIX 1997 */
- cpio->option_atime_restore = 1;
- break;
- case 'B': /* POSIX 1997 */
- cpio->bytes_per_block = 5120;
- break;
- case 'C': /* NetBSD/OpenBSD */
- cpio->bytes_per_block = atoi(cpio->optarg);
- if (cpio->bytes_per_block <= 0)
- lafe_errc(1, 0, "Invalid blocksize %s", cpio->optarg);
- break;
- case 'c': /* POSIX 1997 */
- cpio->format = "odc";
- break;
- case 'd': /* POSIX 1997 */
- cpio->extract_flags &= ~ARCHIVE_EXTRACT_NO_AUTODIR;
- break;
- case 'E': /* NetBSD/OpenBSD */
- lafe_include_from_file(&cpio->matching,
- cpio->optarg, cpio->option_null);
- break;
- case 'F': /* NetBSD/OpenBSD/GNU cpio */
- cpio->filename = cpio->optarg;
- break;
- case 'f': /* POSIX 1997 */
- lafe_exclude(&cpio->matching, cpio->optarg);
- break;
- case 'H': /* GNU cpio (also --format) */
- cpio->format = cpio->optarg;
- break;
- case 'h':
- long_help();
- break;
- case 'I': /* NetBSD/OpenBSD */
- cpio->filename = cpio->optarg;
- break;
- case 'i': /* POSIX 1997 */
- if (cpio->mode != '\0')
- lafe_errc(1, 0,
- "Cannot use both -i and -%c", cpio->mode);
- cpio->mode = opt;
- break;
- case 'J': /* GNU tar, others */
- cpio->compress = opt;
- break;
- case 'j': /* GNU tar, others */
- cpio->compress = opt;
- break;
- case OPTION_INSECURE:
- cpio->extract_flags &= ~ARCHIVE_EXTRACT_SECURE_SYMLINKS;
- cpio->extract_flags &= ~ARCHIVE_EXTRACT_SECURE_NODOTDOT;
- break;
- case 'L': /* GNU cpio */
- cpio->option_follow_links = 1;
- break;
- case 'l': /* POSIX 1997 */
- cpio->option_link = 1;
- break;
- case OPTION_LZMA: /* GNU tar, others */
- cpio->compress = opt;
- break;
- case 'm': /* POSIX 1997 */
- cpio->extract_flags |= ARCHIVE_EXTRACT_TIME;
- break;
- case 'n': /* GNU cpio */
- cpio->option_numeric_uid_gid = 1;
- break;
- case OPTION_NO_PRESERVE_OWNER: /* GNU cpio */
- cpio->extract_flags &= ~ARCHIVE_EXTRACT_OWNER;
- break;
- case 'O': /* GNU cpio */
- cpio->filename = cpio->optarg;
- break;
- case 'o': /* POSIX 1997 */
- if (cpio->mode != '\0')
- lafe_errc(1, 0,
- "Cannot use both -o and -%c", cpio->mode);
- cpio->mode = opt;
- break;
- case 'p': /* POSIX 1997 */
- if (cpio->mode != '\0')
- lafe_errc(1, 0,
- "Cannot use both -p and -%c", cpio->mode);
- cpio->mode = opt;
- cpio->extract_flags &= ~ARCHIVE_EXTRACT_SECURE_NODOTDOT;
- break;
- case OPTION_PRESERVE_OWNER:
- cpio->extract_flags |= ARCHIVE_EXTRACT_OWNER;
- break;
- case OPTION_QUIET: /* GNU cpio */
- cpio->quiet = 1;
- break;
- case 'R': /* GNU cpio, also --owner */
- /* TODO: owner_parse should return uname/gname
- * also; use that to set [ug]name_override. */
- errmsg = owner_parse(cpio->optarg, &uid, &gid);
- if (errmsg) {
- lafe_warnc(-1, "%s", errmsg);
- usage();
- }
- if (uid != -1) {
- cpio->uid_override = uid;
- cpio->uname_override = NULL;
- }
- if (gid != -1) {
- cpio->gid_override = gid;
- cpio->gname_override = NULL;
- }
- break;
- case 'r': /* POSIX 1997 */
- cpio->option_rename = 1;
- break;
- case 't': /* POSIX 1997 */
- cpio->option_list = 1;
- break;
- case 'u': /* POSIX 1997 */
- cpio->extract_flags
- &= ~ARCHIVE_EXTRACT_NO_OVERWRITE_NEWER;
- break;
- case 'v': /* POSIX 1997 */
- cpio->verbose++;
- break;
- case OPTION_VERSION: /* GNU convention */
- version();
- break;
-#if 0
- /*
- * cpio_getopt() handles -W specially, so it's not
- * available here.
- */
- case 'W': /* Obscure, but useful GNU convention. */
- break;
-#endif
- case 'y': /* tar convention */
- cpio->compress = opt;
- break;
- case 'Z': /* tar convention */
- cpio->compress = opt;
- break;
- case 'z': /* tar convention */
- cpio->compress = opt;
- break;
- default:
- usage();
- }
- }
-
- /*
- * Sanity-check args, error out on nonsensical combinations.
- */
- /* -t implies -i if no mode was specified. */
- if (cpio->option_list && cpio->mode == '\0')
- cpio->mode = 'i';
- /* -t requires -i */
- if (cpio->option_list && cpio->mode != 'i')
- lafe_errc(1, 0, "Option -t requires -i");
- /* -n requires -it */
- if (cpio->option_numeric_uid_gid && !cpio->option_list)
- lafe_errc(1, 0, "Option -n requires -it");
- /* Can only specify format when writing */
- if (cpio->format != NULL && cpio->mode != 'o')
- lafe_errc(1, 0, "Option --format requires -o");
- /* -l requires -p */
- if (cpio->option_link && cpio->mode != 'p')
- lafe_errc(1, 0, "Option -l requires -p");
- /* TODO: Flag other nonsensical combinations. */
-
- switch (cpio->mode) {
- case 'o':
- /* TODO: Implement old binary format in libarchive,
- use that here. */
- if (cpio->format == NULL)
- cpio->format = "odc"; /* Default format */
-
- mode_out(cpio);
- break;
- case 'i':
- while (*cpio->argv != NULL) {
- lafe_include(&cpio->matching, *cpio->argv);
- --cpio->argc;
- ++cpio->argv;
- }
- if (cpio->option_list)
- mode_list(cpio);
- else
- mode_in(cpio);
- break;
- case 'p':
- if (*cpio->argv == NULL || **cpio->argv == '\0')
- lafe_errc(1, 0,
- "-p mode requires a target directory");
- mode_pass(cpio, *cpio->argv);
- break;
- default:
- lafe_errc(1, 0,
- "Must specify at least one of -i, -o, or -p");
- }
-
- free_cache(cpio->gname_cache);
- free_cache(cpio->uname_cache);
- return (cpio->return_value);
-}
-
-static void
-usage(void)
-{
- const char *p;
-
- p = lafe_progname;
-
- fprintf(stderr, "Brief Usage:\n");
- fprintf(stderr, " List: %s -it < archive\n", p);
- fprintf(stderr, " Extract: %s -i < archive\n", p);
- fprintf(stderr, " Create: %s -o < filenames > archive\n", p);
- fprintf(stderr, " Help: %s --help\n", p);
- exit(1);
-}
-
-static const char *long_help_msg =
- "First option must be a mode specifier:\n"
- " -i Input -o Output -p Pass\n"
- "Common Options:\n"
- " -v Verbose\n"
- "Create: %p -o [options] < [list of files] > [archive]\n"
- " -J,-y,-z,--lzma Compress archive with xz/bzip2/gzip/lzma\n"
- " --format {odc|newc|ustar} Select archive format\n"
- "List: %p -it < [archive]\n"
- "Extract: %p -i [options] < [archive]\n";
-
-
-/*
- * Note that the word 'bsdcpio' will always appear in the first line
- * of output.
- *
- * In particular, /bin/sh scripts that need to test for the presence
- * of bsdcpio can use the following template:
- *
- * if (cpio --help 2>&1 | grep bsdcpio >/dev/null 2>&1 ) then \
- * echo bsdcpio; else echo not bsdcpio; fi
- */
-static void
-long_help(void)
-{
- const char *prog;
- const char *p;
-
- prog = lafe_progname;
-
- fflush(stderr);
-
- p = (strcmp(prog,"bsdcpio") != 0) ? "(bsdcpio)" : "";
- printf("%s%s: manipulate archive files\n", prog, p);
-
- for (p = long_help_msg; *p != '\0'; p++) {
- if (*p == '%') {
- if (p[1] == 'p') {
- fputs(prog, stdout);
- p++;
- } else
- putchar('%');
- } else
- putchar(*p);
- }
- version();
-}
-
-static void
-version(void)
-{
- fprintf(stdout,"bsdcpio %s -- %s\n",
- BSDCPIO_VERSION_STRING,
- archive_version());
- exit(0);
-}
-
-static void
-mode_out(struct cpio *cpio)
-{
- struct archive_entry *entry, *spare;
- struct lafe_line_reader *lr;
- const char *p;
- int r;
-
- if (cpio->option_append)
- lafe_errc(1, 0, "Append mode not yet supported.");
-
- cpio->archive_read_disk = archive_read_disk_new();
- if (cpio->archive_read_disk == NULL)
- lafe_errc(1, 0, "Failed to allocate archive object");
- if (cpio->option_follow_links)
- archive_read_disk_set_symlink_logical(cpio->archive_read_disk);
- else
- archive_read_disk_set_symlink_physical(cpio->archive_read_disk);
- archive_read_disk_set_standard_lookup(cpio->archive_read_disk);
-
- cpio->archive = archive_write_new();
- if (cpio->archive == NULL)
- lafe_errc(1, 0, "Failed to allocate archive object");
- switch (cpio->compress) {
- case 'J':
- r = archive_write_set_compression_xz(cpio->archive);
- break;
- case OPTION_LZMA:
- r = archive_write_set_compression_lzma(cpio->archive);
- break;
- case 'j': case 'y':
- r = archive_write_set_compression_bzip2(cpio->archive);
- break;
- case 'z':
- r = archive_write_set_compression_gzip(cpio->archive);
- break;
- case 'Z':
- r = archive_write_set_compression_compress(cpio->archive);
- break;
- default:
- r = archive_write_set_compression_none(cpio->archive);
- break;
- }
- if (r < ARCHIVE_WARN)
- lafe_errc(1, 0, "Requested compression not available");
- r = archive_write_set_format_by_name(cpio->archive, cpio->format);
- if (r != ARCHIVE_OK)
- lafe_errc(1, 0, "%s", archive_error_string(cpio->archive));
- archive_write_set_bytes_per_block(cpio->archive, cpio->bytes_per_block);
- cpio->linkresolver = archive_entry_linkresolver_new();
- archive_entry_linkresolver_set_strategy(cpio->linkresolver,
- archive_format(cpio->archive));
-
- /*
- * The main loop: Copy each file into the output archive.
- */
- r = archive_write_open_file(cpio->archive, cpio->filename);
- if (r != ARCHIVE_OK)
- lafe_errc(1, 0, "%s", archive_error_string(cpio->archive));
- lr = lafe_line_reader("-", cpio->option_null);
- while ((p = lafe_line_reader_next(lr)) != NULL)
- file_to_archive(cpio, p);
- lafe_line_reader_free(lr);
-
- /*
- * The hardlink detection may have queued up a couple of entries
- * that can now be flushed.
- */
- entry = NULL;
- archive_entry_linkify(cpio->linkresolver, &entry, &spare);
- while (entry != NULL) {
- entry_to_archive(cpio, entry);
- archive_entry_free(entry);
- entry = NULL;
- archive_entry_linkify(cpio->linkresolver, &entry, &spare);
- }
-
- r = archive_write_close(cpio->archive);
- if (r != ARCHIVE_OK)
- lafe_errc(1, 0, "%s", archive_error_string(cpio->archive));
-
- if (!cpio->quiet) {
- int64_t blocks =
- (archive_position_uncompressed(cpio->archive) + 511)
- / 512;
- fprintf(stderr, "%lu %s\n", (unsigned long)blocks,
- blocks == 1 ? "block" : "blocks");
- }
- archive_write_finish(cpio->archive);
-}
-
-/*
- * This is used by both out mode (to copy objects from disk into
- * an archive) and pass mode (to copy objects from disk to
- * an archive_write_disk "archive").
- */
-static int
-file_to_archive(struct cpio *cpio, const char *srcpath)
-{
- const char *destpath;
- struct archive_entry *entry, *spare;
- size_t len;
- const char *p;
- int r;
-
- /*
- * Create an archive_entry describing the source file.
- *
- */
- entry = archive_entry_new();
- if (entry == NULL)
- lafe_errc(1, 0, "Couldn't allocate entry");
- archive_entry_copy_sourcepath(entry, srcpath);
- r = archive_read_disk_entry_from_file(cpio->archive_read_disk,
- entry, -1, NULL);
- if (r < ARCHIVE_FAILED)
- lafe_errc(1, 0, "%s",
- archive_error_string(cpio->archive_read_disk));
- if (r < ARCHIVE_OK)
- lafe_warnc(0, "%s",
- archive_error_string(cpio->archive_read_disk));
- if (r <= ARCHIVE_FAILED) {
- cpio->return_value = 1;
- return (r);
- }
-
- if (cpio->uid_override >= 0) {
- archive_entry_set_uid(entry, cpio->uid_override);
- archive_entry_set_uname(entry, cpio->uname_override);
- }
- if (cpio->gid_override >= 0) {
- archive_entry_set_gid(entry, cpio->gid_override);
- archive_entry_set_gname(entry, cpio->gname_override);
- }
-
- /*
- * Generate a destination path for this entry.
- * "destination path" is the name to which it will be copied in
- * pass mode or the name that will go into the archive in
- * output mode.
- */
- destpath = srcpath;
- if (cpio->destdir) {
- len = strlen(cpio->destdir) + strlen(srcpath) + 8;
- if (len >= cpio->pass_destpath_alloc) {
- while (len >= cpio->pass_destpath_alloc) {
- cpio->pass_destpath_alloc += 512;
- cpio->pass_destpath_alloc *= 2;
- }
- free(cpio->pass_destpath);
- cpio->pass_destpath = malloc(cpio->pass_destpath_alloc);
- if (cpio->pass_destpath == NULL)
- lafe_errc(1, ENOMEM,
- "Can't allocate path buffer");
- }
- strcpy(cpio->pass_destpath, cpio->destdir);
- p = srcpath;
- while (p[0] == '/')
- ++p;
- strcat(cpio->pass_destpath, p);
- destpath = cpio->pass_destpath;
- }
- if (cpio->option_rename)
- destpath = cpio_rename(destpath);
- if (destpath == NULL)
- return (0);
- archive_entry_copy_pathname(entry, destpath);
-
- /*
- * If we're trying to preserve hardlinks, match them here.
- */
- spare = NULL;
- if (cpio->linkresolver != NULL
- && archive_entry_filetype(entry) != AE_IFDIR) {
- archive_entry_linkify(cpio->linkresolver, &entry, &spare);
- }
-
- if (entry != NULL) {
- r = entry_to_archive(cpio, entry);
- archive_entry_free(entry);
- if (spare != NULL) {
- if (r == 0)
- r = entry_to_archive(cpio, spare);
- archive_entry_free(spare);
- }
- }
- return (r);
-}
-
-static int
-entry_to_archive(struct cpio *cpio, struct archive_entry *entry)
-{
- const char *destpath = archive_entry_pathname(entry);
- const char *srcpath = archive_entry_sourcepath(entry);
- int fd = -1;
- ssize_t bytes_read;
- int r;
-
- /* Print out the destination name to the user. */
- if (cpio->verbose)
- fprintf(stderr,"%s", destpath);
-
- /*
- * Option_link only makes sense in pass mode and for
- * regular files. Also note: if a link operation fails
- * because of cross-device restrictions, we'll fall back
- * to copy mode for that entry.
- *
- * TODO: Test other cpio implementations to see if they
- * hard-link anything other than regular files here.
- */
- if (cpio->option_link
- && archive_entry_filetype(entry) == AE_IFREG)
- {
- struct archive_entry *t;
- /* Save the original entry in case we need it later. */
- t = archive_entry_clone(entry);
- if (t == NULL)
- lafe_errc(1, ENOMEM, "Can't create link");
- /* Note: link(2) doesn't create parent directories,
- * so we use archive_write_header() instead as a
- * convenience. */
- archive_entry_set_hardlink(t, srcpath);
- /* This is a straight link that carries no data. */
- archive_entry_set_size(t, 0);
- r = archive_write_header(cpio->archive, t);
- archive_entry_free(t);
- if (r != ARCHIVE_OK)
- lafe_warnc(archive_errno(cpio->archive),
- "%s", archive_error_string(cpio->archive));
- if (r == ARCHIVE_FATAL)
- exit(1);
-#ifdef EXDEV
- if (r != ARCHIVE_OK && archive_errno(cpio->archive) == EXDEV) {
- /* Cross-device link: Just fall through and use
- * the original entry to copy the file over. */
- lafe_warnc(0, "Copying file instead");
- } else
-#endif
- return (0);
- }
-
- /*
- * Make sure we can open the file (if necessary) before
- * trying to write the header.
- */
- if (archive_entry_filetype(entry) == AE_IFREG) {
- if (archive_entry_size(entry) > 0) {
- fd = open(srcpath, O_RDONLY | O_BINARY);
- if (fd < 0) {
- lafe_warnc(errno,
- "%s: could not open file", srcpath);
- goto cleanup;
- }
- }
- } else {
- archive_entry_set_size(entry, 0);
- }
-
- r = archive_write_header(cpio->archive, entry);
-
- if (r != ARCHIVE_OK)
- lafe_warnc(archive_errno(cpio->archive),
- "%s: %s",
- srcpath,
- archive_error_string(cpio->archive));
-
- if (r == ARCHIVE_FATAL)
- exit(1);
-
- if (r >= ARCHIVE_WARN && fd >= 0) {
- bytes_read = read(fd, cpio->buff, cpio->buff_size);
- while (bytes_read > 0) {
- r = archive_write_data(cpio->archive,
- cpio->buff, bytes_read);
- if (r < 0)
- lafe_errc(1, archive_errno(cpio->archive),
- "%s", archive_error_string(cpio->archive));
- if (r < bytes_read) {
- lafe_warnc(0,
- "Truncated write; file may have grown while being archived.");
- }
- bytes_read = read(fd, cpio->buff, cpio->buff_size);
- }
- }
-
- fd = restore_time(cpio, entry, srcpath, fd);
-
-cleanup:
- if (cpio->verbose)
- fprintf(stderr,"\n");
- if (fd >= 0)
- close(fd);
- return (0);
-}
-
-static int
-restore_time(struct cpio *cpio, struct archive_entry *entry,
- const char *name, int fd)
-{
-#ifndef HAVE_UTIMES
- static int warned = 0;
-
- (void)cpio; /* UNUSED */
- (void)entry; /* UNUSED */
- (void)name; /* UNUSED */
-
- if (!warned)
- lafe_warnc(0, "Can't restore access times on this platform");
- warned = 1;
- return (fd);
-#else
-#if defined(_WIN32) && !defined(__CYGWIN__)
- struct __timeval times[2];
-#else
- struct timeval times[2];
-#endif
-
- if (!cpio->option_atime_restore)
- return (fd);
-
- times[1].tv_sec = archive_entry_mtime(entry);
- times[1].tv_usec = archive_entry_mtime_nsec(entry) / 1000;
-
- times[0].tv_sec = archive_entry_atime(entry);
- times[0].tv_usec = archive_entry_atime_nsec(entry) / 1000;
-
-#if defined(HAVE_FUTIMES) && !defined(__CYGWIN__)
- if (fd >= 0 && futimes(fd, times) == 0)
- return (fd);
-#endif
- /*
- * Some platform cannot restore access times if the file descriptor
- * is still opened.
- */
- if (fd >= 0) {
- close(fd);
- fd = -1;
- }
-
-#ifdef HAVE_LUTIMES
- if (lutimes(name, times) != 0)
-#else
- if ((AE_IFLNK != archive_entry_filetype(entry))
- && utimes(name, times) != 0)
-#endif
- lafe_warnc(errno, "Can't update time for %s", name);
-#endif
- return (fd);
-}
-
-
-static void
-mode_in(struct cpio *cpio)
-{
- struct archive *a;
- struct archive_entry *entry;
- struct archive *ext;
- const char *destpath;
- int r;
-
- ext = archive_write_disk_new();
- if (ext == NULL)
- lafe_errc(1, 0, "Couldn't allocate restore object");
- r = archive_write_disk_set_options(ext, cpio->extract_flags);
- if (r != ARCHIVE_OK)
- lafe_errc(1, 0, "%s", archive_error_string(ext));
- a = archive_read_new();
- if (a == NULL)
- lafe_errc(1, 0, "Couldn't allocate archive object");
- archive_read_support_compression_all(a);
- archive_read_support_format_all(a);
-
- if (archive_read_open_file(a, cpio->filename, cpio->bytes_per_block))
- lafe_errc(1, archive_errno(a),
- "%s", archive_error_string(a));
- for (;;) {
- r = archive_read_next_header(a, &entry);
- if (r == ARCHIVE_EOF)
- break;
- if (r != ARCHIVE_OK) {
- lafe_errc(1, archive_errno(a),
- "%s", archive_error_string(a));
- }
- if (lafe_excluded(cpio->matching, archive_entry_pathname(entry)))
- continue;
- if (cpio->option_rename) {
- destpath = cpio_rename(archive_entry_pathname(entry));
- archive_entry_set_pathname(entry, destpath);
- } else
- destpath = archive_entry_pathname(entry);
- if (destpath == NULL)
- continue;
- if (cpio->verbose)
- fprintf(stdout, "%s\n", destpath);
- if (cpio->uid_override >= 0)
- archive_entry_set_uid(entry, cpio->uid_override);
- if (cpio->gid_override >= 0)
- archive_entry_set_gid(entry, cpio->gid_override);
- r = archive_write_header(ext, entry);
- if (r != ARCHIVE_OK) {
- fprintf(stderr, "%s: %s\n",
- archive_entry_pathname(entry),
- archive_error_string(ext));
- } else if (archive_entry_size(entry) > 0) {
- r = extract_data(a, ext);
- if (r != ARCHIVE_OK)
- cpio->return_value = 1;
- }
- }
- r = archive_read_close(a);
- if (r != ARCHIVE_OK)
- lafe_errc(1, 0, "%s", archive_error_string(a));
- r = archive_write_close(ext);
- if (r != ARCHIVE_OK)
- lafe_errc(1, 0, "%s", archive_error_string(ext));
- if (!cpio->quiet) {
- int64_t blocks = (archive_position_uncompressed(a) + 511)
- / 512;
- fprintf(stderr, "%lu %s\n", (unsigned long)blocks,
- blocks == 1 ? "block" : "blocks");
- }
- archive_read_finish(a);
- archive_write_finish(ext);
- exit(cpio->return_value);
-}
-
-/*
- * Exits if there's a fatal error. Returns ARCHIVE_OK
- * if everything is kosher.
- */
-static int
-extract_data(struct archive *ar, struct archive *aw)
-{
- int r;
- size_t size;
- const void *block;
- off_t offset;
-
- for (;;) {
- r = archive_read_data_block(ar, &block, &size, &offset);
- if (r == ARCHIVE_EOF)
- return (ARCHIVE_OK);
- if (r != ARCHIVE_OK) {
- lafe_warnc(archive_errno(ar),
- "%s", archive_error_string(ar));
- exit(1);
- }
- r = archive_write_data_block(aw, block, size, offset);
- if (r != ARCHIVE_OK) {
- lafe_warnc(archive_errno(aw),
- "%s", archive_error_string(aw));
- return (r);
- }
- }
-}
-
-static void
-mode_list(struct cpio *cpio)
-{
- struct archive *a;
- struct archive_entry *entry;
- int r;
-
- a = archive_read_new();
- if (a == NULL)
- lafe_errc(1, 0, "Couldn't allocate archive object");
- archive_read_support_compression_all(a);
- archive_read_support_format_all(a);
-
- if (archive_read_open_file(a, cpio->filename, cpio->bytes_per_block))
- lafe_errc(1, archive_errno(a),
- "%s", archive_error_string(a));
- for (;;) {
- r = archive_read_next_header(a, &entry);
- if (r == ARCHIVE_EOF)
- break;
- if (r != ARCHIVE_OK) {
- lafe_errc(1, archive_errno(a),
- "%s", archive_error_string(a));
- }
- if (lafe_excluded(cpio->matching, archive_entry_pathname(entry)))
- continue;
- if (cpio->verbose)
- list_item_verbose(cpio, entry);
- else
- fprintf(stdout, "%s\n", archive_entry_pathname(entry));
- }
- r = archive_read_close(a);
- if (r != ARCHIVE_OK)
- lafe_errc(1, 0, "%s", archive_error_string(a));
- if (!cpio->quiet) {
- int64_t blocks = (archive_position_uncompressed(a) + 511)
- / 512;
- fprintf(stderr, "%lu %s\n", (unsigned long)blocks,
- blocks == 1 ? "block" : "blocks");
- }
- archive_read_finish(a);
- exit(0);
-}
-
-/*
- * Display information about the current file.
- *
- * The format here roughly duplicates the output of 'ls -l'.
- * This is based on SUSv2, where 'tar tv' is documented as
- * listing additional information in an "unspecified format,"
- * and 'pax -l' is documented as using the same format as 'ls -l'.
- */
-static void
-list_item_verbose(struct cpio *cpio, struct archive_entry *entry)
-{
- char size[32];
- char date[32];
- char uids[16], gids[16];
- const char *uname, *gname;
- FILE *out = stdout;
- const char *fmt;
- time_t mtime;
- static time_t now;
-
- if (!now)
- time(&now);
-
- if (cpio->option_numeric_uid_gid) {
- /* Format numeric uid/gid for display. */
- strcpy(uids, cpio_i64toa(archive_entry_uid(entry)));
- uname = uids;
- strcpy(gids, cpio_i64toa(archive_entry_gid(entry)));
- gname = gids;
- } else {
- /* Use uname if it's present, else lookup name from uid. */
- uname = archive_entry_uname(entry);
- if (uname == NULL)
- uname = lookup_uname(cpio, archive_entry_uid(entry));
- /* Use gname if it's present, else lookup name from gid. */
- gname = archive_entry_gname(entry);
- if (gname == NULL)
- gname = lookup_gname(cpio, archive_entry_gid(entry));
- }
-
- /* Print device number or file size. */
- if (archive_entry_filetype(entry) == AE_IFCHR
- || archive_entry_filetype(entry) == AE_IFBLK) {
- snprintf(size, sizeof(size), "%lu,%lu",
- (unsigned long)archive_entry_rdevmajor(entry),
- (unsigned long)archive_entry_rdevminor(entry));
- } else {
- strcpy(size, cpio_i64toa(archive_entry_size(entry)));
- }
-
- /* Format the time using 'ls -l' conventions. */
- mtime = archive_entry_mtime(entry);
-#if defined(_WIN32) && !defined(__CYGWIN__)
- /* Windows' strftime function does not support %e format. */
- if (mtime - now > 365*86400/2
- || mtime - now < -365*86400/2)
- fmt = cpio->day_first ? "%d %b %Y" : "%b %d %Y";
- else
- fmt = cpio->day_first ? "%d %b %H:%M" : "%b %d %H:%M";
-#else
- if (abs(mtime - now) > (365/2)*86400)
- fmt = cpio->day_first ? "%e %b %Y" : "%b %e %Y";
- else
- fmt = cpio->day_first ? "%e %b %H:%M" : "%b %e %H:%M";
-#endif
- strftime(date, sizeof(date), fmt, localtime(&mtime));
-
- fprintf(out, "%s%3d %-8s %-8s %8s %12s %s",
- archive_entry_strmode(entry),
- archive_entry_nlink(entry),
- uname, gname, size, date,
- archive_entry_pathname(entry));
-
- /* Extra information for links. */
- if (archive_entry_hardlink(entry)) /* Hard link */
- fprintf(out, " link to %s", archive_entry_hardlink(entry));
- else if (archive_entry_symlink(entry)) /* Symbolic link */
- fprintf(out, " -> %s", archive_entry_symlink(entry));
- fprintf(out, "\n");
-}
-
-static void
-mode_pass(struct cpio *cpio, const char *destdir)
-{
- struct lafe_line_reader *lr;
- const char *p;
- int r;
-
- /* Ensure target dir has a trailing '/' to simplify path surgery. */
- cpio->destdir = malloc(strlen(destdir) + 8);
- strcpy(cpio->destdir, destdir);
- if (destdir[strlen(destdir) - 1] != '/')
- strcat(cpio->destdir, "/");
-
- cpio->archive = archive_write_disk_new();
- if (cpio->archive == NULL)
- lafe_errc(1, 0, "Failed to allocate archive object");
- r = archive_write_disk_set_options(cpio->archive, cpio->extract_flags);
- if (r != ARCHIVE_OK)
- lafe_errc(1, 0, "%s", archive_error_string(cpio->archive));
- cpio->linkresolver = archive_entry_linkresolver_new();
- archive_write_disk_set_standard_lookup(cpio->archive);
-
- cpio->archive_read_disk = archive_read_disk_new();
- if (cpio->archive_read_disk == NULL)
- lafe_errc(1, 0, "Failed to allocate archive object");
- if (cpio->option_follow_links)
- archive_read_disk_set_symlink_logical(cpio->archive_read_disk);
- else
- archive_read_disk_set_symlink_physical(cpio->archive_read_disk);
- archive_read_disk_set_standard_lookup(cpio->archive_read_disk);
-
- lr = lafe_line_reader("-", cpio->option_null);
- while ((p = lafe_line_reader_next(lr)) != NULL)
- file_to_archive(cpio, p);
- lafe_line_reader_free(lr);
-
- archive_entry_linkresolver_free(cpio->linkresolver);
- r = archive_write_close(cpio->archive);
- if (r != ARCHIVE_OK)
- lafe_errc(1, 0, "%s", archive_error_string(cpio->archive));
-
- if (!cpio->quiet) {
- int64_t blocks =
- (archive_position_uncompressed(cpio->archive) + 511)
- / 512;
- fprintf(stderr, "%lu %s\n", (unsigned long)blocks,
- blocks == 1 ? "block" : "blocks");
- }
-
- archive_write_finish(cpio->archive);
-}
-
-/*
- * Prompt for a new name for this entry. Returns a pointer to the
- * new name or NULL if the entry should not be copied. This
- * implements the semantics defined in POSIX.1-1996, which specifies
- * that an input of '.' means the name should be unchanged. GNU cpio
- * treats '.' as a literal new name.
- */
-static const char *
-cpio_rename(const char *name)
-{
- static char buff[1024];
- FILE *t;
- char *p, *ret;
-
- t = fopen("/dev/tty", "r+");
- if (t == NULL)
- return (name);
- fprintf(t, "%s (Enter/./(new name))? ", name);
- fflush(t);
-
- p = fgets(buff, sizeof(buff), t);
- fclose(t);
- if (p == NULL)
- /* End-of-file is a blank line. */
- return (NULL);
-
- while (*p == ' ' || *p == '\t')
- ++p;
- if (*p == '\n' || *p == '\0')
- /* Empty line. */
- return (NULL);
- if (*p == '.' && p[1] == '\n')
- /* Single period preserves original name. */
- return (name);
- ret = p;
- /* Trim the final newline. */
- while (*p != '\0' && *p != '\n')
- ++p;
- /* Overwrite the final \n with a null character. */
- *p = '\0';
- return (ret);
-}
-
-static void
-free_cache(struct name_cache *cache)
-{
- size_t i;
-
- if (cache != NULL) {
- for (i = 0; i < cache->size; i++)
- free(cache->cache[i].name);
- free(cache);
- }
-}
-
-/*
- * Lookup uname/gname from uid/gid, return NULL if no match.
- */
-static const char *
-lookup_name(struct cpio *cpio, struct name_cache **name_cache_variable,
- int (*lookup_fn)(struct cpio *, const char **, id_t), id_t id)
-{
- char asnum[16];
- struct name_cache *cache;
- const char *name;
- int slot;
-
-
- if (*name_cache_variable == NULL) {
- *name_cache_variable = malloc(sizeof(struct name_cache));
- if (*name_cache_variable == NULL)
- lafe_errc(1, ENOMEM, "No more memory");
- memset(*name_cache_variable, 0, sizeof(struct name_cache));
- (*name_cache_variable)->size = name_cache_size;
- }
-
- cache = *name_cache_variable;
- cache->probes++;
-
- slot = id % cache->size;
- if (cache->cache[slot].name != NULL) {
- if (cache->cache[slot].id == id) {
- cache->hits++;
- return (cache->cache[slot].name);
- }
- free(cache->cache[slot].name);
- cache->cache[slot].name = NULL;
- }
-
- if (lookup_fn(cpio, &name, id) == 0) {
- if (name == NULL || name[0] == '\0') {
- /* If lookup failed, format it as a number. */
- snprintf(asnum, sizeof(asnum), "%u", (unsigned)id);
- name = asnum;
- }
- cache->cache[slot].name = strdup(name);
- if (cache->cache[slot].name != NULL) {
- cache->cache[slot].id = id;
- return (cache->cache[slot].name);
- }
- /*
- * Conveniently, NULL marks an empty slot, so
- * if the strdup() fails, we've just failed to
- * cache it. No recovery necessary.
- */
- }
- return (NULL);
-}
-
-static const char *
-lookup_uname(struct cpio *cpio, uid_t uid)
-{
- return (lookup_name(cpio, &cpio->uname_cache,
- &lookup_uname_helper, (id_t)uid));
-}
-
-static int
-lookup_uname_helper(struct cpio *cpio, const char **name, id_t id)
-{
- struct passwd *pwent;
-
- (void)cpio; /* UNUSED */
-
- errno = 0;
- pwent = getpwuid((uid_t)id);
- if (pwent == NULL) {
- *name = NULL;
- if (errno != 0 && errno != ENOENT)
- lafe_warnc(errno, "getpwuid(%d) failed", id);
- return (errno);
- }
-
- *name = pwent->pw_name;
- return (0);
-}
-
-static const char *
-lookup_gname(struct cpio *cpio, gid_t gid)
-{
- return (lookup_name(cpio, &cpio->gname_cache,
- &lookup_gname_helper, (id_t)gid));
-}
-
-static int
-lookup_gname_helper(struct cpio *cpio, const char **name, id_t id)
-{
- struct group *grent;
-
- (void)cpio; /* UNUSED */
-
- errno = 0;
- grent = getgrgid((gid_t)id);
- if (grent == NULL) {
- *name = NULL;
- if (errno != 0)
- lafe_warnc(errno, "getgrgid(%d) failed", id);
- return (errno);
- }
-
- *name = grent->gr_name;
- return (0);
-}
-
-/*
- * It would be nice to just use printf() for formatting large numbers,
- * but the compatibility problems are a big headache. Hence the
- * following simple utility function.
- */
-const char *
-cpio_i64toa(int64_t n0)
-{
- // 2^64 =~ 1.8 * 10^19, so 20 decimal digits suffice.
- // We also need 1 byte for '-' and 1 for '\0'.
- static char buff[22];
- int64_t n = n0 < 0 ? -n0 : n0;
- char *p = buff + sizeof(buff);
-
- *--p = '\0';
- do {
- *--p = '0' + (int)(n % 10);
- n /= 10;
- } while (n > 0);
- if (n0 < 0)
- *--p = '-';
- return p;
-}
diff --git a/usr.bin/cpio/cpio.h b/usr.bin/cpio/cpio.h
deleted file mode 100644
index 2d5b548..0000000
--- a/usr.bin/cpio/cpio.h
+++ /dev/null
@@ -1,111 +0,0 @@
-/*-
- * Copyright (c) 2003-2007 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 CPIO_H_INCLUDED
-#define CPIO_H_INCLUDED
-
-#include "cpio_platform.h"
-#include <stdio.h>
-
-#include "matching.h"
-
-/*
- * The internal state for the "cpio" program.
- *
- * Keeping all of the state in a structure like this simplifies memory
- * leak testing (at exit, anything left on the heap is suspect). A
- * pointer to this structure is passed to most cpio internal
- * functions.
- */
-struct cpio {
- /* Option parsing */
- const char *optarg;
-
- /* Options */
- const char *filename;
- char mode; /* -i -o -p */
- char compress; /* -j, -y, or -z */
- const char *format; /* -H format */
- int bytes_per_block; /* -b block_size */
- int verbose; /* -v */
- int quiet; /* --quiet */
- int extract_flags; /* Flags for extract operation */
- char symlink_mode; /* H or L, per BSD conventions */
- const char *compress_program;
- int option_append; /* -A, only relevant for -o */
- int option_atime_restore; /* -a */
- int option_follow_links; /* -L */
- int option_link; /* -l */
- int option_list; /* -t */
- char option_null; /* --null */
- int option_numeric_uid_gid; /* -n */
- int option_rename; /* -r */
- char *destdir;
- size_t pass_destpath_alloc;
- char *pass_destpath;
- int uid_override;
- char *uname_override;
- int gid_override;
- char *gname_override;
- int day_first; /* true if locale prefers day/mon */
-
- /* If >= 0, then close this when done. */
- int fd;
-
- /* Miscellaneous state information */
- struct archive *archive;
- struct archive *archive_read_disk;
- int argc;
- char **argv;
- int return_value; /* Value returned by main() */
- struct archive_entry_linkresolver *linkresolver;
-
- struct name_cache *uname_cache;
- struct name_cache *gname_cache;
-
- /* Work data. */
- struct lafe_matching *matching;
- char *buff;
- size_t buff_size;
-};
-
-const char *owner_parse(const char *, int *, int *);
-
-
-/* Fake short equivalents for long options that otherwise lack them. */
-enum {
- OPTION_INSECURE = 1,
- OPTION_LZMA,
- OPTION_NO_PRESERVE_OWNER,
- OPTION_PRESERVE_OWNER,
- OPTION_QUIET,
- OPTION_VERSION
-};
-
-int cpio_getopt(struct cpio *cpio);
-
-#endif
diff --git a/usr.bin/cpio/cpio_platform.h b/usr.bin/cpio/cpio_platform.h
deleted file mode 100644
index 3043828..0000000
--- a/usr.bin/cpio/cpio_platform.h
+++ /dev/null
@@ -1,77 +0,0 @@
-/*-
- * Copyright (c) 2003-2007 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$
- */
-
-/*
- * This header is the first thing included in any of the cpio
- * source files. As far as possible, platform-specific issues should
- * be dealt with here and not within individual source files.
- */
-
-#ifndef CPIO_PLATFORM_H_INCLUDED
-#define CPIO_PLATFORM_H_INCLUDED
-
-#if defined(PLATFORM_CONFIG_H)
-/* Use hand-built config.h in environments that need it. */
-#include PLATFORM_CONFIG_H
-#else
-/* Read config.h or die trying. */
-#include "config.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
-
-#ifdef HAVE_LIBARCHIVE
-/* If we're using the platform libarchive, include system headers. */
-#include <archive.h>
-#include <archive_entry.h>
-#else
-/* Otherwise, include user headers. */
-#include "archive.h"
-#include "archive_entry.h"
-#endif
-
-/* How to mark functions that don't return. */
-#if defined(__GNUC__) && (__GNUC__ > 2 || \
- (__GNUC__ == 2 && __GNUC_MINOR__ >= 5))
-#define __LA_DEAD __attribute__((__noreturn__))
-#else
-#define __LA_DEAD
-#endif
-
-#if defined(_WIN32) && !defined(__CYGWIN__)
-#include "cpio_windows.h"
-#endif
-
-#endif /* !CPIO_PLATFORM_H_INCLUDED */
diff --git a/usr.bin/cpio/test/Makefile b/usr.bin/cpio/test/Makefile
index e1b94f1..850373b 100644
--- a/usr.bin/cpio/test/Makefile
+++ b/usr.bin/cpio/test/Makefile
@@ -1,14 +1,14 @@
# $FreeBSD$
-# Where to find the cpio sources (for the internal unit tests)
-CPIO_SRCDIR=${.CURDIR}/..
+LIBARCHIVEDIR= ${.CURDIR}/../../../contrib/libarchive
-.PATH: ${CPIO_SRCDIR}
+.PATH: ${LIBARCHIVEDIR}/cpio
CPIO_SRCS= cmdline.c
-.PATH: ${.CURDIR}/../../../lib/libarchive/libarchive_fe
+.PATH: ${LIBARCHIVEDIR}/libarchive_fe
CPIO_SRCS+= err.c pathmatch.c
+.PATH: ${LIBARCHIVEDIR}/cpio/test
TESTS= \
test_0.c \
test_basic.c \
@@ -49,29 +49,30 @@ NO_MAN=yes
PROG=bsdcpio_test
DPADD=${LIBARCHIVE} ${LIBBZ2} ${LIBZ} ${LIBLZMA}
-CFLAGS+= -DPLATFORM_CONFIG_H=\"config_freebsd.h\"
-CFLAGS+= -I..
+CFLAGS+= -DPLATFORM_CONFIG_H=\"${.CURDIR}/../config_freebsd.h\"
+CFLAGS+= -I${.CURDIR}/..
LDADD= -larchive -lz -lbz2 -llzma
#CFLAGS+= -static -g -O2 -Wall
CFLAGS+= -g -O2 -Wall
CFLAGS+= -I${.OBJDIR}
-CFLAGS+= -I${CPIO_SRCDIR}
-CFLAGS+= -I${.CURDIR}/../../../lib/libarchive/libarchive_fe
+CFLAGS+= -I${LIBARCHIVEDIR}/cpio -I${LIBARCHIVEDIR}/libarchive_fe
# Uncomment to link against dmalloc
#LDADD+= -L/usr/local/lib -ldmalloc
#CFLAGS+= -I/usr/local/include -DUSE_DMALLOC
check test: bsdcpio_test
- ${.OBJDIR}/bsdcpio_test -p ${.OBJDIR}/../bsdcpio -r ${.CURDIR}
+ ${.OBJDIR}/bsdcpio_test -p ${.OBJDIR}/../bsdcpio \
+ -r ${LIBARCHIVEDIR}/cpio/test
${.OBJDIR}/list.h list.h: ${TESTS} Makefile
- (cd ${.CURDIR}; cat ${TESTS}) | grep DEFINE_TEST > list.h
+ (cd ${LIBARCHIVEDIR}/cpio/test; cat ${TESTS}) | \
+ grep DEFINE_TEST > ${.OBJDIR}/list.h
clean:
rm -f ${CLEANFILES}
rm -f *~
-chmod -R +w /tmp/bsdcpio_test.*
- rm -rf /tmp/bsdcpio_test.*
+ rm -rf /tmp/bsdcpio_test
.include <bsd.prog.mk>
diff --git a/usr.bin/cpio/test/main.c b/usr.bin/cpio/test/main.c
deleted file mode 100644
index bca4c96..0000000
--- a/usr.bin/cpio/test/main.c
+++ /dev/null
@@ -1,2140 +0,0 @@
-/*
- * Copyright (c) 2003-2009 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.
- */
-
-#include "test.h"
-#include <errno.h>
-#include <locale.h>
-#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$");
-#define KNOWNREF "test_option_f.cpio.uu"
-#define ENVBASE "BSDCPIO" /* Prefix for environment variables. */
-#define PROGRAM "bsdcpio" /* Name of program being tested. */
-#undef LIBRARY /* Not testing a library. */
-#undef EXTRA_DUMP /* How to dump extra data */
-/* How to generate extra version info. */
-#define EXTRA_VERSION (systemf("%s --version", testprog) ? "" : "")
-
-/*
- *
- * Windows support routines
- *
- * Note: Configuration is a tricky issue. Using HAVE_* feature macros
- * in the test harness is dangerous because they cover up
- * configuration errors. The classic example of this is omitting a
- * configure check. If libarchive and libarchive_test both look for
- * the same feature macro, such errors are hard to detect. Platform
- * macros (e.g., _WIN32 or __GNUC__) are a little better, but can
- * easily lead to very messy code. It's best to limit yourself
- * to only the most generic programming techniques in the test harness
- * and thus avoid conditionals altogether. Where that's not possible,
- * try to minimize conditionals by grouping platform-specific tests in
- * one place (e.g., test_acl_freebsd) or by adding new assert()
- * functions (e.g., assertMakeHardlink()) to cover up platform
- * differences. Platform-specific coding in libarchive_test is often
- * a symptom that some capability is missing from libarchive itself.
- */
-#if defined(_WIN32) && !defined(__CYGWIN__)
-#include <io.h>
-#include <windows.h>
-#ifndef F_OK
-#define F_OK (0)
-#endif
-#ifndef S_ISDIR
-#define S_ISDIR(m) ((m) & _S_IFDIR)
-#endif
-#ifndef S_ISREG
-#define S_ISREG(m) ((m) & _S_IFREG)
-#endif
-#if !defined(__BORLANDC__)
-#define access _access
-#define chdir _chdir
-#endif
-#ifndef fileno
-#define fileno _fileno
-#endif
-/*#define fstat _fstat64*/
-#if !defined(__BORLANDC__)
-#define getcwd _getcwd
-#endif
-#define lstat stat
-/*#define lstat _stat64*/
-/*#define stat _stat64*/
-#define rmdir _rmdir
-#if !defined(__BORLANDC__)
-#define strdup _strdup
-#define umask _umask
-#endif
-#define int64_t __int64
-#endif
-
-#if defined(HAVE__CrtSetReportMode)
-# include <crtdbg.h>
-#endif
-
-#if defined(_WIN32) && !defined(__CYGWIN__)
-void *GetFunctionKernel32(const char *name)
-{
- static HINSTANCE lib;
- static int set;
- if (!set) {
- set = 1;
- lib = LoadLibrary("kernel32.dll");
- }
- if (lib == NULL) {
- fprintf(stderr, "Can't load kernel32.dll?!\n");
- exit(1);
- }
- return (void *)GetProcAddress(lib, name);
-}
-
-static int
-my_CreateSymbolicLinkA(const char *linkname, const char *target, int flags)
-{
- static BOOLEAN (WINAPI *f)(LPCSTR, LPCSTR, DWORD);
- static int set;
- if (!set) {
- set = 1;
- f = GetFunctionKernel32("CreateSymbolicLinkA");
- }
- return f == NULL ? 0 : (*f)(linkname, target, flags);
-}
-
-static int
-my_CreateHardLinkA(const char *linkname, const char *target)
-{
- static BOOLEAN (WINAPI *f)(LPCSTR, LPCSTR, LPSECURITY_ATTRIBUTES);
- static int set;
- if (!set) {
- set = 1;
- f = GetFunctionKernel32("CreateHardLinkA");
- }
- return f == NULL ? 0 : (*f)(linkname, target, NULL);
-}
-
-int
-my_GetFileInformationByName(const char *path, BY_HANDLE_FILE_INFORMATION *bhfi)
-{
- HANDLE h;
- int r;
-
- memset(bhfi, 0, sizeof(*bhfi));
- h = CreateFile(path, FILE_READ_ATTRIBUTES, 0, NULL,
- OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
- if (h == INVALID_HANDLE_VALUE)
- return (0);
- r = GetFileInformationByHandle(h, bhfi);
- CloseHandle(h);
- return (r);
-}
-#endif
-
-#if defined(HAVE__CrtSetReportMode)
-static void
-invalid_parameter_handler(const wchar_t * expression,
- const wchar_t * function, const wchar_t * file,
- unsigned int line, uintptr_t pReserved)
-{
- /* nop */
-}
-#endif
-
-/*
- *
- * OPTIONS FLAGS
- *
- */
-
-/* Enable core dump on failure. */
-static int dump_on_failure = 0;
-/* Default is to remove temp dirs and log data for successful tests. */
-static int keep_temp_files = 0;
-/* Default is to just report pass/fail for each test. */
-static int verbosity = 0;
-#define VERBOSITY_SUMMARY_ONLY -1 /* -q */
-#define VERBOSITY_PASSFAIL 0 /* Default */
-#define VERBOSITY_LIGHT_REPORT 1 /* -v */
-#define VERBOSITY_FULL 2 /* -vv */
-/* A few places generate even more output for verbosity > VERBOSITY_FULL,
- * mostly for debugging the test harness itself. */
-/* Cumulative count of assertion failures. */
-static int failures = 0;
-/* Cumulative count of reported skips. */
-static int skips = 0;
-/* Cumulative count of assertions checked. */
-static int assertions = 0;
-
-/* Directory where uuencoded reference files can be found. */
-static const char *refdir;
-
-/*
- * Report log information selectively to console and/or disk log.
- */
-static int log_console = 0;
-static FILE *logfile;
-static void
-vlogprintf(const char *fmt, va_list ap)
-{
-#ifdef va_copy
- va_list lfap;
- va_copy(lfap, ap);
-#endif
- if (log_console)
- vfprintf(stdout, fmt, ap);
- if (logfile != NULL)
-#ifdef va_copy
- vfprintf(logfile, fmt, lfap);
- va_end(lfap);
-#else
- vfprintf(logfile, fmt, ap);
-#endif
-}
-
-static void
-logprintf(const char *fmt, ...)
-{
- va_list ap;
- va_start(ap, fmt);
- vlogprintf(fmt, ap);
- va_end(ap);
-}
-
-/* Set up a message to display only if next assertion fails. */
-static char msgbuff[4096];
-static const char *msg, *nextmsg;
-void
-failure(const char *fmt, ...)
-{
- va_list ap;
- va_start(ap, fmt);
- vsprintf(msgbuff, fmt, ap);
- va_end(ap);
- nextmsg = msgbuff;
-}
-
-/*
- * Copy arguments into file-local variables.
- * This was added to permit vararg assert() functions without needing
- * variadic wrapper macros. Turns out that the vararg capability is almost
- * never used, so almost all of the vararg assertions can be simplified
- * by removing the vararg capability and reworking the wrapper macro to
- * pass __FILE__, __LINE__ directly into the function instead of using
- * this hook. I suspect this machinery is used so rarely that we
- * would be better off just removing it entirely. That would simplify
- * the code here noticably.
- */
-static const char *test_filename;
-static int test_line;
-static void *test_extra;
-void assertion_setup(const char *filename, int line)
-{
- test_filename = filename;
- test_line = line;
-}
-
-/* Called at the beginning of each assert() function. */
-static void
-assertion_count(const char *file, int line)
-{
- (void)file; /* UNUSED */
- (void)line; /* UNUSED */
- ++assertions;
- /* Proper handling of "failure()" message. */
- msg = nextmsg;
- nextmsg = NULL;
- /* Uncomment to print file:line after every assertion.
- * Verbose, but occasionally useful in tracking down crashes. */
- /* printf("Checked %s:%d\n", file, line); */
-}
-
-/*
- * For each test source file, we remember how many times each
- * assertion was reported. Cleared before each new test,
- * used by test_summarize().
- */
-static struct line {
- int count;
- int skip;
-} failed_lines[10000];
-
-/* Count this failure, setup up log destination and handle initial report. */
-static void
-failure_start(const char *filename, int line, const char *fmt, ...)
-{
- va_list ap;
-
- /* Record another failure for this line. */
- ++failures;
- /* test_filename = filename; */
- failed_lines[line].count++;
-
- /* Determine whether to log header to console. */
- switch (verbosity) {
- case VERBOSITY_FULL:
- log_console = 1;
- break;
- case VERBOSITY_LIGHT_REPORT:
- log_console = (failed_lines[line].count < 2);
- break;
- default:
- log_console = 0;
- }
-
- /* Log file:line header for this failure */
- va_start(ap, fmt);
-#if _MSC_VER
- logprintf("%s(%d): ", filename, line);
-#else
- logprintf("%s:%d: ", filename, line);
-#endif
- vlogprintf(fmt, ap);
- va_end(ap);
- logprintf("\n");
-
- if (msg != NULL && msg[0] != '\0') {
- logprintf(" Description: %s\n", msg);
- msg = NULL;
- }
-
- /* Determine whether to log details to console. */
- if (verbosity == VERBOSITY_LIGHT_REPORT)
- log_console = 0;
-}
-
-/* Complete reporting of failed tests. */
-/*
- * The 'extra' hook here is used by libarchive to include libarchive
- * error messages with assertion failures. It could also be used
- * to add strerror() output, for example. Just define the EXTRA_DUMP()
- * macro appropriately.
- */
-static void
-failure_finish(void *extra)
-{
- (void)extra; /* UNUSED (maybe) */
-#ifdef EXTRA_DUMP
- if (extra != NULL)
- logprintf(" detail: %s\n", EXTRA_DUMP(extra));
-#endif
-
- if (dump_on_failure) {
- fprintf(stderr,
- " *** forcing core dump so failure can be debugged ***\n");
- *(char *)(NULL) = 0;
- exit(1);
- }
-}
-
-/* Inform user that we're skipping some checks. */
-void
-test_skipping(const char *fmt, ...)
-{
- char buff[1024];
- va_list ap;
-
- va_start(ap, fmt);
- vsprintf(buff, fmt, ap);
- va_end(ap);
- /* failure_start() isn't quite right, but is awfully convenient. */
- failure_start(test_filename, test_line, "SKIPPING: %s", buff);
- --failures; /* Undo failures++ in failure_start() */
- /* Don't failure_finish() here. */
- /* Mark as skip, so doesn't count as failed test. */
- failed_lines[test_line].skip = 1;
- ++skips;
-}
-
-/*
- *
- * ASSERTIONS
- *
- */
-
-/* Generic assert() just displays the failed condition. */
-int
-assertion_assert(const char *file, int line, int value,
- const char *condition, void *extra)
-{
- assertion_count(file, line);
- if (!value) {
- failure_start(file, line, "Assertion failed: %s", condition);
- failure_finish(extra);
- }
- return (value);
-}
-
-/* chdir() and report any errors */
-int
-assertion_chdir(const char *file, int line, const char *pathname)
-{
- assertion_count(file, line);
- if (chdir(pathname) == 0)
- return (1);
- failure_start(file, line, "chdir(\"%s\")", pathname);
- failure_finish(NULL);
- return (0);
-
-}
-
-/* Verify two integers are equal. */
-int
-assertion_equal_int(const char *file, int line,
- long long v1, const char *e1, long long v2, const char *e2, void *extra)
-{
- assertion_count(file, line);
- if (v1 == v2)
- return (1);
- failure_start(file, line, "%s != %s", e1, e2);
- logprintf(" %s=%lld (0x%llx, 0%llo)\n", e1, v1, v1, v1);
- logprintf(" %s=%lld (0x%llx, 0%llo)\n", e2, v2, v2, v2);
- failure_finish(extra);
- return (0);
-}
-
-static void strdump(const char *e, const char *p)
-{
- const char *q = p;
-
- logprintf(" %s = ", e);
- if (p == NULL) {
- logprintf("NULL");
- return;
- }
- logprintf("\"");
- while (*p != '\0') {
- unsigned int c = 0xff & *p++;
- switch (c) {
- case '\a': printf("\a"); break;
- case '\b': printf("\b"); break;
- case '\n': printf("\n"); break;
- case '\r': printf("\r"); break;
- default:
- if (c >= 32 && c < 127)
- logprintf("%c", c);
- else
- logprintf("\\x%02X", c);
- }
- }
- logprintf("\"");
- logprintf(" (length %d)\n", q == NULL ? -1 : (int)strlen(q));
-}
-
-/* Verify two strings are equal, dump them if not. */
-int
-assertion_equal_string(const char *file, int line,
- const char *v1, const char *e1,
- const char *v2, const char *e2,
- void *extra)
-{
- assertion_count(file, line);
- if (v1 == v2 || (v1 != NULL && v2 != NULL && strcmp(v1, v2) == 0))
- return (1);
- failure_start(file, line, "%s != %s", e1, e2);
- strdump(e1, v1);
- strdump(e2, v2);
- failure_finish(extra);
- return (0);
-}
-
-static void
-wcsdump(const char *e, const wchar_t *w)
-{
- logprintf(" %s = ", e);
- if (w == NULL) {
- logprintf("(null)");
- return;
- }
- logprintf("\"");
- while (*w != L'\0') {
- unsigned int c = *w++;
- if (c >= 32 && c < 127)
- logprintf("%c", c);
- else if (c < 256)
- logprintf("\\x%02X", c);
- else if (c < 0x10000)
- logprintf("\\u%04X", c);
- else
- logprintf("\\U%08X", c);
- }
- logprintf("\"\n");
-}
-
-#ifndef HAVE_WCSCMP
-static int
-wcscmp(const wchar_t *s1, const wchar_t *s2)
-{
-
- while (*s1 == *s2++) {
- if (*s1++ == L'\0')
- return 0;
- }
- if (*s1 > *--s2)
- return 1;
- else
- return -1;
-}
-#endif
-
-/* Verify that two wide strings are equal, dump them if not. */
-int
-assertion_equal_wstring(const char *file, int line,
- const wchar_t *v1, const char *e1,
- const wchar_t *v2, const char *e2,
- void *extra)
-{
- assertion_count(file, line);
- if (v1 == v2 || wcscmp(v1, v2) == 0)
- return (1);
- failure_start(file, line, "%s != %s", e1, e2);
- wcsdump(e1, v1);
- wcsdump(e2, v2);
- failure_finish(extra);
- return (0);
-}
-
-/*
- * Pretty standard hexdump routine. As a bonus, if ref != NULL, then
- * any bytes in p that differ from ref will be highlighted with '_'
- * before and after the hex value.
- */
-static void
-hexdump(const char *p, const char *ref, size_t l, size_t offset)
-{
- size_t i, j;
- char sep;
-
- if (p == NULL) {
- logprintf("(null)\n");
- return;
- }
- for(i=0; i < l; i+=16) {
- logprintf("%04x", (unsigned)(i + offset));
- sep = ' ';
- for (j = 0; j < 16 && i + j < l; j++) {
- if (ref != NULL && p[i + j] != ref[i + j])
- sep = '_';
- logprintf("%c%02x", sep, 0xff & (int)p[i+j]);
- if (ref != NULL && p[i + j] == ref[i + j])
- sep = ' ';
- }
- for (; j < 16; j++) {
- logprintf("%c ", sep);
- sep = ' ';
- }
- logprintf("%c", sep);
- for (j=0; j < 16 && i + j < l; j++) {
- int c = p[i + j];
- if (c >= ' ' && c <= 126)
- logprintf("%c", c);
- else
- logprintf(".");
- }
- logprintf("\n");
- }
-}
-
-/* Verify that two blocks of memory are the same, display the first
- * block of differences if they're not. */
-int
-assertion_equal_mem(const char *file, int line,
- const void *_v1, const char *e1,
- const void *_v2, const char *e2,
- size_t l, const char *ld, void *extra)
-{
- const char *v1 = (const char *)_v1;
- const char *v2 = (const char *)_v2;
- size_t offset;
-
- assertion_count(file, line);
- if (v1 == v2 || (v1 != NULL && v2 != NULL && memcmp(v1, v2, l) == 0))
- return (1);
-
- failure_start(file, line, "%s != %s", e1, e2);
- logprintf(" size %s = %d\n", ld, (int)l);
- /* Dump 48 bytes (3 lines) so that the first difference is
- * in the second line. */
- offset = 0;
- while (l > 64 && memcmp(v1, v2, 32) == 0) {
- /* Two lines agree, so step forward one line. */
- v1 += 16;
- v2 += 16;
- l -= 16;
- offset += 16;
- }
- logprintf(" Dump of %s\n", e1);
- hexdump(v1, v2, l < 64 ? l : 64, offset);
- logprintf(" Dump of %s\n", e2);
- hexdump(v2, v1, l < 64 ? l : 64, offset);
- logprintf("\n");
- failure_finish(extra);
- return (0);
-}
-
-/* Verify that the named file exists and is empty. */
-int
-assertion_empty_file(const char *f1fmt, ...)
-{
- char buff[1024];
- char f1[1024];
- struct stat st;
- va_list ap;
- ssize_t s;
- FILE *f;
-
- assertion_count(test_filename, test_line);
- va_start(ap, f1fmt);
- vsprintf(f1, f1fmt, ap);
- va_end(ap);
-
- if (stat(f1, &st) != 0) {
- failure_start(test_filename, test_line, "Stat failed: %s", f1);
- failure_finish(NULL);
- return (0);
- }
- if (st.st_size == 0)
- return (1);
-
- failure_start(test_filename, test_line, "File should be empty: %s", f1);
- logprintf(" File size: %d\n", (int)st.st_size);
- logprintf(" Contents:\n");
- f = fopen(f1, "rb");
- if (f == NULL) {
- logprintf(" Unable to open %s\n", f1);
- } else {
- s = ((off_t)sizeof(buff) < st.st_size) ?
- (ssize_t)sizeof(buff) : (ssize_t)st.st_size;
- s = fread(buff, 1, s, f);
- hexdump(buff, NULL, s, 0);
- fclose(f);
- }
- failure_finish(NULL);
- return (0);
-}
-
-/* Verify that the named file exists and is not empty. */
-int
-assertion_non_empty_file(const char *f1fmt, ...)
-{
- char f1[1024];
- struct stat st;
- va_list ap;
-
- assertion_count(test_filename, test_line);
- va_start(ap, f1fmt);
- vsprintf(f1, f1fmt, ap);
- va_end(ap);
-
- if (stat(f1, &st) != 0) {
- failure_start(test_filename, test_line, "Stat failed: %s", f1);
- failure_finish(NULL);
- return (0);
- }
- if (st.st_size == 0) {
- failure_start(test_filename, test_line, "File empty: %s", f1);
- failure_finish(NULL);
- return (0);
- }
- return (1);
-}
-
-/* Verify that two files have the same contents. */
-/* TODO: hexdump the first bytes that actually differ. */
-int
-assertion_equal_file(const char *fn1, const char *f2pattern, ...)
-{
- char fn2[1024];
- va_list ap;
- char buff1[1024];
- char buff2[1024];
- FILE *f1, *f2;
- int n1, n2;
-
- assertion_count(test_filename, test_line);
- va_start(ap, f2pattern);
- vsprintf(fn2, f2pattern, ap);
- va_end(ap);
-
- f1 = fopen(fn1, "rb");
- f2 = fopen(fn2, "rb");
- for (;;) {
- n1 = fread(buff1, 1, sizeof(buff1), f1);
- n2 = fread(buff2, 1, sizeof(buff2), f2);
- if (n1 != n2)
- break;
- if (n1 == 0 && n2 == 0) {
- fclose(f1);
- fclose(f2);
- return (1);
- }
- if (memcmp(buff1, buff2, n1) != 0)
- break;
- }
- fclose(f1);
- fclose(f2);
- failure_start(test_filename, test_line, "Files not identical");
- logprintf(" file1=\"%s\"\n", fn1);
- logprintf(" file2=\"%s\"\n", fn2);
- failure_finish(test_extra);
- return (0);
-}
-
-/* Verify that the named file does exist. */
-int
-assertion_file_exists(const char *fpattern, ...)
-{
- char f[1024];
- va_list ap;
-
- assertion_count(test_filename, test_line);
- va_start(ap, fpattern);
- vsprintf(f, fpattern, ap);
- va_end(ap);
-
-#if defined(_WIN32) && !defined(__CYGWIN__)
- if (!_access(f, 0))
- return (1);
-#else
- if (!access(f, F_OK))
- return (1);
-#endif
- failure_start(test_filename, test_line, "File should exist: %s", f);
- failure_finish(test_extra);
- return (0);
-}
-
-/* Verify that the named file doesn't exist. */
-int
-assertion_file_not_exists(const char *fpattern, ...)
-{
- char f[1024];
- va_list ap;
-
- assertion_count(test_filename, test_line);
- va_start(ap, fpattern);
- vsprintf(f, fpattern, ap);
- va_end(ap);
-
-#if defined(_WIN32) && !defined(__CYGWIN__)
- if (_access(f, 0))
- return (1);
-#else
- if (access(f, F_OK))
- return (1);
-#endif
- failure_start(test_filename, test_line, "File should not exist: %s", f);
- failure_finish(test_extra);
- return (0);
-}
-
-/* Compare the contents of a file to a block of memory. */
-int
-assertion_file_contents(const void *buff, int s, const char *fpattern, ...)
-{
- char fn[1024];
- va_list ap;
- char *contents;
- FILE *f;
- int n;
-
- assertion_count(test_filename, test_line);
- va_start(ap, fpattern);
- vsprintf(fn, fpattern, ap);
- va_end(ap);
-
- f = fopen(fn, "rb");
- if (f == NULL) {
- failure_start(test_filename, test_line,
- "File should exist: %s", fn);
- failure_finish(test_extra);
- return (0);
- }
- contents = malloc(s * 2);
- n = fread(contents, 1, s * 2, f);
- fclose(f);
- if (n == s && memcmp(buff, contents, s) == 0) {
- free(contents);
- return (1);
- }
- failure_start(test_filename, test_line, "File contents don't match");
- logprintf(" file=\"%s\"\n", fn);
- if (n > 0)
- hexdump(contents, buff, n > 512 ? 512 : n, 0);
- else {
- logprintf(" File empty, contents should be:\n");
- hexdump(buff, NULL, s > 512 ? 512 : n, 0);
- }
- failure_finish(test_extra);
- free(contents);
- return (0);
-}
-
-/* Check the contents of a text file, being tolerant of line endings. */
-int
-assertion_text_file_contents(const char *buff, const char *fn)
-{
- char *contents;
- const char *btxt, *ftxt;
- FILE *f;
- int n, s;
-
- assertion_count(test_filename, test_line);
- f = fopen(fn, "r");
- if (f == NULL) {
- failure_start(test_filename, test_line,
- "File doesn't exist: %s", fn);
- failure_finish(test_extra);
- return (0);
- }
- s = strlen(buff);
- contents = malloc(s * 2 + 128);
- n = fread(contents, 1, s * 2 + 128 - 1, f);
- if (n >= 0)
- contents[n] = '\0';
- fclose(f);
- /* Compare texts. */
- btxt = buff;
- ftxt = (const char *)contents;
- while (*btxt != '\0' && *ftxt != '\0') {
- if (*btxt == *ftxt) {
- ++btxt;
- ++ftxt;
- continue;
- }
- if (btxt[0] == '\n' && ftxt[0] == '\r' && ftxt[1] == '\n') {
- /* Pass over different new line characters. */
- ++btxt;
- ftxt += 2;
- continue;
- }
- break;
- }
- if (*btxt == '\0' && *ftxt == '\0') {
- free(contents);
- return (1);
- }
- failure_start(test_filename, test_line, "Contents don't match");
- logprintf(" file=\"%s\"\n", fn);
- if (n > 0)
- hexdump(contents, buff, n, 0);
- else {
- logprintf(" File empty, contents should be:\n");
- hexdump(buff, NULL, s, 0);
- }
- failure_finish(test_extra);
- free(contents);
- return (0);
-}
-
-/* Test that two paths point to the same file. */
-/* As a side-effect, asserts that both files exist. */
-static int
-is_hardlink(const char *file, int line,
- const char *path1, const char *path2)
-{
-#if defined(_WIN32) && !defined(__CYGWIN__)
- BY_HANDLE_FILE_INFORMATION bhfi1, bhfi2;
- int r;
-
- assertion_count(file, line);
- r = my_GetFileInformationByName(path1, &bhfi1);
- if (r == 0) {
- failure_start(file, line, "File %s can't be inspected?", path1);
- failure_finish(NULL);
- return (0);
- }
- r = my_GetFileInformationByName(path2, &bhfi2);
- if (r == 0) {
- failure_start(file, line, "File %s can't be inspected?", path2);
- failure_finish(NULL);
- return (0);
- }
- return (bhfi1.dwVolumeSerialNumber == bhfi2.dwVolumeSerialNumber
- && bhfi1.nFileIndexHigh == bhfi2.nFileIndexHigh
- && bhfi1.nFileIndexLow == bhfi2.nFileIndexLow);
-#else
- struct stat st1, st2;
- int r;
-
- assertion_count(file, line);
- r = lstat(path1, &st1);
- if (r != 0) {
- failure_start(file, line, "File should exist: %s", path1);
- failure_finish(NULL);
- return (0);
- }
- r = lstat(path2, &st2);
- if (r != 0) {
- failure_start(file, line, "File should exist: %s", path2);
- failure_finish(NULL);
- return (0);
- }
- return (st1.st_ino == st2.st_ino && st1.st_dev == st2.st_dev);
-#endif
-}
-
-int
-assertion_is_hardlink(const char *file, int line,
- const char *path1, const char *path2)
-{
- if (is_hardlink(file, line, path1, path2))
- return (1);
- failure_start(file, line,
- "Files %s and %s are not hardlinked", path1, path2);
- failure_finish(NULL);
- return (0);
-}
-
-int
-assertion_is_not_hardlink(const char *file, int line,
- const char *path1, const char *path2)
-{
- if (!is_hardlink(file, line, path1, path2))
- return (1);
- failure_start(file, line,
- "Files %s and %s should not be hardlinked", path1, path2);
- failure_finish(NULL);
- return (0);
-}
-
-/* Verify a/b/mtime of 'pathname'. */
-/* If 'recent', verify that it's within last 10 seconds. */
-static int
-assertion_file_time(const char *file, int line,
- const char *pathname, long t, long nsec, char type, int recent)
-{
- long long filet, filet_nsec;
- int r;
-
-#if defined(_WIN32) && !defined(__CYGWIN__)
-#define EPOC_TIME (116444736000000000ULL)
- FILETIME ftime, fbirthtime, fatime, fmtime;
- ULARGE_INTEGER wintm;
- HANDLE h;
- ftime.dwLowDateTime = 0;
- ftime.dwHighDateTime = 0;
-
- assertion_count(file, line);
- h = CreateFile(pathname, FILE_READ_ATTRIBUTES, 0, NULL,
- OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
- if (h == INVALID_HANDLE_VALUE) {
- failure_start(file, line, "Can't access %s\n", pathname);
- failure_finish(NULL);
- return (0);
- }
- r = GetFileTime(h, &fbirthtime, &fatime, &fmtime);
- switch (type) {
- case 'a': ftime = fatime; break;
- case 'b': ftime = fbirthtime; break;
- case 'm': ftime = fmtime; break;
- }
- CloseHandle(h);
- if (r == 0) {
- failure_start(file, line, "Can't GetFileTime %s\n", pathname);
- failure_finish(NULL);
- return (0);
- }
- wintm.LowPart = ftime.dwLowDateTime;
- wintm.HighPart = ftime.dwHighDateTime;
- filet = (wintm.QuadPart - EPOC_TIME) / 10000000;
- filet_nsec = ((wintm.QuadPart - EPOC_TIME) % 10000000) * 100;
- nsec = (nsec / 100) * 100; /* Round the request */
-#else
- struct stat st;
-
- assertion_count(file, line);
- r = lstat(pathname, &st);
- if (r != 0) {
- failure_start(file, line, "Can't stat %s\n", pathname);
- failure_finish(NULL);
- return (0);
- }
- switch (type) {
- case 'a': filet = st.st_atime; break;
- case 'm': filet = st.st_mtime; break;
- case 'b': filet = 0; break;
- default: fprintf(stderr, "INTERNAL: Bad type %c for file time", type);
- exit(1);
- }
-#if defined(__FreeBSD__)
- switch (type) {
- case 'a': filet_nsec = st.st_atimespec.tv_nsec; break;
- case 'b': filet = st.st_birthtime;
- filet_nsec = st.st_birthtimespec.tv_nsec; break;
- case 'm': filet_nsec = st.st_mtimespec.tv_nsec; break;
- default: fprintf(stderr, "INTERNAL: Bad type %c for file time", type);
- exit(1);
- }
- /* FreeBSD generally only stores to microsecond res, so round. */
- filet_nsec = (filet_nsec / 1000) * 1000;
- nsec = (nsec / 1000) * 1000;
-#else
- filet_nsec = nsec = 0; /* Generic POSIX only has whole seconds. */
- if (type == 'b') return (1); /* Generic POSIX doesn't have birthtime */
-#if defined(__HAIKU__)
- if (type == 'a') return (1); /* Haiku doesn't have atime. */
-#endif
-#endif
-#endif
- if (recent) {
- /* Check that requested time is up-to-date. */
- time_t now = time(NULL);
- if (filet < now - 10 || filet > now + 1) {
- failure_start(file, line,
- "File %s has %ctime %ld, %ld seconds ago\n",
- pathname, type, filet, now - filet);
- failure_finish(NULL);
- return (0);
- }
- } else if (filet != t || filet_nsec != nsec) {
- failure_start(file, line,
- "File %s has %ctime %ld.%09ld, expected %ld.%09ld",
- pathname, type, filet, filet_nsec, t, nsec);
- failure_finish(NULL);
- return (0);
- }
- return (1);
-}
-
-/* Verify atime of 'pathname'. */
-int
-assertion_file_atime(const char *file, int line,
- const char *pathname, long t, long nsec)
-{
- return assertion_file_time(file, line, pathname, t, nsec, 'a', 0);
-}
-
-/* Verify atime of 'pathname' is up-to-date. */
-int
-assertion_file_atime_recent(const char *file, int line, const char *pathname)
-{
- return assertion_file_time(file, line, pathname, 0, 0, 'a', 1);
-}
-
-/* Verify birthtime of 'pathname'. */
-int
-assertion_file_birthtime(const char *file, int line,
- const char *pathname, long t, long nsec)
-{
- return assertion_file_time(file, line, pathname, t, nsec, 'b', 0);
-}
-
-/* Verify birthtime of 'pathname' is up-to-date. */
-int
-assertion_file_birthtime_recent(const char *file, int line,
- const char *pathname)
-{
- return assertion_file_time(file, line, pathname, 0, 0, 'b', 1);
-}
-
-/* Verify mtime of 'pathname'. */
-int
-assertion_file_mtime(const char *file, int line,
- const char *pathname, long t, long nsec)
-{
- return assertion_file_time(file, line, pathname, t, nsec, 'm', 0);
-}
-
-/* Verify mtime of 'pathname' is up-to-date. */
-int
-assertion_file_mtime_recent(const char *file, int line, const char *pathname)
-{
- return assertion_file_time(file, line, pathname, 0, 0, 'm', 1);
-}
-
-/* Verify number of links to 'pathname'. */
-int
-assertion_file_nlinks(const char *file, int line,
- const char *pathname, int nlinks)
-{
-#if defined(_WIN32) && !defined(__CYGWIN__)
- BY_HANDLE_FILE_INFORMATION bhfi;
- int r;
-
- assertion_count(file, line);
- r = my_GetFileInformationByName(pathname, &bhfi);
- if (r != 0 && bhfi.nNumberOfLinks == (DWORD)nlinks)
- return (1);
- failure_start(file, line, "File %s has %d links, expected %d",
- pathname, bhfi.nNumberOfLinks, nlinks);
- failure_finish(NULL);
- return (0);
-#else
- struct stat st;
- int r;
-
- assertion_count(file, line);
- r = lstat(pathname, &st);
- if (r == 0 && st.st_nlink == nlinks)
- return (1);
- failure_start(file, line, "File %s has %d links, expected %d",
- pathname, st.st_nlink, nlinks);
- failure_finish(NULL);
- return (0);
-#endif
-}
-
-/* Verify size of 'pathname'. */
-int
-assertion_file_size(const char *file, int line, const char *pathname, long size)
-{
- int64_t filesize;
- int r;
-
- assertion_count(file, line);
-#if defined(_WIN32) && !defined(__CYGWIN__)
- {
- BY_HANDLE_FILE_INFORMATION bhfi;
- r = !my_GetFileInformationByName(pathname, &bhfi);
- filesize = ((int64_t)bhfi.nFileSizeHigh << 32) + bhfi.nFileSizeLow;
- }
-#else
- {
- struct stat st;
- r = lstat(pathname, &st);
- filesize = st.st_size;
- }
-#endif
- if (r == 0 && filesize == size)
- return (1);
- failure_start(file, line, "File %s has size %ld, expected %ld",
- pathname, (long)filesize, (long)size);
- failure_finish(NULL);
- return (0);
-}
-
-/* Assert that 'pathname' is a dir. If mode >= 0, verify that too. */
-int
-assertion_is_dir(const char *file, int line, const char *pathname, int mode)
-{
- struct stat st;
- int r;
-
-#if defined(_WIN32) && !defined(__CYGWIN__)
- (void)mode; /* UNUSED */
-#endif
- assertion_count(file, line);
- r = lstat(pathname, &st);
- if (r != 0) {
- failure_start(file, line, "Dir should exist: %s", pathname);
- failure_finish(NULL);
- return (0);
- }
- if (!S_ISDIR(st.st_mode)) {
- failure_start(file, line, "%s is not a dir", pathname);
- failure_finish(NULL);
- return (0);
- }
-#if !defined(_WIN32) || defined(__CYGWIN__)
- /* Windows doesn't handle permissions the same way as POSIX,
- * so just ignore the mode tests. */
- /* TODO: Can we do better here? */
- if (mode >= 0 && mode != (st.st_mode & 07777)) {
- failure_start(file, line, "Dir %s has wrong mode", pathname);
- logprintf(" Expected: 0%3o\n", mode);
- logprintf(" Found: 0%3o\n", st.st_mode & 07777);
- failure_finish(NULL);
- return (0);
- }
-#endif
- return (1);
-}
-
-/* Verify that 'pathname' is a regular file. If 'mode' is >= 0,
- * verify that too. */
-int
-assertion_is_reg(const char *file, int line, const char *pathname, int mode)
-{
- struct stat st;
- int r;
-
-#if defined(_WIN32) && !defined(__CYGWIN__)
- (void)mode; /* UNUSED */
-#endif
- assertion_count(file, line);
- r = lstat(pathname, &st);
- if (r != 0 || !S_ISREG(st.st_mode)) {
- failure_start(file, line, "File should exist: %s", pathname);
- failure_finish(NULL);
- return (0);
- }
-#if !defined(_WIN32) || defined(__CYGWIN__)
- /* Windows doesn't handle permissions the same way as POSIX,
- * so just ignore the mode tests. */
- /* TODO: Can we do better here? */
- if (mode >= 0 && mode != (st.st_mode & 07777)) {
- failure_start(file, line, "File %s has wrong mode", pathname);
- logprintf(" Expected: 0%3o\n", mode);
- logprintf(" Found: 0%3o\n", st.st_mode & 07777);
- failure_finish(NULL);
- return (0);
- }
-#endif
- return (1);
-}
-
-/* Check whether 'pathname' is a symbolic link. If 'contents' is
- * non-NULL, verify that the symlink has those contents. */
-static int
-is_symlink(const char *file, int line,
- const char *pathname, const char *contents)
-{
-#if defined(_WIN32) && !defined(__CYGWIN__)
- (void)pathname; /* UNUSED */
- (void)contents; /* UNUSED */
- assertion_count(file, line);
- /* Windows sort-of has real symlinks, but they're only usable
- * by privileged users and are crippled even then, so there's
- * really not much point in bothering with this. */
- return (0);
-#else
- char buff[300];
- struct stat st;
- ssize_t linklen;
- int r;
-
- assertion_count(file, line);
- r = lstat(pathname, &st);
- if (r != 0) {
- failure_start(file, line,
- "Symlink should exist: %s", pathname);
- failure_finish(NULL);
- return (0);
- }
- if (!S_ISLNK(st.st_mode))
- return (0);
- if (contents == NULL)
- return (1);
- linklen = readlink(pathname, buff, sizeof(buff));
- if (linklen < 0) {
- failure_start(file, line, "Can't read symlink %s", pathname);
- failure_finish(NULL);
- return (0);
- }
- buff[linklen] = '\0';
- if (strcmp(buff, contents) != 0)
- return (0);
- return (1);
-#endif
-}
-
-/* Assert that path is a symlink that (optionally) contains contents. */
-int
-assertion_is_symlink(const char *file, int line,
- const char *path, const char *contents)
-{
- if (is_symlink(file, line, path, contents))
- return (1);
- if (contents)
- failure_start(file, line, "File %s is not a symlink to %s",
- path, contents);
- else
- failure_start(file, line, "File %s is not a symlink", path);
- failure_finish(NULL);
- return (0);
-}
-
-
-/* Create a directory and report any errors. */
-int
-assertion_make_dir(const char *file, int line, const char *dirname, int mode)
-{
- assertion_count(file, line);
-#if defined(_WIN32) && !defined(__CYGWIN__)
- (void)mode; /* UNUSED */
- if (0 == _mkdir(dirname))
- return (1);
-#else
- if (0 == mkdir(dirname, mode))
- return (1);
-#endif
- failure_start(file, line, "Could not create directory %s", dirname);
- failure_finish(NULL);
- return(0);
-}
-
-/* Create a file with the specified contents and report any failures. */
-int
-assertion_make_file(const char *file, int line,
- const char *path, int mode, const char *contents)
-{
-#if defined(_WIN32) && !defined(__CYGWIN__)
- /* TODO: Rework this to set file mode as well. */
- FILE *f;
- (void)mode; /* UNUSED */
- assertion_count(file, line);
- f = fopen(path, "wb");
- if (f == NULL) {
- failure_start(file, line, "Could not create file %s", path);
- failure_finish(NULL);
- return (0);
- }
- if (contents != NULL) {
- if (strlen(contents)
- != fwrite(contents, 1, strlen(contents), f)) {
- fclose(f);
- failure_start(file, line,
- "Could not write file %s", path);
- failure_finish(NULL);
- return (0);
- }
- }
- fclose(f);
- return (1);
-#else
- int fd;
- assertion_count(file, line);
- fd = open(path, O_CREAT | O_WRONLY, mode >= 0 ? mode : 0644);
- if (fd < 0) {
- failure_start(file, line, "Could not create %s", path);
- failure_finish(NULL);
- return (0);
- }
- if (contents != NULL) {
- if ((ssize_t)strlen(contents)
- != write(fd, contents, strlen(contents))) {
- close(fd);
- failure_start(file, line, "Could not write to %s", path);
- failure_finish(NULL);
- return (0);
- }
- }
- close(fd);
- return (1);
-#endif
-}
-
-/* Create a hardlink and report any failures. */
-int
-assertion_make_hardlink(const char *file, int line,
- const char *newpath, const char *linkto)
-{
- int succeeded;
-
- assertion_count(file, line);
-#if defined(_WIN32) && !defined(__CYGWIN__)
- succeeded = my_CreateHardLinkA(newpath, linkto);
-#elif HAVE_LINK
- succeeded = !link(linkto, newpath);
-#else
- succeeded = 0;
-#endif
- if (succeeded)
- return (1);
- failure_start(file, line, "Could not create hardlink");
- logprintf(" New link: %s\n", newpath);
- logprintf(" Old name: %s\n", linkto);
- failure_finish(NULL);
- return(0);
-}
-
-/* Create a symlink and report any failures. */
-int
-assertion_make_symlink(const char *file, int line,
- const char *newpath, const char *linkto)
-{
-#if defined(_WIN32) && !defined(__CYGWIN__)
- int targetIsDir = 0; /* TODO: Fix this */
- assertion_count(file, line);
- if (my_CreateSymbolicLinkA(newpath, linkto, targetIsDir))
- return (1);
-#elif HAVE_SYMLINK
- assertion_count(file, line);
- if (0 == symlink(linkto, newpath))
- return (1);
-#endif
- failure_start(file, line, "Could not create symlink");
- logprintf(" New link: %s\n", newpath);
- logprintf(" Old name: %s\n", linkto);
- failure_finish(NULL);
- return(0);
-}
-
-/* Set umask, report failures. */
-int
-assertion_umask(const char *file, int line, int mask)
-{
- assertion_count(file, line);
- (void)file; /* UNUSED */
- (void)line; /* UNUSED */
- umask(mask);
- return (1);
-}
-
-/*
- *
- * UTILITIES for use by tests.
- *
- */
-
-/*
- * Check whether platform supports symlinks. This is intended
- * for tests to use in deciding whether to bother testing symlink
- * support; if the platform doesn't support symlinks, there's no point
- * in checking whether the program being tested can create them.
- *
- * Note that the first time this test is called, we actually go out to
- * disk to create and verify a symlink. This is necessary because
- * symlink support is actually a property of a particular filesystem
- * and can thus vary between directories on a single system. After
- * the first call, this returns the cached result from memory, so it's
- * safe to call it as often as you wish.
- */
-int
-canSymlink(void)
-{
- /* Remember the test result */
- static int value = 0, tested = 0;
- if (tested)
- return (value);
-
- ++tested;
- assertion_make_file(__FILE__, __LINE__, "canSymlink.0", 0644, "a");
- /* Note: Cygwin has its own symlink() emulation that does not
- * use the Win32 CreateSymbolicLink() function. */
-#if defined(_WIN32) && !defined(__CYGWIN__)
- value = my_CreateSymbolicLinkA("canSymlink.1", "canSymlink.0", 0)
- && is_symlink(__FILE__, __LINE__, "canSymlink.1", "canSymlink.0");
-#elif HAVE_SYMLINK
- value = (0 == symlink("canSymlink.0", "canSymlink.1"))
- && is_symlink(__FILE__, __LINE__, "canSymlink.1","canSymlink.0");
-#endif
- return (value);
-}
-
-/*
- * Can this platform run the gzip program?
- */
-/* Platform-dependent options for hiding the output of a subcommand. */
-#if defined(_WIN32) && !defined(__CYGWIN__)
-static const char *redirectArgs = ">NUL 2>NUL"; /* Win32 cmd.exe */
-#else
-static const char *redirectArgs = ">/dev/null 2>/dev/null"; /* POSIX 'sh' */
-#endif
-int
-canGzip(void)
-{
- static int tested = 0, value = 0;
- if (!tested) {
- tested = 1;
- if (systemf("gzip -V %s", redirectArgs) == 0)
- value = 1;
- }
- return (value);
-}
-
-/*
- * Can this platform run the gunzip program?
- */
-int
-canGunzip(void)
-{
- static int tested = 0, value = 0;
- if (!tested) {
- tested = 1;
- if (systemf("gunzip -V %s", redirectArgs) == 0)
- value = 1;
- }
- return (value);
-}
-
-/*
- * Sleep as needed; useful for verifying disk timestamp changes by
- * ensuring that the wall-clock time has actually changed before we
- * go back to re-read something from disk.
- */
-void
-sleepUntilAfter(time_t t)
-{
- while (t >= time(NULL))
-#if defined(_WIN32) && !defined(__CYGWIN__)
- Sleep(500);
-#else
- sleep(1);
-#endif
-}
-
-/*
- * Call standard system() call, but build up the command line using
- * sprintf() conventions.
- */
-int
-systemf(const char *fmt, ...)
-{
- char buff[8192];
- va_list ap;
- int r;
-
- va_start(ap, fmt);
- vsprintf(buff, fmt, ap);
- if (verbosity > VERBOSITY_FULL)
- logprintf("Cmd: %s\n", buff);
- r = system(buff);
- va_end(ap);
- return (r);
-}
-
-/*
- * Slurp a file into memory for ease of comparison and testing.
- * Returns size of file in 'sizep' if non-NULL, null-terminates
- * data in memory for ease of use.
- */
-char *
-slurpfile(size_t * sizep, const char *fmt, ...)
-{
- char filename[8192];
- struct stat st;
- va_list ap;
- char *p;
- ssize_t bytes_read;
- FILE *f;
- int r;
-
- va_start(ap, fmt);
- vsprintf(filename, fmt, ap);
- va_end(ap);
-
- f = fopen(filename, "rb");
- if (f == NULL) {
- /* Note: No error; non-existent file is okay here. */
- return (NULL);
- }
- r = fstat(fileno(f), &st);
- if (r != 0) {
- logprintf("Can't stat file %s\n", filename);
- fclose(f);
- return (NULL);
- }
- p = malloc((size_t)st.st_size + 1);
- if (p == NULL) {
- logprintf("Can't allocate %ld bytes of memory to read file %s\n",
- (long int)st.st_size, filename);
- fclose(f);
- return (NULL);
- }
- bytes_read = fread(p, 1, (size_t)st.st_size, f);
- if (bytes_read < st.st_size) {
- logprintf("Can't read file %s\n", filename);
- fclose(f);
- free(p);
- return (NULL);
- }
- p[st.st_size] = '\0';
- if (sizep != NULL)
- *sizep = (size_t)st.st_size;
- fclose(f);
- return (p);
-}
-
-/* Read a uuencoded file from the reference directory, decode, and
- * write the result into the current directory. */
-#define UUDECODE(c) (((c) - 0x20) & 0x3f)
-void
-extract_reference_file(const char *name)
-{
- char buff[1024];
- FILE *in, *out;
-
- sprintf(buff, "%s/%s.uu", refdir, name);
- in = fopen(buff, "r");
- failure("Couldn't open reference file %s", buff);
- assert(in != NULL);
- if (in == NULL)
- return;
- /* Read up to and including the 'begin' line. */
- for (;;) {
- if (fgets(buff, sizeof(buff), in) == NULL) {
- /* TODO: This is a failure. */
- return;
- }
- if (memcmp(buff, "begin ", 6) == 0)
- break;
- }
- /* Now, decode the rest and write it. */
- /* Not a lot of error checking here; the input better be right. */
- out = fopen(name, "wb");
- while (fgets(buff, sizeof(buff), in) != NULL) {
- char *p = buff;
- int bytes;
-
- if (memcmp(buff, "end", 3) == 0)
- break;
-
- bytes = UUDECODE(*p++);
- while (bytes > 0) {
- int n = 0;
- /* Write out 1-3 bytes from that. */
- if (bytes > 0) {
- n = UUDECODE(*p++) << 18;
- n |= UUDECODE(*p++) << 12;
- fputc(n >> 16, out);
- --bytes;
- }
- if (bytes > 0) {
- n |= UUDECODE(*p++) << 6;
- fputc((n >> 8) & 0xFF, out);
- --bytes;
- }
- if (bytes > 0) {
- n |= UUDECODE(*p++);
- fputc(n & 0xFF, out);
- --bytes;
- }
- }
- }
- fclose(out);
- fclose(in);
-}
-
-/*
- *
- * TEST management
- *
- */
-
-/*
- * "list.h" is simply created by "grep DEFINE_TEST test_*.c"; it has
- * a line like
- * DEFINE_TEST(test_function)
- * for each test.
- */
-
-/* Use "list.h" to declare all of the test functions. */
-#undef DEFINE_TEST
-#define DEFINE_TEST(name) void name(void);
-#include "list.h"
-
-/* Use "list.h" to create a list of all tests (functions and names). */
-#undef DEFINE_TEST
-#define DEFINE_TEST(n) { n, #n, 0 },
-struct { void (*func)(void); const char *name; int failures; } tests[] = {
- #include "list.h"
-};
-
-/*
- * Summarize repeated failures in the just-completed test.
- */
-static void
-test_summarize(const char *filename, int failed)
-{
- unsigned int i;
-
- switch (verbosity) {
- case VERBOSITY_SUMMARY_ONLY:
- printf(failed ? "E" : ".");
- fflush(stdout);
- break;
- case VERBOSITY_PASSFAIL:
- printf(failed ? "FAIL\n" : "ok\n");
- break;
- }
-
- log_console = (verbosity == VERBOSITY_LIGHT_REPORT);
-
- for (i = 0; i < sizeof(failed_lines)/sizeof(failed_lines[0]); i++) {
- if (failed_lines[i].count > 1 && !failed_lines[i].skip)
- logprintf("%s:%d: Summary: Failed %d times\n",
- filename, i, failed_lines[i].count);
- }
- /* Clear the failure history for the next file. */
- memset(failed_lines, 0, sizeof(failed_lines));
-}
-
-/*
- * Actually run a single test, with appropriate setup and cleanup.
- */
-static int
-test_run(int i, const char *tmpdir)
-{
- char logfilename[64];
- int failures_before = failures;
- int oldumask;
-
- switch (verbosity) {
- case VERBOSITY_SUMMARY_ONLY: /* No per-test reports at all */
- break;
- case VERBOSITY_PASSFAIL: /* rest of line will include ok/FAIL marker */
- printf("%3d: %-50s", i, tests[i].name);
- fflush(stdout);
- break;
- default: /* Title of test, details will follow */
- printf("%3d: %s\n", i, tests[i].name);
- }
-
- /* Chdir to the top-level work directory. */
- if (!assertChdir(tmpdir)) {
- fprintf(stderr,
- "ERROR: Can't chdir to top work dir %s\n", tmpdir);
- exit(1);
- }
- /* Create a log file for this test. */
- sprintf(logfilename, "%s.log", tests[i].name);
- logfile = fopen(logfilename, "w");
- fprintf(logfile, "%s\n\n", tests[i].name);
- /* Chdir() to a work dir for this specific test. */
- if (!assertMakeDir(tests[i].name, 0755)
- || !assertChdir(tests[i].name)) {
- fprintf(stderr,
- "ERROR: Can't chdir to work dir %s/%s\n",
- tmpdir, tests[i].name);
- exit(1);
- }
- /* Explicitly reset the locale before each test. */
- setlocale(LC_ALL, "C");
- /* Record the umask before we run the test. */
- umask(oldumask = umask(0));
- /*
- * Run the actual test.
- */
- (*tests[i].func)();
- /*
- * Clean up and report afterwards.
- */
- /* Restore umask */
- umask(oldumask);
- /* Reset locale. */
- setlocale(LC_ALL, "C");
- /* Reset directory. */
- if (!assertChdir(tmpdir)) {
- fprintf(stderr, "ERROR: Couldn't chdir to temp dir %s\n",
- tmpdir);
- exit(1);
- }
- /* Report per-test summaries. */
- tests[i].failures = failures - failures_before;
- test_summarize(test_filename, tests[i].failures);
- /* Close the per-test log file. */
- fclose(logfile);
- logfile = NULL;
- /* If there were no failures, we can remove the work dir and logfile. */
- if (tests[i].failures == 0) {
- if (!keep_temp_files && assertChdir(tmpdir)) {
-#if defined(_WIN32) && !defined(__CYGWIN__)
- /* Make sure not to leave empty directories.
- * Sometimes a processing of closing files used by tests
- * is not done, then rmdir will be failed and it will
- * leave a empty test directory. So we should wait a few
- * seconds and retry rmdir. */
- int r, t;
- for (t = 0; t < 10; t++) {
- if (t > 0)
- Sleep(1000);
- r = systemf("rmdir /S /Q %s", tests[i].name);
- if (r == 0)
- break;
- }
- systemf("del %s", logfilename);
-#else
- systemf("rm -rf %s", tests[i].name);
- systemf("rm %s", logfilename);
-#endif
- }
- }
- /* Return appropriate status. */
- return (tests[i].failures);
-}
-
-/*
- *
- *
- * MAIN and support routines.
- *
- *
- */
-
-static void
-usage(const char *program)
-{
- static const int limit = sizeof(tests) / sizeof(tests[0]);
- int i;
-
- printf("Usage: %s [options] <test> <test> ...\n", program);
- printf("Default is to run all tests.\n");
- printf("Otherwise, specify the numbers of the tests you wish to run.\n");
- printf("Options:\n");
- printf(" -d Dump core after any failure, for debugging.\n");
- printf(" -k Keep all temp files.\n");
- printf(" Default: temp files for successful tests deleted.\n");
-#ifdef PROGRAM
- printf(" -p <path> Path to executable to be tested.\n");
- printf(" Default: path taken from " ENVBASE " environment variable.\n");
-#endif
- printf(" -q Quiet.\n");
- printf(" -r <dir> Path to dir containing reference files.\n");
- printf(" Default: Current directory.\n");
- printf(" -v Verbose.\n");
- printf("Available tests:\n");
- for (i = 0; i < limit; i++)
- printf(" %d: %s\n", i, tests[i].name);
- exit(1);
-}
-
-static char *
-get_refdir(const char *d)
-{
- char tried[512] = { '\0' };
- char buff[128];
- char *pwd, *p;
-
- /* If a dir was specified, try that */
- if (d != NULL) {
- pwd = NULL;
- snprintf(buff, sizeof(buff), "%s", d);
- p = slurpfile(NULL, "%s/%s", buff, KNOWNREF);
- if (p != NULL) goto success;
- strncat(tried, buff, sizeof(tried) - strlen(tried) - 1);
- strncat(tried, "\n", sizeof(tried) - strlen(tried) - 1);
- goto failure;
- }
-
- /* Get the current dir. */
- pwd = getcwd(NULL, 0);
- while (pwd[strlen(pwd) - 1] == '\n')
- pwd[strlen(pwd) - 1] = '\0';
-
- /* Look for a known file. */
- snprintf(buff, sizeof(buff), "%s", pwd);
- p = slurpfile(NULL, "%s/%s", buff, KNOWNREF);
- if (p != NULL) goto success;
- strncat(tried, buff, sizeof(tried) - strlen(tried) - 1);
- strncat(tried, "\n", sizeof(tried) - strlen(tried) - 1);
-
- snprintf(buff, sizeof(buff), "%s/test", pwd);
- p = slurpfile(NULL, "%s/%s", buff, KNOWNREF);
- if (p != NULL) goto success;
- strncat(tried, buff, sizeof(tried) - strlen(tried) - 1);
- strncat(tried, "\n", sizeof(tried) - strlen(tried) - 1);
-
-#if defined(LIBRARY)
- snprintf(buff, sizeof(buff), "%s/%s/test", pwd, LIBRARY);
-#else
- snprintf(buff, sizeof(buff), "%s/%s/test", pwd, PROGRAM);
-#endif
- p = slurpfile(NULL, "%s/%s", buff, KNOWNREF);
- if (p != NULL) goto success;
- strncat(tried, buff, sizeof(tried) - strlen(tried) - 1);
- strncat(tried, "\n", sizeof(tried) - strlen(tried) - 1);
-
- if (memcmp(pwd, "/usr/obj", 8) == 0) {
- snprintf(buff, sizeof(buff), "%s", pwd + 8);
- p = slurpfile(NULL, "%s/%s", buff, KNOWNREF);
- if (p != NULL) goto success;
- strncat(tried, buff, sizeof(tried) - strlen(tried) - 1);
- strncat(tried, "\n", sizeof(tried) - strlen(tried) - 1);
-
- snprintf(buff, sizeof(buff), "%s/test", pwd + 8);
- p = slurpfile(NULL, "%s/%s", buff, KNOWNREF);
- if (p != NULL) goto success;
- strncat(tried, buff, sizeof(tried) - strlen(tried) - 1);
- strncat(tried, "\n", sizeof(tried) - strlen(tried) - 1);
- }
-
-failure:
- printf("Unable to locate known reference file %s\n", KNOWNREF);
- printf(" Checked following directories:\n%s\n", tried);
-#if defined(_WIN32) && !defined(__CYGWIN__) && defined(_DEBUG)
- DebugBreak();
-#endif
- exit(1);
-
-success:
- free(p);
- free(pwd);
- return strdup(buff);
-}
-
-int
-main(int argc, char **argv)
-{
- static const int limit = sizeof(tests) / sizeof(tests[0]);
- int i, tests_run = 0, tests_failed = 0, option;
- time_t now;
- char *refdir_alloc = NULL;
- const char *progname;
- const char *tmp, *option_arg, *p;
- char tmpdir[256];
- char tmpdir_timestamp[256];
-
- (void)argc; /* UNUSED */
-
-#if defined(HAVE__CrtSetReportMode)
- /* To stop to run the default invalid parameter handler. */
- _set_invalid_parameter_handler(invalid_parameter_handler);
- /* Disable annoying assertion message box. */
- _CrtSetReportMode(_CRT_ASSERT, 0);
-#endif
-
- /*
- * Name of this program, used to build root of our temp directory
- * tree.
- */
- progname = p = argv[0];
- while (*p != '\0') {
- /* Support \ or / dir separators for Windows compat. */
- if (*p == '/' || *p == '\\')
- progname = p + 1;
- ++p;
- }
-
-#ifdef PROGRAM
- /* Get the target program from environment, if available. */
- testprogfile = getenv(ENVBASE);
-#endif
-
- if (getenv("TMPDIR") != NULL)
- tmp = getenv("TMPDIR");
- else if (getenv("TMP") != NULL)
- tmp = getenv("TMP");
- else if (getenv("TEMP") != NULL)
- tmp = getenv("TEMP");
- else if (getenv("TEMPDIR") != NULL)
- tmp = getenv("TEMPDIR");
- else
- tmp = "/tmp";
-
- /* Allow -d to be controlled through the environment. */
- if (getenv(ENVBASE "_DEBUG") != NULL)
- dump_on_failure = 1;
-
- /* Get the directory holding test files from environment. */
- refdir = getenv(ENVBASE "_TEST_FILES");
-
- /*
- * Parse options, without using getopt(), which isn't available
- * on all platforms.
- */
- ++argv; /* Skip program name */
- while (*argv != NULL) {
- if (**argv != '-')
- break;
- p = *argv++;
- ++p; /* Skip '-' */
- while (*p != '\0') {
- option = *p++;
- option_arg = NULL;
- /* If 'opt' takes an argument, parse that. */
- if (option == 'p' || option == 'r') {
- if (*p != '\0')
- option_arg = p;
- else if (*argv == NULL) {
- fprintf(stderr,
- "Option -%c requires argument.\n",
- option);
- usage(progname);
- } else
- option_arg = *argv++;
- p = ""; /* End of this option word. */
- }
-
- /* Now, handle the option. */
- switch (option) {
- case 'd':
- dump_on_failure = 1;
- break;
- case 'k':
- keep_temp_files = 1;
- break;
- case 'p':
-#ifdef PROGRAM
- testprogfile = option_arg;
-#else
- usage(progname);
-#endif
- break;
- case 'q':
- verbosity--;
- break;
- case 'r':
- refdir = option_arg;
- break;
- case 'v':
- verbosity++;
- break;
- default:
- usage(progname);
- }
- }
- }
-
- /*
- * Sanity-check that our options make sense.
- */
-#ifdef PROGRAM
- if (testprogfile == NULL)
- usage(progname);
- {
- char *testprg;
-#if defined(_WIN32) && !defined(__CYGWIN__)
- /* Command.com sometimes rejects '/' separators. */
- testprg = strdup(testprogfile);
- for (i = 0; testprg[i] != '\0'; i++) {
- if (testprg[i] == '/')
- testprg[i] = '\\';
- }
- testprogfile = testprg;
-#endif
- /* Quote the name that gets put into shell command lines. */
- testprg = malloc(strlen(testprogfile) + 3);
- strcpy(testprg, "\"");
- strcat(testprg, testprogfile);
- strcat(testprg, "\"");
- testprog = testprg;
- }
-#endif
-
- /*
- * Create a temp directory for the following tests.
- * Include the time the tests started as part of the name,
- * to make it easier to track the results of multiple tests.
- */
- now = time(NULL);
- for (i = 0; ; i++) {
- strftime(tmpdir_timestamp, sizeof(tmpdir_timestamp),
- "%Y-%m-%dT%H.%M.%S",
- localtime(&now));
- sprintf(tmpdir, "%s/%s.%s-%03d", tmp, progname,
- tmpdir_timestamp, i);
- if (assertMakeDir(tmpdir,0755))
- break;
- if (i >= 999) {
- fprintf(stderr,
- "ERROR: Unable to create temp directory %s\n",
- tmpdir);
- exit(1);
- }
- }
-
- /*
- * If the user didn't specify a directory for locating
- * reference files, try to find the reference files in
- * the "usual places."
- */
- refdir = refdir_alloc = get_refdir(refdir);
-
- /*
- * Banner with basic information.
- */
- printf("\n");
- printf("If tests fail or crash, details will be in:\n");
- printf(" %s\n", tmpdir);
- printf("\n");
- if (verbosity > VERBOSITY_SUMMARY_ONLY) {
- printf("Reference files will be read from: %s\n", refdir);
-#ifdef PROGRAM
- printf("Running tests on: %s\n", testprog);
-#endif
- printf("Exercising: ");
- fflush(stdout);
- printf("%s\n", EXTRA_VERSION);
- } else {
- printf("Running ");
- fflush(stdout);
- }
-
- /*
- * Run some or all of the individual tests.
- */
- if (*argv == NULL) {
- /* Default: Run all tests. */
- for (i = 0; i < limit; i++) {
- if (test_run(i, tmpdir))
- tests_failed++;
- tests_run++;
- }
- } else {
- while (*(argv) != NULL) {
- if (**argv >= '0' && **argv <= '9') {
- i = atoi(*argv);
- if (i < 0 || i >= limit) {
- printf("*** INVALID Test %s\n", *argv);
- free(refdir_alloc);
- usage(progname);
- /* usage() never returns */
- }
- } else {
- for (i = 0; i < limit; ++i) {
- if (strcmp(*argv, tests[i].name) == 0)
- break;
- }
- if (i >= limit) {
- printf("*** INVALID Test ``%s''\n",
- *argv);
- free(refdir_alloc);
- usage(progname);
- /* usage() never returns */
- }
- }
- if (test_run(i, tmpdir))
- tests_failed++;
- tests_run++;
- argv++;
- }
- }
-
- /*
- * Report summary statistics.
- */
- if (verbosity > VERBOSITY_SUMMARY_ONLY) {
- printf("\n");
- printf("Totals:\n");
- printf(" Tests run: %8d\n", tests_run);
- printf(" Tests failed: %8d\n", tests_failed);
- printf(" Assertions checked:%8d\n", assertions);
- printf(" Assertions failed: %8d\n", failures);
- printf(" Skips reported: %8d\n", skips);
- }
- if (failures) {
- printf("\n");
- printf("Failing tests:\n");
- for (i = 0; i < limit; ++i) {
- if (tests[i].failures)
- printf(" %d: %s (%d failures)\n", i,
- tests[i].name, tests[i].failures);
- }
- printf("\n");
- printf("Details for failing tests: %s\n", tmpdir);
- printf("\n");
- } else {
- if (verbosity == VERBOSITY_SUMMARY_ONLY)
- printf("\n");
- printf("%d tests passed, no failures\n", tests_run);
- }
-
- free(refdir_alloc);
-
- /* If the final tmpdir is empty, we can remove it. */
- /* This should be the usual case when all tests succeed. */
- assertChdir("..");
- rmdir(tmpdir);
-
- return (tests_failed ? 1 : 0);
-}
diff --git a/usr.bin/cpio/test/test.h b/usr.bin/cpio/test/test.h
deleted file mode 100644
index 8b1352a..0000000
--- a/usr.bin/cpio/test/test.h
+++ /dev/null
@@ -1,285 +0,0 @@
-/*
- * Copyright (c) 2003-2006 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$
- */
-
-/* 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
-
-#include <sys/types.h> /* Windows requires this before sys/stat.h */
-#include <sys/stat.h>
-
-#ifdef USE_DMALLOC
-#include <dmalloc.h>
-#endif
-#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
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.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__)
-#include "../cpio_windows.h"
-#if !defined(__BORLANDC__)
-#define strdup _strdup
-#endif
-#define LOCALE_DE "deu"
-#else
-#define LOCALE_DE "de_DE.UTF-8"
-#endif
-
-/* Visual Studio */
-#ifdef _MSC_VER
-#define snprintf sprintf_s
-#endif
-
-/* Cygwin */
-#if defined(__CYGWIN__)
-/* Cygwin-1.7.x is lazy about populating nlinks, so don't
- * expect it to be accurate. */
-# define NLINKS_INACCURATE_FOR_DIRS
-#endif
-
-#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)
-/* 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 two files are the same; allow printf-style expansion of second name.
- * See below for comments about variable arguments here...
- */
-#define assertEqualFile \
- assertion_setup(__FILE__, __LINE__);assertion_equal_file
-/* Assert that a file is empty; supports printf-style arguments. */
-#define assertEmptyFile \
- assertion_setup(__FILE__, __LINE__);assertion_empty_file
-/* Assert that a file is not empty; supports printf-style arguments. */
-#define assertNonEmptyFile \
- assertion_setup(__FILE__, __LINE__);assertion_non_empty_file
-#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 \
- assertion_setup(__FILE__, __LINE__);assertion_file_exists
-/* Assert that a file exists; supports printf-style arguments. */
-#define assertFileNotExists \
- assertion_setup(__FILE__, __LINE__);assertion_file_not_exists
-/* Assert that file contents match a string; supports printf-style arguments. */
-#define assertFileContents \
- assertion_setup(__FILE__, __LINE__);assertion_file_contents
-#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 assertTextFileContents \
- assertion_setup(__FILE__, __LINE__);assertion_text_file_contents
-#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, contents)
-#define assertMakeHardlink(newfile, oldfile) \
- assertion_make_hardlink(__FILE__, __LINE__, newfile, oldfile)
-#define assertMakeSymlink(newfile, linkto) \
- assertion_make_symlink(__FILE__, __LINE__, newfile, linkto)
-#define assertUmask(mask) \
- assertion_umask(__FILE__, __LINE__, mask)
-
-/*
- * 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 \
- assertion_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 assertion_equal_file(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_equal_string(const char *, int, const char *v1, const char *, const char *v2, const char *, void *);
-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_contents(const void *, int, const char *, ...);
-int assertion_file_exists(const char *, ...);
-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 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, const char *);
-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_non_empty_file(const char *, ...);
-int assertion_text_file_contents(const char *buff, const char *f);
-int assertion_umask(const char *, int, int);
-void assertion_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 "gzip" program. */
-int canGzip(void);
-
-/* Return true if this platform can run the "gunzip" program. */
-int canGunzip(void);
-
-/* 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, ...);
-
-/* Extracts named reference file to the current directory. */
-void extract_reference_file(const char *);
-
-/*
- * Special interfaces for program test harness.
- */
-
-/* Pathname of exe to be tested. */
-const char *testprogfile;
-/* Name of exe to use in printf-formatted command strings. */
-/* On Windows, this includes leading/trailing quotes. */
-const char *testprog;
diff --git a/usr.bin/cpio/test/test_0.c b/usr.bin/cpio/test/test_0.c
deleted file mode 100644
index 75a1437..0000000
--- a/usr.bin/cpio/test/test_0.c
+++ /dev/null
@@ -1,67 +0,0 @@
-/*-
- * Copyright (c) 2003-2007 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.
- */
-#include "test.h"
-__FBSDID("$FreeBSD$");
-
-/*
- * This first test does basic sanity checks on the environment. For
- * most of these, we just exit on failure.
- */
-#if !defined(_WIN32) || defined(__CYGWIN__)
-#define DEV_NULL "/dev/null"
-#else
-#define DEV_NULL "NUL"
-#endif
-
-DEFINE_TEST(test_0)
-{
- struct stat st;
-
- failure("File %s does not exist?!", testprogfile);
- if (!assertEqualInt(0, stat(testprogfile, &st)))
- exit(1);
-
- failure("%s is not executable?!", testprogfile);
- if (!assert((st.st_mode & 0111) != 0))
- exit(1);
-
- /*
- * Try to succesfully run the program; this requires that
- * we know some option that will succeed.
- */
- if (0 == systemf("%s --version >" DEV_NULL, testprog)) {
- /* This worked. */
- } else if (0 == systemf("%s -W version >" DEV_NULL, testprog)) {
- /* This worked. */
- } else {
- failure("Unable to successfully run any of the following:\n"
- " * %s --version\n"
- " * %s -W version\n",
- testprog, testprog);
- assert(0);
- }
-
- /* TODO: Ensure that our reference files are available. */
-}
diff --git a/usr.bin/cpio/test/test_basic.c b/usr.bin/cpio/test/test_basic.c
deleted file mode 100644
index 3a3fae8..0000000
--- a/usr.bin/cpio/test/test_basic.c
+++ /dev/null
@@ -1,173 +0,0 @@
-/*-
- * Copyright (c) 2003-2007 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.
- */
-#include "test.h"
-__FBSDID("$FreeBSD$");
-
-static void
-verify_files(const char *msg)
-{
- /*
- * Verify unpacked files.
- */
-
- /* Regular file with 2 links. */
- assertIsReg("file", 0644);
- failure(msg);
- assertFileSize("file", 10);
- assertFileNLinks("file", 2);
-
- /* Another name for the same file. */
- assertIsHardlink("linkfile", "file");
-
- /* Symlink */
- if (canSymlink())
- assertIsSymlink("symlink", "file");
-
- /* Another file with 1 link and different permissions. */
- assertIsReg("file2", 0777);
- assertFileSize("file2", 10);
- assertFileNLinks("file2", 1);
-
- /* dir */
- assertIsDir("dir", 0775);
-}
-
-static void
-basic_cpio(const char *target,
- const char *pack_options,
- const char *unpack_options,
- const char *se)
-{
- int r;
-
- if (!assertMakeDir(target, 0775))
- return;
-
- /* Use the cpio program to create an archive. */
- r = systemf("%s -o %s < filelist >%s/archive 2>%s/pack.err",
- testprog, pack_options, target, target);
- failure("Error invoking %s -o %s", testprog, pack_options);
- assertEqualInt(r, 0);
-
- assertChdir(target);
-
- /* Verify stderr. */
- failure("Expected: %s, options=%s", se, pack_options);
- assertTextFileContents(se, "pack.err");
-
- /*
- * Use cpio to unpack the archive into another directory.
- */
- r = systemf("%s -i %s< archive >unpack.out 2>unpack.err",
- testprog, unpack_options);
- failure("Error invoking %s -i %s", testprog, unpack_options);
- assertEqualInt(r, 0);
-
- /* Verify stderr. */
- failure("Error invoking %s -i %s in dir %s", testprog, unpack_options, target);
- assertTextFileContents(se, "unpack.err");
-
- verify_files(pack_options);
-
- assertChdir("..");
-}
-
-static void
-passthrough(const char *target)
-{
- int r;
-
- if (!assertMakeDir(target, 0775))
- return;
-
- /*
- * Use cpio passthrough mode to copy files to another directory.
- */
- r = systemf("%s -p %s <filelist >%s/stdout 2>%s/stderr",
- testprog, target, target, target);
- failure("Error invoking %s -p", testprog);
- assertEqualInt(r, 0);
-
- assertChdir(target);
-
- /* Verify stderr. */
- failure("Error invoking %s -p in dir %s",
- testprog, target);
- assertTextFileContents("1 block\n", "stderr");
-
- verify_files("passthrough");
- assertChdir("..");
-}
-
-DEFINE_TEST(test_basic)
-{
- FILE *filelist;
- const char *msg;
-
- assertUmask(0);
-
- /*
- * Create an assortment of files on disk.
- */
- filelist = fopen("filelist", "w");
-
- /* File with 10 bytes content. */
- assertMakeFile("file", 0644, "1234567890");
- fprintf(filelist, "file\n");
-
- /* hardlink to above file. */
- assertMakeHardlink("linkfile", "file");
- fprintf(filelist, "linkfile\n");
-
- /* Symlink to above file. */
- if (canSymlink()) {
- assertMakeSymlink("symlink", "file");
- fprintf(filelist, "symlink\n");
- }
-
- /* Another file with different permissions. */
- assertMakeFile("file2", 0777, "1234567890");
- fprintf(filelist, "file2\n");
-
- /* Directory. */
- assertMakeDir("dir", 0775);
- fprintf(filelist, "dir\n");
- /* All done. */
- fclose(filelist);
-
- assertUmask(022);
-
- /* Archive/dearchive with a variety of options. */
- msg = canSymlink() ? "2 blocks\n" : "1 block\n";
- basic_cpio("copy", "", "", msg);
- basic_cpio("copy_odc", "--format=odc", "", msg);
- basic_cpio("copy_newc", "-H newc", "", "2 blocks\n");
- basic_cpio("copy_cpio", "-H odc", "", msg);
- msg = canSymlink() ? "9 blocks\n" : "8 blocks\n";
- basic_cpio("copy_ustar", "-H ustar", "", msg);
-
- /* Copy in one step using -p */
- passthrough("passthrough");
-}
diff --git a/usr.bin/cpio/test/test_cmdline.c b/usr.bin/cpio/test/test_cmdline.c
deleted file mode 100644
index 2dd7d65..0000000
--- a/usr.bin/cpio/test/test_cmdline.c
+++ /dev/null
@@ -1,107 +0,0 @@
-/*-
- * Copyright (c) 2003-2009 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.
- */
-#include "test.h"
-__FBSDID("$FreeBSD$");
-
-/*
- * Test the command-line parsing.
- */
-
-DEFINE_TEST(test_cmdline)
-{
- FILE *f;
-
- /* Create an empty file. */
- f = fopen("empty", "wb");
- assert(f != NULL);
- fclose(f);
-
- failure("-Q is an invalid option on every cpio program I know of");
- assert(0 != systemf("%s -i -Q <empty >1.out 2>1.err", testprog));
- assertEmptyFile("1.out");
-
- failure("-f requires an argument");
- assert(0 != systemf("%s -if <empty >2.out 2>2.err", testprog));
- assertEmptyFile("2.out");
-
- failure("-f requires an argument");
- assert(0 != systemf("%s -i -f <empty >3.out 2>3.err", testprog));
- assertEmptyFile("3.out");
-
- failure("--format requires an argument");
- assert(0 != systemf("%s -i --format <empty >4.out 2>4.err", testprog));
- assertEmptyFile("4.out");
-
- failure("--badopt is an invalid option");
- assert(0 != systemf("%s -i --badop <empty >5.out 2>5.err", testprog));
- assertEmptyFile("5.out");
-
- failure("--badopt is an invalid option");
- assert(0 != systemf("%s -i --badopt <empty >6.out 2>6.err", testprog));
- assertEmptyFile("6.out");
-
- failure("--n is ambiguous");
- assert(0 != systemf("%s -i --n <empty >7.out 2>7.err", testprog));
- assertEmptyFile("7.out");
-
- failure("--create forbids an argument");
- assert(0 != systemf("%s --create=arg <empty >8.out 2>8.err", testprog));
- assertEmptyFile("8.out");
-
- failure("-i with empty input should succeed");
- assert(0 == systemf("%s -i <empty >9.out 2>9.err", testprog));
- assertEmptyFile("9.out");
-
- failure("-o with empty input should succeed");
- assert(0 == systemf("%s -o <empty >10.out 2>10.err", testprog));
-
- failure("-i -p is nonsense");
- assert(0 != systemf("%s -i -p <empty >11.out 2>11.err", testprog));
- assertEmptyFile("11.out");
-
- failure("-p -i is nonsense");
- assert(0 != systemf("%s -p -i <empty >12.out 2>12.err", testprog));
- assertEmptyFile("12.out");
-
- failure("-i -o is nonsense");
- assert(0 != systemf("%s -i -o <empty >13.out 2>13.err", testprog));
- assertEmptyFile("13.out");
-
- failure("-o -i is nonsense");
- assert(0 != systemf("%s -o -i <empty >14.out 2>14.err", testprog));
- assertEmptyFile("14.out");
-
- failure("-o -p is nonsense");
- assert(0 != systemf("%s -o -p <empty >15.out 2>15.err", testprog));
- assertEmptyFile("15.out");
-
- failure("-p -o is nonsense");
- assert(0 != systemf("%s -p -o <empty >16.out 2>16.err", testprog));
- assertEmptyFile("16.out");
-
- failure("-p with empty input should fail");
- assert(0 != systemf("%s -p <empty >17.out 2>17.err", testprog));
- assertEmptyFile("17.out");
-}
diff --git a/usr.bin/cpio/test/test_format_newc.c b/usr.bin/cpio/test/test_format_newc.c
deleted file mode 100644
index eb87c31..0000000
--- a/usr.bin/cpio/test/test_format_newc.c
+++ /dev/null
@@ -1,294 +0,0 @@
-/*-
- * Copyright (c) 2003-2007 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.
- */
-#include "test.h"
-__FBSDID("$FreeBSD$");
-
-/* Number of bytes needed to pad 'n' to multiple of 'block', assuming
- * that 'block' is a power of two. This trick can be more easily
- * remembered as -n & (block - 1), but many compilers quite reasonably
- * warn about "-n" when n is an unsigned value. (~(n) + 1) is the
- * same thing, but written in a way that won't offend anyone. */
-#define PAD(n, block) ((~(n) + 1) & ((block) - 1))
-
-static int
-is_hex(const char *p, size_t l)
-{
- while (l > 0) {
- if ((*p >= '0' && *p <= '9')
- || (*p >= 'a' && *p <= 'f')
- || (*p >= 'A' && *p <= 'F'))
- {
- --l;
- ++p;
- } else
- return (0);
-
- }
- return (1);
-}
-
-static int
-from_hex(const char *p, size_t l)
-{
- int r = 0;
-
- while (l > 0) {
- r *= 16;
- if (*p >= 'a' && *p <= 'f')
- r += *p + 10 - 'a';
- else if (*p >= 'A' && *p <= 'F')
- r += *p + 10 - 'A';
- else
- r += *p - '0';
- --l;
- ++p;
- }
- return (r);
-}
-
-DEFINE_TEST(test_format_newc)
-{
- FILE *list;
- int r;
- int devmajor, devminor, ino, gid;
- int uid = -1;
- time_t t, t2, now;
- char *p, *e;
- size_t s, fs, ns;
-
- assertUmask(0);
-
-#if !defined(_WIN32)
- uid = getuid();
-#endif
-
- /*
- * Create an assortment of files.
- * TODO: Extend this to cover more filetypes.
- */
- list = fopen("list", "w");
-
- /* "file1" */
- assertMakeFile("file1", 0644, "1234567890");
- fprintf(list, "file1\n");
-
- /* "hardlink" */
- assertMakeHardlink("hardlink", "file1");
- fprintf(list, "hardlink\n");
-
- /* Another hardlink, but this one won't be archived. */
- assertMakeHardlink("hardlink2", "file1");
-
- /* "symlink" */
- if (canSymlink()) {
- assertMakeSymlink("symlink", "file1");
- fprintf(list, "symlink\n");
- }
-
- /* "dir" */
- assertMakeDir("dir", 0775);
- fprintf(list, "dir\n");
-
- /* Record some facts about what we just created: */
- now = time(NULL); /* They were all created w/in last two seconds. */
-
- /* Use the cpio program to create an archive. */
- fclose(list);
- r = systemf("%s -o --format=newc <list >newc.out 2>newc.err",
- testprog);
- if (!assertEqualInt(r, 0))
- return;
-
- /* Verify that nothing went to stderr. */
- if (canSymlink()) {
- assertTextFileContents("2 blocks\n", "newc.err");
- } else {
- assertTextFileContents("1 block\n", "newc.err");
- }
-
- /* Verify that stdout is a well-formed cpio file in "newc" format. */
- p = slurpfile(&s, "newc.out");
- assertEqualInt(s, canSymlink() ? 1024 : 512);
- e = p;
-
- /*
- * Some of these assertions could be stronger, but it's
- * a little tricky because they depend on the local environment.
- */
-
- /* First entry is "file1" */
- assert(is_hex(e, 110)); /* Entire header is octal digits. */
- assertEqualMem(e + 0, "070701", 6); /* Magic */
- ino = from_hex(e + 6, 8); /* ino */
-#if defined(_WIN32) && !defined(__CYGWIN__)
- /* Group members bits and others bits do not work. */
- assertEqualInt(0x8180, from_hex(e + 14, 8) & 0xffc0); /* Mode */
-#else
- assertEqualInt(0x81a4, from_hex(e + 14, 8)); /* Mode */
-#endif
- if (uid < 0)
- uid = from_hex(e + 22, 8);
- assertEqualInt(from_hex(e + 22, 8), uid); /* uid */
- gid = from_hex(e + 30, 8); /* gid */
- assertEqualMem(e + 38, "00000003", 8); /* nlink */
- t = from_hex(e + 46, 8); /* mtime */
- failure("t=0x%08x now=0x%08x=%d", t, now, now);
- assert(t <= now); /* File wasn't created in future. */
- failure("t=0x%08x now - 2=0x%08x = %d", t, now - 2, now - 2);
- assert(t >= now - 2); /* File was created w/in last 2 secs. */
- failure("newc format stores body only with last appearance of a link\n"
- " first appearance should be empty, so this file size\n"
- " field should be zero");
- assertEqualInt(0, from_hex(e + 54, 8)); /* File size */
- fs = from_hex(e + 54, 8);
- fs += PAD(fs, 4);
- devmajor = from_hex(e + 62, 8); /* devmajor */
- devminor = from_hex(e + 70, 8); /* devminor */
- assert(is_hex(e + 78, 8)); /* rdevmajor */
- assert(is_hex(e + 86, 8)); /* rdevminor */
- assertEqualMem(e + 94, "00000006", 8); /* Name size */
- ns = from_hex(e + 94, 8);
- ns += PAD(ns + 2, 4);
- assertEqualInt(0, from_hex(e + 102, 8)); /* check field */
- assertEqualMem(e + 110, "file1\0", 6); /* Name contents */
- /* Since there's another link, no file contents here. */
- /* But add in file size so that an error here doesn't cascade. */
- e += 110 + fs + ns;
-
- if (canSymlink()) {
- /* "symlink" pointing to "file1" */
- assert(is_hex(e, 110));
- assertEqualMem(e + 0, "070701", 6); /* Magic */
- assert(is_hex(e + 6, 8)); /* ino */
- assertEqualInt(0xa1ff, from_hex(e + 14, 8)); /* Mode */
- assertEqualInt(from_hex(e + 22, 8), uid); /* uid */
- assertEqualInt(gid, from_hex(e + 30, 8)); /* gid */
- assertEqualMem(e + 38, "00000001", 8); /* nlink */
- t2 = from_hex(e + 46, 8); /* mtime */
- failure("First entry created at t=0x%08x this entry created at t2=0x%08x", t, t2);
- assert(t2 == t || t2 == t + 1); /* Almost same as first entry. */
- assertEqualMem(e + 54, "00000005", 8); /* File size */
- fs = from_hex(e + 54, 8);
- fs += PAD(fs, 4);
- assertEqualInt(devmajor, from_hex(e + 62, 8)); /* devmajor */
- assertEqualInt(devminor, from_hex(e + 70, 8)); /* devminor */
- assert(is_hex(e + 78, 8)); /* rdevmajor */
- assert(is_hex(e + 86, 8)); /* rdevminor */
- assertEqualMem(e + 94, "00000008", 8); /* Name size */
- ns = from_hex(e + 94, 8);
- ns += PAD(ns + 2, 4);
- assertEqualInt(0, from_hex(e + 102, 8)); /* check field */
- assertEqualMem(e + 110, "symlink\0\0\0", 10); /* Name contents */
- assertEqualMem(e + 110 + ns, "file1\0\0\0", 8); /* symlink target */
- e += 110 + fs + ns;
- }
-
- /* "dir" */
- assert(is_hex(e, 110));
- assertEqualMem(e + 0, "070701", 6); /* Magic */
- assert(is_hex(e + 6, 8)); /* ino */
-#if defined(_WIN32) && !defined(__CYGWIN__)
- /* Group members bits and others bits do not work. */
- assertEqualInt(0x41c0, from_hex(e + 14, 8) & 0xffc0); /* Mode */
-#else
- /* Mode: sgid bit sometimes propagates from parent dirs, ignore it. */
- assertEqualInt(040775, from_hex(e + 14, 8) & ~02000);
-#endif
- assertEqualInt(from_hex(e + 22, 8), uid); /* uid */
- assertEqualInt(gid, from_hex(e + 30, 8)); /* gid */
-#ifndef NLINKS_INACCURATE_FOR_DIRS
- assertEqualMem(e + 38, "00000002", 8); /* nlink */
-#endif
- t2 = from_hex(e + 46, 8); /* mtime */
- failure("First entry created at t=0x%08x this entry created at t2=0x%08x", t, t2);
- assert(t2 == t || t2 == t + 1); /* Almost same as first entry. */
- assertEqualMem(e + 54, "00000000", 8); /* File size */
- fs = from_hex(e + 54, 8);
- fs += PAD(fs, 4);
- assertEqualInt(devmajor, from_hex(e + 62, 8)); /* devmajor */
- assertEqualInt(devminor, from_hex(e + 70, 8)); /* devminor */
- assert(is_hex(e + 78, 8)); /* rdevmajor */
- assert(is_hex(e + 86, 8)); /* rdevminor */
- assertEqualMem(e + 94, "00000004", 8); /* Name size */
- ns = from_hex(e + 94, 8);
- ns += PAD(ns + 2, 4);
- assertEqualInt(0, from_hex(e + 102, 8)); /* check field */
- assertEqualMem(e + 110, "dir\0\0\0", 6); /* Name contents */
- e += 110 + fs + ns;
-
- /* Hardlink identical to "file1" */
- /* Since we only wrote two of the three links to this
- * file, this link should get deferred by the hardlink logic. */
- assert(is_hex(e, 110));
- assertEqualMem(e + 0, "070701", 6); /* Magic */
- failure("If these aren't the same, then the hardlink detection failed to match them.");
- assertEqualInt(ino, from_hex(e + 6, 8)); /* ino */
-#if defined(_WIN32) && !defined(__CYGWIN__)
- /* Group members bits and others bits do not work. */
- assertEqualInt(0x8180, from_hex(e + 14, 8) & 0xffc0); /* Mode */
-#else
- assertEqualInt(0x81a4, from_hex(e + 14, 8)); /* Mode */
-#endif
- assertEqualInt(from_hex(e + 22, 8), uid); /* uid */
- assertEqualInt(gid, from_hex(e + 30, 8)); /* gid */
- assertEqualMem(e + 38, "00000003", 8); /* nlink */
- t2 = from_hex(e + 46, 8); /* mtime */
- failure("First entry created at t=0x%08x this entry created at t2=0x%08x", t, t2);
- assert(t2 == t || t2 == t + 1); /* Almost same as first entry. */
- assertEqualInt(10, from_hex(e + 54, 8)); /* File size */
- fs = from_hex(e + 54, 8);
- fs += PAD(fs, 4);
- assertEqualInt(devmajor, from_hex(e + 62, 8)); /* devmajor */
- assertEqualInt(devminor, from_hex(e + 70, 8)); /* devminor */
- assert(is_hex(e + 78, 8)); /* rdevmajor */
- assert(is_hex(e + 86, 8)); /* rdevminor */
- assertEqualMem(e + 94, "00000009", 8); /* Name size */
- ns = from_hex(e + 94, 8);
- ns += PAD(ns + 2, 4);
- assertEqualInt(0, from_hex(e + 102, 8)); /* check field */
- assertEqualMem(e + 110, "hardlink\0\0", 10); /* Name contents */
- assertEqualMem(e + 110 + ns, "1234567890\0\0", 12); /* File contents */
- e += 110 + ns + fs;
-
- /* Last entry is end-of-archive marker. */
- assert(is_hex(e, 110));
- assertEqualMem(e + 0, "070701", 6); /* Magic */
- assertEqualMem(e + 8, "00000000", 8); /* ino */
- assertEqualMem(e + 14, "00000000", 8); /* mode */
- assertEqualMem(e + 22, "00000000", 8); /* uid */
- assertEqualMem(e + 30, "00000000", 8); /* gid */
- assertEqualMem(e + 38, "00000001", 8); /* nlink */
- assertEqualMem(e + 46, "00000000", 8); /* mtime */
- assertEqualMem(e + 54, "00000000", 8); /* size */
- assertEqualMem(e + 62, "00000000", 8); /* devmajor */
- assertEqualMem(e + 70, "00000000", 8); /* devminor */
- assertEqualMem(e + 78, "00000000", 8); /* rdevmajor */
- assertEqualMem(e + 86, "00000000", 8); /* rdevminor */
- assertEqualInt(11, from_hex(e + 94, 8)); /* name size */
- assertEqualMem(e + 102, "00000000", 8); /* check field */
- assertEqualMem(e + 110, "TRAILER!!!\0\0", 12); /* Name */
-
- free(p);
-}
diff --git a/usr.bin/cpio/test/test_gcpio_compat.c b/usr.bin/cpio/test/test_gcpio_compat.c
deleted file mode 100644
index 3d992c4..0000000
--- a/usr.bin/cpio/test/test_gcpio_compat.c
+++ /dev/null
@@ -1,108 +0,0 @@
-/*-
- * Copyright (c) 2003-2007 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.
- */
-#include "test.h"
-__FBSDID("$FreeBSD$");
-
-static void
-unpack_test(const char *from, const char *options, const char *se)
-{
- int r;
-
- /* Create a work dir named after the file we're unpacking. */
- assertMakeDir(from, 0775);
- assertChdir(from);
-
- /*
- * Use cpio to unpack the sample archive
- */
- extract_reference_file(from);
- r = systemf("%s -i %s < %s >unpack.out 2>unpack.err",
- testprog, options, from);
- failure("Error invoking %s -i %s < %s",
- testprog, options, from);
- assertEqualInt(r, 0);
-
- /* Verify that nothing went to stderr. */
- if (canSymlink()) {
- failure("Error invoking %s -i %s < %s",
- testprog, options, from);
- assertTextFileContents(se, "unpack.err");
- }
-
- /*
- * Verify unpacked files.
- */
-
- /* Regular file with 2 links. */
- assertIsReg("file", 0644);
- failure("%s", from);
- assertFileSize("file", 10);
- assertFileSize("linkfile", 10);
- failure("%s", from);
- assertFileNLinks("file", 2);
-
- /* Another name for the same file. */
- failure("%s", from);
- assertIsHardlink("linkfile", "file");
- assertFileSize("file", 10);
- assertFileSize("linkfile", 10);
-
- /* Symlink */
- if (canSymlink())
- assertIsSymlink("symlink", "file");
-
- /* dir */
- assertIsDir("dir", 0775);
-
- assertChdir("..");
-}
-
-DEFINE_TEST(test_gcpio_compat)
-{
- assertUmask(0);
-
- /* Dearchive sample files with a variety of options. */
- if (canSymlink()) {
- unpack_test("test_gcpio_compat_ref.bin",
- "--no-preserve-owner", "1 block\n");
- unpack_test("test_gcpio_compat_ref.crc",
- "--no-preserve-owner", "2 blocks\n");
- unpack_test("test_gcpio_compat_ref.newc",
- "--no-preserve-owner", "2 blocks\n");
- /* gcpio-2.9 only reads 6 blocks here */
- unpack_test("test_gcpio_compat_ref.ustar",
- "--no-preserve-owner", "7 blocks\n");
- } else {
- unpack_test("test_gcpio_compat_ref_nosym.bin",
- "--no-preserve-owner", "1 block\n");
- unpack_test("test_gcpio_compat_ref_nosym.crc",
- "--no-preserve-owner", "2 blocks\n");
- unpack_test("test_gcpio_compat_ref_nosym.newc",
- "--no-preserve-owner", "2 blocks\n");
- /* gcpio-2.9 only reads 6 blocks here */
- unpack_test("test_gcpio_compat_ref_nosym.ustar",
- "--no-preserve-owner", "7 blocks\n");
- }
-}
diff --git a/usr.bin/cpio/test/test_gcpio_compat_ref.bin.uu b/usr.bin/cpio/test/test_gcpio_compat_ref.bin.uu
deleted file mode 100644
index 745d8ab..0000000
--- a/usr.bin/cpio/test/test_gcpio_compat_ref.bin.uu
+++ /dev/null
@@ -1,16 +0,0 @@
-$FreeBSD$
-begin 644 test_gcpio_compat_ref.bin
-MQW%9`*IWI('H`^@#`@````U'=YD%````"@!F:6QE```Q,C,T-38W.#D*QW%9
-M`*IWI('H`^@#`@````U'=YD)````"@!L:6YK9FEL90``,3(S-#4V-S@Y"L=Q
-M60"K=^VAZ`/H`P$````-1X29"`````0`<WEM;&EN:P!F:6QEQW%9`*YW_4'H
-M`^@#`@````U'A9D$``````!D:7(`QW$``````````````0`````````+````
-M``!44D%)3$52(2$A````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-1````````````````````````
-`
-end
diff --git a/usr.bin/cpio/test/test_gcpio_compat_ref.crc.uu b/usr.bin/cpio/test/test_gcpio_compat_ref.crc.uu
deleted file mode 100644
index df8dde0..0000000
--- a/usr.bin/cpio/test/test_gcpio_compat_ref.crc.uu
+++ /dev/null
@@ -1,27 +0,0 @@
-$FreeBSD$
-begin 644 test_gcpio_compat_ref.crc
-M,#<P-S`R,#`S,S<W86$P,#`P.#%A-#`P,#`P,V4X,#`P,#`S93@P,#`P,#`P
-M,C0W,&0Y.3<W,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#4Y,#`P,#`P,#`P,#`P
-M,#`P,#`P,#`P,#`U,#`P,#`P,#!F:6QE```P-S`W,#(P,#,S-S=A83`P,#`X
-M,6$T,#`P,#`S93@P,#`P,#-E.#`P,#`P,#`R-#<P9#DY-S<P,#`P,#`P83`P
-M,#`P,#`P,#`P,#`P-3DP,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#DP,#`P,#%E
-M-VQI;FMF:6QE```Q,C,T-38W.#D*```P-S`W,#(P,#,S-S=A8C`P,#!A,65D
-M,#`P,#`S93@P,#`P,#-E.#`P,#`P,#`Q-#<P9#DY.#0P,#`P,#`P-#`P,#`P
-M,#`P,#`P,#`P-3DP,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#@P,#`P,#`P,'-Y
-M;6QI;FL```!F:6QE,#<P-S`R,#`S,S<W864P,#`P-#%F9#`P,#`P,V4X,#`P
-M,#`S93@P,#`P,#`P,C0W,&0Y.3@U,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#4Y
-M,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`T,#`P,#`P,#!D:7(````P-S`W,#(P
-M,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`Q,#`P,#`P
-M,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P
-M,#`P,&(P,#`P,#`P,%1204E,15(A(2$`````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-B````````````````````````````````````````````````
-`
-end
diff --git a/usr.bin/cpio/test/test_gcpio_compat_ref.newc.uu b/usr.bin/cpio/test/test_gcpio_compat_ref.newc.uu
deleted file mode 100644
index 1e29ba9..0000000
--- a/usr.bin/cpio/test/test_gcpio_compat_ref.newc.uu
+++ /dev/null
@@ -1,27 +0,0 @@
-$FreeBSD$
-begin 644 test_gcpio_compat_ref.newc
-M,#<P-S`Q,#`S,S<W86$P,#`P.#%A-#`P,#`P,V4X,#`P,#`S93@P,#`P,#`P
-M,C0W,&0Y.3<W,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#4Y,#`P,#`P,#`P,#`P
-M,#`P,#`P,#`P,#`U,#`P,#`P,#!F:6QE```P-S`W,#$P,#,S-S=A83`P,#`X
-M,6$T,#`P,#`S93@P,#`P,#-E.#`P,#`P,#`R-#<P9#DY-S<P,#`P,#`P83`P
-M,#`P,#`P,#`P,#`P-3DP,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#DP,#`P,#`P
-M,&QI;FMF:6QE```Q,C,T-38W.#D*```P-S`W,#$P,#,S-S=A8C`P,#!A,65D
-M,#`P,#`S93@P,#`P,#-E.#`P,#`P,#`Q-#<P9#DY.#0P,#`P,#`P-#`P,#`P
-M,#`P,#`P,#`P-3DP,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#@P,#`P,#`P,'-Y
-M;6QI;FL```!F:6QE,#<P-S`Q,#`S,S<W864P,#`P-#%F9#`P,#`P,V4X,#`P
-M,#`S93@P,#`P,#`P,C0W,&0Y.3@U,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#4Y
-M,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`T,#`P,#`P,#!D:7(````P-S`W,#$P
-M,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`Q,#`P,#`P
-M,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P
-M,#`P,&(P,#`P,#`P,%1204E,15(A(2$`````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-B````````````````````````````````````````````````
-`
-end
diff --git a/usr.bin/cpio/test/test_gcpio_compat_ref.ustar.uu b/usr.bin/cpio/test/test_gcpio_compat_ref.ustar.uu
deleted file mode 100644
index 77989f4..0000000
--- a/usr.bin/cpio/test/test_gcpio_compat_ref.ustar.uu
+++ /dev/null
@@ -1,84 +0,0 @@
-$FreeBSD$
-begin 644 test_gcpio_compat_ref.ustar
-M9FEL90``````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M`````````````#`P,#`V-#0`,#`P,3<U,``P,#`Q-S4P`#`P,#`P,#`P,#$R
-M`#$P-S`S,S$T-38W`#`P,3$S-C,`,```````````````````````````````
-M````````````````````````````````````````````````````````````
-M``````````````````````````````````````````!U<W1A<@`P,'1I;0``
-M````````````````````````````````````=&EM````````````````````
-M```````````````````P,#`P,#`P`#`P,#`P,#``````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M```````````````````````Q,C,T-38W.#D*````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M`````````````````````````````````````````````&QI;FMF:6QE````
-M````````````````````````````````````````````````````````````
-M```````````````````````````````````````````````````````````P
-M,#`P-C0T`#`P,#$W-3``,#`P,3<U,``P,#`P,#`P,#`P,``Q,#<P,S,Q-#4V
-M-P`P,#$S,#<W`#%F:6QE````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````=7-T87(`,#!T:6T`````````````````
-M`````````````````````'1I;0``````````````````````````````````
-M````,#`P,#`P,``P,#`P,#`P````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````<WEM;&EN:P``````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M`````````````````````#`P,#`W-34`,#`P,3<U,``P,#`Q-S4P`#`P,#`P
-M,#`P,#`P`#$P-S`S,S$T-C`T`#`P,3(W-C0`,F9I;&4`````````````````
-M````````````````````````````````````````````````````````````
-M``````````````````````````````````````````````````!U<W1A<@`P
-M,'1I;0``````````````````````````````````````=&EM````````````
-M```````````````````````````P,#`P,#`P`#`P,#`P,#``````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M``````````````````````````````!D:7(O````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````,#`P,#<W-0`P,#`Q
-M-S4P`#`P,#$W-3``,#`P,#`P,#`P,#``,3`W,#,S,30V,#4`,#`Q,3,P,0`U
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M`````````````'5S=&%R`#`P=&EM````````````````````````````````
-M``````!T:6T``````````````````````````````````````#`P,#`P,#``
-M,#`P,#`P,```````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-=````````````````````````````````````````
-`
-end
diff --git a/usr.bin/cpio/test/test_gcpio_compat_ref_nosym.bin.uu b/usr.bin/cpio/test/test_gcpio_compat_ref_nosym.bin.uu
deleted file mode 100644
index 7a2a272..0000000
--- a/usr.bin/cpio/test/test_gcpio_compat_ref_nosym.bin.uu
+++ /dev/null
@@ -1,17 +0,0 @@
-$FreeBSD$
-
-begin 644 test_gcpio_compat_ref_nosym.bin
-MQW%4`-[Z_4'H`^@#`@`VNZU*NQX$``````!D:7(`QW%4`-SZI('H`^@#`@`G
-MNZU*NQX%````"@!F:6QE```Q,C,T-38W.#D*QW%4`-SZI('H`^@#`@`GNZU*
-MNQX)````"@!L:6YK9FEL90``,3(S-#4V-S@Y"L=Q``````````````$`````
-M````"P``````5%)!24Q%4B$A(0``````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-1````````````````````````
-`
-end
diff --git a/usr.bin/cpio/test/test_gcpio_compat_ref_nosym.crc.uu b/usr.bin/cpio/test/test_gcpio_compat_ref_nosym.crc.uu
deleted file mode 100644
index 0147df7..0000000
--- a/usr.bin/cpio/test/test_gcpio_compat_ref_nosym.crc.uu
+++ /dev/null
@@ -1,17 +0,0 @@
-$FreeBSD$
-
-begin 644 test_gcpio_compat_ref_nosym.crc
-M,#<P-S`R,#`U-D9!1$4P,#`P-#%&1#`P,#`P,T4X,#`P,#`S13@P,#`P,#`P
-M,C1!040Q14)",#`P,#`P,#`P,#`P,#`P,#`P,#`P,#4T,#`P,#`P0D(P,35"
-M,#`S-C`P,#`P,#`T,#`P,#`P,#!D:7(````P-S`W,#(P,#4V1D%$0S`P,#`X
-M,4$T,#`P,#`S13@P,#`P,#-%.#`P,#`P,#`R-$%!1#%%0D(P,#`P,#`P,#`P
-M,#`P,#`P,#`P,#`P-30P,#`P,#!"0C`Q-4(P,#(W,#`P,#`P,#4P,#`P,#`P
-M,&9I;&4``#`W,#<P,C`P-39&041#,#`P,#@Q030P,#`P,#-%.#`P,#`P,T4X
-M,#`P,#`P,#(T04%$,45"0C`P,#`P,#!!,#`P,#`P,#`P,#`P,#`U-#`P,#`P
-M,$)",#$U0C`P,C<P,#`P,#`P.3`P,#`P,44W;&EN:V9I;&4``#$R,S0U-C<X
-M.0H``#`W,#<P,C`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P
-M,#`P,#$P,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P
-M,#`P,#`P,#`P,#`P,#`P0C`P,#`P,#`P5%)!24Q%4B$A(0``````````````
-1````````````````````````
-`
-end
diff --git a/usr.bin/cpio/test/test_gcpio_compat_ref_nosym.newc.uu b/usr.bin/cpio/test/test_gcpio_compat_ref_nosym.newc.uu
deleted file mode 100644
index e2a4900..0000000
--- a/usr.bin/cpio/test/test_gcpio_compat_ref_nosym.newc.uu
+++ /dev/null
@@ -1,17 +0,0 @@
-$FreeBSD$
-
-begin 644 test_gcpio_compat_ref_nosym.newc
-M,#<P-S`Q,#`U-D9!1$4P,#`P-#%&1#`P,#`P,T4X,#`P,#`S13@P,#`P,#`P
-M,C1!040Q14)",#`P,#`P,#`P,#`P,#`P,#`P,#`P,#4T,#`P,#`P0D(P,35"
-M,#`S-C`P,#`P,#`T,#`P,#`P,#!D:7(````P-S`W,#$P,#4V1D%$0S`P,#`X
-M,4$T,#`P,#`S13@P,#`P,#-%.#`P,#`P,#`R-$%!1#%%0D(P,#`P,#`P,#`P
-M,#`P,#`P,#`P,#`P-30P,#`P,#!"0C`Q-4(P,#(W,#`P,#`P,#4P,#`P,#`P
-M,&9I;&4``#`W,#<P,3`P-39&041#,#`P,#@Q030P,#`P,#-%.#`P,#`P,T4X
-M,#`P,#`P,#(T04%$,45"0C`P,#`P,#!!,#`P,#`P,#`P,#`P,#`U-#`P,#`P
-M,$)",#$U0C`P,C<P,#`P,#`P.3`P,#`P,#`P;&EN:V9I;&4``#$R,S0U-C<X
-M.0H``#`W,#<P,3`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P
-M,#`P,#$P,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P
-M,#`P,#`P,#`P,#`P,#`P0C`P,#`P,#`P5%)!24Q%4B$A(0``````````````
-1````````````````````````
-`
-end
diff --git a/usr.bin/cpio/test/test_gcpio_compat_ref_nosym.ustar.uu b/usr.bin/cpio/test/test_gcpio_compat_ref_nosym.ustar.uu
deleted file mode 100644
index b5cbd66..0000000
--- a/usr.bin/cpio/test/test_gcpio_compat_ref_nosym.ustar.uu
+++ /dev/null
@@ -1,74 +0,0 @@
-$FreeBSD$
-
-begin 644 test_gcpio_compat_ref_nosym.ustar
-M9&ER+P``````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M`````````````#`P,#`W-S4`,#`P,3<U,``P,#`Q-S4P`#`P,#`P,#`P,#`P
-M`#$Q,C4S,C$W,C<S`#`P,3$S-3$`-0``````````````````````````````
-M````````````````````````````````````````````````````````````
-M``````````````````````````````````````````!U<W1A<@`P,'1I;0``
-M````````````````````````````````````=&EM````````````````````
-M```````````````````P,#`P,C<S`#8V,#`P-C8`````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M``````````````````````!F:6QE````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````,#`P,#8T-``P,#`Q-S4P`#`P
-M,#$W-3``,#`P,#`P,#`P,3(`,3$R-3,R,3<R-S,`,#`Q,30R,P`P````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M`````'5S=&%R`#`P=&EM``````````````````````````````````````!T
-M:6T``````````````````````````````````````#`P,#`R-S,`-C8P,#`T
-M-P``````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M`````````````````````````````````````````````#$R,S0U-C<X.0H`
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````;&EN:V9I;&4`````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M`````````````````````#`P,#`V-#0`,#`P,3<U,``P,#`Q-S4P`#`P,#`P
-M,#`P,#`P`#$Q,C4S,C$W,C<S`#`P,3,Q,S<`,69I;&4`````````````````
-M````````````````````````````````````````````````````````````
-M``````````````````````````````````````````````````!U<W1A<@`P
-M,'1I;0``````````````````````````````````````=&EM````````````
-M```````````````````````````P,#`P,C<S`#8V,#`P-#<`````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-,````````````````
-`
-end
diff --git a/usr.bin/cpio/test/test_option_B_upper.c b/usr.bin/cpio/test/test_option_B_upper.c
deleted file mode 100644
index b040354..0000000
--- a/usr.bin/cpio/test/test_option_B_upper.c
+++ /dev/null
@@ -1,52 +0,0 @@
-/*-
- * Copyright (c) 2003-2007 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.
- */
-#include "test.h"
-__FBSDID("$FreeBSD$");
-
-
-DEFINE_TEST(test_option_B_upper)
-{
- struct stat st;
- int r;
-
- /*
- * Create a file on disk.
- */
- assertMakeFile("file", 0644, NULL);
-
- /* Create an archive without -B; this should be 512 bytes. */
- r = systemf("echo file | %s -o > small.cpio 2>small.err", testprog);
- assertEqualInt(r, 0);
- assertTextFileContents("1 block\n", "small.err");
- assertEqualInt(0, stat("small.cpio", &st));
- assertEqualInt(512, st.st_size);
-
- /* Create an archive with -B; this should be 5120 bytes. */
- r = systemf("echo file | %s -oB > large.cpio 2>large.err", testprog);
- assertEqualInt(r, 0);
- assertTextFileContents("1 block\n", "large.err");
- assertEqualInt(0, stat("large.cpio", &st));
- assertEqualInt(5120, st.st_size);
-}
diff --git a/usr.bin/cpio/test/test_option_C_upper.c b/usr.bin/cpio/test/test_option_C_upper.c
deleted file mode 100644
index c8e63fd..0000000
--- a/usr.bin/cpio/test/test_option_C_upper.c
+++ /dev/null
@@ -1,62 +0,0 @@
-/*-
- * Copyright (c) 2003-2007 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.
- */
-#include "test.h"
-__FBSDID("$FreeBSD$");
-
-
-DEFINE_TEST(test_option_C_upper)
-{
- int r;
-
- /*
- * Create a file on disk.
- */
- assertMakeFile("file", 0644, NULL);
-
- /* Create an archive without -C; this should be 512 bytes. */
- r = systemf("echo file | %s -o > small.cpio 2>small.err", testprog);
- assertEqualInt(r, 0);
- assertTextFileContents("1 block\n", "small.err");
- assertFileSize("small.cpio", 512);
-
- /* Create an archive with -C 513; this should be 513 bytes. */
- r = systemf("echo file | %s -o -C 513 > 513.cpio 2>513.err",
- testprog);
- assertEqualInt(r, 0);
- assertTextFileContents("1 block\n", "513.err");
- assertFileSize("513.cpio", 513);
-
- /* Create an archive with -C 12345; this should be 12345 bytes. */
- r = systemf("echo file | %s -o -C12345 > 12345.cpio 2>12345.err",
- testprog);
- assertEqualInt(r, 0);
- assertTextFileContents("1 block\n", "12345.err");
- assertFileSize("12345.cpio", 12345);
-
- /* Create an archive with invalid -C request */
- assert(0 != systemf("echo file | %s -o -C > bad.cpio 2>bad.err",
- testprog));
- assertEmptyFile("bad.cpio");
-}
diff --git a/usr.bin/cpio/test/test_option_J_upper.c b/usr.bin/cpio/test/test_option_J_upper.c
deleted file mode 100644
index 532aacf..0000000
--- a/usr.bin/cpio/test/test_option_J_upper.c
+++ /dev/null
@@ -1,56 +0,0 @@
-/*-
- * Copyright (c) 2003-2009 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.
- */
-#include "test.h"
-__FBSDID("$FreeBSD$");
-
-DEFINE_TEST(test_option_J_upper)
-{
- char *p;
- int r;
- size_t s;
-
- /* Create a file. */
- assertMakeFile("f", 0644, "a");
-
- /* Archive it with xz compression. */
- r = systemf("echo f | %s -o -J >archive.out 2>archive.err",
- testprog);
- p = slurpfile(&s, "archive.err");
- p[s] = '\0';
- if (r != 0) {
- if (strstr(p, "compression not available") != NULL) {
- skipping("This version of bsdcpio was compiled "
- "without xz support");
- return;
- }
- failure("-J option is broken");
- assertEqualInt(r, 0);
- return;
- }
- /* Check that the archive file has an xz signature. */
- p = slurpfile(&s, "archive.out");
- assert(s > 2);
- assertEqualMem(p, "\3757zXZ", 5);
-}
diff --git a/usr.bin/cpio/test/test_option_L_upper.c b/usr.bin/cpio/test/test_option_L_upper.c
deleted file mode 100644
index 0acc100..0000000
--- a/usr.bin/cpio/test/test_option_L_upper.c
+++ /dev/null
@@ -1,101 +0,0 @@
-/*-
- * Copyright (c) 2003-2007 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.
- */
-#include "test.h"
-__FBSDID("$FreeBSD$");
-
-/* This is a little pointless, as Windows doesn't support symlinks
- * (except for the seriously crippled CreateSymbolicLink API) so these
- * tests won't run on Windows. */
-#if defined(_WIN32) && !defined(__CYGWIN__)
-#define CAT "type"
-#else
-#define CAT "cat"
-#endif
-
-DEFINE_TEST(test_option_L_upper)
-{
- FILE *filelist;
- int r;
-
- if (!canSymlink()) {
- skipping("Symlink tests");
- return;
- }
-
- filelist = fopen("filelist", "w");
-
- /* Create a file and a symlink to the file. */
- assertMakeFile("file", 0644, "1234567890");
- fprintf(filelist, "file\n");
-
- /* Symlink to above file. */
- assertMakeSymlink("symlink", "file");
- fprintf(filelist, "symlink\n");
-
- fclose(filelist);
-
- r = systemf(CAT " filelist | %s -pd copy >copy.out 2>copy.err", testprog);
- assertEqualInt(r, 0);
- assertTextFileContents("1 block\n", "copy.err");
-
- failure("Regular -p without -L should preserve symlinks.");
- assertIsSymlink("copy/symlink", NULL);
-
- r = systemf(CAT " filelist | %s -pd -L copy-L >copy-L.out 2>copy-L.err", testprog);
- assertEqualInt(r, 0);
- assertEmptyFile("copy-L.out");
- assertTextFileContents("1 block\n", "copy-L.err");
- failure("-pdL should dereference symlinks and turn them into files.");
- assertIsReg("copy-L/symlink", -1);
-
- r = systemf(CAT " filelist | %s -o >archive.out 2>archive.err", testprog);
- failure("Error invoking %s -o ", testprog);
- assertEqualInt(r, 0);
- assertTextFileContents("1 block\n", "archive.err");
-
- assertMakeDir("unpack", 0755);
- assertChdir("unpack");
- r = systemf(CAT " ../archive.out | %s -i >unpack.out 2>unpack.err", testprog);
- failure("Error invoking %s -i", testprog);
- assertEqualInt(r, 0);
- assertTextFileContents("1 block\n", "unpack.err");
- assertChdir("..");
-
- assertIsSymlink("unpack/symlink", NULL);
-
- r = systemf(CAT " filelist | %s -oL >archive-L.out 2>archive-L.err", testprog);
- failure("Error invoking %s -oL", testprog);
- assertEqualInt(r, 0);
- assertTextFileContents("1 block\n", "archive-L.err");
-
- assertMakeDir("unpack-L", 0755);
- assertChdir("unpack-L");
- r = systemf(CAT " ../archive-L.out | %s -i >unpack-L.out 2>unpack-L.err", testprog);
- failure("Error invoking %s -i < archive-L.out", testprog);
- assertEqualInt(r, 0);
- assertTextFileContents("1 block\n", "unpack-L.err");
- assertChdir("..");
- assertIsReg("unpack-L/symlink", -1);
-}
diff --git a/usr.bin/cpio/test/test_option_Z_upper.c b/usr.bin/cpio/test/test_option_Z_upper.c
deleted file mode 100644
index 936ce0c..0000000
--- a/usr.bin/cpio/test/test_option_Z_upper.c
+++ /dev/null
@@ -1,56 +0,0 @@
-/*-
- * Copyright (c) 2003-2009 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.
- */
-#include "test.h"
-__FBSDID("$FreeBSD$");
-
-DEFINE_TEST(test_option_Z_upper)
-{
- char *p;
- int r;
- size_t s;
-
- /* Create a file. */
- assertMakeFile("f", 0644, "a");
-
- /* Archive it with compress compression. */
- r = systemf("echo f | %s -oZ >archive.out 2>archive.err",
- testprog);
- p = slurpfile(&s, "archive.err");
- p[s] = '\0';
- if (r != 0) {
- if (strstr(p, "compression not available") != NULL) {
- skipping("This version of bsdcpio was compiled "
- "without compress support");
- return;
- }
- failure("-Z option is broken");
- assertEqualInt(r, 0);
- return;
- }
- /* Check that the archive file has a compress signature. */
- p = slurpfile(&s, "archive.out");
- assert(s > 2);
- assertEqualMem(p, "\x1f\x9d", 2);
-}
diff --git a/usr.bin/cpio/test/test_option_a.c b/usr.bin/cpio/test/test_option_a.c
deleted file mode 100644
index af4b48e..0000000
--- a/usr.bin/cpio/test/test_option_a.c
+++ /dev/null
@@ -1,154 +0,0 @@
-/*-
- * Copyright (c) 2003-2008 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.
- */
-#include "test.h"
-#if defined(HAVE_UTIME_H)
-#include <utime.h>
-#elif defined(HAVE_SYS_UTIME_H)
-#include <sys/utime.h>
-#endif
-__FBSDID("$FreeBSD$");
-
-static struct {
- const char *name;
- time_t atime_sec;
-} files[] = {
- { "f0", 0 },
- { "f1", 0 },
- { "f2", 0 },
- { "f3", 0 },
- { "f4", 0 },
- { "f5", 0 }
-};
-
-/*
- * Create a bunch of test files and record their atimes.
- * For the atime preserve/change tests, the files must have
- * atimes in the past. We can accomplish this by explicitly invoking
- * utime() on platforms that support it or by simply sleeping
- * for a second after creating the files. (Creating all of the files
- * at once means we only need to sleep once.)
- */
-static void
-test_create(void)
-{
- struct stat st;
- struct utimbuf times;
- static const int numfiles = sizeof(files) / sizeof(files[0]);
- int i;
-
- for (i = 0; i < numfiles; ++i) {
- /*
- * Note: Have to write at least one byte to the file.
- * cpio doesn't bother reading the file if it's zero length,
- * so the atime never gets changed in that case, which
- * makes the tests below rather pointless.
- */
- assertMakeFile(files[i].name, 0644, "a");
-
- /* If utime() isn't supported on your platform, just
- * #ifdef this section out. Most of the test below is
- * still valid. */
- memset(&times, 0, sizeof(times));
- times.actime = 1;
- times.modtime = 3;
- assertEqualInt(0, utime(files[i].name, &times));
-
- /* Record whatever atime the file ended up with. */
- /* If utime() is available, this should be 1, but there's
- * no harm in being careful. */
- assertEqualInt(0, stat(files[i].name, &st));
- files[i].atime_sec = st.st_atime;
- }
-
- /* Wait until the atime on the last file is actually in the past. */
- sleepUntilAfter(files[numfiles - 1].atime_sec);
-}
-
-DEFINE_TEST(test_option_a)
-{
- struct stat st;
- int r;
- char *p;
-
- /* Create all of the test files. */
- test_create();
-
- /* Sanity check; verify that atimes really do get modified. */
- assert((p = slurpfile(NULL, "f0")) != NULL);
- free(p);
- assertEqualInt(0, stat("f0", &st));
- if (st.st_atime == files[0].atime_sec) {
- skipping("Cannot verify -a option\n"
- " Your system appears to not support atime.");
- }
- else
- {
- /*
- * If this disk is mounted noatime, then we can't
- * verify correct operation without -a.
- */
-
- /* Copy the file without -a; should change the atime. */
- r = systemf("echo %s | %s -pd copy-no-a > copy-no-a.out 2>copy-no-a.err", files[1].name, testprog);
- assertEqualInt(r, 0);
- assertTextFileContents("1 block\n", "copy-no-a.err");
- assertEmptyFile("copy-no-a.out");
- assertEqualInt(0, stat(files[1].name, &st));
- failure("Copying file without -a should have changed atime.");
- assert(st.st_atime != files[1].atime_sec);
-
- /* Archive the file without -a; should change the atime. */
- r = systemf("echo %s | %s -o > archive-no-a.out 2>archive-no-a.err", files[2].name, testprog);
- assertEqualInt(r, 0);
- assertTextFileContents("1 block\n", "copy-no-a.err");
- assertEqualInt(0, stat(files[2].name, &st));
- failure("Archiving file without -a should have changed atime.");
- assert(st.st_atime != files[2].atime_sec);
- }
-
- /*
- * We can, of course, still verify that the atime is unchanged
- * when using the -a option.
- */
-
- /* Copy the file with -a; should not change the atime. */
- r = systemf("echo %s | %s -pad copy-a > copy-a.out 2>copy-a.err",
- files[3].name, testprog);
- assertEqualInt(r, 0);
- assertTextFileContents("1 block\n", "copy-a.err");
- assertEmptyFile("copy-a.out");
- assertEqualInt(0, stat(files[3].name, &st));
- failure("Copying file with -a should not have changed atime.");
- assertEqualInt(st.st_atime, files[3].atime_sec);
-
- /* Archive the file with -a; should not change the atime. */
- r = systemf("echo %s | %s -oa > archive-a.out 2>archive-a.err",
- files[4].name, testprog);
- assertEqualInt(r, 0);
- assertTextFileContents("1 block\n", "copy-a.err");
- assertEqualInt(0, stat(files[4].name, &st));
- failure("Archiving file with -a should not have changed atime.");
- assertEqualInt(st.st_atime, files[4].atime_sec);
-}
diff --git a/usr.bin/cpio/test/test_option_c.c b/usr.bin/cpio/test/test_option_c.c
deleted file mode 100644
index 63dcdbd..0000000
--- a/usr.bin/cpio/test/test_option_c.c
+++ /dev/null
@@ -1,221 +0,0 @@
-/*-
- * Copyright (c) 2003-2007 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.
- */
-#include "test.h"
-__FBSDID("$FreeBSD$");
-
-static int
-is_octal(const char *p, size_t l)
-{
- while (l > 0) {
- if (*p < '0' || *p > '7')
- return (0);
- --l;
- ++p;
- }
- return (1);
-}
-
-static int
-from_octal(const char *p, size_t l)
-{
- int r = 0;
-
- while (l > 0) {
- r *= 8;
- r += *p - '0';
- --l;
- ++p;
- }
- return (r);
-}
-
-DEFINE_TEST(test_option_c)
-{
- FILE *filelist;
- int r;
- int uid = -1;
- int dev, ino, gid;
- time_t t, now;
- char *p, *e;
- size_t s;
-
- assertUmask(0);
-
-#if !defined(_WIN32)
- uid = getuid();
-#endif
-
- /*
- * Create an assortment of files.
- * TODO: Extend this to cover more filetypes.
- */
- filelist = fopen("filelist", "w");
-
- /* "file" */
- assertMakeFile("file", 0644, "1234567890");
- fprintf(filelist, "file\n");
-
- /* "symlink" */
- if (canSymlink()) {
- assertMakeSymlink("symlink", "file");
- fprintf(filelist, "symlink\n");
- }
-
- /* "dir" */
- assertMakeDir("dir", 0775);
- /* Record some facts about what we just created: */
- now = time(NULL); /* They were all created w/in last two seconds. */
- fprintf(filelist, "dir\n");
-
- /* Use the cpio program to create an archive. */
- fclose(filelist);
- r = systemf("%s -oc <filelist >basic.out 2>basic.err", testprog);
- /* Verify that nothing went to stderr. */
- assertTextFileContents("1 block\n", "basic.err");
-
- /* Assert that the program finished. */
- failure("%s -oc crashed", testprog);
- if (!assertEqualInt(r, 0))
- return;
-
- /* Verify that stdout is a well-formed cpio file in "odc" format. */
- p = slurpfile(&s, "basic.out");
- assertEqualInt(s, 512);
- e = p;
-
- /*
- * Some of these assertions could be stronger, but it's
- * a little tricky because they depend on the local environment.
- */
-
- /* First entry is "file" */
- assert(is_octal(e, 76)); /* Entire header is octal digits. */
- assertEqualMem(e + 0, "070707", 6); /* Magic */
- assert(is_octal(e + 6, 6)); /* dev */
- dev = from_octal(e + 6, 6);
- assert(is_octal(e + 12, 6)); /* ino */
- ino = from_octal(e + 12, 6);
-#if defined(_WIN32) && !defined(__CYGWIN__)
- /* Group members bits and others bits do not work. */
- assertEqualMem(e + 18, "100666", 6); /* Mode */
-#else
- assertEqualMem(e + 18, "100644", 6); /* Mode */
-#endif
- if (uid < 0)
- uid = from_octal(e + 24, 6);
- assertEqualInt(from_octal(e + 24, 6), uid); /* uid */
- assert(is_octal(e + 30, 6)); /* gid */
- gid = from_octal(e + 30, 6);
- assertEqualMem(e + 36, "000001", 6); /* nlink */
- failure("file entries should not have rdev set (dev field was 0%o)",
- dev);
- assertEqualMem(e + 42, "000000", 6); /* rdev */
- t = from_octal(e + 48, 11); /* mtime */
- assert(t <= now); /* File wasn't created in future. */
- assert(t >= now - 2); /* File was created w/in last 2 secs. */
- assertEqualMem(e + 59, "000005", 6); /* Name size */
- assertEqualMem(e + 65, "00000000012", 11); /* File size */
- assertEqualMem(e + 76, "file\0", 5); /* Name contents */
- assertEqualMem(e + 81, "1234567890", 10); /* File contents */
- e += 91;
-
- /* "symlink" pointing to "file" */
- if (canSymlink()) {
- assert(is_octal(e, 76)); /* Entire header is octal digits. */
- assertEqualMem(e + 0, "070707", 6); /* Magic */
- assertEqualInt(dev, from_octal(e + 6, 6)); /* dev */
- assert(ino != from_octal(e + 12, 6)); /* ino */
-#if !defined(_WIN32) || defined(__CYGWIN__)
- /* On Windows, symbolic link and group members bits and
- * others bits do not work. */
- assertEqualMem(e + 18, "120777", 6); /* Mode */
-#endif
- assertEqualInt(from_octal(e + 24, 6), uid); /* uid */
- assertEqualInt(gid, from_octal(e + 30, 6)); /* gid */
- assertEqualMem(e + 36, "000001", 6); /* nlink */
- failure("file entries should have rdev == 0 (dev was 0%o)",
- from_octal(e + 6, 6));
- assertEqualMem(e + 42, "000000", 6); /* rdev */
- t = from_octal(e + 48, 11); /* mtime */
- assert(t <= now); /* File wasn't created in future. */
- assert(t >= now - 2); /* File was created w/in last 2 secs. */
- assertEqualMem(e + 59, "000010", 6); /* Name size */
- assertEqualMem(e + 65, "00000000004", 11); /* File size */
- assertEqualMem(e + 76, "symlink\0", 8); /* Name contents */
- assertEqualMem(e + 84, "file", 4); /* Symlink target. */
- e += 88;
- }
-
- /* "dir" */
- assert(is_octal(e, 76));
- assertEqualMem(e + 0, "070707", 6); /* Magic */
- /* Dev should be same as first entry. */
- assert(is_octal(e + 6, 6)); /* dev */
- assertEqualInt(dev, from_octal(e + 6, 6));
- /* Ino must be different from first entry. */
- assert(is_octal(e + 12, 6)); /* ino */
- assert(ino != from_octal(e + 12, 6));
-#if defined(_WIN32) && !defined(__CYGWIN__)
- /* Group members bits and others bits do not work. */
- assertEqualMem(e + 18, "040777", 6); /* Mode */
-#else
- /* Accept 042775 to accomodate systems where sgid bit propagates. */
- if (memcmp(e + 18, "042775", 6) != 0)
- assertEqualMem(e + 18, "040775", 6); /* Mode */
-#endif
- assertEqualInt(from_octal(e + 24, 6), uid); /* uid */
- /* Gid should be same as first entry. */
- assert(is_octal(e + 30, 6)); /* gid */
- assertEqualInt(gid, from_octal(e + 30, 6));
-#ifndef NLINKS_INACCURATE_FOR_DIRS
- assertEqualMem(e + 36, "000002", 6); /* Nlink */
-#endif
- t = from_octal(e + 48, 11); /* mtime */
- assert(t <= now); /* File wasn't created in future. */
- assert(t >= now - 2); /* File was created w/in last 2 secs. */
- assertEqualMem(e + 59, "000004", 6); /* Name size */
- assertEqualMem(e + 65, "00000000000", 11); /* File size */
- assertEqualMem(e + 76, "dir\0", 4); /* name */
- e += 80;
-
- /* TODO: Verify other types of entries. */
-
- /* Last entry is end-of-archive marker. */
- assert(is_octal(e, 76));
- assertEqualMem(e + 0, "070707", 6); /* Magic */
- assertEqualMem(e + 6, "000000", 6); /* dev */
- assertEqualMem(e + 12, "000000", 6); /* ino */
- assertEqualMem(e + 18, "000000", 6); /* Mode */
- assertEqualMem(e + 24, "000000", 6); /* uid */
- assertEqualMem(e + 30, "000000", 6); /* gid */
- assertEqualMem(e + 36, "000001", 6); /* Nlink */
- assertEqualMem(e + 42, "000000", 6); /* rdev */
- assertEqualMem(e + 48, "00000000000", 11); /* mtime */
- assertEqualMem(e + 59, "000013", 6); /* Name size */
- assertEqualMem(e + 65, "00000000000", 11); /* File size */
- assertEqualMem(e + 76, "TRAILER!!!\0", 11); /* Name */
-
- free(p);
-}
diff --git a/usr.bin/cpio/test/test_option_d.c b/usr.bin/cpio/test/test_option_d.c
deleted file mode 100644
index 9ff1453..0000000
--- a/usr.bin/cpio/test/test_option_d.c
+++ /dev/null
@@ -1,64 +0,0 @@
-/*-
- * Copyright (c) 2003-2007 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.
- */
-#include "test.h"
-__FBSDID("$FreeBSD$");
-
-
-DEFINE_TEST(test_option_d)
-{
- int r;
-
- /*
- * Create a file in a directory.
- */
- assertMakeDir("dir", 0755);
- assertMakeFile("dir/file", 0644, NULL);
-
- /* Create an archive. */
- r = systemf("echo dir/file | %s -o > archive.cpio 2>archive.err", testprog);
- assertEqualInt(r, 0);
- assertTextFileContents("1 block\n", "archive.err");
- assertFileSize("archive.cpio", 512);
-
- /* Dearchive without -d, this should fail. */
- assertMakeDir("without-d", 0755);
- assertChdir("without-d");
- r = systemf("%s -i < ../archive.cpio >out 2>err", testprog);
- assertEqualInt(r, 0);
- assertEmptyFile("out");
- /* And the file should not be restored. */
- assertFileNotExists("dir/file");
-
- /* Dearchive with -d, this should succeed. */
- assertChdir("..");
- assertMakeDir("with-d", 0755);
- assertChdir("with-d");
- r = systemf("%s -id < ../archive.cpio >out 2>err", testprog);
- assertEqualInt(r, 0);
- assertEmptyFile("out");
- assertTextFileContents("1 block\n", "err");
- /* And the file should be restored. */
- assertFileExists("dir/file");
-}
diff --git a/usr.bin/cpio/test/test_option_f.c b/usr.bin/cpio/test/test_option_f.c
deleted file mode 100644
index 784e085..0000000
--- a/usr.bin/cpio/test/test_option_f.c
+++ /dev/null
@@ -1,76 +0,0 @@
-/*-
- * Copyright (c) 2003-2007 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.
- */
-#include "test.h"
-__FBSDID("$FreeBSD$");
-
-/*
- * Unpack the archive in a new dir.
- */
-static void
-unpack(const char *dirname, const char *option)
-{
- int r;
-
- assertMakeDir(dirname, 0755);
- assertChdir(dirname);
- extract_reference_file("test_option_f.cpio");
- r = systemf("%s -i %s < test_option_f.cpio > copy-no-a.out 2>copy-no-a.err", testprog, option);
- assertEqualInt(0, r);
- assertChdir("..");
-}
-
-DEFINE_TEST(test_option_f)
-{
- /* Calibrate: No -f option, so everything should be extracted. */
- unpack("t0", "--no-preserve-owner");
- assertFileExists("t0/a123");
- assertFileExists("t0/a234");
- assertFileExists("t0/b123");
- assertFileExists("t0/b234");
-
- /* Don't extract 'a*' files. */
-#if defined(_WIN32) && !defined(__CYGWIN__)
- /* Single quotes isn't used by command.exe. */
- unpack("t1", "--no-preserve-owner -f a*");
-#else
- unpack("t1", "--no-preserve-owner -f 'a*'");
-#endif
- assertFileNotExists("t1/a123");
- assertFileNotExists("t1/a234");
- assertFileExists("t1/b123");
- assertFileExists("t1/b234");
-
- /* Don't extract 'b*' files. */
-#if defined(_WIN32) && !defined(__CYGWIN__)
- /* Single quotes isn't used by command.exe. */
- unpack("t2", "--no-preserve-owner -f b*");
-#else
- unpack("t2", "--no-preserve-owner -f 'b*'");
-#endif
- assertFileExists("t2/a123");
- assertFileExists("t2/a234");
- assertFileNotExists("t2/b123");
- assertFileNotExists("t2/b234");
-}
diff --git a/usr.bin/cpio/test/test_option_f.cpio.uu b/usr.bin/cpio/test/test_option_f.cpio.uu
deleted file mode 100644
index 42c63c3..0000000
--- a/usr.bin/cpio/test/test_option_f.cpio.uu
+++ /dev/null
@@ -1,16 +0,0 @@
-$FreeBSD$
-begin 644 test_option_f.cpio
-M,#<P-S`W,#`P,3,Q-C(Q-38Q,3`P-C0T,#`Q-S4P,#`Q-S4P,#`P,#`Q,#`P
-M,#`P,3`W,S4Q,3(U,C8P,#`P,#4P,#`P,#`P,#`P,&$Q,C,`,#<P-S`W,#`P
-M,3,Q-C(Q-38S,3`P-C0T,#`Q-S4P,#`Q-S4P,#`P,#`Q,#`P,#`P,3`W,S4Q
-M,3(U-#`P,#`P,#4P,#`P,#`P,#`P,&$R,S0`,#<P-S`W,#`P,3,Q-C(Q-38R
-M,3`P-C0T,#`Q-S4P,#`Q-S4P,#`P,#`Q,#`P,#`P,3`W,S4Q,3(U,S0P,#`P
-M,#4P,#`P,#`P,#`P,&(Q,C,`,#<P-S`W,#`P,3,Q-C(Q-38T,3`P-C0T,#`Q
-M-S4P,#`Q-S4P,#`P,#`Q,#`P,#`P,3`W,S4Q,3(U-#,P,#`P,#4P,#`P,#`P
-M,#`P,&(R,S0`,#<P-S`W,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P
-M,#`P,#`Q,#`P,#`P,#`P,#`P,#`P,#`P,#`P,3,P,#`P,#`P,#`P,%1204E,
-M15(A(2$`````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-1````````````````````````
-`
-end
diff --git a/usr.bin/cpio/test/test_option_help.c b/usr.bin/cpio/test/test_option_help.c
deleted file mode 100644
index 5623430..0000000
--- a/usr.bin/cpio/test/test_option_help.c
+++ /dev/null
@@ -1,84 +0,0 @@
-/*-
- * Copyright (c) 2003-2007 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.
- */
-#include "test.h"
-__FBSDID("$FreeBSD$");
-
-/*
- * Test that "--help", "-h", and "-W help" options all work and
- * generate reasonable output.
- */
-
-static int
-in_first_line(const char *p, const char *substring)
-{
- size_t l = strlen(substring);
-
- while (*p != '\0' && *p != '\n') {
- if (memcmp(p, substring, l) == 0)
- return (1);
- ++p;
- }
- return (0);
-}
-
-DEFINE_TEST(test_option_help)
-{
- int r;
- char *p;
- size_t plen;
-
- /* Exercise --help option. */
- r = systemf("%s --help >help.stdout 2>help.stderr", testprog);
- assertEqualInt(r, 0);
- failure("--help should generate nothing to stderr.");
- assertEmptyFile("help.stderr");
- /* Help message should start with name of program. */
- p = slurpfile(&plen, "help.stdout");
- failure("Help output should be long enough.");
- assert(plen >= 7);
- failure("First line of help output should contain string 'bsdcpio'");
- assert(in_first_line(p, "bsdcpio"));
- /*
- * TODO: Extend this check to further verify that --help output
- * looks approximately right.
- */
- free(p);
-
- /* -h option should generate the same output. */
- r = systemf("%s -h >h.stdout 2>h.stderr", testprog);
- assertEqualInt(r, 0);
- failure("-h should generate nothing to stderr.");
- assertEmptyFile("h.stderr");
- failure("stdout should be same for -h and --help");
- assertEqualFile("h.stdout", "help.stdout");
-
- /* -W help should be another synonym. */
- r = systemf("%s -W help >Whelp.stdout 2>Whelp.stderr", testprog);
- assertEqualInt(r, 0);
- failure("-W help should generate nothing to stderr.");
- assertEmptyFile("Whelp.stderr");
- failure("stdout should be same for -W help and --help");
- assertEqualFile("Whelp.stdout", "help.stdout");
-}
diff --git a/usr.bin/cpio/test/test_option_l.c b/usr.bin/cpio/test/test_option_l.c
deleted file mode 100644
index 5c76e68..0000000
--- a/usr.bin/cpio/test/test_option_l.c
+++ /dev/null
@@ -1,50 +0,0 @@
-/*-
- * Copyright (c) 2003-2007 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.
- */
-#include "test.h"
-__FBSDID("$FreeBSD$");
-
-DEFINE_TEST(test_option_l)
-{
- int r;
-
- /* Create a file. */
- assertMakeFile("f", 0644, "a");
-
- /* Copy the file to the "copy" dir. */
- r = systemf("echo f | %s -pd copy >copy.out 2>copy.err",
- testprog);
- assertEqualInt(r, 0);
-
- /* Check that the copy is a true copy and not a link. */
- assertIsNotHardlink("f", "copy/f");
-
- /* Copy the file to the "link" dir with the -l option. */
- r = systemf("echo f | %s -pld link >link.out 2>link.err",
- testprog);
- assertEqualInt(r, 0);
-
- /* Check that this is a link and not a copy. */
- assertIsHardlink("f", "link/f");
-}
diff --git a/usr.bin/cpio/test/test_option_lzma.c b/usr.bin/cpio/test/test_option_lzma.c
deleted file mode 100644
index c6e3353..0000000
--- a/usr.bin/cpio/test/test_option_lzma.c
+++ /dev/null
@@ -1,56 +0,0 @@
-/*-
- * Copyright (c) 2003-2007 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.
- */
-#include "test.h"
-__FBSDID("$FreeBSD$");
-
-DEFINE_TEST(test_option_lzma)
-{
- char *p;
- int r;
- size_t s;
-
- /* Create a file. */
- assertMakeFile("f", 0644, "a");
-
- /* Archive it with lzma compression. */
- r = systemf("echo f | %s -o --lzma >archive.out 2>archive.err",
- testprog);
- p = slurpfile(&s, "archive.err");
- p[s] = '\0';
- if (r != 0) {
- if (strstr(p, "compression not available") != NULL) {
- skipping("This version of bsdcpio was compiled "
- "without lzma support");
- return;
- }
- failure("--lzma option is broken");
- assertEqualInt(r, 0);
- return;
- }
- /* Check that the archive file has an lzma signature. */
- p = slurpfile(&s, "archive.out");
- assert(s > 2);
- assertEqualMem(p, "\x5d\00\00", 3);
-}
diff --git a/usr.bin/cpio/test/test_option_m.c b/usr.bin/cpio/test/test_option_m.c
deleted file mode 100644
index de880b2..0000000
--- a/usr.bin/cpio/test/test_option_m.c
+++ /dev/null
@@ -1,63 +0,0 @@
-/*-
- * Copyright (c) 2003-2007 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.
- */
-#include "test.h"
-__FBSDID("$FreeBSD$");
-
-
-DEFINE_TEST(test_option_m)
-{
- int r;
-
- /*
- * The reference archive has one file with an mtime in 1970, 1
- * second after the start of the epoch.
- */
-
- /* Restored without -m, the result should have a current mtime. */
- assertMakeDir("without-m", 0755);
- assertChdir("without-m");
- extract_reference_file("test_option_m.cpio");
- r = systemf("%s --no-preserve-owner -i < test_option_m.cpio >out 2>err", testprog);
- assertEqualInt(r, 0);
- assertEmptyFile("out");
- assertTextFileContents("1 block\n", "err");
- /* Should have been created within the last few seconds. */
- assertFileMtimeRecent("file");
-
- /* With -m, it should have an mtime in 1970. */
- assertChdir("..");
- assertMakeDir("with-m", 0755);
- assertChdir("with-m");
- extract_reference_file("test_option_m.cpio");
- r = systemf("%s --no-preserve-owner -im < test_option_m.cpio >out 2>err", testprog);
- assertEqualInt(r, 0);
- assertEmptyFile("out");
- assertTextFileContents("1 block\n", "err");
- /*
- * mtime in reference archive is '1' == 1 second after
- * midnight Jan 1, 1970 UTC.
- */
- assertFileMtime("file", 1, 0);
-}
diff --git a/usr.bin/cpio/test/test_option_m.cpio.uu b/usr.bin/cpio/test/test_option_m.cpio.uu
deleted file mode 100644
index 3d20023..0000000
--- a/usr.bin/cpio/test/test_option_m.cpio.uu
+++ /dev/null
@@ -1,16 +0,0 @@
-$FreeBSD$
-begin 644 test_option_m.cpio
-M,#<P-S`W,#`P,3,Q-#4P,#8T,3`P-C0T,#`Q-S4P,#`Q-S4P,#`P,#`Q,#`P
-M,#`P,#`P,#`P,#`P,#$P,#`P,#4P,#`P,#`P,#`P,&9I;&4`,#<P-S`W,#`P
-M,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`Q,#`P,#`P,#`P,#`P
-M,#`P,#`P,#`P,3,P,#`P,#`P,#`P,%1204E,15(A(2$`````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-1````````````````````````
-`
-end
diff --git a/usr.bin/cpio/test/test_option_t.c b/usr.bin/cpio/test/test_option_t.c
deleted file mode 100644
index 4427bb3..0000000
--- a/usr.bin/cpio/test/test_option_t.c
+++ /dev/null
@@ -1,95 +0,0 @@
-/*-
- * Copyright (c) 2003-2007 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.
- */
-#include "test.h"
-__FBSDID("$FreeBSD$");
-
-
-DEFINE_TEST(test_option_t)
-{
- char *p;
- int r;
-
- /* List reference archive, make sure the TOC is correct. */
- extract_reference_file("test_option_t.cpio");
- r = systemf("%s -it < test_option_t.cpio >it.out 2>it.err", testprog);
- assertEqualInt(r, 0);
- assertTextFileContents("1 block\n", "it.err");
- extract_reference_file("test_option_t.stdout");
- p = slurpfile(NULL, "test_option_t.stdout");
- assertTextFileContents(p, "it.out");
- free(p);
-
- /* We accept plain "-t" as a synonym for "-it" */
- r = systemf("%s -t < test_option_t.cpio >t.out 2>t.err", testprog);
- assertEqualInt(r, 0);
- assertTextFileContents("1 block\n", "t.err");
- extract_reference_file("test_option_t.stdout");
- p = slurpfile(NULL, "test_option_t.stdout");
- assertTextFileContents(p, "t.out");
- free(p);
-
- /* But "-ot" is an error. */
- assert(0 != systemf("%s -ot < test_option_t.cpio >ot.out 2>ot.err",
- testprog));
- assertEmptyFile("ot.out");
-
- /* List reference archive verbosely, make sure the TOC is correct. */
- r = systemf("%s -itv < test_option_t.cpio >tv.out 2>tv.err", testprog);
- assertEqualInt(r, 0);
- assertTextFileContents("1 block\n", "tv.err");
- extract_reference_file("test_option_tv.stdout");
-
- /* This doesn't work because the usernames on different systems
- * are different and cpio now looks up numeric UIDs on
- * the local system. */
- /* assertEqualFile("tv.out", "test_option_tv.stdout"); */
-
- /* List reference archive with numeric IDs, verify TOC is correct. */
- r = systemf("%s -itnv < test_option_t.cpio >itnv.out 2>itnv.err",
- testprog);
- assertEqualInt(r, 0);
- assertTextFileContents("1 block\n", "itnv.err");
- p = slurpfile(NULL, "itnv.out");
- /* Since -n uses numeric UID/GID, this part should be the
- * same on every system. */
- assertEqualMem(p, "-rw-r--r-- 1 1000 1000 0 ",42);
- /* Date varies depending on local timezone. */
- if (memcmp(p + 42, "Dec 31 1969", 12) == 0) {
- /* East of Greenwich we get Dec 31, 1969. */
- } else {
- /* West of Greenwich get Jan 1, 1970 */
- assertEqualMem(p + 42, "Jan ", 4);
- /* Some systems format "Jan 01", some "Jan 1" */
- assert(p[46] == ' ' || p[46] == '0');
- assertEqualMem(p + 47, "1 1970 ", 8);
- }
- assertEqualMem(p + 54, " file", 5);
- free(p);
-
- /* But "-n" without "-t" is an error. */
- assert(0 != systemf("%s -in < test_option_t.cpio >in.out 2>in.err",
- testprog));
- assertEmptyFile("in.out");
-}
diff --git a/usr.bin/cpio/test/test_option_t.cpio.uu b/usr.bin/cpio/test/test_option_t.cpio.uu
deleted file mode 100644
index 055fe74..0000000
--- a/usr.bin/cpio/test/test_option_t.cpio.uu
+++ /dev/null
@@ -1,16 +0,0 @@
-$FreeBSD$
-begin 644 test_option_t.cpio
-M,#<P-S`W,#`P,3,Q-#4P,#8T,3`P-C0T,#`Q-S4P,#`Q-S4P,#`P,#`Q,#`P
-M,#`P,#`P,#`P,#`P,#$P,#`P,#4P,#`P,#`P,#`P,&9I;&4`,#<P-S`W,#`P
-M,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`Q,#`P,#`P,#`P,#`P
-M,#`P,#`P,#`P,3,P,#`P,#`P,#`P,%1204E,15(A(2$`````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-1````````````````````````
-`
-end
diff --git a/usr.bin/cpio/test/test_option_t.stdout.uu b/usr.bin/cpio/test/test_option_t.stdout.uu
deleted file mode 100644
index 2457706..0000000
--- a/usr.bin/cpio/test/test_option_t.stdout.uu
+++ /dev/null
@@ -1,5 +0,0 @@
-$FreeBSD$
-begin 644 test_option_t.stdout
-%9FEL90H`
-`
-end
diff --git a/usr.bin/cpio/test/test_option_tv.stdout.uu b/usr.bin/cpio/test/test_option_tv.stdout.uu
deleted file mode 100644
index 7f1879c..0000000
--- a/usr.bin/cpio/test/test_option_tv.stdout.uu
+++ /dev/null
@@ -1,6 +0,0 @@
-$FreeBSD$
-begin 644 test_option_tv.stdout
-M+7)W+7(M+7(M+2`@(#$@=&EM("`@("`@=&EM("`@("`@("`@("`@(#`@1&5C
-/(#,Q("`Q.38Y(&9I;&4*
-`
-end
diff --git a/usr.bin/cpio/test/test_option_u.c b/usr.bin/cpio/test/test_option_u.c
deleted file mode 100644
index 08058aa..0000000
--- a/usr.bin/cpio/test/test_option_u.c
+++ /dev/null
@@ -1,81 +0,0 @@
-/*-
- * Copyright (c) 2003-2007 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.
- */
-#include "test.h"
-#if defined(HAVE_UTIME_H)
-#include <utime.h>
-#elif defined(HAVE_SYS_UTIME_H)
-#include <sys/utime.h>
-#endif
-__FBSDID("$FreeBSD$");
-
-DEFINE_TEST(test_option_u)
-{
- struct utimbuf times;
- char *p;
- size_t s;
- int r;
-
- /* Create a file. */
- assertMakeFile("f", 0644, "a");
-
- /* Copy the file to the "copy" dir. */
- r = systemf("echo f | %s -pd copy >copy.out 2>copy.err",
- testprog);
- assertEqualInt(r, 0);
-
- /* Check that the file contains only a single "a" */
- p = slurpfile(&s, "copy/f");
- assertEqualInt(s, 1);
- assertEqualMem(p, "a", 1);
-
- /* Recreate the file with a single "b" */
- assertMakeFile("f", 0644, "b");
-
- /* Set the mtime to the distant past. */
- memset(&times, 0, sizeof(times));
- times.actime = 1;
- times.modtime = 3;
- assertEqualInt(0, utime("f", &times));
-
- /* Copy the file to the "copy" dir. */
- r = systemf("echo f | %s -pd copy >copy.out 2>copy.err",
- testprog);
- assertEqualInt(r, 0);
-
- /* Verify that the file hasn't changed (it wasn't overwritten) */
- p = slurpfile(&s, "copy/f");
- assertEqualInt(s, 1);
- assertEqualMem(p, "a", 1);
-
- /* Copy the file to the "copy" dir with -u (force) */
- r = systemf("echo f | %s -pud copy >copy.out 2>copy.err",
- testprog);
- assertEqualInt(r, 0);
-
- /* Verify that the file has changed (it was overwritten) */
- p = slurpfile(&s, "copy/f");
- assertEqualInt(s, 1);
- assertEqualMem(p, "b", 1);
-}
diff --git a/usr.bin/cpio/test/test_option_version.c b/usr.bin/cpio/test/test_option_version.c
deleted file mode 100644
index 7345da1..0000000
--- a/usr.bin/cpio/test/test_option_version.c
+++ /dev/null
@@ -1,109 +0,0 @@
-/*-
- * Copyright (c) 2003-2007 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.
- */
-#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, "-- ", 3);
- q += 3; s -= 3;
- /* 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;
- /* 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);
-}
diff --git a/usr.bin/cpio/test/test_option_y.c b/usr.bin/cpio/test/test_option_y.c
deleted file mode 100644
index 8e81ee7..0000000
--- a/usr.bin/cpio/test/test_option_y.c
+++ /dev/null
@@ -1,57 +0,0 @@
-/*-
- * Copyright (c) 2003-2007 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.
- */
-#include "test.h"
-__FBSDID("$FreeBSD$");
-
-DEFINE_TEST(test_option_y)
-{
- char *p;
- int r;
- size_t s;
-
- /* Create a file. */
- assertMakeFile("f", 0644, "a");
-
- /* Archive it with bzip2 compression. */
- r = systemf("echo f | %s -oy >archive.out 2>archive.err",
- testprog);
- p = slurpfile(&s, "archive.err");
- p[s] = '\0';
- if (r != 0) {
- if (strstr(p, "compression not available") != NULL) {
- skipping("This version of bsdcpio was compiled "
- "without bzip2 support");
- return;
- }
- failure("-y option is broken");
- assertEqualInt(r, 0);
- return;
- }
- assertTextFileContents("1 block\n", "archive.err");
- /* Check that the archive file has a bzip2 signature. */
- p = slurpfile(&s, "archive.out");
- assert(s > 2);
- assertEqualMem(p, "BZh9", 4);
-}
diff --git a/usr.bin/cpio/test/test_option_z.c b/usr.bin/cpio/test/test_option_z.c
deleted file mode 100644
index 91d37ac..0000000
--- a/usr.bin/cpio/test/test_option_z.c
+++ /dev/null
@@ -1,56 +0,0 @@
-/*-
- * Copyright (c) 2003-2007 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.
- */
-#include "test.h"
-__FBSDID("$FreeBSD$");
-
-DEFINE_TEST(test_option_z)
-{
- char *p;
- int r;
- size_t s;
-
- /* Create a file. */
- assertMakeFile("f", 0644, "a");
-
- /* Archive it with gzip compression. */
- r = systemf("echo f | %s -oz >archive.out 2>archive.err",
- testprog);
- p = slurpfile(&s, "archive.err");
- p[s] = '\0';
- if (r != 0) {
- if (strstr(p, "compression not available") != NULL) {
- skipping("This version of bsdcpio was compiled "
- "without gzip support");
- return;
- }
- failure("-z option is broken");
- assertEqualInt(r, 0);
- return;
- }
- /* Check that the archive file has a gzip signature. */
- p = slurpfile(&s, "archive.out");
- assert(s > 4);
- assertEqualMem(p, "\x1f\x8b\x08\x00", 4);
-}
diff --git a/usr.bin/cpio/test/test_owner_parse.c b/usr.bin/cpio/test/test_owner_parse.c
deleted file mode 100644
index d07724e..0000000
--- a/usr.bin/cpio/test/test_owner_parse.c
+++ /dev/null
@@ -1,122 +0,0 @@
-/*-
- * Copyright (c) 2003-2009 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.
- */
-#include "test.h"
-__FBSDID("$FreeBSD$");
-
-#include "../cpio.h"
-#include "err.h"
-
-#if !defined(_WIN32)
-#define ROOT "root"
-static int root_uids[] = { 0 };
-/* Solaris 9 root has gid 1 (other) */
-static int root_gids[] = { 0, 1 };
-#elif defined(__CYGWIN__)
-/* On cygwin, the Administrator user most likely exists (unless
- * it has been renamed or is in a non-English localization), but
- * its primary group membership depends on how the user set up
- * their /etc/passwd. Likely values are 513 (None), 545 (Users),
- * or 544 (Administrators). Just check for one of those...
- * TODO: Handle non-English localizations...e.g. French 'Administrateur'
- * Use CreateWellKnownSID() and LookupAccountName()?
- */
-#define ROOT "Administrator"
-static int root_uids[] = { 500 };
-static int root_gids[] = { 513, 545, 544 };
-#endif
-
-#if defined(ROOT)
-static int
-int_in_list(int i, int *l, size_t n)
-{
- while (n-- > 0)
- if (*l++ == i)
- return (1);
- failure("%d", i);
- return (0);
-}
-#endif
-
-DEFINE_TEST(test_owner_parse)
-{
-#if !defined(ROOT)
- skipping("No uid/gid configuration for this OS");
-#else
- int uid, gid;
-
- assert(NULL == owner_parse(ROOT, &uid, &gid));
- assert(int_in_list(uid, root_uids,
- sizeof(root_uids)/sizeof(root_uids[0])));
- assertEqualInt(-1, gid);
-
-
- assert(NULL == owner_parse(ROOT ":", &uid, &gid));
- assert(int_in_list(uid, root_uids,
- sizeof(root_uids)/sizeof(root_uids[0])));
- assert(int_in_list(gid, root_gids,
- sizeof(root_gids)/sizeof(root_gids[0])));
-
- assert(NULL == owner_parse(ROOT ".", &uid, &gid));
- assert(int_in_list(uid, root_uids,
- sizeof(root_uids)/sizeof(root_uids[0])));
- assert(int_in_list(gid, root_gids,
- sizeof(root_gids)/sizeof(root_gids[0])));
-
- assert(NULL == owner_parse("111", &uid, &gid));
- assertEqualInt(111, uid);
- assertEqualInt(-1, gid);
-
- assert(NULL == owner_parse("112:", &uid, &gid));
- assertEqualInt(112, uid);
- /* Can't assert gid, since we don't know gid for user #112. */
-
- assert(NULL == owner_parse("113.", &uid, &gid));
- assertEqualInt(113, uid);
- /* Can't assert gid, since we don't know gid for user #113. */
-
- assert(NULL == owner_parse(":114", &uid, &gid));
- assertEqualInt(-1, uid);
- assertEqualInt(114, gid);
-
- assert(NULL == owner_parse(".115", &uid, &gid));
- assertEqualInt(-1, uid);
- assertEqualInt(115, gid);
-
- assert(NULL == owner_parse("116:117", &uid, &gid));
- assertEqualInt(116, uid);
- assertEqualInt(117, gid);
-
- /*
- * TODO: Lookup current user/group name, build strings and
- * use those to verify username/groupname lookups for ordinary
- * users.
- */
-
- assert(NULL != owner_parse(":nonexistentgroup", &uid, &gid));
- assert(NULL != owner_parse(ROOT ":nonexistentgroup", &uid, &gid));
- assert(NULL !=
- owner_parse("nonexistentuser:nonexistentgroup", &uid, &gid));
-#endif
-}
diff --git a/usr.bin/cpio/test/test_passthrough_dotdot.c b/usr.bin/cpio/test/test_passthrough_dotdot.c
deleted file mode 100644
index 58d8234..0000000
--- a/usr.bin/cpio/test/test_passthrough_dotdot.c
+++ /dev/null
@@ -1,76 +0,0 @@
-/*-
- * Copyright (c) 2003-2007 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.
- */
-#include "test.h"
-__FBSDID("$FreeBSD$");
-
-/*
- * Verify that "cpio -p .." works.
- */
-
-DEFINE_TEST(test_passthrough_dotdot)
-{
- int r;
- FILE *filelist;
-
- assertUmask(0);
-
- /*
- * Create an assortment of files on disk.
- */
- filelist = fopen("filelist", "w");
-
- /* Directory. */
- assertMakeDir("dir", 0755);
- assertChdir("dir");
-
- fprintf(filelist, ".\n");
-
- /* File with 10 bytes content. */
- assertMakeFile("file", 0642, "1234567890");
- fprintf(filelist, "file\n");
-
- /* All done. */
- fclose(filelist);
-
-
- /*
- * Use cpio passthrough mode to copy files to another directory.
- */
- r = systemf("%s -pdvm .. <../filelist >../stdout 2>../stderr",
- testprog);
- failure("Error invoking %s -pd ..", testprog);
- assertEqualInt(r, 0);
-
- assertChdir("..");
-
- /* Verify stderr and stdout. */
- assertTextFileContents("../.\n../file\n1 block\n", "stderr");
- assertEmptyFile("stdout");
-
- /* Regular file. */
- assertIsReg("file", 0642);
- assertFileSize("file", 10);
- assertFileNLinks("file", 1);
-}
diff --git a/usr.bin/cpio/test/test_passthrough_reverse.c b/usr.bin/cpio/test/test_passthrough_reverse.c
deleted file mode 100644
index 42df75a..0000000
--- a/usr.bin/cpio/test/test_passthrough_reverse.c
+++ /dev/null
@@ -1,85 +0,0 @@
-/*-
- * Copyright (c) 2003-2007 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.
- */
-#include "test.h"
-__FBSDID("$FreeBSD$");
-
-/*
- * As reported by Bernd Walter: Some people are in the habit of
- * using "find -d" to generate a list for cpio -p because that
- * copies the top-level dir last, which preserves owner and mode
- * information. That's not necessary for bsdcpio (libarchive defers
- * restoring directory information), but bsdcpio should still generate
- * the correct results with this usage.
- */
-
-DEFINE_TEST(test_passthrough_reverse)
-{
- int r;
- FILE *filelist;
-
- assertUmask(0);
-
- /*
- * Create an assortment of files on disk.
- */
- filelist = fopen("filelist", "w");
-
- /* Directory. */
- assertMakeDir("dir", 0743);
-
- /* File with 10 bytes content. */
- assertMakeFile("dir/file", 0644, "1234567890");
- fprintf(filelist, "dir/file\n");
-
- /* Write dir last. */
- fprintf(filelist, "dir\n");
-
- /* All done. */
- fclose(filelist);
-
-
- /*
- * Use cpio passthrough mode to copy files to another directory.
- */
- r = systemf("%s -pdvm out <filelist >stdout 2>stderr", testprog);
- failure("Error invoking %s -pd out", testprog);
- assertEqualInt(r, 0);
-
- assertChdir("out");
-
- /* Verify stderr and stdout. */
- assertTextFileContents("out/dir/file\nout/dir\n1 block\n",
- "../stderr");
- assertEmptyFile("../stdout");
-
- /* dir */
- assertIsDir("dir", 0743);
-
-
- /* Regular file. */
- assertIsReg("dir/file", 0644);
- assertFileSize("dir/file", 10);
- assertFileNLinks("dir/file", 1);
-}
diff --git a/usr.bin/cpio/test/test_pathmatch.c b/usr.bin/cpio/test/test_pathmatch.c
deleted file mode 100644
index 177c2bc..0000000
--- a/usr.bin/cpio/test/test_pathmatch.c
+++ /dev/null
@@ -1,243 +0,0 @@
-/*-
- * Copyright (c) 2003-2007 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.
- */
-#include "test.h"
-__FBSDID("$FreeBSD$");
-
-#include "pathmatch.h"
-
-/*
- * Verify that the pattern matcher implements the wildcard logic specified
- * in SUSv2 for the cpio command. This is essentially the
- * shell glob syntax:
- * * - matches any sequence of chars, including '/'
- * ? - matches any single char, including '/'
- * [...] - matches any of a set of chars, '-' specifies a range,
- * initial '!' is undefined
- *
- * The specification in SUSv2 is a bit incomplete, I assume the following:
- * Trailing '-' in [...] is not special.
- *
- * TODO: Figure out if there's a good way to extend this to handle
- * Windows paths that use '\' as a path separator. <sigh>
- */
-
-DEFINE_TEST(test_pathmatch)
-{
- assertEqualInt(1, lafe_pathmatch("a/b/c", "a/b/c", 0));
- assertEqualInt(0, lafe_pathmatch("a/b/", "a/b/c", 0));
- assertEqualInt(0, lafe_pathmatch("a/b", "a/b/c", 0));
- assertEqualInt(0, lafe_pathmatch("a/b/c", "a/b/", 0));
- assertEqualInt(0, lafe_pathmatch("a/b/c", "a/b", 0));
-
- /* Empty pattern only matches empty string. */
- assertEqualInt(1, lafe_pathmatch("","", 0));
- assertEqualInt(0, lafe_pathmatch("","a", 0));
- assertEqualInt(1, lafe_pathmatch("*","", 0));
- assertEqualInt(1, lafe_pathmatch("*","a", 0));
- assertEqualInt(1, lafe_pathmatch("*","abcd", 0));
- /* SUSv2: * matches / */
- assertEqualInt(1, lafe_pathmatch("*","abcd/efgh/ijkl", 0));
- assertEqualInt(1, lafe_pathmatch("abcd*efgh/ijkl","abcd/efgh/ijkl", 0));
- assertEqualInt(1, lafe_pathmatch("abcd***efgh/ijkl","abcd/efgh/ijkl", 0));
- assertEqualInt(1, lafe_pathmatch("abcd***/efgh/ijkl","abcd/efgh/ijkl", 0));
- assertEqualInt(0, lafe_pathmatch("?", "", 0));
- assertEqualInt(0, lafe_pathmatch("?", "\0", 0));
- assertEqualInt(1, lafe_pathmatch("?", "a", 0));
- assertEqualInt(0, lafe_pathmatch("?", "ab", 0));
- assertEqualInt(1, lafe_pathmatch("?", ".", 0));
- assertEqualInt(1, lafe_pathmatch("?", "?", 0));
- assertEqualInt(1, lafe_pathmatch("a", "a", 0));
- assertEqualInt(0, lafe_pathmatch("a", "ab", 0));
- assertEqualInt(0, lafe_pathmatch("a", "ab", 0));
- assertEqualInt(1, lafe_pathmatch("a?c", "abc", 0));
- /* SUSv2: ? matches / */
- assertEqualInt(1, lafe_pathmatch("a?c", "a/c", 0));
- assertEqualInt(1, lafe_pathmatch("a?*c*", "a/c", 0));
- assertEqualInt(1, lafe_pathmatch("*a*", "a/c", 0));
- assertEqualInt(1, lafe_pathmatch("*a*", "/a/c", 0));
- assertEqualInt(1, lafe_pathmatch("*a*", "defaaaaaaa", 0));
- assertEqualInt(0, lafe_pathmatch("a*", "defghi", 0));
- assertEqualInt(0, lafe_pathmatch("*a*", "defghi", 0));
-
- /* Character classes */
- assertEqualInt(1, lafe_pathmatch("abc[def", "abc[def", 0));
- assertEqualInt(0, lafe_pathmatch("abc[def]", "abc[def", 0));
- assertEqualInt(0, lafe_pathmatch("abc[def", "abcd", 0));
- assertEqualInt(1, lafe_pathmatch("abc[def]", "abcd", 0));
- assertEqualInt(1, lafe_pathmatch("abc[def]", "abce", 0));
- assertEqualInt(1, lafe_pathmatch("abc[def]", "abcf", 0));
- assertEqualInt(0, lafe_pathmatch("abc[def]", "abcg", 0));
- assertEqualInt(1, lafe_pathmatch("abc[d*f]", "abcd", 0));
- assertEqualInt(1, lafe_pathmatch("abc[d*f]", "abc*", 0));
- assertEqualInt(0, lafe_pathmatch("abc[d*f]", "abcdefghi", 0));
- assertEqualInt(0, lafe_pathmatch("abc[d*", "abcdefghi", 0));
- assertEqualInt(1, lafe_pathmatch("abc[d*", "abc[defghi", 0));
- assertEqualInt(1, lafe_pathmatch("abc[d-f]", "abcd", 0));
- assertEqualInt(1, lafe_pathmatch("abc[d-f]", "abce", 0));
- assertEqualInt(1, lafe_pathmatch("abc[d-f]", "abcf", 0));
- assertEqualInt(0, lafe_pathmatch("abc[d-f]", "abcg", 0));
- assertEqualInt(0, lafe_pathmatch("abc[d-fh-k]", "abca", 0));
- assertEqualInt(1, lafe_pathmatch("abc[d-fh-k]", "abcd", 0));
- assertEqualInt(1, lafe_pathmatch("abc[d-fh-k]", "abce", 0));
- assertEqualInt(1, lafe_pathmatch("abc[d-fh-k]", "abcf", 0));
- assertEqualInt(0, lafe_pathmatch("abc[d-fh-k]", "abcg", 0));
- assertEqualInt(1, lafe_pathmatch("abc[d-fh-k]", "abch", 0));
- assertEqualInt(1, lafe_pathmatch("abc[d-fh-k]", "abci", 0));
- assertEqualInt(1, lafe_pathmatch("abc[d-fh-k]", "abcj", 0));
- assertEqualInt(1, lafe_pathmatch("abc[d-fh-k]", "abck", 0));
- assertEqualInt(0, lafe_pathmatch("abc[d-fh-k]", "abcl", 0));
- assertEqualInt(0, lafe_pathmatch("abc[d-fh-k]", "abc-", 0));
-
- /* [] matches nothing, [!] is the same as ? */
- assertEqualInt(0, lafe_pathmatch("abc[]efg", "abcdefg", 0));
- assertEqualInt(0, lafe_pathmatch("abc[]efg", "abcqefg", 0));
- assertEqualInt(0, lafe_pathmatch("abc[]efg", "abcefg", 0));
- assertEqualInt(1, lafe_pathmatch("abc[!]efg", "abcdefg", 0));
- assertEqualInt(1, lafe_pathmatch("abc[!]efg", "abcqefg", 0));
- assertEqualInt(0, lafe_pathmatch("abc[!]efg", "abcefg", 0));
-
- /* I assume: Trailing '-' is non-special. */
- assertEqualInt(0, lafe_pathmatch("abc[d-fh-]", "abcl", 0));
- assertEqualInt(1, lafe_pathmatch("abc[d-fh-]", "abch", 0));
- assertEqualInt(1, lafe_pathmatch("abc[d-fh-]", "abc-", 0));
- assertEqualInt(1, lafe_pathmatch("abc[d-fh-]", "abc-", 0));
-
- /* ']' can be backslash-quoted within a character class. */
- assertEqualInt(1, lafe_pathmatch("abc[\\]]", "abc]", 0));
- assertEqualInt(1, lafe_pathmatch("abc[\\]d]", "abc]", 0));
- assertEqualInt(1, lafe_pathmatch("abc[\\]d]", "abcd", 0));
- assertEqualInt(1, lafe_pathmatch("abc[d\\]]", "abc]", 0));
- assertEqualInt(1, lafe_pathmatch("abc[d\\]]", "abcd", 0));
- assertEqualInt(1, lafe_pathmatch("abc[d]e]", "abcde]", 0));
- assertEqualInt(1, lafe_pathmatch("abc[d\\]e]", "abc]", 0));
- assertEqualInt(0, lafe_pathmatch("abc[d\\]e]", "abcd]e", 0));
- assertEqualInt(0, lafe_pathmatch("abc[d]e]", "abc]", 0));
-
- /* backslash-quoted chars can appear as either end of a range. */
- assertEqualInt(1, lafe_pathmatch("abc[\\d-f]gh", "abcegh", 0));
- assertEqualInt(0, lafe_pathmatch("abc[\\d-f]gh", "abcggh", 0));
- assertEqualInt(0, lafe_pathmatch("abc[\\d-f]gh", "abc\\gh", 0));
- assertEqualInt(1, lafe_pathmatch("abc[d-\\f]gh", "abcegh", 0));
- assertEqualInt(1, lafe_pathmatch("abc[\\d-\\f]gh", "abcegh", 0));
- assertEqualInt(1, lafe_pathmatch("abc[\\d-\\f]gh", "abcegh", 0));
- /* backslash-quoted '-' isn't special. */
- assertEqualInt(0, lafe_pathmatch("abc[d\\-f]gh", "abcegh", 0));
- assertEqualInt(1, lafe_pathmatch("abc[d\\-f]gh", "abc-gh", 0));
-
- /* Leading '!' negates a character class. */
- assertEqualInt(0, lafe_pathmatch("abc[!d]", "abcd", 0));
- assertEqualInt(1, lafe_pathmatch("abc[!d]", "abce", 0));
- assertEqualInt(1, lafe_pathmatch("abc[!d]", "abcc", 0));
- assertEqualInt(0, lafe_pathmatch("abc[!d-z]", "abcq", 0));
- assertEqualInt(1, lafe_pathmatch("abc[!d-gi-z]", "abch", 0));
- assertEqualInt(1, lafe_pathmatch("abc[!fgijkl]", "abch", 0));
- assertEqualInt(0, lafe_pathmatch("abc[!fghijkl]", "abch", 0));
-
- /* Backslash quotes next character. */
- assertEqualInt(0, lafe_pathmatch("abc\\[def]", "abc\\d", 0));
- assertEqualInt(1, lafe_pathmatch("abc\\[def]", "abc[def]", 0));
- assertEqualInt(0, lafe_pathmatch("abc\\\\[def]", "abc[def]", 0));
- assertEqualInt(0, lafe_pathmatch("abc\\\\[def]", "abc\\[def]", 0));
- assertEqualInt(1, lafe_pathmatch("abc\\\\[def]", "abc\\d", 0));
- assertEqualInt(1, lafe_pathmatch("abcd\\", "abcd\\", 0));
- assertEqualInt(0, lafe_pathmatch("abcd\\", "abcd\\[", 0));
- assertEqualInt(0, lafe_pathmatch("abcd\\", "abcde", 0));
- assertEqualInt(0, lafe_pathmatch("abcd\\[", "abcd\\", 0));
-
- /*
- * Because '.' and '/' have special meanings, we can
- * identify many equivalent paths even if they're expressed
- * differently. (But quoting a character with '\\' suppresses
- * special meanings!)
- */
- assertEqualInt(0, lafe_pathmatch("a/b/", "a/bc", 0));
- assertEqualInt(1, lafe_pathmatch("a/./b", "a/b", 0));
- assertEqualInt(0, lafe_pathmatch("a\\/./b", "a/b", 0));
- assertEqualInt(0, lafe_pathmatch("a/\\./b", "a/b", 0));
- assertEqualInt(0, lafe_pathmatch("a/.\\/b", "a/b", 0));
- assertEqualInt(0, lafe_pathmatch("a\\/\\.\\/b", "a/b", 0));
- assertEqualInt(1, lafe_pathmatch("./abc/./def/", "abc/def/", 0));
- assertEqualInt(1, lafe_pathmatch("abc/def", "./././abc/./def", 0));
- assertEqualInt(1, lafe_pathmatch("abc/def/././//", "./././abc/./def/", 0));
- assertEqualInt(1, lafe_pathmatch(".////abc/.//def", "./././abc/./def", 0));
- assertEqualInt(1, lafe_pathmatch("./abc?def/", "abc/def/", 0));
- failure("\"?./\" is not the same as \"/./\"");
- assertEqualInt(0, lafe_pathmatch("./abc?./def/", "abc/def/", 0));
- failure("Trailing '/' should match no trailing '/'");
- assertEqualInt(1, lafe_pathmatch("./abc/./def/", "abc/def", 0));
- failure("Trailing '/./' is still the same directory.");
- assertEqualInt(1, lafe_pathmatch("./abc/./def/./", "abc/def", 0));
- failure("Trailing '/.' is still the same directory.");
- assertEqualInt(1, lafe_pathmatch("./abc/./def/.", "abc/def", 0));
- assertEqualInt(1, lafe_pathmatch("./abc/./def", "abc/def/", 0));
- failure("Trailing '/./' is still the same directory.");
- assertEqualInt(1, lafe_pathmatch("./abc/./def", "abc/def/./", 0));
- failure("Trailing '/.' is still the same directory.");
- assertEqualInt(1, lafe_pathmatch("./abc*/./def", "abc/def/.", 0));
-
- /* Matches not anchored at beginning. */
- assertEqualInt(0,
- lafe_pathmatch("bcd", "abcd", PATHMATCH_NO_ANCHOR_START));
- assertEqualInt(1,
- lafe_pathmatch("abcd", "abcd", PATHMATCH_NO_ANCHOR_START));
- assertEqualInt(0,
- lafe_pathmatch("^bcd", "abcd", PATHMATCH_NO_ANCHOR_START));
- assertEqualInt(1,
- lafe_pathmatch("b/c/d", "a/b/c/d", PATHMATCH_NO_ANCHOR_START));
- assertEqualInt(0,
- lafe_pathmatch("b/c", "a/b/c/d", PATHMATCH_NO_ANCHOR_START));
- assertEqualInt(0,
- lafe_pathmatch("^b/c", "a/b/c/d", PATHMATCH_NO_ANCHOR_START));
-
- /* Matches not anchored at end. */
- assertEqualInt(0,
- lafe_pathmatch("bcd", "abcd", PATHMATCH_NO_ANCHOR_END));
- assertEqualInt(1,
- lafe_pathmatch("abcd", "abcd", PATHMATCH_NO_ANCHOR_END));
- assertEqualInt(1,
- lafe_pathmatch("abcd", "abcd/", PATHMATCH_NO_ANCHOR_END));
- assertEqualInt(1,
- lafe_pathmatch("abcd", "abcd/.", PATHMATCH_NO_ANCHOR_END));
- assertEqualInt(0,
- lafe_pathmatch("abc", "abcd", PATHMATCH_NO_ANCHOR_END));
- assertEqualInt(1,
- lafe_pathmatch("a/b/c", "a/b/c/d", PATHMATCH_NO_ANCHOR_END));
- assertEqualInt(0,
- lafe_pathmatch("a/b/c$", "a/b/c/d", PATHMATCH_NO_ANCHOR_END));
- assertEqualInt(1,
- lafe_pathmatch("a/b/c$", "a/b/c", PATHMATCH_NO_ANCHOR_END));
- assertEqualInt(1,
- lafe_pathmatch("a/b/c$", "a/b/c/", PATHMATCH_NO_ANCHOR_END));
- assertEqualInt(1,
- lafe_pathmatch("a/b/c/", "a/b/c/d", PATHMATCH_NO_ANCHOR_END));
- assertEqualInt(0,
- lafe_pathmatch("a/b/c/$", "a/b/c/d", PATHMATCH_NO_ANCHOR_END));
- assertEqualInt(1,
- lafe_pathmatch("a/b/c/$", "a/b/c/", PATHMATCH_NO_ANCHOR_END));
- assertEqualInt(1,
- lafe_pathmatch("a/b/c/$", "a/b/c", PATHMATCH_NO_ANCHOR_END));
- assertEqualInt(0,
- lafe_pathmatch("b/c", "a/b/c/d", PATHMATCH_NO_ANCHOR_END));
-}
OpenPOWER on IntegriCloud