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. | 
