EN JA
ARCHIVE_ENTRY_LINKIFY(3)
ARCHIVE_ENTRY_LINKIFY(3) FreeBSD Library Functions Manual ARCHIVE_ENTRY_LINKIFY(3)

名称

archive_entry_linkresolver, archive_entry_linkresolver_new, archive_entry_linkresolver_set_strategy, archive_entry_linkresolver_free, archive_entry_linkifyハードリンクリゾルバ (resolver) 関数

ライブラリ

ストリーミングアーカイブライブラリ (libarchive, -larchive)

書式

#include < archive_entry.h>

struct archive_entry_linkresolver *
archive_entry_linkresolver_new( void);

void
archive_entry_linkresolver_set_strategy( struct archive_entry_linkresolver *resolver, int format);

void
archive_entry_linkresolver_free( struct archive_entry_linkresolver *resolver);

void
archive_entry_linkify( struct archive_entry_linkresolver *resolver, struct archive_entry **entry, struct archive_entry **sparse);

解説

アーカイブを作成したいプログラムは、ハードリンクを処理しなければなりません。ハードリンクは、アーカイブ形式によって異なる方法で取り扱われます。基本的な方法は、次の通りです:
  1. ハードリンクを無視して、各参照 (古い cpio、zip) のための本体を格納します。
  2. 始めて inode が見られる (ustar、pax) 本体を格納します。
  3. 始めて inode が見られる (新 cpio) 本体を格納します。

archive_entry_linkresolver 関数は、統一されたインタフェース適用することと影で複雑なものを扱うことによって支援しています。

archive_entry_linkresolver 関数は、 archive_entry インスタンスが有効な nlinks、inode とデバイス値を持っていることを仮定しています。 inode とデバイス値は、エントリと一致するために使用されます。 nlinks 値は、すべての参照がすべて見つかっているかどうか、内部の参照が再利用することができるかを決定するために使用されます。

archive_entry_linkresolver_new() 関数は、新しいリンクリゾルバ (resolver) を割り付けます。 archive_entry_linkresolver_free() を使用してインスタンスを解放することができます。すべての延期されたエントリは、フラッシュされ、内部の記憶域は、解放されます。

archive_entry_linkresolver_set_strategy() 関数は、与えられた形式のための最適なハードリンクの方法を選択します。 archive_format(3) から書式コードを取得することができます。関数を 2 回度以上呼び出すことができますが、すべての延期されたエントリを最初にフラッシュすることが推奨されます。

archive_entry_linkify() 関数は、 archive_entry_linkresolver の中心です。 entry() 引数は、書き込まれるべき archive_entry を指します。方法に依存して、次のアクションのうちの 1 つが取られます:

  1. 単純なアーカイブ形式について、 *entry は、未変更のままにされ、 *sparse は、 NULL に設定されます。
  2. tar のようなアーカイブ形式について、 *sparse は、 NULL に設定されます。 *entryNULL であるなら、アクションは、取られません。 *entry のハードリンクのカウントが 1 より大きく、ファイルタイプが通常ファイルであるか、またはシンボリックリンクであるなら、内部のリストは、一致する inode を検索します。そのような inode が見つかるなら、リンクのカウントは、減少され、 *entry のファイルサイズは、本体が書き込まれるべきではないことを通知するために 0 に設定されます。そのような inode が見つからないなら、エントリのコピーは、リンクのカウントを 1 減少して、内部のキャッシュに追加されます。
  3. 新しい cpio のようなアーカイブ形式について、 NULL*entry に対する値は、延期されたエントリをフラッシュするために使用されます。その場合には、 *entry は、任意の延期されたエントリに設定され、エントリそれ自体は、内部のリストから削除されます。内部のリストが空であるなら、 *entry は、 NULL に設定されます。いずれにせよ、 *sparse は、 NULL に設定され、関数は、返ります。 *entry のハードリンクのカウントが 1 か、またはファイルタイプがディレクトリまたはデバイスであるなら、 *sparse は、 NULL に設定され、それ以上のアクションは、取られません。そうでなければ、内部のリストは、一致する inode を検索します。そのような inode が見つからないなら、エントリは、内部のリストに追加され、 *entry*sparse の両方は、 NULL に設定され、関数は、返ります。そのような inode が見つかるなら、リンクカウントは、減少されます。それが 1 より大きいままであるなら、内部のリストの既存のエントリは、リンクカウントを保持した後に、 *entry と交換されます。既存のエントリは、 *entry に返されます。リンクカウントが 1 に到達したなら、新しいエントリも内部のリストから削除され、 *sparse に返されます。そうでなければ、 *sparse は、 NULL に設定されます。

したがって、一般的な使用法は、次の通りです:

  1. 新しいアーカイブエントリごとに、 archive_entry_linkify() を呼び出します。
  2. 返されたエントリは、今 0 のサイズがあるかもしれないということを覚えておいてください。
  3. *entryNULL でないなら、それをアーカイブします。
  4. *sparseNULL でないなら、それをアーカイブします。
  5. すべてのエントリがディスクに書き込まれた後に、 NULL に設定された *entry を付けて archive_entry_linkify() を呼び出し、それが NULL でない限り、返されたエントリをアーカイブします。

戻り値

archive_entry_linkresolver_new() は、 malloc(3) が失敗すれば、 NULL を返します。

関連項目

archive_entry(3)
February 2, 2012 FreeBSD