715 lines
		
	
	
		
			22 KiB
		
	
	
	
		
			Groff
		
	
	
	
	
	
			
		
		
	
	
			715 lines
		
	
	
		
			22 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: head/lib/libarchive/archive_read.3 191595 2009-04-27 20:13:13Z kientzle $
 | 
						|
.\"
 | 
						|
.Dd April 13, 2009
 | 
						|
.Dt archive_read 3
 | 
						|
.Os
 | 
						|
.Sh NAME
 | 
						|
.Nm archive_read_new ,
 | 
						|
.Nm archive_read_set_filter_options ,
 | 
						|
.Nm archive_read_set_format_options ,
 | 
						|
.Nm archive_read_set_options ,
 | 
						|
.Nm archive_read_support_compression_all ,
 | 
						|
.Nm archive_read_support_compression_bzip2 ,
 | 
						|
.Nm archive_read_support_compression_compress ,
 | 
						|
.Nm archive_read_support_compression_gzip ,
 | 
						|
.Nm archive_read_support_compression_lzma ,
 | 
						|
.Nm archive_read_support_compression_none ,
 | 
						|
.Nm archive_read_support_compression_xz ,
 | 
						|
.Nm archive_read_support_compression_program ,
 | 
						|
.Nm archive_read_support_compression_program_signature ,
 | 
						|
.Nm archive_read_support_format_all ,
 | 
						|
.Nm archive_read_support_format_ar ,
 | 
						|
.Nm archive_read_support_format_cpio ,
 | 
						|
.Nm archive_read_support_format_empty ,
 | 
						|
.Nm archive_read_support_format_iso9660 ,
 | 
						|
.Nm archive_read_support_format_mtree,
 | 
						|
.Nm archive_read_support_format_raw,
 | 
						|
.Nm archive_read_support_format_tar ,
 | 
						|
.Nm archive_read_support_format_zip ,
 | 
						|
.Nm archive_read_open ,
 | 
						|
.Nm archive_read_open2 ,
 | 
						|
.Nm archive_read_open_fd ,
 | 
						|
.Nm archive_read_open_FILE ,
 | 
						|
.Nm archive_read_open_filename ,
 | 
						|
.Nm archive_read_open_memory ,
 | 
						|
.Nm archive_read_next_header ,
 | 
						|
.Nm archive_read_next_header2 ,
 | 
						|
.Nm archive_read_data ,
 | 
						|
.Nm archive_read_data_block ,
 | 
						|
.Nm archive_read_data_skip ,
 | 
						|
.\" #if ARCHIVE_API_VERSION < 3
 | 
						|
.Nm archive_read_data_into_buffer ,
 | 
						|
.\" #endif
 | 
						|
.Nm archive_read_data_into_fd ,
 | 
						|
.Nm archive_read_extract ,
 | 
						|
.Nm archive_read_extract2 ,
 | 
						|
.Nm archive_read_extract_set_progress_callback ,
 | 
						|
.Nm archive_read_close ,
 | 
						|
.Nm archive_read_finish
 | 
						|
.Nd functions for reading streaming archives
 | 
						|
.Sh SYNOPSIS
 | 
						|
.In archive.h
 | 
						|
.Ft struct archive *
 | 
						|
.Fn archive_read_new "void"
 | 
						|
.Ft int
 | 
						|
.Fn archive_read_support_compression_all "struct archive *"
 | 
						|
.Ft int
 | 
						|
.Fn archive_read_support_compression_bzip2 "struct archive *"
 | 
						|
.Ft int
 | 
						|
.Fn archive_read_support_compression_compress "struct archive *"
 | 
						|
.Ft int
 | 
						|
.Fn archive_read_support_compression_gzip "struct archive *"
 | 
						|
.Ft int
 | 
						|
.Fn archive_read_support_compression_lzma "struct archive *"
 | 
						|
.Ft int
 | 
						|
.Fn archive_read_support_compression_none "struct archive *"
 | 
						|
.Ft int
 | 
						|
.Fn archive_read_support_compression_xz "struct archive *"
 | 
						|
.Ft int
 | 
						|
.Fo archive_read_support_compression_program
 | 
						|
.Fa "struct archive *"
 | 
						|
.Fa "const char *cmd"
 | 
						|
.Fc
 | 
						|
.Ft int
 | 
						|
.Fo archive_read_support_compression_program_signature
 | 
						|
.Fa "struct archive *"
 | 
						|
.Fa "const char *cmd"
 | 
						|
.Fa "const void *signature"
 | 
						|
.Fa "size_t signature_length"
 | 
						|
.Fc
 | 
						|
.Ft int
 | 
						|
.Fn archive_read_support_format_all "struct archive *"
 | 
						|
.Ft int
 | 
						|
.Fn archive_read_support_format_ar "struct archive *"
 | 
						|
.Ft int
 | 
						|
.Fn archive_read_support_format_cpio "struct archive *"
 | 
						|
.Ft int
 | 
						|
.Fn archive_read_support_format_empty "struct archive *"
 | 
						|
.Ft int
 | 
						|
.Fn archive_read_support_format_iso9660 "struct archive *"
 | 
						|
.Ft int
 | 
						|
.Fn archive_read_support_format_mtree "struct archive *"
 | 
						|
.Ft int
 | 
						|
.Fn archive_read_support_format_raw "struct archive *"
 | 
						|
.Ft int
 | 
						|
.Fn archive_read_support_format_tar "struct archive *"
 | 
						|
.Ft int
 | 
						|
.Fn archive_read_support_format_zip "struct archive *"
 | 
						|
.Ft int
 | 
						|
.Fn archive_read_set_filter_options "struct archive *" "const char *"
 | 
						|
.Ft int
 | 
						|
.Fn archive_read_set_format_options "struct archive *" "const char *"
 | 
						|
.Ft int
 | 
						|
.Fn archive_read_set_options "struct archive *" "const char *"
 | 
						|
.Ft int
 | 
						|
.Fo archive_read_open
 | 
						|
.Fa "struct archive *"
 | 
						|
.Fa "void *client_data"
 | 
						|
.Fa "archive_open_callback *"
 | 
						|
.Fa "archive_read_callback *"
 | 
						|
.Fa "archive_close_callback *"
 | 
						|
.Fc
 | 
						|
.Ft int
 | 
						|
.Fo archive_read_open2
 | 
						|
.Fa "struct archive *"
 | 
						|
.Fa "void *client_data"
 | 
						|
.Fa "archive_open_callback *"
 | 
						|
.Fa "archive_read_callback *"
 | 
						|
.Fa "archive_skip_callback *"
 | 
						|
.Fa "archive_close_callback *"
 | 
						|
.Fc
 | 
						|
.Ft int
 | 
						|
.Fn archive_read_open_FILE "struct archive *" "FILE *file"
 | 
						|
.Ft int
 | 
						|
.Fn archive_read_open_fd "struct archive *" "int fd" "size_t block_size"
 | 
						|
.Ft int
 | 
						|
.Fo archive_read_open_filename
 | 
						|
.Fa "struct archive *"
 | 
						|
.Fa "const char *filename"
 | 
						|
.Fa "size_t block_size"
 | 
						|
.Fc
 | 
						|
.Ft int
 | 
						|
.Fn archive_read_open_memory "struct archive *" "void *buff" "size_t size"
 | 
						|
.Ft int
 | 
						|
.Fn archive_read_next_header "struct archive *" "struct archive_entry **"
 | 
						|
.Ft int
 | 
						|
.Fn archive_read_next_header2 "struct archive *" "struct archive_entry *"
 | 
						|
.Ft ssize_t
 | 
						|
.Fn archive_read_data "struct archive *" "void *buff" "size_t len"
 | 
						|
.Ft int
 | 
						|
.Fo archive_read_data_block
 | 
						|
.Fa "struct archive *"
 | 
						|
.Fa "const void **buff"
 | 
						|
.Fa "size_t *len"
 | 
						|
.Fa "off_t *offset"
 | 
						|
.Fc
 | 
						|
.Ft int
 | 
						|
.Fn archive_read_data_skip "struct archive *"
 | 
						|
.\" #if ARCHIVE_API_VERSION < 3
 | 
						|
.Ft int
 | 
						|
.Fn archive_read_data_into_buffer "struct archive *" "void *" "ssize_t len"
 | 
						|
.\" #endif
 | 
						|
.Ft int
 | 
						|
.Fn archive_read_data_into_fd "struct archive *" "int fd"
 | 
						|
.Ft int
 | 
						|
.Fo archive_read_extract
 | 
						|
.Fa "struct archive *"
 | 
						|
.Fa "struct archive_entry *"
 | 
						|
.Fa "int flags"
 | 
						|
.Fc
 | 
						|
.Ft int
 | 
						|
.Fo archive_read_extract2
 | 
						|
.Fa "struct archive *src"
 | 
						|
.Fa "struct archive_entry *"
 | 
						|
.Fa "struct archive *dest"
 | 
						|
.Fc
 | 
						|
.Ft void
 | 
						|
.Fo archive_read_extract_set_progress_callback
 | 
						|
.Fa "struct archive *"
 | 
						|
.Fa "void (*func)(void *)"
 | 
						|
.Fa "void *user_data"
 | 
						|
.Fc
 | 
						|
.Ft int
 | 
						|
.Fn archive_read_close "struct archive *"
 | 
						|
.Ft int
 | 
						|
.Fn archive_read_finish "struct archive *"
 | 
						|
.Sh DESCRIPTION
 | 
						|
These functions provide a complete API for reading streaming archives.
 | 
						|
The general process is to first create the
 | 
						|
.Tn struct archive
 | 
						|
object, set options, initialize the reader, iterate over the archive
 | 
						|
headers and associated data, then close the archive and release all
 | 
						|
resources.
 | 
						|
The following summary describes the functions in approximately the
 | 
						|
order they would be used:
 | 
						|
.Bl -tag -compact -width indent
 | 
						|
.It Fn archive_read_new
 | 
						|
Allocates and initializes a
 | 
						|
.Tn struct archive
 | 
						|
object suitable for reading from an archive.
 | 
						|
.It Xo
 | 
						|
.Fn archive_read_support_compression_bzip2 ,
 | 
						|
.Fn archive_read_support_compression_compress ,
 | 
						|
.Fn archive_read_support_compression_gzip ,
 | 
						|
.Fn archive_read_support_compression_lzma ,
 | 
						|
.Fn archive_read_support_compression_none ,
 | 
						|
.Fn archive_read_support_compression_xz
 | 
						|
.Xc
 | 
						|
Enables auto-detection code and decompression support for the
 | 
						|
specified compression.
 | 
						|
Returns
 | 
						|
.Cm ARCHIVE_OK
 | 
						|
if the compression is fully supported, or
 | 
						|
.Cm ARCHIVE_WARN
 | 
						|
if the compression is supported only through an external program.
 | 
						|
Note that decompression using an external program is usually slower than
 | 
						|
decompression through built-in libraries.
 | 
						|
Note that
 | 
						|
.Dq none
 | 
						|
is always enabled by default.
 | 
						|
.It Fn archive_read_support_compression_all
 | 
						|
Enables all available decompression filters.
 | 
						|
.It Fn archive_read_support_compression_program
 | 
						|
Data is fed through the specified external program before being dearchived.
 | 
						|
Note that this disables automatic detection of the compression format,
 | 
						|
so it makes no sense to specify this in conjunction with any other
 | 
						|
decompression option.
 | 
						|
.It Fn archive_read_support_compression_program_signature
 | 
						|
This feeds data through the specified external program
 | 
						|
but only if the initial bytes of the data match the specified
 | 
						|
signature value.
 | 
						|
.It Xo
 | 
						|
.Fn archive_read_support_format_all ,
 | 
						|
.Fn archive_read_support_format_ar ,
 | 
						|
.Fn archive_read_support_format_cpio ,
 | 
						|
.Fn archive_read_support_format_empty ,
 | 
						|
.Fn archive_read_support_format_iso9660 ,
 | 
						|
.Fn archive_read_support_format_mtree ,
 | 
						|
.Fn archive_read_support_format_tar ,
 | 
						|
.Fn archive_read_support_format_zip
 | 
						|
.Xc
 | 
						|
Enables support---including auto-detection code---for the
 | 
						|
specified archive format.
 | 
						|
For example,
 | 
						|
.Fn archive_read_support_format_tar
 | 
						|
enables support for a variety of standard tar formats, old-style tar,
 | 
						|
ustar, pax interchange format, and many common variants.
 | 
						|
For convenience,
 | 
						|
.Fn archive_read_support_format_all
 | 
						|
enables support for all available formats.
 | 
						|
Only empty archives are supported by default.
 | 
						|
.It Fn archive_read_support_format_raw
 | 
						|
The
 | 
						|
.Dq raw
 | 
						|
format handler allows libarchive to be used to read arbitrary data.
 | 
						|
It treats any data stream as an archive with a single entry.
 | 
						|
The pathname of this entry is
 | 
						|
.Dq data ;
 | 
						|
all other entry fields are unset.
 | 
						|
This is not enabled by
 | 
						|
.Fn archive_read_support_format_all
 | 
						|
in order to avoid erroneous handling of damaged archives.
 | 
						|
.It Xo
 | 
						|
.Fn archive_read_set_filter_options ,
 | 
						|
.Fn archive_read_set_format_options ,
 | 
						|
.Fn archive_read_set_options
 | 
						|
.Xc
 | 
						|
Specifies options that will be passed to currently-registered
 | 
						|
filters (including decompression filters) and/or format readers.
 | 
						|
The argument is a comma-separated list of individual options.
 | 
						|
Individual options have one of the following forms:
 | 
						|
.Bl -tag -compact -width indent
 | 
						|
.It Ar option=value
 | 
						|
The option/value pair will be provided to every module.
 | 
						|
Modules that do not accept an option with this name will ignore it.
 | 
						|
.It Ar option
 | 
						|
The option will be provided to every module with a value of
 | 
						|
.Dq 1 .
 | 
						|
.It Ar !option
 | 
						|
The option will be provided to every module with a NULL value.
 | 
						|
.It Ar module:option=value , Ar module:option , Ar module:!option
 | 
						|
As above, but the corresponding option and value will be provided
 | 
						|
only to modules whose name matches
 | 
						|
.Ar module .
 | 
						|
.El
 | 
						|
The return value will be
 | 
						|
.Cm ARCHIVE_OK
 | 
						|
if any module accepts the option, or
 | 
						|
.Cm ARCHIVE_WARN
 | 
						|
if no module accepted the option, or
 | 
						|
.Cm ARCHIVE_FATAL
 | 
						|
if there was a fatal error while attempting to process the option.
 | 
						|
.Pp
 | 
						|
The currently supported options are:
 | 
						|
.Bl -tag -compact -width indent
 | 
						|
.It Format iso9660
 | 
						|
.Bl -tag -compact -width indent
 | 
						|
.It Cm joliet
 | 
						|
Support Joliet extensions.
 | 
						|
Defaults to enabled, use
 | 
						|
.Cm !joliet
 | 
						|
to disable.
 | 
						|
.El
 | 
						|
.El
 | 
						|
.It Fn archive_read_open
 | 
						|
The same as
 | 
						|
.Fn archive_read_open2 ,
 | 
						|
except that the skip callback is assumed to be
 | 
						|
.Dv NULL .
 | 
						|
.It Fn archive_read_open2
 | 
						|
Freeze the settings, open the archive, and prepare for reading entries.
 | 
						|
This is the most generic version of this call, which accepts
 | 
						|
four callback functions.
 | 
						|
Most clients will want to use
 | 
						|
.Fn archive_read_open_filename ,
 | 
						|
.Fn archive_read_open_FILE ,
 | 
						|
.Fn archive_read_open_fd ,
 | 
						|
or
 | 
						|
.Fn archive_read_open_memory
 | 
						|
instead.
 | 
						|
The library invokes the client-provided functions to obtain
 | 
						|
raw bytes from the archive.
 | 
						|
.It Fn archive_read_open_FILE
 | 
						|
Like
 | 
						|
.Fn archive_read_open ,
 | 
						|
except that it accepts a
 | 
						|
.Ft "FILE *"
 | 
						|
pointer.
 | 
						|
This function should not be used with tape drives or other devices
 | 
						|
that require strict I/O blocking.
 | 
						|
.It Fn archive_read_open_fd
 | 
						|
Like
 | 
						|
.Fn archive_read_open ,
 | 
						|
except that it accepts a file descriptor and block size rather than
 | 
						|
a set of function pointers.
 | 
						|
Note that the file descriptor will not be automatically closed at
 | 
						|
end-of-archive.
 | 
						|
This function is safe for use with tape drives or other blocked devices.
 | 
						|
.It Fn archive_read_open_file
 | 
						|
This is a deprecated synonym for
 | 
						|
.Fn archive_read_open_filename .
 | 
						|
.It Fn archive_read_open_filename
 | 
						|
Like
 | 
						|
.Fn archive_read_open ,
 | 
						|
except that it accepts a simple filename and a block size.
 | 
						|
A NULL filename represents standard input.
 | 
						|
This function is safe for use with tape drives or other blocked devices.
 | 
						|
.It Fn archive_read_open_memory
 | 
						|
Like
 | 
						|
.Fn archive_read_open ,
 | 
						|
except that it accepts a pointer and size of a block of
 | 
						|
memory containing the archive data.
 | 
						|
.It Fn archive_read_next_header
 | 
						|
Read the header for the next entry and return a pointer to
 | 
						|
a
 | 
						|
.Tn struct archive_entry .
 | 
						|
This is a convenience wrapper around
 | 
						|
.Fn archive_read_next_header2
 | 
						|
that reuses an internal
 | 
						|
.Tn struct archive_entry
 | 
						|
object for each request.
 | 
						|
.It Fn archive_read_next_header2
 | 
						|
Read the header for the next entry and populate the provided
 | 
						|
.Tn struct archive_entry .
 | 
						|
.It Fn archive_read_data
 | 
						|
Read data associated with the header just read.
 | 
						|
Internally, this is a convenience function that calls
 | 
						|
.Fn archive_read_data_block
 | 
						|
and fills any gaps with nulls so that callers see a single
 | 
						|
continuous stream of data.
 | 
						|
.It Fn archive_read_data_block
 | 
						|
Return the next available block of data for this entry.
 | 
						|
Unlike
 | 
						|
.Fn archive_read_data ,
 | 
						|
the
 | 
						|
.Fn archive_read_data_block
 | 
						|
function avoids copying data and allows you to correctly handle
 | 
						|
sparse files, as supported by some archive formats.
 | 
						|
The library guarantees that offsets will increase and that blocks
 | 
						|
will not overlap.
 | 
						|
Note that the blocks returned from this function can be much larger
 | 
						|
than the block size read from disk, due to compression
 | 
						|
and internal buffer optimizations.
 | 
						|
.It Fn archive_read_data_skip
 | 
						|
A convenience function that repeatedly calls
 | 
						|
.Fn archive_read_data_block
 | 
						|
to skip all of the data for this archive entry.
 | 
						|
.\" #if ARCHIVE_API_VERSION < 3
 | 
						|
.It Fn archive_read_data_into_buffer
 | 
						|
This function is deprecated and will be removed.
 | 
						|
Use
 | 
						|
.Fn archive_read_data
 | 
						|
instead.
 | 
						|
.\" #endif
 | 
						|
.It Fn archive_read_data_into_fd
 | 
						|
A convenience function that repeatedly calls
 | 
						|
.Fn archive_read_data_block
 | 
						|
to copy the entire entry to the provided file descriptor.
 | 
						|
.It Fn archive_read_extract , Fn archive_read_extract_set_skip_file
 | 
						|
A convenience function that wraps the corresponding
 | 
						|
.Xr archive_write_disk 3
 | 
						|
interfaces.
 | 
						|
The first call to
 | 
						|
.Fn archive_read_extract
 | 
						|
creates a restore object using
 | 
						|
.Xr archive_write_disk_new 3
 | 
						|
and
 | 
						|
.Xr archive_write_disk_set_standard_lookup 3 ,
 | 
						|
then transparently invokes
 | 
						|
.Xr archive_write_disk_set_options 3 ,
 | 
						|
.Xr archive_write_header 3 ,
 | 
						|
.Xr archive_write_data 3 ,
 | 
						|
and
 | 
						|
.Xr archive_write_finish_entry 3
 | 
						|
to create the entry on disk and copy data into it.
 | 
						|
The
 | 
						|
.Va flags
 | 
						|
argument is passed unmodified to
 | 
						|
.Xr archive_write_disk_set_options 3 .
 | 
						|
.It Fn archive_read_extract2
 | 
						|
This is another version of
 | 
						|
.Fn archive_read_extract
 | 
						|
that allows you to provide your own restore object.
 | 
						|
In particular, this allows you to override the standard lookup functions
 | 
						|
using
 | 
						|
.Xr archive_write_disk_set_group_lookup 3 ,
 | 
						|
and
 | 
						|
.Xr archive_write_disk_set_user_lookup 3 .
 | 
						|
Note that
 | 
						|
.Fn archive_read_extract2
 | 
						|
does not accept a
 | 
						|
.Va flags
 | 
						|
argument; you should use
 | 
						|
.Fn archive_write_disk_set_options
 | 
						|
to set the restore options yourself.
 | 
						|
.It Fn archive_read_extract_set_progress_callback
 | 
						|
Sets a pointer to a user-defined callback that can be used
 | 
						|
for updating progress displays during extraction.
 | 
						|
The progress function will be invoked during the extraction of large
 | 
						|
regular files.
 | 
						|
The progress function will be invoked with the pointer provided to this call.
 | 
						|
Generally, the data pointed to should include a reference to the archive
 | 
						|
object and the archive_entry object so that various statistics
 | 
						|
can be retrieved for the progress display.
 | 
						|
.It Fn archive_read_close
 | 
						|
Complete the archive and invoke the close callback.
 | 
						|
.It Fn archive_read_finish
 | 
						|
Invokes
 | 
						|
.Fn archive_read_close
 | 
						|
if it was not invoked manually, then release all resources.
 | 
						|
Note: In libarchive 1.x, this function was declared to return
 | 
						|
.Ft void ,
 | 
						|
which made it impossible to detect certain errors when
 | 
						|
.Fn archive_read_close
 | 
						|
was invoked implicitly from this function.
 | 
						|
The declaration is corrected beginning with libarchive 2.0.
 | 
						|
.El
 | 
						|
.Pp
 | 
						|
Note that the library determines most of the relevant information about
 | 
						|
the archive by inspection.
 | 
						|
In particular, it automatically detects
 | 
						|
.Xr gzip 1
 | 
						|
or
 | 
						|
.Xr bzip2 1
 | 
						|
compression and transparently performs the appropriate decompression.
 | 
						|
It also automatically detects the archive format.
 | 
						|
.Pp
 | 
						|
A complete description of the
 | 
						|
.Tn struct archive
 | 
						|
and
 | 
						|
.Tn struct archive_entry
 | 
						|
objects can be found in the overview manual page for
 | 
						|
.Xr libarchive 3 .
 | 
						|
.Sh CLIENT CALLBACKS
 | 
						|
The callback functions must match the following prototypes:
 | 
						|
.Bl -item -offset indent
 | 
						|
.It
 | 
						|
.Ft typedef ssize_t
 | 
						|
.Fo archive_read_callback
 | 
						|
.Fa "struct archive *"
 | 
						|
.Fa "void *client_data"
 | 
						|
.Fa "const void **buffer"
 | 
						|
.Fc
 | 
						|
.It
 | 
						|
.\" #if ARCHIVE_API_VERSION < 2
 | 
						|
.Ft typedef int
 | 
						|
.Fo archive_skip_callback
 | 
						|
.Fa "struct archive *"
 | 
						|
.Fa "void *client_data"
 | 
						|
.Fa "size_t request"
 | 
						|
.Fc
 | 
						|
.\" #else
 | 
						|
.\" .Ft typedef off_t
 | 
						|
.\" .Fo archive_skip_callback
 | 
						|
.\" .Fa "struct archive *"
 | 
						|
.\" .Fa "void *client_data"
 | 
						|
.\" .Fa "off_t request"
 | 
						|
.\" .Fc
 | 
						|
.\" #endif
 | 
						|
.It
 | 
						|
.Ft typedef int
 | 
						|
.Fn archive_open_callback "struct archive *" "void *client_data"
 | 
						|
.It
 | 
						|
.Ft typedef int
 | 
						|
.Fn archive_close_callback "struct archive *" "void *client_data"
 | 
						|
.El
 | 
						|
.Pp
 | 
						|
The open callback is invoked by
 | 
						|
.Fn archive_open .
 | 
						|
It should return
 | 
						|
.Cm ARCHIVE_OK
 | 
						|
if the underlying file or data source is successfully
 | 
						|
opened.
 | 
						|
If the open fails, it should call
 | 
						|
.Fn archive_set_error
 | 
						|
to register an error code and message and return
 | 
						|
.Cm ARCHIVE_FATAL .
 | 
						|
.Pp
 | 
						|
The read callback is invoked whenever the library
 | 
						|
requires raw bytes from the archive.
 | 
						|
The read callback should read data into a buffer,
 | 
						|
set the
 | 
						|
.Li const void **buffer
 | 
						|
argument to point to the available data, and
 | 
						|
return a count of the number of bytes available.
 | 
						|
The library will invoke the read callback again
 | 
						|
only after it has consumed this data.
 | 
						|
The library imposes no constraints on the size
 | 
						|
of the data blocks returned.
 | 
						|
On end-of-file, the read callback should
 | 
						|
return zero.
 | 
						|
On error, the read callback should invoke
 | 
						|
.Fn archive_set_error
 | 
						|
to register an error code and message and
 | 
						|
return -1.
 | 
						|
.Pp
 | 
						|
The skip callback is invoked when the
 | 
						|
library wants to ignore a block of data.
 | 
						|
The return value is the number of bytes actually
 | 
						|
skipped, which may differ from the request.
 | 
						|
If the callback cannot skip data, it should return
 | 
						|
zero.
 | 
						|
If the skip callback is not provided (the
 | 
						|
function pointer is
 | 
						|
.Dv NULL ),
 | 
						|
the library will invoke the read function
 | 
						|
instead and simply discard the result.
 | 
						|
A skip callback can provide significant
 | 
						|
performance gains when reading uncompressed
 | 
						|
archives from slow disk drives or other media
 | 
						|
that can skip quickly.
 | 
						|
.Pp
 | 
						|
The close callback is invoked by archive_close when
 | 
						|
the archive processing is complete.
 | 
						|
The callback should return
 | 
						|
.Cm ARCHIVE_OK
 | 
						|
on success.
 | 
						|
On failure, the callback should invoke
 | 
						|
.Fn archive_set_error
 | 
						|
to register an error code and message and
 | 
						|
return
 | 
						|
.Cm ARCHIVE_FATAL.
 | 
						|
.Sh EXAMPLE
 | 
						|
The following illustrates basic usage of the library.
 | 
						|
In this example,
 | 
						|
the callback functions are simply wrappers around the standard
 | 
						|
.Xr open 2 ,
 | 
						|
.Xr read 2 ,
 | 
						|
and
 | 
						|
.Xr close 2
 | 
						|
system calls.
 | 
						|
.Bd -literal -offset indent
 | 
						|
void
 | 
						|
list_archive(const char *name)
 | 
						|
{
 | 
						|
  struct mydata *mydata;
 | 
						|
  struct archive *a;
 | 
						|
  struct archive_entry *entry;
 | 
						|
 | 
						|
  mydata = malloc(sizeof(struct mydata));
 | 
						|
  a = archive_read_new();
 | 
						|
  mydata->name = name;
 | 
						|
  archive_read_support_compression_all(a);
 | 
						|
  archive_read_support_format_all(a);
 | 
						|
  archive_read_open(a, mydata, myopen, myread, myclose);
 | 
						|
  while (archive_read_next_header(a, &entry) == ARCHIVE_OK) {
 | 
						|
    printf("%s\\n",archive_entry_pathname(entry));
 | 
						|
    archive_read_data_skip(a);
 | 
						|
  }
 | 
						|
  archive_read_finish(a);
 | 
						|
  free(mydata);
 | 
						|
}
 | 
						|
 | 
						|
ssize_t
 | 
						|
myread(struct archive *a, void *client_data, const void **buff)
 | 
						|
{
 | 
						|
  struct mydata *mydata = client_data;
 | 
						|
 | 
						|
  *buff = mydata->buff;
 | 
						|
  return (read(mydata->fd, mydata->buff, 10240));
 | 
						|
}
 | 
						|
 | 
						|
int
 | 
						|
myopen(struct archive *a, void *client_data)
 | 
						|
{
 | 
						|
  struct mydata *mydata = client_data;
 | 
						|
 | 
						|
  mydata->fd = open(mydata->name, O_RDONLY);
 | 
						|
  return (mydata->fd >= 0 ? ARCHIVE_OK : ARCHIVE_FATAL);
 | 
						|
}
 | 
						|
 | 
						|
int
 | 
						|
myclose(struct archive *a, void *client_data)
 | 
						|
{
 | 
						|
  struct mydata *mydata = client_data;
 | 
						|
 | 
						|
  if (mydata->fd > 0)
 | 
						|
    close(mydata->fd);
 | 
						|
  return (ARCHIVE_OK);
 | 
						|
}
 | 
						|
.Ed
 | 
						|
.Sh RETURN VALUES
 | 
						|
Most functions return zero on success, non-zero on error.
 | 
						|
The possible return codes include:
 | 
						|
.Cm ARCHIVE_OK
 | 
						|
(the operation succeeded),
 | 
						|
.Cm ARCHIVE_WARN
 | 
						|
(the operation succeeded but a non-critical error was encountered),
 | 
						|
.Cm ARCHIVE_EOF
 | 
						|
(end-of-archive was encountered),
 | 
						|
.Cm ARCHIVE_RETRY
 | 
						|
(the operation failed but can be retried),
 | 
						|
and
 | 
						|
.Cm ARCHIVE_FATAL
 | 
						|
(there was a fatal error; the archive should be closed immediately).
 | 
						|
Detailed error codes and textual descriptions are available from the
 | 
						|
.Fn archive_errno
 | 
						|
and
 | 
						|
.Fn archive_error_string
 | 
						|
functions.
 | 
						|
.Pp
 | 
						|
.Fn archive_read_new
 | 
						|
returns a pointer to a freshly allocated
 | 
						|
.Tn struct archive
 | 
						|
object.
 | 
						|
It returns
 | 
						|
.Dv NULL
 | 
						|
on error.
 | 
						|
.Pp
 | 
						|
.Fn archive_read_data
 | 
						|
returns a count of bytes actually read or zero at the end of the entry.
 | 
						|
On error, a value of
 | 
						|
.Cm ARCHIVE_FATAL ,
 | 
						|
.Cm ARCHIVE_WARN ,
 | 
						|
or
 | 
						|
.Cm ARCHIVE_RETRY
 | 
						|
is returned and an error code and textual description can be retrieved from the
 | 
						|
.Fn archive_errno
 | 
						|
and
 | 
						|
.Fn archive_error_string
 | 
						|
functions.
 | 
						|
.Pp
 | 
						|
The library expects the client callbacks to behave similarly.
 | 
						|
If there is an error, you can use
 | 
						|
.Fn archive_set_error
 | 
						|
to set an appropriate error code and description,
 | 
						|
then return one of the non-zero values above.
 | 
						|
(Note that the value eventually returned to the client may
 | 
						|
not be the same; many errors that are not critical at the level
 | 
						|
of basic I/O can prevent the archive from being properly read,
 | 
						|
thus most I/O errors eventually cause
 | 
						|
.Cm ARCHIVE_FATAL
 | 
						|
to be returned.)
 | 
						|
.\" .Sh ERRORS
 | 
						|
.Sh SEE ALSO
 | 
						|
.Xr tar 1 ,
 | 
						|
.Xr archive 3 ,
 | 
						|
.Xr archive_util 3 ,
 | 
						|
.Xr tar 5
 | 
						|
.Sh HISTORY
 | 
						|
The
 | 
						|
.Nm libarchive
 | 
						|
library first appeared in
 | 
						|
.Fx 5.3 .
 | 
						|
.Sh AUTHORS
 | 
						|
.An -nosplit
 | 
						|
The
 | 
						|
.Nm libarchive
 | 
						|
library was written by
 | 
						|
.An Tim Kientzle Aq kientzle@acm.org .
 | 
						|
.Sh BUGS
 | 
						|
Many traditional archiver programs treat
 | 
						|
empty files as valid empty archives.
 | 
						|
For example, many implementations of
 | 
						|
.Xr tar 1
 | 
						|
allow you to append entries to an empty file.
 | 
						|
Of course, it is impossible to determine the format of an empty file
 | 
						|
by inspecting the contents, so this library treats empty files as
 | 
						|
having a special
 | 
						|
.Dq empty
 | 
						|
format.
 |