Blame doc/html/archive_write.3.html

Packit Service 1d0348
Packit Service 1d0348
Packit Service 1d0348
Packit Service 1d0348
"http://www.w3.org/TR/html4/loose.dtd">
Packit Service 1d0348
<html>
Packit Service 1d0348
<head>
Packit Service 1d0348
<meta name="generator" content="groff -Thtml, see www.gnu.org">
Packit Service 1d0348
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
Packit Service 1d0348
<meta name="Content-Style" content="text/css">
Packit Service 1d0348
<style type="text/css">
Packit Service 1d0348
       p       { margin-top: 0; margin-bottom: 0; vertical-align: top }
Packit Service 1d0348
       pre     { margin-top: 0; margin-bottom: 0; vertical-align: top }
Packit Service 1d0348
       table   { margin-top: 0; margin-bottom: 0; vertical-align: top }
Packit Service 1d0348
       h1      { text-align: center }
Packit Service 1d0348
</style>
Packit Service 1d0348
<title></title>
Packit Service 1d0348
</head>
Packit Service 1d0348
<body>
Packit Service 1d0348
Packit Service 1d0348

Packit Service 1d0348
Packit Service 1d0348
Packit Service 1d0348

ARCHIVE_WRITE(3) BSD Library Functions Manual

Packit Service 1d0348
ARCHIVE_WRITE(3)

Packit Service 1d0348
Packit Service 1d0348

NAME

Packit Service 1d0348
Packit Service 1d0348

archive_write

Packit Service 1d0348
functions for creating archives

Packit Service 1d0348
Packit Service 1d0348

LIBRARY

Packit Service 1d0348
Packit Service 1d0348

Streaming Archive Library

Packit Service 1d0348
(libarchive, -larchive)

Packit Service 1d0348
Packit Service 1d0348

SYNOPSIS

Packit Service 1d0348
Packit Service 1d0348

#include

Packit Service 1d0348
<archive.h>

Packit Service 1d0348
Packit Service 1d0348

DESCRIPTION

Packit Service 1d0348
Packit Service 1d0348

These functions provide a

Packit Service 1d0348
complete API for creating streaming archive files. The
Packit Service 1d0348
general process is to first create the struct archive
Packit Service 1d0348
object, set any desired options, initialize the archive,
Packit Service 1d0348
append entries, then close the archive and release all
Packit Service 1d0348
resources.

Packit Service 1d0348
Packit Service 1d0348

Create

Packit Service 1d0348
archive object 
Packit Service 1d0348
See archive_write_new(3).

Packit Service 1d0348
Packit Service 1d0348

To write an

Packit Service 1d0348
archive, you must first obtain an initialized struct archive
Packit Service 1d0348
object from archive_write_new().

Packit Service 1d0348
Packit Service 1d0348

Enable

Packit Service 1d0348
filters and formats, configure block size and padding
Packit Service 1d0348

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

Packit Service 1d0348
modify this object for the desired operations with the
Packit Service 1d0348
various archive_write_set_XXX() functions. In
Packit Service 1d0348
particular, you will need to invoke appropriate
Packit Service 1d0348
archive_write_add_XXX() and
Packit Service 1d0348
archive_write_set_XXX() functions to enable the
Packit Service 1d0348
corresponding compression and format support.

Packit Service 1d0348
Packit Service 1d0348

Set

Packit Service 1d0348
options 
Packit Service 1d0348
See archive_write_set_options(3).

Packit Service 1d0348
Packit Service 1d0348

Open

Packit Service 1d0348
archive 
Packit Service 1d0348
See archive_write_open(3).

Packit Service 1d0348
Packit Service 1d0348

Once you have

Packit Service 1d0348
prepared the struct archive object, you call
Packit Service 1d0348
archive_write_open() to actually open the archive and
Packit Service 1d0348
prepare it for writing. There are several variants of this
Packit Service 1d0348
function; the most basic expects you to provide pointers to
Packit Service 1d0348
several functions that can provide blocks of bytes from the
Packit Service 1d0348
archive. There are convenience forms that allow you to
Packit Service 1d0348
specify a filename, file descriptor, FILE * object,
Packit Service 1d0348
or a block of memory from which to write the archive
Packit Service 1d0348
data.

Packit Service 1d0348
Packit Service 1d0348

Produce

Packit Service 1d0348
archive 
Packit Service 1d0348
See archive_write_header(3) and archive_write_data(3).

Packit Service 1d0348
Packit Service 1d0348

Individual

Packit Service 1d0348
archive entries are written in a three-step process: You
Packit Service 1d0348
first initialize a struct archive_entry structure with
Packit Service 1d0348
information about the new entry. At a minimum, you should
Packit Service 1d0348
set the pathname of the entry and provide a struct
Packit Service 1d0348
stat with a valid st_mode field, which specifies
Packit Service 1d0348
the type of object and st_size field, which specifies
Packit Service 1d0348
the size of the data portion of the object.

Packit Service 1d0348
Packit Service 1d0348

Release

Packit Service 1d0348
resources 
Packit Service 1d0348
See archive_write_free(3).

Packit Service 1d0348
Packit Service 1d0348

After all

Packit Service 1d0348
entries have been written, use the
Packit Service 1d0348
archive_write_free() function to release all
Packit Service 1d0348
resources.

Packit Service 1d0348
Packit Service 1d0348

EXAMPLE

Packit Service 1d0348
Packit Service 1d0348

The following sketch illustrates

Packit Service 1d0348
basic usage of the library. In this example, the callback
Packit Service 1d0348
functions are simply wrappers around the standard open(2),
Packit Service 1d0348
write(2), and close(2) system calls.

Packit Service 1d0348
Packit Service 1d0348

#ifdef

Packit Service 1d0348
__linux__

Packit Service 1d0348
Packit Service 1d0348
Packit Service 1d0348
       cellspacing="0" cellpadding="0">
Packit Service 1d0348
Packit Service 1d0348
Packit Service 1d0348
Packit Service 1d0348
Packit Service 1d0348
Packit Service 1d0348

#define

Packit Service 1d0348
Packit Service 1d0348
Packit Service 1d0348
Packit Service 1d0348

_FILE_OFFSET_BITS 64

Packit Service 1d0348
Packit Service 1d0348
Packit Service 1d0348
Packit Service 1d0348
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

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 =

Packit Service 1d0348
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
Packit Service 1d0348
*buff, size_t n) 
Packit Service 1d0348
{ 
Packit Service 1d0348
struct mydata *mydata = client_data;

Packit Service 1d0348
Packit Service 1d0348

return

Packit Service 1d0348
(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

Packit Service 1d0348
(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
{ 
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 =

Packit Service 1d0348
archive_write_new(); 
Packit Service 1d0348
mydata->name = outname; 
Packit Service 1d0348
/* Set archive format and filter according to output file
Packit Service 1d0348
extension. 
Packit Service 1d0348
* If it fails, set default format. Platform depended
Packit Service 1d0348
function. 
Packit Service 1d0348
* See supported formats in
Packit Service 1d0348
archive_write_set_format_filter_by_ext.c */ 
Packit Service 1d0348
if (archive_write_set_format_filter_by_ext(a, outname) !=
Packit Service 1d0348
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

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

Packit Service 1d0348
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
Packit Service 1d0348

tar(1), libarchive(3),

Packit Service 1d0348
archive_write_set_options(3), cpio(5), mtree(5), tar(5)

Packit Service 1d0348
Packit Service 1d0348

HISTORY

Packit Service 1d0348
Packit Service 1d0348

The libarchive library

Packit Service 1d0348
first appeared in FreeBSD 5.3.

Packit Service 1d0348
Packit Service 1d0348

AUTHORS

Packit Service 1d0348
Packit Service 1d0348

The libarchive library

Packit Service 1d0348
was written by Tim Kientzle <kientzle@acm.org>.

Packit Service 1d0348
Packit Service 1d0348

BUGS

Packit Service 1d0348
Packit Service 1d0348

There are many peculiar bugs in

Packit Service 1d0348
historic tar implementations that may cause certain programs
Packit Service 1d0348
to reject archives written by this library. For example,
Packit Service 1d0348
several historic implementations calculated header checksums
Packit Service 1d0348
incorrectly and will thus reject valid archives; GNU tar
Packit Service 1d0348
does not fully support pax interchange format; some old tar
Packit Service 1d0348
implementations required specific field terminations.

Packit Service 1d0348
Packit Service 1d0348

The default pax

Packit Service 1d0348
interchange format eliminates most of the historic tar
Packit Service 1d0348
limitations and provides a generic key/value attribute
Packit Service 1d0348
facility for vendor-defined extensions. One oversight in
Packit Service 1d0348
POSIX is the failure to provide a standard attribute for
Packit Service 1d0348
large device numbers. This library uses
Packit Service 1d0348
’’SCHILY.devminor’’ and
Packit Service 1d0348
’’SCHILY.devmajor’’ for device
Packit Service 1d0348
numbers that exceed the range supported by the
Packit Service 1d0348
backwards-compatible ustar header. These keys are compatible
Packit Service 1d0348
with Joerg Schilling’s star archiver. Other
Packit Service 1d0348
implementations may not recognize these keys and will thus
Packit Service 1d0348
be unable to correctly restore device nodes with large
Packit Service 1d0348
device numbers from archives created by this library.

Packit Service 1d0348
Packit Service 1d0348

BSD

Packit Service 1d0348
February 2, 2012 BSD

Packit Service 1d0348

Packit Service 1d0348
</body>
Packit Service 1d0348
</html>