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

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

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

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

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

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

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


person Cheeso    schedule 16.01.2010    source источник
comment
Кто-то проголосовал за то, чтобы закрыть это как не относящееся к программированию. На самом деле это связано с программированием, потому что я пытаюсь создать tar в .NET, который поддерживает трюк GNU LongName. Если бы мне просто нужно было распаковать архив, я, конечно, мог бы просто использовать tar от gnu, и мне не нужен был бы ответ на этот вопрос.   -  person Cheeso    schedule 17.01.2010


Ответы (2)


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

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

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

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

person Cheeso    schedule 16.01.2010
comment
Я также нашел эту страницу, на которой больше рассказывается о LongLink: delorie.com/gnu/docs /tar/tar_114.html Вы также можете столкнуться с заголовками @@MaNgLeD.*. Они похожи на LongLink, но блок(и) данных содержит скрипт для переименования файла из @MaNgLeD.___ в его реальный путь. С ними можно обращаться так же, как с LongLink, когда вы обрабатываете TAR самостоятельно. - person Daryl Hanson; 18.04.2012
comment
Из того, что я вижу, размер равен strlen() + 1, поэтому в вашем примере размер в tar-файле будет 1201. Хотя это может не иметь значения, если вы не сохраните терминатор NUL, за исключением случаев, когда ваше имя файла точно кратно 512 байтам. - person Alexis Wilke; 20.06.2013
comment
@AlexisWilke - прошло несколько лет, но, насколько я помню, нулевой символ не был закодирован. хотя может ты и прав. - person Cheeso; 20.06.2013
comment
См. эту полезную справочную страницу: 'L' Длинный файл имя. Star может читать и записывать этот тип заголовка. В форматах xustar и exustar star предпочитает хранить длинные имена файлов, используя метод POSIX.1-2001. Размер всегда отличен от нуля и обозначает длину длинного имени файла, включая завершающий нулевой байт. Имя файла находится в данных, которые следуют за заголовком. - person xroche; 28.08.2014

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