diff options
Diffstat (limited to 'Utilities/cmlibarchive/libarchive/o2')
-rw-r--r-- | Utilities/cmlibarchive/libarchive/o2 | 483 |
1 files changed, 483 insertions, 0 deletions
diff --git a/Utilities/cmlibarchive/libarchive/o2 b/Utilities/cmlibarchive/libarchive/o2 new file mode 100644 index 0000000..580c9c3 --- /dev/null +++ b/Utilities/cmlibarchive/libarchive/o2 @@ -0,0 +1,483 @@ +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 <kientzle@acm.org>. + +[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 |