什么是GNU tar ././@LongLink“技巧”?

时间:2010-01-16 20:15:17

标签: interop gnu tar

I read gnu tar和gnu兼容的tar实用程序使用tar条目类型'L'(76)来指示存档中的下一个条目具有“long”名称。在这种情况下,条目类型为“L”的标题块通常会对名称././@LongLink进行编码。

我的问题是:下一个块的格式在哪里描述?

tar存档的格式非常简单:它只是一系列512字节的块。在正常情况下,tar存档中的每个文件都表示为一系列块。第一个块是标题块,包含文件名,条目类型,修改时间和其他元数据。然后使用所需的512字节块来跟随原始文件数据。然后是下一个条目。

如果文件名长于适合标题块中分配的空间,gnu tar显然使用了所谓的“././@LongLink技巧”。我找不到它的准确描述。

当条目类型为“L”时,我如何知道“长”文件名有多长?长名称是否限制为512字节,换句话说,什么适合一个块?

最重要的是:记录在哪里?

2 个答案:

答案 0 :(得分:13)

通过观察单个存档,我猜测了tar档案中的'L'条目类型,以及“././@LongLink”名称:

“L”条目存在于一系列1个或多个512字节块的标题中,这些块仅包含名称超过100个字符的文件或目录的文件名。例如,如果文件名长度为1200个字符,那么标题块中的大小将为1200,并且将有3个带文件名数据的附加块;最后一个块被部分填充。

在该系列之后是另一个标题块,采用传统形式 - 类型为“0”(常规文件)或“5”(目录)的标头,后跟带有条目数据的适当数量的数据块。在此系列的标题中,名称将被截断为实际名称的前100个字符。

修改
请参阅我的实施: http://cheesoexamples.codeplex.com/SourceControl/changeset/view/99885#1868643

答案 1 :(得分:2)

请注意,有关所有内容的信息可以在libtar项目中找到:

http://www.feep.net/libtar/

建议的头文件是libtar.h(与POSIX tar.h相对),它明显包含长文件名和长符号链接。

获取长文件名/链接的“假”标题+数据,然后获取“真实”标题(实际文件名和符号链接除外)。

HEADER type 'L'
BLOCKS of data with the real long filename
HEADER type 'K'
BLOCKS of data with the real symbolic link
HEADER type '0' (or '5' for directory, etc.)
BLOCKS of data with the actual file contents

当然,在MS-Windows下,你可能不会处理符号链接,虽然在Win7中可以说MS-Windows下的符号链接正在工作(最后。)

libtar.h中的相关定义:

/* GNU extensions for typeflag */
#define GNU_LONGNAME_TYPE   'L'
#define GNU_LONGLINK_TYPE   'K'