| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483 |
- archive_write(3) BSD Library Functions Manual archive_write(3)
- [1mNAME[0m
- [1marchive_write_new[22m, [1marchive_write_set_format_cpio[22m,
- [1marchive_write_set_format_pax[22m, [1marchive_write_set_format_pax_restricted[22m,
- [1marchive_write_set_format_shar[22m, [1marchive_write_set_format_shar_binary[22m,
- [1marchive_write_set_format_ustar[22m, [1marchive_write_get_bytes_per_block[22m,
- [1marchive_write_set_bytes_per_block[22m, [1marchive_write_set_bytes_in_last_block[22m,
- [1marchive_write_set_compression_bzip2[22m,
- [1marchive_write_set_compression_compress[22m,
- [1marchive_write_set_compression_gzip[22m, [1marchive_write_set_compression_none[22m,
- [1marchive_write_set_compression_program[22m,
- [1marchive_write_set_compressor_options[22m, [1marchive_write_set_format_options[22m,
- [1marchive_write_set_options[22m, [1marchive_write_open[22m, [1marchive_write_open_fd[22m,
- [1marchive_write_open_FILE[22m, [1marchive_write_open_filename[22m,
- [1marchive_write_open_memory[22m, [1marchive_write_header[22m, [1marchive_write_data[22m,
- [1marchive_write_finish_entry[22m, [1marchive_write_close[22m, [1marchive_write_finish [22m--
- functions for creating archives
- [1mSYNOPSIS[0m
- [1m#include <archive.h>[0m
- [4mstruct[24m [4marchive[24m [4m*[0m
- [1marchive_write_new[22m([4mvoid[24m);
- [4mint[0m
- [1marchive_write_get_bytes_per_block[22m([4mstruct[24m [4marchive[24m [4m*[24m);
- [4mint[0m
- [1marchive_write_set_bytes_per_block[22m([4mstruct[24m [4marchive[24m [4m*[24m, [4mint[24m [4mbytes_per_block[24m);
- [4mint[0m
- [1marchive_write_set_bytes_in_last_block[22m([4mstruct[24m [4marchive[24m [4m*[24m, [4mint[24m);
- [4mint[0m
- [1marchive_write_set_compression_bzip2[22m([4mstruct[24m [4marchive[24m [4m*[24m);
- [4mint[0m
- [1marchive_write_set_compression_compress[22m([4mstruct[24m [4marchive[24m [4m*[24m);
- [4mint[0m
- [1marchive_write_set_compression_gzip[22m([4mstruct[24m [4marchive[24m [4m*[24m);
- [4mint[0m
- [1marchive_write_set_compression_none[22m([4mstruct[24m [4marchive[24m [4m*[24m);
- [4mint[0m
- [1marchive_write_set_compression_program[22m([4mstruct[24m [4marchive[24m [4m*[24m,
- [4mconst[24m [4mchar[24m [4m*[24m [4mcmd[24m);
- [4mint[0m
- [1marchive_write_set_format_cpio[22m([4mstruct[24m [4marchive[24m [4m*[24m);
- [4mint[0m
- [1marchive_write_set_format_pax[22m([4mstruct[24m [4marchive[24m [4m*[24m);
- [4mint[0m
- [1marchive_write_set_format_pax_restricted[22m([4mstruct[24m [4marchive[24m [4m*[24m);
- [4mint[0m
- [1marchive_write_set_format_shar[22m([4mstruct[24m [4marchive[24m [4m*[24m);
- [4mint[0m
- [1marchive_write_set_format_shar_binary[22m([4mstruct[24m [4marchive[24m [4m*[24m);
- [4mint[0m
- [1marchive_write_set_format_ustar[22m([4mstruct[24m [4marchive[24m [4m*[24m);
- [4mint[0m
- [1marchive_write_set_format_options[22m([4mstruct[24m [4marchive[24m [4m*[24m, [4mconst[24m [4mchar[24m [4m*[24m);
- [4mint[0m
- [1marchive_write_set_compressor_options[22m([4mstruct[24m [4marchive[24m [4m*[24m, [4mconst[24m [4mchar[24m [4m*[24m);
- [4mint[0m
- [1marchive_write_set_options[22m([4mstruct[24m [4marchive[24m [4m*[24m, [4mconst[24m [4mchar[24m [4m*[24m);
- [4mint[0m
- [1marchive_write_open[22m([4mstruct[24m [4marchive[24m [4m*[24m, [4mvoid[24m [4m*client_data[24m,
- [4marchive_open_callback[24m [4m*[24m, [4marchive_write_callback[24m [4m*[24m,
- [4marchive_close_callback[24m [4m*[24m);
- [4mint[0m
- [1marchive_write_open_fd[22m([4mstruct[24m [4marchive[24m [4m*[24m, [4mint[24m [4mfd[24m);
- [4mint[0m
- [1marchive_write_open_FILE[22m([4mstruct[24m [4marchive[24m [4m*[24m, [4mFILE[24m [4m*file[24m);
- [4mint[0m
- [1marchive_write_open_filename[22m([4mstruct[24m [4marchive[24m [4m*[24m, [4mconst[24m [4mchar[24m [4m*filename[24m);
- [4mint[0m
- [1marchive_write_open_memory[22m([4mstruct[24m [4marchive[24m [4m*[24m, [4mvoid[24m [4m*buffer[24m,
- [4msize_t[24m [4mbufferSize[24m, [4msize_t[24m [4m*outUsed[24m);
- [4mint[0m
- [1marchive_write_header[22m([4mstruct[24m [4marchive[24m [4m*[24m, [4mstruct[24m [4marchive_entry[24m [4m*[24m);
- [4mssize_t[0m
- [1marchive_write_data[22m([4mstruct[24m [4marchive[24m [4m*[24m, [4mconst[24m [4mvoid[24m [4m*[24m, [4msize_t[24m);
- [4mint[0m
- [1marchive_write_finish_entry[22m([4mstruct[24m [4marchive[24m [4m*[24m);
- [4mint[0m
- [1marchive_write_close[22m([4mstruct[24m [4marchive[24m [4m*[24m);
- [4mint[0m
- [1marchive_write_finish[22m([4mstruct[24m [4marchive[24m [4m*[24m);
- [1mDESCRIPTION[0m
- These functions provide a complete API for creating streaming archive
- files. The general process is to first create the struct archive object,
- set any desired options, initialize the archive, append entries, then
- close the archive and release all resources. The following summary
- describes the functions in approximately the order they are ordinarily
- used:
- [1marchive_write_new[22m()
- Allocates and initializes a struct archive object suitable for
- writing a tar archive.
- [1marchive_write_set_bytes_per_block[22m()
- Sets the block size used for writing the archive data. Every
- call to the write callback function, except possibly the last
- one, will use this value for the length. The third parameter is
- a boolean that specifies whether or not the final block written
- will be padded to the full block size. If it is zero, the last
- block will not be padded. If it is non-zero, padding will be
- added both before and after compression. The default is to use a
- block size of 10240 bytes and to pad the last block. Note that a
- block size of zero will suppress internal blocking and cause
- writes to be sent directly to the write callback as they occur.
- [1marchive_write_get_bytes_per_block[22m()
- Retrieve the block size to be used for writing. A value of -1
- here indicates that the library should use default values. A
- value of zero indicates that internal blocking is suppressed.
- [1marchive_write_set_bytes_in_last_block[22m()
- Sets the block size used for writing the last block. If this
- value is zero, the last block will be padded to the same size as
- the other blocks. Otherwise, the final block will be padded to a
- multiple of this size. In particular, setting it to 1 will cause
- the final block to not be padded. For compressed output, any
- padding generated by this option is applied only after the com-
- pression. The uncompressed data is always unpadded. The default
- is to pad the last block to the full block size (note that
- [1marchive_write_open_filename[22m() will set this based on the file
- type). Unlike the other ``set'' functions, this function can be
- called after the archive is opened.
- [1marchive_write_get_bytes_in_last_block[22m()
- Retrieve the currently-set value for last block size. A value of
- -1 here indicates that the library should use default values.
- [1marchive_write_set_format_cpio[22m(), [1marchive_write_set_format_pax[22m(),
- [1marchive_write_set_format_pax_restricted[22m(),
- [1marchive_write_set_format_shar[22m(),
- [1marchive_write_set_format_shar_binary[22m(),
- [1marchive_write_set_format_ustar[22m()
- Sets the format that will be used for the archive. The library
- can write POSIX octet-oriented cpio format archives, POSIX-stan-
- dard ``pax interchange'' format archives, traditional ``shar''
- archives, enhanced ``binary'' shar archives that store a variety
- of file attributes and handle binary files, and POSIX-standard
- ``ustar'' archives. The pax interchange format is a backwards-
- compatible tar format that adds key/value attributes to each
- entry and supports arbitrary filenames, linknames, uids, sizes,
- etc. ``Restricted pax interchange format'' is the library
- default; this is the same as pax format, but suppresses the pax
- extended header for most normal files. In most cases, this will
- result in ordinary ustar archives.
- [1marchive_write_set_compression_bzip2[22m(),
- [1marchive_write_set_compression_compress[22m(),
- [1marchive_write_set_compression_gzip[22m(),
- [1marchive_write_set_compression_none[22m()
- The resulting archive will be compressed as specified. Note that
- the compressed output is always properly blocked.
- [1marchive_write_set_compression_program[22m()
- The archive will be fed into the specified compression program.
- The output of that program is blocked and written to the client
- write callbacks.
- [1marchive_write_set_compressor_options[22m(),
- [1marchive_write_set_format_options[22m(), [1marchive_write_set_options[22m()
- Specifies options that will be passed to the currently-enabled
- compressor and/or format writer. The argument is a comma-sepa-
- rated list of individual options. Individual options have one of
- the following forms:
- [4moption=value[0m
- The option/value pair will be provided to every module.
- Modules that do not accept an option with this name will
- ignore it.
- [4moption[24m The option will be provided to every module with a value
- of ``1''.
- [4m!option[0m
- The option will be provided to every module with a NULL
- value.
- [4mmodule:option=value[24m, [4mmodule:option[24m, [4mmodule:!option[0m
- As above, but the corresponding option and value will be
- provided only to modules whose name matches [4mmodule[24m.
- The return value will be [1mARCHIVE_OK [22mif any module accepts the
- option, or [1mARCHIVE_WARN [22mif no module accepted the option, or
- [1mARCHIVE_FATAL [22mif there was a fatal error while attempting to
- process the option.
- The currently supported options are:
- Compressor gzip
- [1mcompression-level[0m
- The value is interpreted as a decimal integer
- specifying the gzip compression level.
- Compressor xz
- [1mcompression-level[0m
- The value is interpreted as a decimal integer
- specifying the compression level.
- Format mtree
- [1mcksum[22m, [1mdevice[22m, [1mflags[22m, [1mgid[22m, [1mgname[22m, [1mindent[22m, [1mlink[22m, [1mmd5[22m,
- [1mmode[22m, [1mnlink[22m, [1mrmd160[22m, [1msha1[22m, [1msha256[22m, [1msha384[22m,
- [1msha512[22m, [1msize[22m, [1mtime[22m, [1muid[22m, [1muname[0m
- Enable a particular keyword in the mtree output.
- Prefix with an exclamation mark to disable the
- corresponding keyword. The default is equivalent
- to ``device, flags, gid, gname, link, mode,
- nlink, size, time, type, uid, uname''.
- [1mall [22mEnables all of the above keywords.
- [1muse-set[0m
- Enables generation of [1m/set [22mlines that specify
- default values for the following files and/or
- directories.
- [1mindent [22mXXX needs explanation XXX
- [1marchive_write_open[22m()
- Freeze the settings, open the archive, and prepare for writing
- entries. This is the most generic form of this function, which
- accepts pointers to three callback functions which will be
- invoked by the compression layer to write the constructed ar-
- chive.
- [1marchive_write_open_fd[22m()
- A convenience form of [1marchive_write_open[22m() that accepts a file
- descriptor. The [1marchive_write_open_fd[22m() function is safe for use
- with tape drives or other block-oriented devices.
- [1marchive_write_open_FILE[22m()
- A convenience form of [1marchive_write_open[22m() that accepts a [4mFILE[24m [4m*[0m
- pointer. Note that [1marchive_write_open_FILE[22m() is not safe for
- writing to tape drives or other devices that require correct
- blocking.
- [1marchive_write_open_file[22m()
- A deprecated synonym for [1marchive_write_open_filename[22m().
- [1marchive_write_open_filename[22m()
- A convenience form of [1marchive_write_open[22m() that accepts a file-
- name. A NULL argument indicates that the output should be writ-
- ten to standard output; an argument of ``-'' will open a file
- with that name. If you have not invoked
- [1marchive_write_set_bytes_in_last_block[22m(), then
- [1marchive_write_open_filename[22m() will adjust the last-block padding
- depending on the file: it will enable padding when writing to
- standard output or to a character or block device node, it will
- disable padding otherwise. You can override this by manually
- invoking [1marchive_write_set_bytes_in_last_block[22m() before calling
- [1marchive_write_open[22m(). The [1marchive_write_open_filename[22m() function
- is safe for use with tape drives or other block-oriented devices.
- [1marchive_write_open_memory[22m()
- A convenience form of [1marchive_write_open[22m() that accepts a pointer
- to a block of memory that will receive the archive. The final
- [4msize_t[24m [4m*[24m argument points to a variable that will be updated after
- each write to reflect how much of the buffer is currently in use.
- You should be careful to ensure that this variable remains allo-
- cated until after the archive is closed.
- [1marchive_write_header[22m()
- Build and write a header using the data in the provided struct
- archive_entry structure. See archive_entry(3) for information on
- creating and populating struct archive_entry objects.
- [1marchive_write_data[22m()
- Write data corresponding to the header just written. Returns
- number of bytes written or -1 on error.
- [1marchive_write_finish_entry[22m()
- Close out the entry just written. In particular, this writes out
- the final padding required by some formats. Ordinarily, clients
- never need to call this, as it is called automatically by
- [1marchive_write_next_header[22m() and [1marchive_write_close[22m() as needed.
- [1marchive_write_close[22m()
- Complete the archive and invoke the close callback.
- [1marchive_write_finish[22m()
- Invokes [1marchive_write_close[22m() if it was not invoked manually,
- then releases all resources. Note that this function was
- declared to return [4mvoid[24m in libarchive 1.x, which made it impossi-
- ble to detect errors when [1marchive_write_close[22m() was invoked
- implicitly from this function. This is corrected beginning with
- libarchive 2.0.
- More information about the [4mstruct[24m [4marchive[24m object and the overall design
- of the library can be found in the libarchive(3) overview.
- [1mIMPLEMENTATION[0m
- Compression support is built-in to libarchive, which uses zlib and bzlib
- to handle gzip and bzip2 compression, respectively.
- [1mCLIENT CALLBACKS[0m
- To use this library, you will need to define and register callback func-
- tions that will be invoked to write data to the resulting archive. These
- functions are registered by calling [1marchive_write_open[22m():
- [4mtypedef[24m [4mint[24m [1marchive_open_callback[22m([4mstruct[24m [4marchive[24m [4m*[24m, [4mvoid[0m
- [4m*client_data[24m)
- The open callback is invoked by [1marchive_write_open[22m(). It should return
- [1mARCHIVE_OK [22mif the underlying file or data source is successfully opened.
- If the open fails, it should call [1marchive_set_error[22m() to register an
- error code and message and return [1mARCHIVE_FATAL[22m.
- [4mtypedef[24m [4mssize_t[24m [1marchive_write_callback[22m([4mstruct[24m [4marchive[24m [4m*[24m,
- [4mvoid[24m [4m*client_data[24m, [4mconst[24m [4mvoid[24m [4m*buffer[24m, [4msize_t[24m [4mlength[24m)
- The write callback is invoked whenever the library needs to write raw
- bytes to the archive. For correct blocking, each call to the write call-
- back function should translate into a single write(2) system call. This
- is especially critical when writing archives to tape drives. On success,
- the write callback should return the number of bytes actually written.
- On error, the callback should invoke [1marchive_set_error[22m() to register an
- error code and message and return -1.
- [4mtypedef[24m [4mint[24m [1marchive_close_callback[22m([4mstruct[24m [4marchive[24m [4m*[24m, [4mvoid[0m
- [4m*client_data[24m)
- The close callback is invoked by archive_close when the archive process-
- ing is complete. The callback should return [1mARCHIVE_OK [22mon success. On
- failure, the callback should invoke [1marchive_set_error[22m() to register an
- error code and message and return [1mARCHIVE_FATAL.[0m
- [1mEXAMPLE[0m
- The following sketch illustrates basic usage of the library. In this
- example, the callback functions are simply wrappers around the standard
- open(2), write(2), and close(2) system calls.
- #include <sys/stat.h>
- #include <archive.h>
- #include <archive_entry.h>
- #include <fcntl.h>
- #include <stdlib.h>
- #include <unistd.h>
- struct mydata {
- const char *name;
- int fd;
- };
- int
- myopen(struct archive *a, void *client_data)
- {
- struct mydata *mydata = client_data;
- mydata->fd = open(mydata->name, O_WRONLY | O_CREAT, 0644);
- if (mydata->fd >= 0)
- return (ARCHIVE_OK);
- else
- return (ARCHIVE_FATAL);
- }
- ssize_t
- mywrite(struct archive *a, void *client_data, const void *buff, size_t n)
- {
- struct mydata *mydata = client_data;
- return (write(mydata->fd, buff, n));
- }
- int
- myclose(struct archive *a, void *client_data)
- {
- struct mydata *mydata = client_data;
- if (mydata->fd > 0)
- close(mydata->fd);
- return (0);
- }
- void
- write_archive(const char *outname, const char **filename)
- {
- struct mydata *mydata = malloc(sizeof(struct mydata));
- struct archive *a;
- struct archive_entry *entry;
- struct stat st;
- char buff[8192];
- int len;
- int fd;
- a = archive_write_new();
- mydata->name = outname;
- archive_write_set_compression_gzip(a);
- archive_write_set_format_ustar(a);
- archive_write_open(a, mydata, myopen, mywrite, myclose);
- while (*filename) {
- stat(*filename, &st);
- entry = archive_entry_new();
- archive_entry_copy_stat(entry, &st);
- archive_entry_set_pathname(entry, *filename);
- archive_write_header(a, entry);
- fd = open(*filename, O_RDONLY);
- len = read(fd, buff, sizeof(buff));
- while ( len > 0 ) {
- archive_write_data(a, buff, len);
- len = read(fd, buff, sizeof(buff));
- }
- archive_entry_free(entry);
- filename++;
- }
- archive_write_finish(a);
- }
- int main(int argc, const char **argv)
- {
- const char *outname;
- argv++;
- outname = argv++;
- write_archive(outname, argv);
- return 0;
- }
- [1mRETURN VALUES[0m
- Most functions return [1mARCHIVE_OK [22m(zero) on success, or one of several
- non-zero error codes for errors. Specific error codes include:
- [1mARCHIVE_RETRY [22mfor operations that might succeed if retried, [1mARCHIVE_WARN[0m
- for unusual conditions that do not prevent further operations, and
- [1mARCHIVE_FATAL [22mfor serious errors that make remaining operations impossi-
- ble. The [1marchive_errno[22m() and [1marchive_error_string[22m() functions can be
- used to retrieve an appropriate error code and a textual error message.
- [1marchive_write_new[22m() returns a pointer to a newly-allocated struct archive
- object.
- [1marchive_write_data[22m() returns a count of the number of bytes actually
- written. On error, -1 is returned and the [1marchive_errno[22m() and
- [1marchive_error_string[22m() functions will return appropriate values. Note
- that if the client-provided write callback function returns a non-zero
- value, that error will be propagated back to the caller through whatever
- API function resulted in that call, which may include
- [1marchive_write_header[22m(), [1marchive_write_data[22m(), [1marchive_write_close[22m(), or
- [1marchive_write_finish[22m(). The client callback can call [1marchive_set_error[22m()
- to provide values that can then be retrieved by [1marchive_errno[22m() and
- [1marchive_error_string[22m().
- [1mSEE ALSO[0m
- tar(1), libarchive(3), tar(5)
- [1mHISTORY[0m
- The [1mlibarchive [22mlibrary first appeared in FreeBSD 5.3.
- [1mAUTHORS[0m
- The [1mlibarchive [22mlibrary was written by Tim Kientzle <[email protected]>.
- [1mBUGS[0m
- There are many peculiar bugs in historic tar implementations that may
- cause certain programs to reject archives written by this library. For
- example, several historic implementations calculated header checksums
- incorrectly and will thus reject valid archives; GNU tar does not fully
- support pax interchange format; some old tar implementations required
- specific field terminations.
- The default pax interchange format eliminates most of the historic tar
- limitations and provides a generic key/value attribute facility for ven-
- dor-defined extensions. One oversight in POSIX is the failure to provide
- a standard attribute for large device numbers. This library uses
- ``SCHILY.devminor'' and ``SCHILY.devmajor'' for device numbers that
- exceed the range supported by the backwards-compatible ustar header.
- These keys are compatible with Joerg Schilling's [1mstar [22marchiver. Other
- implementations may not recognize these keys and will thus be unable to
- correctly restore device nodes with large device numbers from archives
- created by this library.
- BSD May 11, 2008 BSD
|