|
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>
|