Blame doc/man/archive_entry_linkify.3

Packit Service 1d0348
.TH ARCHIVE_ENTRY_LINKIFY 3 "February 2, 2012" ""
Packit Service 1d0348
.SH NAME
Packit Service 1d0348
.ad l
Packit Service 1d0348
\fB\%archive_entry_linkresolver\fP,
Packit Service 1d0348
\fB\%archive_entry_linkresolver_new\fP,
Packit Service 1d0348
\fB\%archive_entry_linkresolver_set_strategy\fP,
Packit Service 1d0348
\fB\%archive_entry_linkresolver_free\fP,
Packit Service 1d0348
\fB\%archive_entry_linkify\fP
Packit Service 1d0348
\- hardlink resolver functions
Packit Service 1d0348
.SH LIBRARY
Packit Service 1d0348
.ad l
Packit Service 1d0348
Streaming Archive Library (libarchive, -larchive)
Packit Service 1d0348
.SH SYNOPSIS
Packit Service 1d0348
.ad l
Packit Service 1d0348
\fB#include <archive_entry.h>\fP
Packit Service 1d0348
.br
Packit Service 1d0348
\fIstruct archive_entry_linkresolver *\fP
Packit Service 1d0348
.br
Packit Service 1d0348
\fB\%archive_entry_linkresolver_new\fP(\fI\%void\fP);
Packit Service 1d0348
.br
Packit Service 1d0348
\fIvoid\fP
Packit Service 1d0348
.br
Packit Service 1d0348
\fB\%archive_entry_linkresolver_set_strategy\fP(\fI\%struct\ archive_entry_linkresolver\ *resolver\fP, \fI\%int\ format\fP);
Packit Service 1d0348
.br
Packit Service 1d0348
\fIvoid\fP
Packit Service 1d0348
.br
Packit Service 1d0348
\fB\%archive_entry_linkresolver_free\fP(\fI\%struct\ archive_entry_linkresolver\ *resolver\fP);
Packit Service 1d0348
.br
Packit Service 1d0348
\fIvoid\fP
Packit Service 1d0348
.br
Packit Service 1d0348
\fB\%archive_entry_linkify\fP(\fI\%struct\ archive_entry_linkresolver\ *resolver\fP, \fI\%struct\ archive_entry\ **entry\fP, \fI\%struct\ archive_entry\ **sparse\fP);
Packit Service 1d0348
.SH DESCRIPTION
Packit Service 1d0348
.ad l
Packit Service 1d0348
Programs that want to create archives have to deal with hardlinks.
Packit Service 1d0348
Hardlinks are handled in different ways by the archive formats.
Packit Service 1d0348
The basic strategies are:
Packit Service 1d0348
.RS 5
Packit Service 1d0348
.IP 1.
Packit Service 1d0348
Ignore hardlinks and store the body for each reference (old cpio, zip).
Packit Service 1d0348
.IP 2.
Packit Service 1d0348
Store the body the first time an inode is seen (ustar, pax).
Packit Service 1d0348
.IP 3.
Packit Service 1d0348
Store the body the last time an inode is seen (new cpio).
Packit Service 1d0348
.RE
Packit Service 1d0348
.PP
Packit Service 1d0348
The
Packit Service 1d0348
\fB\%archive_entry_linkresolver\fP
Packit Service 1d0348
functions help by providing a unified interface and handling the complexity
Packit Service 1d0348
behind the scene.
Packit Service 1d0348
.PP
Packit Service 1d0348
The
Packit Service 1d0348
\fB\%archive_entry_linkresolver\fP
Packit Service 1d0348
functions assume that
Packit Service 1d0348
Vt archive_entry
Packit Service 1d0348
instances have valid nlinks, inode and device values.
Packit Service 1d0348
The inode and device value is used to match entries.
Packit Service 1d0348
The nlinks value is used to determined if all references have been found and
Packit Service 1d0348
if the internal references can be recycled.
Packit Service 1d0348
.PP
Packit Service 1d0348
The
Packit Service 1d0348
\fB\%archive_entry_linkresolver_new\fP()
Packit Service 1d0348
function allocates a new link resolver.
Packit Service 1d0348
The instance can be freed using
Packit Service 1d0348
\fB\%archive_entry_linkresolver_free\fP().
Packit Service 1d0348
All deferred entries are flushed and the internal storage is freed.
Packit Service 1d0348
.PP
Packit Service 1d0348
The
Packit Service 1d0348
\fB\%archive_entry_linkresolver_set_strategy\fP()
Packit Service 1d0348
function selects the optimal hardlink strategy for the given format.
Packit Service 1d0348
The format code can be obtained from
Packit Service 1d0348
\fBarchive_format\fP(3).
Packit Service 1d0348
The function can be called more than once, but it is recommended to
Packit Service 1d0348
flush all deferred entries first.
Packit Service 1d0348
.PP
Packit Service 1d0348
The
Packit Service 1d0348
\fB\%archive_entry_linkify\fP()
Packit Service 1d0348
function is the core of
Packit Service 1d0348
\fB\%archive_entry_linkresolver\fP.
Packit Service 1d0348
The
Packit Service 1d0348
\fB\%entry\fP()
Packit Service 1d0348
argument points to the
Packit Service 1d0348
Vt archive_entry
Packit Service 1d0348
that should be written.
Packit Service 1d0348
Depending on the strategy one of the following actions is taken:
Packit Service 1d0348
.RS 5
Packit Service 1d0348
.IP 1.
Packit Service 1d0348
For the simple archive formats
Packit Service 1d0348
\fI*entry\fP
Packit Service 1d0348
is left unmodified and
Packit Service 1d0348
\fI*sparse\fP
Packit Service 1d0348
is set to
Packit Service 1d0348
.BR NULL.
Packit Service 1d0348
.IP 2.
Packit Service 1d0348
For tar like archive formats,
Packit Service 1d0348
\fI*sparse\fP
Packit Service 1d0348
is set to
Packit Service 1d0348
.BR NULL.
Packit Service 1d0348
If
Packit Service 1d0348
\fI*entry\fP
Packit Service 1d0348
is
Packit Service 1d0348
.BR NULL,
Packit Service 1d0348
no action is taken.
Packit Service 1d0348
If the hardlink count of
Packit Service 1d0348
\fI*entry\fP
Packit Service 1d0348
is larger than 1 and the file type is a regular file or symbolic link,
Packit Service 1d0348
the internal list is searched for a matching inode.
Packit Service 1d0348
If such an inode is found, the link count is decremented and the file size
Packit Service 1d0348
of
Packit Service 1d0348
\fI*entry\fP
Packit Service 1d0348
is set to 0 to notify that no body should be written.
Packit Service 1d0348
If no such inode is found, a copy of the entry is added to the internal cache
Packit Service 1d0348
with a link count reduced by one.
Packit Service 1d0348
.IP 3.
Packit Service 1d0348
For new cpio like archive formats a value for
Packit Service 1d0348
\fI*entry\fP
Packit Service 1d0348
of
Packit Service 1d0348
.BR NULL
Packit Service 1d0348
is used to flush deferred entries.
Packit Service 1d0348
In that case
Packit Service 1d0348
\fI*entry\fP
Packit Service 1d0348
is set to an arbitrary deferred entry and the entry itself is removed from the
Packit Service 1d0348
internal list.
Packit Service 1d0348
If the internal list is empty,
Packit Service 1d0348
\fI*entry\fP
Packit Service 1d0348
is set to
Packit Service 1d0348
.BR NULL.
Packit Service 1d0348
In either case,
Packit Service 1d0348
\fI*sparse\fP
Packit Service 1d0348
is set to
Packit Service 1d0348
.BR NULL
Packit Service 1d0348
and the function returns.
Packit Service 1d0348
If the hardlink count of
Packit Service 1d0348
\fI*entry\fP
Packit Service 1d0348
is one or the file type is a directory or device,
Packit Service 1d0348
\fI*sparse\fP
Packit Service 1d0348
is set to
Packit Service 1d0348
.BR NULL
Packit Service 1d0348
and no further action is taken.
Packit Service 1d0348
Otherwise, the internal list is searched for a matching inode.
Packit Service 1d0348
If such an inode is not found, the entry is added to the internal list,
Packit Service 1d0348
both
Packit Service 1d0348
\fI*entry\fP
Packit Service 1d0348
and
Packit Service 1d0348
\fI*sparse\fP
Packit Service 1d0348
are set to
Packit Service 1d0348
.BR NULL
Packit Service 1d0348
and the function returns.
Packit Service 1d0348
If such an inode is found, the link count is decremented.
Packit Service 1d0348
If it remains larger than one, the existing entry on the internal list
Packit Service 1d0348
is swapped with
Packit Service 1d0348
\fI*entry\fP
Packit Service 1d0348
after retaining the link count.
Packit Service 1d0348
The existing entry is returned in
Packit Service 1d0348
\fI*entry\fP.
Packit Service 1d0348
If the link count reached one, the new entry is also removed from the
Packit Service 1d0348
internal list and returned in
Packit Service 1d0348
\fI*sparse\fP.
Packit Service 1d0348
Otherwise
Packit Service 1d0348
\fI*sparse\fP
Packit Service 1d0348
is set to
Packit Service 1d0348
.BR NULL.
Packit Service 1d0348
.RE
Packit Service 1d0348
.PP
Packit Service 1d0348
The general usage is therefore:
Packit Service 1d0348
.RS 5
Packit Service 1d0348
.IP 1.
Packit Service 1d0348
For each new archive entry, call
Packit Service 1d0348
\fB\%archive_entry_linkify\fP().
Packit Service 1d0348
.IP 2.
Packit Service 1d0348
Keep in mind that the entries returned may have a size of 0 now.
Packit Service 1d0348
.IP 3.
Packit Service 1d0348
If
Packit Service 1d0348
\fI*entry\fP
Packit Service 1d0348
is not
Packit Service 1d0348
.BR NULL,
Packit Service 1d0348
archive it.
Packit Service 1d0348
.IP 4.
Packit Service 1d0348
If
Packit Service 1d0348
\fI*sparse\fP
Packit Service 1d0348
is not
Packit Service 1d0348
.BR NULL,
Packit Service 1d0348
archive it.
Packit Service 1d0348
.IP 5.
Packit Service 1d0348
After all entries have been written to disk, call
Packit Service 1d0348
\fB\%archive_entry_linkify\fP()
Packit Service 1d0348
with
Packit Service 1d0348
\fI*entry\fP
Packit Service 1d0348
set to
Packit Service 1d0348
.BR NULL
Packit Service 1d0348
and archive the returned entry as long as it is not
Packit Service 1d0348
.BR NULL.
Packit Service 1d0348
.RE
Packit Service 1d0348
.SH RETURN VALUES
Packit Service 1d0348
.ad l
Packit Service 1d0348
\fB\%archive_entry_linkresolver_new\fP()
Packit Service 1d0348
returns
Packit Service 1d0348
.BR NULL
Packit Service 1d0348
on
Packit Service 1d0348
\fBmalloc\fP(3)
Packit Service 1d0348
failures.
Packit Service 1d0348
.SH SEE ALSO
Packit Service 1d0348
.ad l
Packit Service 1d0348
\fBarchive_entry\fP(3)