Merge FreeBSD changes from usr.bin/tar to contrib/libarchive/tar:

r204111 (uqs):
Fix common misspelling of hierarchy

r207786 (kientzle):
Various manpage updates, including many long-option synonyms that were
previously undocumented.

r208028 (uqs):
mdoc: move remaining sections into consistent order

This pertains mostly to FILES, HISTORY, EXIT STATUS and AUTHORS sections.

r209152 (kientzle):
If the compressed data is larger than the uncompressed,
report the compression ratio as 0% instead of displaying
nonsense triggered by numeric overflow.  This is common
when dealing with uncompressed files when the I/O blocking
causes there to be small transient differences in the
accounting.

r210720 (joel):
Fix typos.

r223541 (kientzle):
If there is a read error reading Y/N confirmation from the keyboard,
exit immediately with an error.

If there is an error opening or reading a file to put into the archive,
set the return value for a deferred error exit.

r223573 (kientzle):
The --newer-than test should descend into old
directories to look for new files.

r226636 (kientzle):
Typo from previous commit. Urgh.

r224153 (mm, partial):
Update bsdtar.1 manpage

MFC after:	2 weeks
This commit is contained in:
Martin Matuska 2011-12-21 15:30:49 +00:00
parent e9dd49674a
commit c5d360f82a
6 changed files with 187 additions and 116 deletions

View File

@ -50,8 +50,8 @@
.Sh DESCRIPTION
.Nm
creates and manipulates streaming archive files.
This implementation can extract from tar, pax, cpio, zip, jar, ar,
and ISO 9660 cdrom images and can create tar, pax, cpio, ar,
This implementation can extract from tar, pax, cpio, zip, jar, ar, xar,
rpm and ISO 9660 cdrom images and can create tar, pax, cpio, ar, zip,
and shar archives.
.Pp
The first synopsis form shows a
@ -67,6 +67,8 @@ is a mode indicator from the following list:
.Bl -tag -compact -width indent
.It Fl c
Create a new archive containing the specified items.
The long option form is
.Fl Fl create .
.It Fl r
Like
.Fl c ,
@ -75,8 +77,12 @@ Note that this only works on uncompressed archives stored in regular files.
The
.Fl f
option is required.
The long option form is
.Fl Fl append .
.It Fl t
List archive contents to stdout.
The long option form is
.Fl Fl list .
.It Fl u
Like
.Fl r ,
@ -86,11 +92,15 @@ Note that this only works on uncompressed archives stored in regular files.
The
.Fl f
option is required.
The long form is
.Fl Fl update .
.It Fl x
Extract to disk from the archive.
If a file with the same name appears more than once in the archive,
each copy will be extracted, with later copies overwriting (replacing)
earlier copies.
The long option form is
.Fl Fl extract .
.El
.Pp
In
@ -127,14 +137,18 @@ In contrast,
.Dl Nm Fl c Fl f Pa - Pa newfile Pa original.tar
creates a new archive with only two entries.
Similarly,
.Dl Nm Fl czf Pa - Fl -format Cm pax Cm @ Ns Pa -
.Dl Nm Fl czf Pa - Fl Fl format Cm pax Cm @ Ns Pa -
reads an archive from standard input (whose format will be determined
automatically) and converts it into a gzip-compressed
pax-format archive on stdout.
In this way,
.Nm
can be used to convert archives from one format to another.
.It Fl b Ar blocksize
.It Fl B , Fl Fl read-full-blocks
Ignored for compatibility with other
.Xr tar 1
implementations.
.It Fl b Ar blocksize , Fl Fl block-size Ar blocksize
Specify the block size, in 512-byte records, for tape drive I/O.
As a rule, this argument is only needed when reading from or writing
to tape drives, and usually not even then as the default block size of
@ -144,21 +158,22 @@ In c and r mode, this changes the directory before adding
the following files.
In x mode, change directories after opening the archive
but before extracting entries from the archive.
.It Fl -check-links
(c and r modes only)
Issue a warning message unless all links to each file are archived.
.It Fl -chroot
.It Fl Fl chroot
(x mode only)
.Fn chroot
to the current directory after processing any
.Fl C
options and before extracting any files.
.It Fl -exclude Ar pattern
.It Fl Fl disable-copyfile
Mac OS X specific.
Disable the use of
.Xr copyfile 3 .
.It Fl Fl exclude Ar pattern
Do not process files or directories that match the
specified pattern.
Note that exclusions take precedence over patterns or filenames
specified on the command line.
.It Fl -format Ar format
.It Fl Fl format Ar format
(c, r, u mode only)
Use the specified format for the created archive.
Supported formats include
@ -172,16 +187,18 @@ Other formats may also be supported; see
for more information about currently-supported formats.
In r and u modes, when extending an existing archive, the format specified
here must be compatible with the format of the existing archive on disk.
.It Fl f Ar file
.It Fl f Ar file , Fl Fl file Ar file
Read the archive from or write the archive to the specified file.
The filename can be
.Pa -
for standard input or standard output.
If not specified, the default tape device will be used.
(On
The default varies by system;
on
.Fx ,
the default tape device is
.Pa /dev/sa0 . )
the default is
.Pa /dev/sa0 ;
on Linux, the default is
.Pa /dev/st0 .
.It Fl Fl gid Ar id
Use the provided group id number.
On extract, this overrides the group id in the archive;
@ -214,25 +231,36 @@ Synonym for
.It Fl I
Synonym for
.Fl T .
.It Fl -include Ar pattern
.It Fl Fl help
Show usage.
.It Fl Fl include Ar pattern
Process only files or directories that match the specified pattern.
Note that exclusions specified with
.Fl -exclude
.Fl Fl exclude
take precedence over inclusions.
If no inclusions are explicitly specified, all entries are processed by
default.
The
.Fl -include
.Fl Fl include
option is especially useful when filtering archives.
For example, the command
.Dl Nm Fl c Fl f Pa new.tar Fl -include='*foo*' Cm @ Ns Pa old.tgz
.Dl Nm Fl c Fl f Pa new.tar Fl Fl include='*foo*' Cm @ Ns Pa old.tgz
creates a new archive
.Pa new.tar
containing only the entries from
.Pa old.tgz
containing the string
.Sq foo .
.It Fl j
.It Fl J , Fl Fl xz
(c mode only)
Compress the resulting archive with
.Xr xz 1 .
In extract or list modes, this option is ignored.
Note that, unlike other
.Nm tar
implementations, this implementation recognizes XZ compression
automatically when reading archives.
.It Fl j , Fl Fl bzip , Fl Fl bzip2 , Fl Fl bunzip2
(c mode only)
Compress the resulting archive with
.Xr bzip2 1 .
@ -241,68 +269,71 @@ Note that, unlike other
.Nm tar
implementations, this implementation recognizes bzip2 compression
automatically when reading archives.
.It Fl k
.It Fl k , Fl Fl keep-old-files
(x mode only)
Do not overwrite existing files.
In particular, if a file appears more than once in an archive,
later copies will not overwrite earlier copies.
.It Fl -keep-newer-files
.It Fl Fl keep-newer-files
(x mode only)
Do not overwrite existing files that are newer than the
versions appearing in the archive being extracted.
.It Fl L
.It Fl L , Fl Fl dereference
(c and r mode only)
All symbolic links will be followed.
Normally, symbolic links are archived as such.
With this option, the target of the link will be archived instead.
.It Fl l
This is a synonym for the
.Fl -check-links
option.
.It Fl m
.It Fl l , Fl Fl check-links
(c and r modes only)
Issue a warning message unless all links to each file are archived.
.It Fl Fl lzma
(c mode only) Compress the resulting archive with the original LZMA algorithm.
Use of this option is discouraged and new archives should be created with
.Fl Fl xz
instead.
Note that, unlike other
.Nm tar
implementations, this implementation recognizes LZMA compression
automatically when reading archives.
.It Fl m , Fl Fl modification-time
(x mode only)
Do not extract modification time.
By default, the modification time is set to the time stored in the archive.
.It Fl n
.It Fl n , Fl Fl norecurse , Fl Fl no-recursion
(c, r, u modes only)
Do not recursively archive the contents of directories.
.It Fl -newer Ar date
.It Fl Fl newer Ar date
(c, r, u modes only)
Only include files and directories newer than the specified date.
This compares ctime entries.
.It Fl -newer-mtime Ar date
.It Fl Fl newer-mtime Ar date
(c, r, u modes only)
Like
.Fl -newer ,
.Fl Fl newer ,
except it compares mtime entries instead of ctime entries.
.It Fl -newer-than Pa file
.It Fl Fl newer-than Pa file
(c, r, u modes only)
Only include files and directories newer than the specified file.
This compares ctime entries.
.It Fl -newer-mtime-than Pa file
.It Fl Fl newer-mtime-than Pa file
(c, r, u modes only)
Like
.Fl -newer-than ,
.Fl Fl newer-than ,
except it compares mtime entries instead of ctime entries.
.It Fl -nodump
.It Fl Fl nodump
(c and r modes only)
Honor the nodump file flag by skipping this file.
.It Fl -null
.It Fl Fl null
(use with
.Fl I ,
.Fl T ,
.Fl I
or
.Fl X )
.Fl T )
Filenames or patterns are separated by null characters,
not by newlines.
This is often used to read filenames output by the
.Fl print0
option to
.Xr find 1 .
.It Fl -numeric-owner
(x mode only)
Ignore symbolic user and group names when restoring archives to disk,
only numeric uid and gid values will be obeyed.
.It Fl Fl no-same-owner
(x mode only)
Do not extract owner and group IDs.
@ -330,7 +361,7 @@ On extract, it causes user and group names in the archive
to be ignored in favor of the numeric user and group ids.
On create, it causes user and group names to not be stored
in the archive.
.It Fl O
.It Fl O , Fl Fl to-stdout
(x, t modes only)
In extract (-x) mode, files will be written to standard out rather than
being extracted to disk.
@ -349,11 +380,11 @@ the archive will be discarded.
.It Fl o
(c, r, u mode)
A synonym for
.Fl -format Ar ustar
.It Fl -one-file-system
.Fl Fl format Ar ustar
.It Fl Fl one-file-system
(c, r, and u modes)
Do not cross mount points.
.It Fl -options Ar options
.It Fl Fl options Ar options
Select optional behaviors for particular modules.
The argument is a text string containing comma-separated
keywords and values.
@ -424,7 +455,7 @@ Supported values are store (uncompressed) and deflate (gzip algorithm).
.El
If a provided option is not supported by any module, that
is a fatal error.
.It Fl P
.It Fl P , Fl Fl absolute-paths
Preserve pathnames.
By default, absolute pathnames (those that begin with a /
character) have the leading slash removed both when creating archives
@ -435,21 +466,22 @@ will refuse to extract archive entries whose pathnames contain
.Pa ..
or whose target directory would be altered by a symlink.
This option suppresses these behaviors.
.It Fl p
.It Fl p , Fl Fl insecure , Fl Fl preserve-permissions
(x mode only)
Preserve file permissions.
Attempt to restore the full permissions, including owner, file modes, file
flags and ACLs, if available, for each item extracted from the archive.
By default, newly-created files are owned by the user running
.Nm ,
the file mode is restored for newly-created regular files, and
all other types of entries receive default permissions.
If
This is the default, if
.Nm
is being run by root, the default is to restore the owner unless the
.Fl o
option is also specified.
.It Fl q ( Fl -fast-read )
is being run by root and can be overriden by also specifying
.Fl Fl no-same-owner
and
.Fl Fl no-same-permissions .
.It Fl Fl posix
(c, r, u mode only)
Synonym for
.Fl Fl format Ar pax
.It Fl q , Fl Fl fast-read
(x and t mode only)
Extract or list only the first archive entry that matches each pattern
or filename operand.
@ -463,8 +495,16 @@ This option is provided as a performance optimization.
Extract files as sparse files.
For every block on disk, check first if it contains only NULL bytes and seek
over it otherwise.
This works similiar to the conv=sparse option of dd.
.It Fl -strip-components Ar count
This works similar to the conv=sparse option of dd.
.It Fl Fl same-owner
(x mode only)
Extract owner and group IDs.
This is the reverse of
.Fl Fl no-same-owner
and the default behavior if
.Nm
is run as root.
.It Fl Fl strip-components Ar count
(x mode only)
Remove the specified number of leading path elements.
Pathnames with fewer elements will be silently skipped.
@ -496,7 +536,7 @@ of symbolic links.
The optional trailing p specifies that after a successful substitution
the original path name and the new path name should be printed to
standard error.
.It Fl T Ar filename
.It Fl T Ar filename , Fl Fl files-from Ar filename
In x or t mode,
.Nm
will read the list of names to be extracted from
@ -510,20 +550,26 @@ The special name
on a line by itself will cause the current directory to be changed to
the directory specified on the following line.
Names are terminated by newlines unless
.Fl -null
.Fl Fl null
is specified.
Note that
.Fl -null
.Fl Fl null
also disables the special handling of lines containing
.Dq -C .
.It Fl U
.It Fl Fl totals
(c, r, u mode only)
After archiving all files, print a summary to stderr.
.It Fl U , Fl Fl unlink , Fl Fl unlink-first
(x mode only)
Unlink files before creating them.
Without this option,
This can be a minor performance optimization if most files
already exist, but can make things slower if most files
do not already exist.
This flag also causes
.Nm
overwrites existing files, which preserves existing hardlinks.
With this option, existing hardlinks will be broken, as will any
symlink that would affect the location of an extracted file.
to remove intervening directory symlinks instead of
reporting an error.
See the SECURITY section below for more details.
.It Fl Fl uid Ar id
Use the provided user id number and ignore the user
name from the archive.
@ -547,7 +593,7 @@ the name is not verified against the system user database.
Pipe the input (in x or t mode) or the output (in c mode) through
.Pa program
instead of using the builtin compression support.
.It Fl v
.It Fl v , Fl Fl verbose
Produce verbose output.
In create and extract modes,
.Nm
@ -560,18 +606,18 @@ will produce output similar to that of
Additional
.Fl v
options will provide additional detail.
.It Fl -version
.It Fl Fl version
Print version of
.Nm
and
.Nm libarchive ,
and exit.
.It Fl w
.It Fl w , Fl Fl confirmation , Fl Fl interactive
Ask for confirmation for every action.
.It Fl X Ar filename
.It Fl X Ar filename , Fl Fl exclude-from Ar filename
Read a list of exclusion patterns from the specified file.
See
.Fl -exclude
.Fl Fl exclude
for more information about the handling of exclusions.
.It Fl y
(c mode only)
@ -582,16 +628,7 @@ Note that, unlike other
.Nm tar
implementations, this implementation recognizes bzip2 compression
automatically when reading archives.
.It Fl z
(c mode only)
Compress the resulting archive with
.Xr gzip 1 .
In extract or list modes, this option is ignored.
Note that, unlike other
.Nm tar
implementations, this implementation recognizes gzip compression
automatically when reading archives.
.It Fl Z
.It Fl Z , Fl Fl compress , Fl Fl uncompress
(c mode only)
Compress the resulting archive with
.Xr compress 1 .
@ -600,9 +637,16 @@ Note that, unlike other
.Nm tar
implementations, this implementation recognizes compress compression
automatically when reading archives.
.It Fl z , Fl Fl gunzip , Fl Fl gzip
(c mode only)
Compress the resulting archive with
.Xr gzip 1 .
In extract or list modes, this option is ignored.
Note that, unlike other
.Nm tar
implementations, this implementation recognizes gzip compression
automatically when reading archives.
.El
.Sh EXIT STATUS
.Ex -std
.Sh ENVIRONMENT
The following environment variables affect the execution of
.Nm :
@ -613,25 +657,21 @@ See
.Xr environ 7
for more information.
.It Ev TAPE
The default tape device.
The default device.
The
.Fl f
option overrides this.
Please see the description of the
.Fl f
option above for more details.
.It Ev TZ
The timezone to use when displaying dates.
See
.Xr environ 7
for more information.
.El
.Sh FILES
.Bl -tag -width ".Ev BLOCKSIZE"
.It Pa /dev/sa0
The default tape device, if not overridden by the
.Ev TAPE
environment variable or the
.Fl f
option.
.El
.Sh EXIT STATUS
.Ex -std
.Sh EXAMPLES
The following creates a new archive
called
@ -694,9 +734,9 @@ permissions, or names that differ from existing data on disk:
.Dl $ tar -cvf output.tar @input.mtree
.Pp
The
.Fl -newer
.Fl Fl newer
and
.Fl -newer-mtime
.Fl Fl newer-mtime
switches accept a variety of common date and time specifications, including
.Dq 12 Mar 2005 7:14:29pm ,
.Dq 2005-03-12 19:14 ,
@ -705,7 +745,7 @@ and
.Dq 19:14 PST May 1 .
.Pp
The
.Fl -options
.Fl Fl options
argument can be used to control various details of archive generation
or reading.
For example, you can generate mtree output which only contains
@ -713,9 +753,9 @@ For example, you can generate mtree output which only contains
and
.Cm uid
keywords:
.Dl Nm Fl cf Pa file.tar Fl -format=mtree Fl -options='!all,type,time,uid' Pa dir
.Dl Nm Fl cf Pa file.tar Fl Fl format=mtree Fl Fl options='!all,type,time,uid' Pa dir
or you can set the compression level used by gzip or xz compression:
.Dl Nm Fl czf Pa file.tar Fl -options='compression-level=9' .
.Dl Nm Fl czf Pa file.tar Fl Fl options='compression-level=9' .
For more details, see the explanation of the
.Fn archive_read_set_options
and
@ -861,6 +901,7 @@ components, or symlinks to other directories.
.Xr mt 1 ,
.Xr pax 1 ,
.Xr shar 1 ,
.Xr xz 1 ,
.Xr libarchive 3 ,
.Xr libarchive-formats 5 ,
.Xr tar 5
@ -870,7 +911,7 @@ in
.St -p1003.1-96
but was dropped from
.St -p1003.1-2001 .
The options used by this implementation were developed by surveying a
The options supported by this implementation were developed by surveying a
number of existing tar implementations as well as the old POSIX specification
for tar and the current POSIX specification for pax.
.Pp
@ -896,6 +937,9 @@ beginning with
This is a complete re-implementation based on the
.Xr libarchive 3
library.
It was first released with
.Fx 5.4
in May, 2005.
.Sh BUGS
This program follows
.St -p1003.1-96
@ -905,7 +949,7 @@ option.
Note that GNU tar prior to version 1.15 treated
.Fl l
as a synonym for the
.Fl -one-file-system
.Fl Fl one-file-system
option.
.Pp
The
@ -983,6 +1027,3 @@ Converting between dissimilar archive formats (such as tar and cpio) using the
convention can cause hard link information to be lost.
(This is a consequence of the incompatible ways that different archive
formats store hardlink information.)
.Pp
There are alternative long options for many of the short options that
are deliberately not documented.

View File

@ -103,6 +103,7 @@ progress_func(void *cookie)
struct archive *a = progress_data->archive;
struct archive_entry *entry = progress_data->entry;
uint64_t comp, uncomp;
int compression;
if (!need_report())
return;
@ -112,9 +113,13 @@ progress_func(void *cookie)
if (a != NULL) {
comp = archive_position_compressed(a);
uncomp = archive_position_uncompressed(a);
if (comp > uncomp)
compression = 0;
else
compression = (int)((uncomp - comp) * 100 / uncomp);
fprintf(stderr,
"In: %s bytes, compression %d%%;",
tar_i64toa(comp), (int)((uncomp - comp) * 100 / uncomp));
tar_i64toa(comp), compression);
fprintf(stderr, " Out: %d files, %s bytes\n",
archive_file_count(a), tar_i64toa(uncomp));
}
@ -214,7 +219,7 @@ read_archive(struct bsdtar *bsdtar, char mode)
}
if (bsdtar->uname)
archive_entry_set_uname(entry, bsdtar->uname);
if (bsdtar->gname >= 0)
if (bsdtar->gname)
archive_entry_set_gname(entry, bsdtar->gname);
/*

View File

@ -44,7 +44,7 @@ DEFINE_TEST(test_option_s)
{
struct stat st;
/* Create a sample file heirarchy. */
/* Create a sample file hierarchy. */
assertMakeDir("in", 0755);
assertMakeDir("in/d1", 0755);
assertEqualInt(0, mkfile("in/d1/foo", "foo"));

View File

@ -401,7 +401,7 @@ tree_next(struct tree *t)
* violation. Just crash now. */
if (t->visit_type == TREE_ERROR_FATAL) {
fprintf(stderr, "Unable to continue traversing"
" directory heirarchy after a fatal error.");
" directory hierarchy after a fatal error.");
abort();
}

View File

@ -226,7 +226,11 @@ yes(const char *fmt, ...)
fflush(stderr);
l = read(2, buff, sizeof(buff) - 1);
if (l <= 0)
if (l < 0) {
fprintf(stderr, "Keyboard read failed\n");
exit(1);
}
if (l == 0)
return (0);
buff[l] = 0;

View File

@ -751,6 +751,9 @@ write_hierarchy(struct bsdtar *bsdtar, struct archive *a, const char *path)
break;
}
if (bsdtar->option_no_subdirs)
descend = 0;
/*
* Are we about to cross to a new filesystem?
*/
@ -763,7 +766,6 @@ write_hierarchy(struct bsdtar *bsdtar, struct archive *a, const char *path)
} else if (descend == 0) {
/* We're not descending, so no need to check. */
} else if (bsdtar->option_dont_traverse_mounts) {
/* User has asked us not to cross mount points. */
descend = 0;
} else {
/* We're prepared to cross a mount point. */
@ -790,8 +792,15 @@ write_hierarchy(struct bsdtar *bsdtar, struct archive *a, const char *path)
* In -u mode, check that the file is newer than what's
* already in the archive; in all modes, obey --newerXXX flags.
*/
if (!new_enough(bsdtar, name, st))
if (!new_enough(bsdtar, name, st)) {
if (!descend)
continue;
if (bsdtar->option_interactive &&
!yes("add '%s'", name))
continue;
tree_descend(tree);
continue;
}
archive_entry_free(entry);
entry = archive_entry_new();
@ -885,8 +894,7 @@ write_hierarchy(struct bsdtar *bsdtar, struct archive *a, const char *path)
!yes("add '%s'", name))
continue;
/* Note: if user vetoes, we won't descend. */
if (descend && !bsdtar->option_no_subdirs)
if (descend)
tree_descend(tree);
/*
@ -936,6 +944,7 @@ write_entry_backend(struct bsdtar *bsdtar, struct archive *a,
const char *pathname = archive_entry_sourcepath(entry);
fd = open(pathname, O_RDONLY | O_BINARY);
if (fd == -1) {
bsdtar->return_value = 1;
if (!bsdtar->verbose)
lafe_warnc(errno,
"%s: could not open file", pathname);
@ -982,15 +991,21 @@ report_write(struct bsdtar *bsdtar, struct archive *a,
struct archive_entry *entry, int64_t progress)
{
uint64_t comp, uncomp;
int compression;
if (bsdtar->verbose)
fprintf(stderr, "\n");
comp = archive_position_compressed(a);
uncomp = archive_position_uncompressed(a);
fprintf(stderr, "In: %d files, %s bytes;",
archive_file_count(a), tar_i64toa(uncomp));
if (comp > uncomp)
compression = 0;
else
compression = (int)((uncomp - comp) * 100 / uncomp);
fprintf(stderr,
" Out: %s bytes, compression %d%%\n",
tar_i64toa(comp), (int)((uncomp - comp) * 100 / uncomp));
tar_i64toa(comp), compression);
/* Can't have two calls to tar_i64toa() pending, so split the output. */
safe_fprintf(stderr, "Current: %s (%s",
archive_entry_pathname(entry),
@ -1031,6 +1046,12 @@ write_file_data(struct bsdtar *bsdtar, struct archive *a,
progress += bytes_written;
bytes_read = read(fd, bsdtar->buff, FILEDATABUFLEN);
}
if (bytes_read < 0) {
lafe_warnc(errno,
"%s: Read error",
archive_entry_pathname(entry));
bsdtar->return_value = 1;
}
return 0;
}