375 lines
12 KiB
Groff
375 lines
12 KiB
Groff
|
.\" 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: src/lib/libarchive/archive_write_disk.3,v 1.4 2008/09/04 05:22:00 kientzle Exp $
|
||
|
.\"
|
||
|
.Dd August 5, 2008
|
||
|
.Dt archive_write_disk 3
|
||
|
.Os
|
||
|
.Sh NAME
|
||
|
.Nm archive_write_disk_new ,
|
||
|
.Nm archive_write_disk_set_options ,
|
||
|
.Nm archive_write_disk_set_skip_file ,
|
||
|
.Nm archive_write_disk_set_group_lookup ,
|
||
|
.Nm archive_write_disk_set_standard_lookup ,
|
||
|
.Nm archive_write_disk_set_user_lookup ,
|
||
|
.Nm archive_write_header ,
|
||
|
.Nm archive_write_data ,
|
||
|
.Nm archive_write_finish_entry ,
|
||
|
.Nm archive_write_close ,
|
||
|
.Nm archive_write_finish
|
||
|
.Nd functions for creating objects on disk
|
||
|
.Sh SYNOPSIS
|
||
|
.In archive.h
|
||
|
.Ft struct archive *
|
||
|
.Fn archive_write_disk_new "void"
|
||
|
.Ft int
|
||
|
.Fn archive_write_disk_set_options "struct archive *" "int flags"
|
||
|
.Ft int
|
||
|
.Fn archive_write_disk_set_skip_file "struct archive *" "dev_t" "ino_t"
|
||
|
.Ft int
|
||
|
.Fo archive_write_disk_set_group_lookup
|
||
|
.Fa "struct archive *"
|
||
|
.Fa "void *"
|
||
|
.Fa "gid_t (*)(void *, const char *gname, gid_t gid)"
|
||
|
.Fa "void (*cleanup)(void *)"
|
||
|
.Fc
|
||
|
.Ft int
|
||
|
.Fn archive_write_disk_set_standard_lookup "struct archive *"
|
||
|
.Ft int
|
||
|
.Fo archive_write_disk_set_user_lookup
|
||
|
.Fa "struct archive *"
|
||
|
.Fa "void *"
|
||
|
.Fa "uid_t (*)(void *, const char *uname, uid_t uid)"
|
||
|
.Fa "void (*cleanup)(void *)"
|
||
|
.Fc
|
||
|
.Ft int
|
||
|
.Fn archive_write_header "struct archive *" "struct archive_entry *"
|
||
|
.Ft ssize_t
|
||
|
.Fn archive_write_data "struct archive *" "const void *" "size_t"
|
||
|
.Ft int
|
||
|
.Fn archive_write_finish_entry "struct archive *"
|
||
|
.Ft int
|
||
|
.Fn archive_write_close "struct archive *"
|
||
|
.Ft int
|
||
|
.Fn archive_write_finish "struct archive *"
|
||
|
.Sh DESCRIPTION
|
||
|
These functions provide a complete API for creating objects on
|
||
|
disk from
|
||
|
.Tn struct archive_entry
|
||
|
descriptions.
|
||
|
They are most naturally used when extracting objects from an archive
|
||
|
using the
|
||
|
.Fn archive_read
|
||
|
interface.
|
||
|
The general process is to read
|
||
|
.Tn struct archive_entry
|
||
|
objects from an archive, then write those objects to a
|
||
|
.Tn struct archive
|
||
|
object created using the
|
||
|
.Fn archive_write_disk
|
||
|
family functions.
|
||
|
This interface is deliberately very similar to the
|
||
|
.Fn archive_write
|
||
|
interface used to write objects to a streaming archive.
|
||
|
.Bl -tag -width indent
|
||
|
.It Fn archive_write_disk_new
|
||
|
Allocates and initializes a
|
||
|
.Tn struct archive
|
||
|
object suitable for writing objects to disk.
|
||
|
.It Fn archive_write_disk_set_skip_file
|
||
|
Records the device and inode numbers of a file that should not be
|
||
|
overwritten.
|
||
|
This is typically used to ensure that an extraction process does not
|
||
|
overwrite the archive from which objects are being read.
|
||
|
This capability is technically unnecessary but can be a significant
|
||
|
performance optimization in practice.
|
||
|
.It Fn archive_write_disk_set_options
|
||
|
The options field consists of a bitwise OR of one or more of the
|
||
|
following values:
|
||
|
.Bl -tag -compact -width "indent"
|
||
|
.It Cm ARCHIVE_EXTRACT_OWNER
|
||
|
The user and group IDs should be set on the restored file.
|
||
|
By default, the user and group IDs are not restored.
|
||
|
.It Cm ARCHIVE_EXTRACT_PERM
|
||
|
Full permissions (including SGID, SUID, and sticky bits) should
|
||
|
be restored exactly as specified, without obeying the
|
||
|
current umask.
|
||
|
Note that SUID and SGID bits can only be restored if the
|
||
|
user and group ID of the object on disk are correct.
|
||
|
If
|
||
|
.Cm ARCHIVE_EXTRACT_OWNER
|
||
|
is not specified, then SUID and SGID bits will only be restored
|
||
|
if the default user and group IDs of newly-created objects on disk
|
||
|
happen to match those specified in the archive entry.
|
||
|
By default, only basic permissions are restored, and umask is obeyed.
|
||
|
.It Cm ARCHIVE_EXTRACT_TIME
|
||
|
The timestamps (mtime, ctime, and atime) should be restored.
|
||
|
By default, they are ignored.
|
||
|
Note that restoring of atime is not currently supported.
|
||
|
.It Cm ARCHIVE_EXTRACT_NO_OVERWRITE
|
||
|
Existing files on disk will not be overwritten.
|
||
|
By default, existing regular files are truncated and overwritten;
|
||
|
existing directories will have their permissions updated;
|
||
|
other pre-existing objects are unlinked and recreated from scratch.
|
||
|
.It Cm ARCHIVE_EXTRACT_UNLINK
|
||
|
Existing files on disk will be unlinked before any attempt to
|
||
|
create them.
|
||
|
In some cases, this can prove to be a significant performance improvement.
|
||
|
By default, existing files are truncated and rewritten, but
|
||
|
the file is not recreated.
|
||
|
In particular, the default behavior does not break existing hard links.
|
||
|
.It Cm ARCHIVE_EXTRACT_ACL
|
||
|
Attempt to restore ACLs.
|
||
|
By default, extended ACLs are ignored.
|
||
|
.It Cm ARCHIVE_EXTRACT_FFLAGS
|
||
|
Attempt to restore extended file flags.
|
||
|
By default, file flags are ignored.
|
||
|
.It Cm ARCHIVE_EXTRACT_XATTR
|
||
|
Attempt to restore POSIX.1e extended attributes.
|
||
|
By default, they are ignored.
|
||
|
.It Cm ARCHIVE_EXTRACT_SECURE_SYMLINKS
|
||
|
Refuse to extract any object whose final location would be altered
|
||
|
by a symlink on disk.
|
||
|
This is intended to help guard against a variety of mischief
|
||
|
caused by archives that (deliberately or otherwise) extract
|
||
|
files outside of the current directory.
|
||
|
The default is not to perform this check.
|
||
|
If
|
||
|
.Cm ARCHIVE_EXTRACT_UNLINK
|
||
|
is specified together with this option, the library will
|
||
|
remove any intermediate symlinks it finds and return an
|
||
|
error only if such symlink could not be removed.
|
||
|
.It Cm ARCHIVE_EXTRACT_SECURE_NODOTDOT
|
||
|
Refuse to extract a path that contains a
|
||
|
.Pa ..
|
||
|
element anywhere within it.
|
||
|
The default is to not refuse such paths.
|
||
|
Note that paths ending in
|
||
|
.Pa ..
|
||
|
always cause an error, regardless of this flag.
|
||
|
.It Cm ARCHIVE_EXTRACT_SPARSE
|
||
|
Scan data for blocks of NUL bytes and try to recreate them with holes.
|
||
|
This results in sparse files, independent of whether the archive format
|
||
|
supports or uses them.
|
||
|
.El
|
||
|
.It Xo
|
||
|
.Fn archive_write_disk_set_group_lookup ,
|
||
|
.Fn archive_write_disk_set_user_lookup
|
||
|
.Xc
|
||
|
The
|
||
|
.Tn struct archive_entry
|
||
|
objects contain both names and ids that can be used to identify users
|
||
|
and groups.
|
||
|
These names and ids describe the ownership of the file itself and
|
||
|
also appear in ACL lists.
|
||
|
By default, the library uses the ids and ignores the names, but
|
||
|
this can be overridden by registering user and group lookup functions.
|
||
|
To register, you must provide a lookup function which
|
||
|
accepts both a name and id and returns a suitable id.
|
||
|
You may also provide a
|
||
|
.Tn void *
|
||
|
pointer to a private data structure and a cleanup function for
|
||
|
that data.
|
||
|
The cleanup function will be invoked when the
|
||
|
.Tn struct archive
|
||
|
object is destroyed.
|
||
|
.It Fn archive_write_disk_set_standard_lookup
|
||
|
This convenience function installs a standard set of user
|
||
|
and group lookup functions.
|
||
|
These functions use
|
||
|
.Xr getpwnam 3
|
||
|
and
|
||
|
.Xr getgrnam 3
|
||
|
to convert names to ids, defaulting to the ids if the names cannot
|
||
|
be looked up.
|
||
|
These functions also implement a simple memory cache to reduce
|
||
|
the number of calls to
|
||
|
.Xr getpwnam 3
|
||
|
and
|
||
|
.Xr getgrnam 3 .
|
||
|
.It Fn archive_write_header
|
||
|
Build and write a header using the data in the provided
|
||
|
.Tn struct archive_entry
|
||
|
structure.
|
||
|
See
|
||
|
.Xr archive_entry 3
|
||
|
for information on creating and populating
|
||
|
.Tn struct archive_entry
|
||
|
objects.
|
||
|
.It Fn archive_write_data
|
||
|
Write data corresponding to the header just written.
|
||
|
Returns number of bytes written or -1 on error.
|
||
|
.It Fn archive_write_finish_entry
|
||
|
Close out the entry just written.
|
||
|
Ordinarily, clients never need to call this, as it
|
||
|
is called automatically by
|
||
|
.Fn archive_write_next_header
|
||
|
and
|
||
|
.Fn archive_write_close
|
||
|
as needed.
|
||
|
.It Fn archive_write_close
|
||
|
Set any attributes that could not be set during the initial restore.
|
||
|
For example, directory timestamps are not restored initially because
|
||
|
restoring a subsequent file would alter that timestamp.
|
||
|
Similarly, non-writable directories are initially created with
|
||
|
write permissions (so that their contents can be restored).
|
||
|
The
|
||
|
.Nm
|
||
|
library maintains a list of all such deferred attributes and
|
||
|
sets them when this function is invoked.
|
||
|
.It Fn archive_write_finish
|
||
|
Invokes
|
||
|
.Fn archive_write_close
|
||
|
if it was not invoked manually, then releases all resources.
|
||
|
.El
|
||
|
More information about the
|
||
|
.Va struct archive
|
||
|
object and the overall design of the library can be found in the
|
||
|
.Xr libarchive 3
|
||
|
overview.
|
||
|
Many of these functions are also documented under
|
||
|
.Xr archive_write 3 .
|
||
|
.Sh RETURN VALUES
|
||
|
Most functions return
|
||
|
.Cm ARCHIVE_OK
|
||
|
(zero) on success, or one of several non-zero
|
||
|
error codes for errors.
|
||
|
Specific error codes include:
|
||
|
.Cm ARCHIVE_RETRY
|
||
|
for operations that might succeed if retried,
|
||
|
.Cm ARCHIVE_WARN
|
||
|
for unusual conditions that do not prevent further operations, and
|
||
|
.Cm ARCHIVE_FATAL
|
||
|
for serious errors that make remaining operations impossible.
|
||
|
The
|
||
|
.Fn archive_errno
|
||
|
and
|
||
|
.Fn archive_error_string
|
||
|
functions can be used to retrieve an appropriate error code and a
|
||
|
textual error message.
|
||
|
.Pp
|
||
|
.Fn archive_write_disk_new
|
||
|
returns a pointer to a newly-allocated
|
||
|
.Tn struct archive
|
||
|
object.
|
||
|
.Pp
|
||
|
.Fn archive_write_data
|
||
|
returns a count of the number of bytes actually written.
|
||
|
On error, -1 is returned and the
|
||
|
.Fn archive_errno
|
||
|
and
|
||
|
.Fn archive_error_string
|
||
|
functions will return appropriate values.
|
||
|
.Sh SEE ALSO
|
||
|
.Xr archive_read 3 ,
|
||
|
.Xr archive_write 3 ,
|
||
|
.Xr tar 1 ,
|
||
|
.Xr libarchive 3
|
||
|
.Sh HISTORY
|
||
|
The
|
||
|
.Nm libarchive
|
||
|
library first appeared in
|
||
|
.Fx 5.3 .
|
||
|
The
|
||
|
.Nm archive_write_disk
|
||
|
interface was added to
|
||
|
.Nm libarchive 2.0
|
||
|
and first appeared in
|
||
|
.Fx 6.3 .
|
||
|
.Sh AUTHORS
|
||
|
.An -nosplit
|
||
|
The
|
||
|
.Nm libarchive
|
||
|
library was written by
|
||
|
.An Tim Kientzle Aq kientzle@acm.org .
|
||
|
.Sh BUGS
|
||
|
Directories are actually extracted in two distinct phases.
|
||
|
Directories are created during
|
||
|
.Fn archive_write_header ,
|
||
|
but final permissions are not set until
|
||
|
.Fn archive_write_close .
|
||
|
This separation is necessary to correctly handle borderline
|
||
|
cases such as a non-writable directory containing
|
||
|
files, but can cause unexpected results.
|
||
|
In particular, directory permissions are not fully
|
||
|
restored until the archive is closed.
|
||
|
If you use
|
||
|
.Xr chdir 2
|
||
|
to change the current directory between calls to
|
||
|
.Fn archive_read_extract
|
||
|
or before calling
|
||
|
.Fn archive_read_close ,
|
||
|
you may confuse the permission-setting logic with
|
||
|
the result that directory permissions are restored
|
||
|
incorrectly.
|
||
|
.Pp
|
||
|
The library attempts to create objects with filenames longer than
|
||
|
.Cm PATH_MAX
|
||
|
by creating prefixes of the full path and changing the current directory.
|
||
|
Currently, this logic is limited in scope; the fixup pass does
|
||
|
not work correctly for such objects and the symlink security check
|
||
|
option disables the support for very long pathnames.
|
||
|
.Pp
|
||
|
Restoring the path
|
||
|
.Pa aa/../bb
|
||
|
does create each intermediate directory.
|
||
|
In particular, the directory
|
||
|
.Pa aa
|
||
|
is created as well as the final object
|
||
|
.Pa bb .
|
||
|
In theory, this can be exploited to create an entire directory heirarchy
|
||
|
with a single request.
|
||
|
Of course, this does not work if the
|
||
|
.Cm ARCHIVE_EXTRACT_NODOTDOT
|
||
|
option is specified.
|
||
|
.Pp
|
||
|
Implicit directories are always created obeying the current umask.
|
||
|
Explicit objects are created obeying the current umask unless
|
||
|
.Cm ARCHIVE_EXTRACT_PERM
|
||
|
is specified, in which case they current umask is ignored.
|
||
|
.Pp
|
||
|
SGID and SUID bits are restored only if the correct user and
|
||
|
group could be set.
|
||
|
If
|
||
|
.Cm ARCHIVE_EXTRACT_OWNER
|
||
|
is not specified, then no attempt is made to set the ownership.
|
||
|
In this case, SGID and SUID bits are restored only if the
|
||
|
user and group of the final object happen to match those specified
|
||
|
in the entry.
|
||
|
.Pp
|
||
|
The
|
||
|
.Dq standard
|
||
|
user-id and group-id lookup functions are not the defaults because
|
||
|
.Xr getgrnam 3
|
||
|
and
|
||
|
.Xr getpwnam 3
|
||
|
are sometimes too large for particular applications.
|
||
|
The current design allows the application author to use a more
|
||
|
compact implementation when appropriate.
|
||
|
.Pp
|
||
|
There should be a corresponding
|
||
|
.Nm archive_read_disk
|
||
|
interface that walks a directory heirarchy and returns archive
|
||
|
entry objects.
|