Что такое GNU tar ././@LongLink "трюк"? - PullRequest
14 голосов
/ 16 января 2010

Я прочитал , что тип записи tar 'L' (76) используется утилитами gnu tar и gnu-совместимым tar для указания того, что следующая запись в архиве имеет "длинное" имя.В этом случае блок заголовка с типом записи 'L' обычно кодирует имя ././@LongLink.

Мой вопрос: где находится формат описанного следующего блока ?

Формат архива tar очень прост: это просто серия блоков по 512 байт.В обычном случае каждый файл в архиве tar представляется в виде последовательности блоков.Первый блок - это блок заголовка, содержащий имя файла, тип записи, время изменения и другие метаданные.Затем следуют необработанные данные файла, используя столько блоков по 512 байт, сколько требуется.Тогда следующая запись.

Если имя файла длиннее, чем уместится в пространстве, выделенном в блоке заголовка, gnu tar, очевидно, использует так называемый трюк ././@LongLink.Я не могу найти точное описание для этого.

Когда тип записи «L», как узнать, как долго «длинное» имя файла?Ограничено ли длинное имя 512 байтами, другими словами, что бы помещалось в одном блоке?

Самое главное: где это задокументировано?

Ответы [ 2 ]

13 голосов
/ 17 января 2010

Просто наблюдая за одним архивом, вот что я догадался о типе записи 'L' в архивах tar и имени "././@LongLink":

Запись 'L' присутствует в заголовке для серии из 1 или более 512-байтовых блоков, которые содержат только имя файла для файла или каталога с именем более 100 символов. Например, если имя файла имеет длину 1200 символов, то размер в блоке заголовка будет 1200, и будет 3 дополнительных блока с данными имени файла; последний блок частично заполнен.

После этой серии идет еще один блок заголовка в традиционной форме - заголовок с типом «0» (обычный файл) или «5» (каталог), за которым следует соответствующее количество блоков данных с входными данными. В заголовке этой серии имя будет усечено до первых 100 символов фактического имени.

EDIT
Смотрите мою реализацию здесь: http://cheesoexamples.codeplex.com/SourceControl/changeset/view/99885#1868643

2 голосов
/ 20 июня 2013

Обратите внимание, что информацию обо всем этом можно найти в проекте 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'
...