Blame doc/html/archive_entry_linkify.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_ENTRY_LINKIFY(3) BSD Library Functions Manual

Packit Service 1d0348
ARCHIVE_ENTRY_LINKIFY(3)

Packit Service 1d0348
Packit Service 1d0348

NAME

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

archive_entry_linkresolver,

Packit Service 1d0348
archive_entry_linkresolver_new,
Packit Service 1d0348
archive_entry_linkresolver_set_strategy,
Packit Service 1d0348
archive_entry_linkresolver_free,
Packit Service 1d0348
archive_entry_linkify — hardlink resolver
Packit Service 1d0348
functions

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_entry.h>

Packit Service 1d0348
Packit Service 1d0348

struct

Packit Service 1d0348
archive_entry_linkresolver *

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

archive_entry_linkresolver_new(void);

Packit Service 1d0348
Packit Service 1d0348

void

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

archive_entry_linkresolver_set_strategy(struct archive_entry_linkresolver *resolver,

Packit Service 1d0348
int format);

Packit Service 1d0348
Packit Service 1d0348

void

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

archive_entry_linkresolver_free(struct archive_entry_linkresolver *resolver);

Packit Service 1d0348
Packit Service 1d0348

void

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

archive_entry_linkify(struct archive_entry_linkresolver *resolver,

Packit Service 1d0348
struct archive_entry **entry,
Packit Service 1d0348
struct archive_entry **sparse);

Packit Service 1d0348
Packit Service 1d0348

DESCRIPTION

Packit Service 1d0348
Packit Service 1d0348

Programs that want to create

Packit Service 1d0348
archives have to deal with hardlinks. Hardlinks are handled
Packit Service 1d0348
in different ways by the archive formats. The basic
Packit Service 1d0348
strategies are:

Packit Service 1d0348
Packit Service 1d0348

1.

Packit Service 1d0348
Packit Service 1d0348

Ignore hardlinks and store the

Packit Service 1d0348
body for each reference (old cpio, zip).

Packit Service 1d0348
Packit Service 1d0348

2.

Packit Service 1d0348
Packit Service 1d0348

Store the body the first time

Packit Service 1d0348
an inode is seen (ustar, pax).

Packit Service 1d0348
Packit Service 1d0348

3.

Packit Service 1d0348
Packit Service 1d0348

Store the body the last time an

Packit Service 1d0348
inode is seen (new cpio).

Packit Service 1d0348
Packit Service 1d0348

The

Packit Service 1d0348
archive_entry_linkresolver functions help by
Packit Service 1d0348
providing a unified interface and handling the complexity
Packit Service 1d0348
behind the scene.

Packit Service 1d0348
Packit Service 1d0348

The

Packit Service 1d0348
archive_entry_linkresolver functions assume that
Packit Service 1d0348
archive_entry instances have valid nlinks, inode and
Packit Service 1d0348
device values. The inode and device value is used to match
Packit Service 1d0348
entries. The nlinks value is used to determined if all
Packit Service 1d0348
references have been found and if the internal references
Packit Service 1d0348
can be recycled.

Packit Service 1d0348
Packit Service 1d0348

The

Packit Service 1d0348
archive_entry_linkresolver_new() function allocates a
Packit Service 1d0348
new link resolver. The instance can be freed using
Packit Service 1d0348
archive_entry_linkresolver_free(). All deferred
Packit Service 1d0348
entries are flushed and the internal storage is freed.

Packit Service 1d0348
Packit Service 1d0348

The

Packit Service 1d0348
archive_entry_linkresolver_set_strategy() function
Packit Service 1d0348
selects the optimal hardlink strategy for the given format.
Packit Service 1d0348
The format code can be obtained from archive_format(3). The
Packit Service 1d0348
function can be called more than once, but it is recommended
Packit Service 1d0348
to flush all deferred entries first.

Packit Service 1d0348
Packit Service 1d0348

The

Packit Service 1d0348
archive_entry_linkify() function is the core of
Packit Service 1d0348
archive_entry_linkresolver. The entry()
Packit Service 1d0348
argument points to the archive_entry that should be
Packit Service 1d0348
written. Depending on the strategy one of the following
Packit Service 1d0348
actions is taken:

Packit Service 1d0348
Packit Service 1d0348

1.

Packit Service 1d0348
Packit Service 1d0348

For the simple archive formats

Packit Service 1d0348
*entry is left unmodified and *sparse is set
Packit Service 1d0348
to NULL.

Packit Service 1d0348
Packit Service 1d0348

2.

Packit Service 1d0348
Packit Service 1d0348

For tar like archive formats,

Packit Service 1d0348
*sparse is set to NULL. If *entry is NULL, no
Packit Service 1d0348
action is taken. If the hardlink count of *entry is
Packit Service 1d0348
larger than 1 and the file type is a regular file or
Packit Service 1d0348
symbolic link, the internal list is searched for a matching
Packit Service 1d0348
inode. If such an inode is found, the link count is
Packit Service 1d0348
decremented and the file size of *entry is set to 0
Packit Service 1d0348
to notify that no body should be written. If no such inode
Packit Service 1d0348
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
Packit Service 1d0348

3.

Packit Service 1d0348
Packit Service 1d0348

For new cpio like archive

Packit Service 1d0348
formats a value for *entry of NULL is used to flush
Packit Service 1d0348
deferred entries. In that case *entry is set to an
Packit Service 1d0348
arbitrary deferred entry and the entry itself is removed
Packit Service 1d0348
from the internal list. If the internal list is empty,
Packit Service 1d0348
*entry is set to NULL. In either case, *sparse
Packit Service 1d0348
is set to NULL and the function returns. If the hardlink
Packit Service 1d0348
count of *entry is one or the file type is a
Packit Service 1d0348
directory or device, *sparse is set to NULL and no
Packit Service 1d0348
further action is taken. Otherwise, the internal list is
Packit Service 1d0348
searched for a matching inode. If such an inode is not
Packit Service 1d0348
found, the entry is added to the internal list, both
Packit Service 1d0348
*entry and *sparse are set to NULL and the
Packit Service 1d0348
function returns. If such an inode is found, the link count
Packit Service 1d0348
is decremented. If it remains larger than one, the existing
Packit Service 1d0348
entry on the internal list is swapped with *entry
Packit Service 1d0348
after retaining the link count. The existing entry is
Packit Service 1d0348
returned in *entry. If the link count reached one,
Packit Service 1d0348
the new entry is also removed from the internal list and
Packit Service 1d0348
returned in *sparse. Otherwise *sparse is set
Packit Service 1d0348
to NULL.

Packit Service 1d0348
Packit Service 1d0348

The general

Packit Service 1d0348
usage is therefore:

Packit Service 1d0348
Packit Service 1d0348

1.

Packit Service 1d0348
Packit Service 1d0348

For each new archive entry,

Packit Service 1d0348
call archive_entry_linkify().

Packit Service 1d0348
Packit Service 1d0348

2.

Packit Service 1d0348
Packit Service 1d0348

Keep in mind that the entries

Packit Service 1d0348
returned may have a size of 0 now.

Packit Service 1d0348
Packit Service 1d0348

3.

Packit Service 1d0348
Packit Service 1d0348

If *entry is not NULL,

Packit Service 1d0348
archive it.

Packit Service 1d0348
Packit Service 1d0348

4.

Packit Service 1d0348
Packit Service 1d0348

If *sparse is not NULL,

Packit Service 1d0348
archive it.

Packit Service 1d0348
Packit Service 1d0348

5.

Packit Service 1d0348
Packit Service 1d0348

After all entries have been

Packit Service 1d0348
written to disk, call archive_entry_linkify() with
Packit Service 1d0348
*entry set to NULL and archive the returned entry as
Packit Service 1d0348
long as it is not NULL.

Packit Service 1d0348
Packit Service 1d0348

RETURN VALUES

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

archive_entry_linkresolver_new()

Packit Service 1d0348
returns NULL on malloc(3) failures.

Packit Service 1d0348
Packit Service 1d0348

SEE ALSO

Packit Service 1d0348
Packit Service 1d0348

archive_entry(3)

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>