Что такое GNU tar././@LongLink "трюк"?

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

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

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

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

Когда тип записи "L", как я могу узнать, как долго длительное имя файла? Является ли длинное имя ограничено 512 байтами, другими словами, все, что подходит в одном блоке?

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

Ответы

Ответ 1

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

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

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

ИЗМЕНИТЬ
Смотрите мою реализацию здесь: http://cheesoexamples.codeplex.com/SourceControl/changeset/view/99885#1868643

Ответ 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'