Blame doc/text/archive_write.3.txt

Packit Service 1d0348
ARCHIVE_WRITE(3)	 BSD Library Functions Manual	      ARCHIVE_WRITE(3)
Packit Service 1d0348
Packit Service 1d0348
NAME
Packit Service 1d0348
     archive_write — functions for creating archives
Packit Service 1d0348
Packit Service 1d0348
LIBRARY
Packit Service 1d0348
     Streaming Archive Library (libarchive, -larchive)
Packit Service 1d0348
Packit Service 1d0348
SYNOPSIS
Packit Service 1d0348
     #include <archive.h>
Packit Service 1d0348
Packit Service 1d0348
DESCRIPTION
Packit Service 1d0348
     These functions provide a complete API for creating streaming archive
Packit Service 1d0348
     files.  The general process is to first create the struct archive object,
Packit Service 1d0348
     set any desired options, initialize the archive, append entries, then
Packit Service 1d0348
     close the archive and release all resources.
Packit Service 1d0348
Packit Service 1d0348
   Create archive object
Packit Service 1d0348
     See archive_write_new(3).
Packit Service 1d0348
Packit Service 1d0348
     To write an archive, you must first obtain an initialized struct archive
Packit Service 1d0348
     object from archive_write_new().
Packit Service 1d0348
Packit Service 1d0348
   Enable filters and formats, configure block size and padding
Packit Service 1d0348
     See archive_write_filter(3), archive_write_format(3) and
Packit Service 1d0348
     archive_write_blocksize(3).
Packit Service 1d0348
Packit Service 1d0348
     You can then modify this object for the desired operations with the vari‐
Packit Service 1d0348
     ous archive_write_set_XXX() functions.  In particular, you will need to
Packit Service 1d0348
     invoke appropriate archive_write_add_XXX() and archive_write_set_XXX()
Packit Service 1d0348
     functions to enable the corresponding compression and format support.
Packit Service 1d0348
Packit Service 1d0348
   Set options
Packit Service 1d0348
     See archive_write_set_options(3).
Packit Service 1d0348
Packit Service 1d0348
   Open archive
Packit Service 1d0348
     See archive_write_open(3).
Packit Service 1d0348
Packit Service 1d0348
     Once you have prepared the struct archive object, you call
Packit Service 1d0348
     archive_write_open() to actually open the archive and prepare it for
Packit Service 1d0348
     writing.  There are several variants of this function; the most basic
Packit Service 1d0348
     expects you to provide pointers to several functions that can provide
Packit Service 1d0348
     blocks of bytes from the archive.	There are convenience forms that allow
Packit Service 1d0348
     you to specify a filename, file descriptor, FILE * object, or a block of
Packit Service 1d0348
     memory from which to write the archive data.
Packit Service 1d0348
Packit Service 1d0348
   Produce archive
Packit Service 1d0348
     See archive_write_header(3) and archive_write_data(3).
Packit Service 1d0348
Packit Service 1d0348
     Individual archive entries are written in a three-step process: You first
Packit Service 1d0348
     initialize a struct archive_entry structure with information about the
Packit Service 1d0348
     new entry.  At a minimum, you should set the pathname of the entry and
Packit Service 1d0348
     provide a struct stat with a valid st_mode field, which specifies the
Packit Service 1d0348
     type of object and st_size field, which specifies the size of the data
Packit Service 1d0348
     portion of the object.
Packit Service 1d0348
Packit Service 1d0348
   Release resources
Packit Service 1d0348
     See archive_write_free(3).
Packit Service 1d0348
Packit Service 1d0348
     After all entries have been written, use the archive_write_free() func‐
Packit Service 1d0348
     tion to release all resources.
Packit Service 1d0348
Packit Service 1d0348
EXAMPLE
Packit Service 1d0348
     The following sketch illustrates basic usage of the library.  In this
Packit Service 1d0348
     example, the callback functions are simply wrappers around the standard
Packit Service 1d0348
     open(2), write(2), and close(2) system calls.
Packit Service 1d0348
Packit Service 1d0348
	   #ifdef __linux__
Packit Service 1d0348
	   #define _FILE_OFFSET_BITS 64
Packit Service 1d0348
	   #endif
Packit Service 1d0348
	   #include <sys/stat.h>
Packit Service 1d0348
	   #include <archive.h>
Packit Service 1d0348
	   #include <archive_entry.h>
Packit Service 1d0348
	   #include <fcntl.h>
Packit Service 1d0348
	   #include <stdlib.h>
Packit Service 1d0348
	   #include <unistd.h>
Packit Service 1d0348
Packit Service 1d0348
	   struct mydata {
Packit Service 1d0348
	     const char *name;
Packit Service 1d0348
	     int fd;
Packit Service 1d0348
	   };
Packit Service 1d0348
Packit Service 1d0348
	   int
Packit Service 1d0348
	   myopen(struct archive *a, void *client_data)
Packit Service 1d0348
	   {
Packit Service 1d0348
	     struct mydata *mydata = client_data;
Packit Service 1d0348
Packit Service 1d0348
	     mydata->fd = open(mydata->name, O_WRONLY | O_CREAT, 0644);
Packit Service 1d0348
	     if (mydata->fd >= 0)
Packit Service 1d0348
	       return (ARCHIVE_OK);
Packit Service 1d0348
	     else
Packit Service 1d0348
	       return (ARCHIVE_FATAL);
Packit Service 1d0348
	   }
Packit Service 1d0348
Packit Service 1d0348
	   la_ssize_t
Packit Service 1d0348
	   mywrite(struct archive *a, void *client_data, const void *buff, size_t n)
Packit Service 1d0348
	   {
Packit Service 1d0348
	     struct mydata *mydata = client_data;
Packit Service 1d0348
Packit Service 1d0348
	     return (write(mydata->fd, buff, n));
Packit Service 1d0348
	   }
Packit Service 1d0348
Packit Service 1d0348
	   int
Packit Service 1d0348
	   myclose(struct archive *a, void *client_data)
Packit Service 1d0348
	   {
Packit Service 1d0348
	     struct mydata *mydata = client_data;
Packit Service 1d0348
Packit Service 1d0348
	     if (mydata->fd > 0)
Packit Service 1d0348
	       close(mydata->fd);
Packit Service 1d0348
	     return (0);
Packit Service 1d0348
	   }
Packit Service 1d0348
Packit Service 1d0348
	   void
Packit Service 1d0348
	   write_archive(const char *outname, const char **filename)
Packit Service 1d0348
	   {
Packit Service 1d0348
	     struct mydata *mydata = malloc(sizeof(struct mydata));
Packit Service 1d0348
	     struct archive *a;
Packit Service 1d0348
	     struct archive_entry *entry;
Packit Service 1d0348
	     struct stat st;
Packit Service 1d0348
	     char buff[8192];
Packit Service 1d0348
	     int len;
Packit Service 1d0348
	     int fd;
Packit Service 1d0348
Packit Service 1d0348
	     a = archive_write_new();
Packit Service 1d0348
	     mydata->name = outname;
Packit Service 1d0348
	     /* Set archive format and filter according to output file extension.
Packit Service 1d0348
	      * If it fails, set default format. Platform depended function.
Packit Service 1d0348
	      * See supported formats in archive_write_set_format_filter_by_ext.c */
Packit Service 1d0348
	     if (archive_write_set_format_filter_by_ext(a, outname) != ARCHIVE_OK)  {
Packit Service 1d0348
	       archive_write_add_filter_gzip(a);
Packit Service 1d0348
	       archive_write_set_format_ustar(a);
Packit Service 1d0348
	     }
Packit Service 1d0348
	     archive_write_open(a, mydata, myopen, mywrite, myclose);
Packit Service 1d0348
	     while (*filename) {
Packit Service 1d0348
	       stat(*filename, &st);
Packit Service 1d0348
	       entry = archive_entry_new();
Packit Service 1d0348
	       archive_entry_copy_stat(entry, &st);
Packit Service 1d0348
	       archive_entry_set_pathname(entry, *filename);
Packit Service 1d0348
	       archive_write_header(a, entry);
Packit Service 1d0348
	       if ((fd = open(*filename, O_RDONLY)) != -1) {
Packit Service 1d0348
		 len = read(fd, buff, sizeof(buff));
Packit Service 1d0348
		 while (len > 0) {
Packit Service 1d0348
		   archive_write_data(a, buff, len);
Packit Service 1d0348
		   len = read(fd, buff, sizeof(buff));
Packit Service 1d0348
		 }
Packit Service 1d0348
		 close(fd);
Packit Service 1d0348
	       }
Packit Service 1d0348
	       archive_entry_free(entry);
Packit Service 1d0348
	       filename++;
Packit Service 1d0348
	     }
Packit Service 1d0348
	     archive_write_free(a);
Packit Service 1d0348
	   }
Packit Service 1d0348
Packit Service 1d0348
	   int main(int argc, const char **argv)
Packit Service 1d0348
	   {
Packit Service 1d0348
	     const char *outname;
Packit Service 1d0348
	     argv++;
Packit Service 1d0348
	     outname = *argv++;
Packit Service 1d0348
	     write_archive(outname, argv);
Packit Service 1d0348
	     return 0;
Packit Service 1d0348
	   }
Packit Service 1d0348
Packit Service 1d0348
SEE ALSO
Packit Service 1d0348
     tar(1), libarchive(3), archive_write_set_options(3), cpio(5), mtree(5),
Packit Service 1d0348
     tar(5)
Packit Service 1d0348
Packit Service 1d0348
HISTORY
Packit Service 1d0348
     The libarchive library first appeared in FreeBSD 5.3.
Packit Service 1d0348
Packit Service 1d0348
AUTHORS
Packit Service 1d0348
     The libarchive library was written by Tim Kientzle <kientzle@acm.org>.
Packit Service 1d0348
Packit Service 1d0348
BUGS
Packit Service 1d0348
     There are many peculiar bugs in historic tar implementations that may
Packit Service 1d0348
     cause certain programs to reject archives written by this library.  For
Packit Service 1d0348
     example, several historic implementations calculated header checksums
Packit Service 1d0348
     incorrectly and will thus reject valid archives; GNU tar does not fully
Packit Service 1d0348
     support pax interchange format; some old tar implementations required
Packit Service 1d0348
     specific field terminations.
Packit Service 1d0348
Packit Service 1d0348
     The default pax interchange format eliminates most of the historic tar
Packit Service 1d0348
     limitations and provides a generic key/value attribute facility for ven‐
Packit Service 1d0348
     dor-defined extensions.  One oversight in POSIX is the failure to provide
Packit Service 1d0348
     a standard attribute for large device numbers.  This library uses
Packit Service 1d0348
     “SCHILY.devminor” and “SCHILY.devmajor” for device numbers that exceed
Packit Service 1d0348
     the range supported by the backwards-compatible ustar header.  These keys
Packit Service 1d0348
     are compatible with Joerg Schilling's star archiver.  Other implementa‐
Packit Service 1d0348
     tions may not recognize these keys and will thus be unable to correctly
Packit Service 1d0348
     restore device nodes with large device numbers from archives created by
Packit Service 1d0348
     this library.
Packit Service 1d0348
Packit Service 1d0348
BSD			       February 2, 2012 			   BSD