| .\" 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/libarchive.3,v 1.11 2007/01/09 08:05:56 kientzle Exp $ |
| .\" |
| .Dd August 19, 2006 |
| .Dt LIBARCHIVE 3 |
| .Os |
| .Sh NAME |
| .Nm libarchive |
| .Nd functions for reading and writing streaming archives |
| .Sh LIBRARY |
| .Lb libarchive |
| .Sh OVERVIEW |
| The |
| .Nm |
| library provides a flexible interface for reading and writing |
| streaming archive files such as tar and cpio. |
| The library is inherently stream-oriented; readers serially iterate through |
| the archive, writers serially add things to the archive. |
| In particular, note that there is no built-in support for |
| random access nor for in-place modification. |
| .Pp |
| When reading an archive, the library automatically detects the |
| format and the compression. |
| The library currently has read support for: |
| .Bl -bullet -compact |
| .It |
| old-style tar archives, |
| .It |
| most variants of the POSIX |
| .Dq ustar |
| format, |
| .It |
| the POSIX |
| .Dq pax interchange |
| format, |
| .It |
| GNU-format tar archives, |
| .It |
| most common cpio archive formats, |
| .It |
| ISO9660 CD images (with or without RockRidge extensions), |
| .It |
| Zip archives. |
| .El |
| The library automatically detects archives compressed with |
| .Xr gzip 1 , |
| .Xr bzip2 1 , |
| or |
| .Xr compress 1 |
| and decompresses them transparently. |
| .Pp |
| When writing an archive, you can specify the compression |
| to be used and the format to use. |
| The library can write |
| .Bl -bullet -compact |
| .It |
| POSIX-standard |
| .Dq ustar |
| archives, |
| .It |
| POSIX |
| .Dq pax interchange format |
| archives, |
| .It |
| POSIX octet-oriented cpio archives, |
| .It |
| two different variants of shar archives. |
| .El |
| Pax interchange format is an extension of the tar archive format that |
| eliminates essentially all of the limitations of historic tar formats |
| in a standard fashion that is supported |
| by POSIX-compliant |
| .Xr pax 1 |
| implementations on many systems as well as several newer implementations of |
| .Xr tar 1 . |
| Note that the default write format will suppress the pax extended |
| attributes for most entries; explicitly requesting pax format will |
| enable those attributes for all entries. |
| .Pp |
| The read and write APIs are accessed through the |
| .Fn archive_read_XXX |
| functions and the |
| .Fn archive_write_XXX |
| functions, respectively, and either can be used independently |
| of the other. |
| .Pp |
| The rest of this manual page provides an overview of the library |
| operation. |
| More detailed information can be found in the individual manual |
| pages for each API or utility function. |
| .Sh READING AN ARCHIVE |
| To read an archive, you must first obtain an initialized |
| .Tn struct archive |
| object from |
| .Fn archive_read_new . |
| You can then modify this object for the desired operations with the |
| various |
| .Fn archive_read_set_XXX |
| and |
| .Fn archive_read_support_XXX |
| functions. |
| In particular, you will need to invoke appropriate |
| .Fn archive_read_support_XXX |
| functions to enable the corresponding compression and format |
| support. |
| Note that these latter functions perform two distinct operations: |
| they cause the corresponding support code to be linked into your |
| program, and they enable the corresponding auto-detect code. |
| Unless you have specific constraints, you will generally want |
| to invoke |
| .Fn archive_read_support_compression_all |
| and |
| .Fn archive_read_support_format_all |
| to enable auto-detect for all formats and compression types |
| currently supported by the library. |
| .Pp |
| Once you have prepared the |
| .Tn struct archive |
| object, you call |
| .Fn archive_read_open |
| to actually open the archive and prepare it for reading. |
| There are several variants of this function; |
| the most basic expects you to provide pointers to several |
| functions that can provide blocks of bytes from the archive. |
| There are convenience forms that allow you to |
| specify a filename, file descriptor, |
| .Ft "FILE *" |
| object, or a block of memory from which to read the archive data. |
| Note that the core library makes no assumptions about the |
| size of the blocks read; |
| callback functions are free to read whatever block size is |
| most appropriate for the medium. |
| .Pp |
| Each archive entry consists of a header followed by a certain |
| amount of data. |
| You can obtain the next header with |
| .Fn archive_read_next_header , |
| which returns a pointer to an |
| .Tn struct archive_entry |
| structure with information about the current archive element. |
| If the entry is a regular file, then the header will be followed |
| by the file data. |
| You can use |
| .Fn archive_read_data |
| (which works much like the |
| .Xr read 2 |
| system call) |
| to read this data from the archive. |
| You may prefer to use the higher-level |
| .Fn archive_read_data_skip , |
| which reads and discards the data for this entry, |
| .Fn archive_read_data_to_buffer , |
| which reads the data into an in-memory buffer, |
| .Fn archive_read_data_to_file , |
| which copies the data to the provided file descriptor, or |
| .Fn archive_read_extract , |
| which recreates the specified entry on disk and copies data |
| from the archive. |
| In particular, note that |
| .Fn archive_read_extract |
| uses the |
| .Tn struct archive_entry |
| structure that you provide it, which may differ from the |
| entry just read from the archive. |
| In particular, many applications will want to override the |
| pathname, file permissions, or ownership. |
| .Pp |
| Once you have finished reading data from the archive, you |
| should call |
| .Fn archive_read_close |
| to close the archive, then call |
| .Fn archive_read_finish |
| to release all resources, including all memory allocated by the library. |
| .Pp |
| The |
| .Xr archive_read 3 |
| manual page provides more detailed calling information for this API. |
| .Sh WRITING AN ARCHIVE |
| You use a similar process to write an archive. |
| The |
| .Fn archive_write_new |
| function creates an archive object useful for writing, |
| the various |
| .Fn archive_write_set_XXX |
| functions are used to set parameters for writing the archive, and |
| .Fn archive_write_open |
| completes the setup and opens the archive for writing. |
| .Pp |
| Individual archive entries are written in a three-step |
| process: |
| You first initialize a |
| .Tn struct archive_entry |
| structure with information about the new entry. |
| At a minimum, you should set the pathname of the |
| entry and provide a |
| .Va struct stat |
| with a valid |
| .Va st_mode |
| field, which specifies the type of object and |
| .Va st_size |
| field, which specifies the size of the data portion of the object. |
| The |
| .Fn archive_write_header |
| function actually writes the header data to the archive. |
| You can then use |
| .Fn archive_write_data |
| to write the actual data. |
| .Pp |
| After all entries have been written, use the |
| .Fn archive_write_finish |
| function to release all resources. |
| .Pp |
| The |
| .Xr archive_write 3 |
| manual page provides more detailed calling information for this API. |
| .Sh DESCRIPTION |
| Detailed descriptions of each function are provided by the |
| corresponding manual pages. |
| .Pp |
| All of the functions utilize an opaque |
| .Tn struct archive |
| datatype that provides access to the archive contents. |
| .Pp |
| The |
| .Tn struct archive_entry |
| structure contains a complete description of a single archive |
| entry. |
| It uses an opaque interface that is fully documented in |
| .Xr archive_entry 3 . |
| .Pp |
| Users familiar with historic formats should be aware that the newer |
| variants have eliminated most restrictions on the length of textual fields. |
| Clients should not assume that filenames, link names, user names, or |
| group names are limited in length. |
| In particular, pax interchange format can easily accommodate pathnames |
| in arbitrary character sets that exceed |
| .Va PATH_MAX . |
| .Sh RETURN VALUES |
| Most functions return zero on success, non-zero on error. |
| The return value indicates the general severity of the error, ranging |
| from |
| .Cm ARCHIVE_WARN , |
| which indicates a minor problem that should probably be reported |
| to the user, to |
| .Cm ARCHIVE_FATAL , |
| which indicates a serious problem that will prevent any further |
| operations on this archive. |
| On error, the |
| .Fn archive_errno |
| function can be used to retrieve a numeric error code (see |
| .Xr errno 2 ) . |
| The |
| .Fn archive_error_string |
| returns a textual error message suitable for display. |
| .Pp |
| .Fn archive_read_new |
| and |
| .Fn archive_write_new |
| return pointers to an allocated and initialized |
| .Tn struct archive |
| object. |
| .Pp |
| .Fn archive_read_data |
| and |
| .Fn archive_write_data |
| return a count of the number of bytes actually read or written. |
| A value of zero indicates the end of the data for this entry. |
| A negative value indicates an error, in which case the |
| .Fn archive_errno |
| and |
| .Fn archive_error_string |
| functions can be used to obtain more information. |
| .Sh ENVIRONMENT |
| There are character set conversions within the |
| .Xr archive_entry 3 |
| functions that are impacted by the currently-selected locale. |
| .Sh SEE ALSO |
| .Xr tar 1 , |
| .Xr archive_entry 3 , |
| .Xr archive_read 3 , |
| .Xr archive_util 3 , |
| .Xr archive_write 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 |
| Some archive formats support information that is not supported by |
| .Tn struct archive_entry . |
| Such information cannot be fully archived or restored using this library. |
| This includes, for example, comments, character sets, |
| or the arbitrary key/value pairs that can appear in |
| pax interchange format archives. |
| .Pp |
| Conversely, of course, not all of the information that can be |
| stored in an |
| .Tn struct archive_entry |
| is supported by all formats. |
| For example, cpio formats do not support nanosecond timestamps; |
| old tar formats do not support large device numbers. |