Формат tar-архива, куда поместить длинное имя элемента архива?

На самом деле это единственный раздел про unix на этом форуме

Модераторы: /dev/random, Модераторы разделов

Аватара пользователя
жучара
Сообщения: 1051
ОС: астралинукс

Формат tar-архива, куда поместить длинное имя элемента архива?

Сообщение жучара »

Друзья! Продолжаю ковыряться с таром. Формат tar-архива описан плохо
https://www.gnu.org/software/tar/manual/html_node/Standard.html#Standard

Там, получается, каждый элемент описан структурой, то ли posix_header, то ли star_header. В исходникак на всякий случай вот что придумали:

Код: Выделить всё

union block
{
  char buffer[BLOCKSIZE];
  struct posix_header header;
  struct star_header star_header;
  struct oldgnu_header oldgnu_header;
  struct sparse_header sparse_header;
  struct star_in_header star_in_header;
  struct star_ext_header star_ext_header;
};
Но это их дела. В этих структурах есть несколько одинаковых полей, от них и будем плясать.

Код: Выделить всё

struct star_header
{                              /* byte offset */
  char name[100];               /*   0 */
  ...
  char size[12];                /* 124 */
  ...
  char typeflag;                /* 156 */
};
Видно, что под имя элемента выделяется 100 байтов. Если больше, туда пишется ././@LongLink, потом в поле typeflag ставится буква L:
/* Identifies the *next* file on the tape as having a long name. */
#define GNUTYPE_LONGNAME 'L'
На этом понятности заканчиваются. Куда-то после этого помещается имя элемента, куда-то его тип. А куда- не описано. Может, занимался кто. Спасибо, кто откликнется. Debian 12. Вот архив n.tar на всякий случай, там сархивирован файл с именем из 105 знаков (на практике, если инкрементно архивировать систему, например, встречается сплошь и рядом)
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Я просто читаю маны.
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5372
ОС: Gentoo

Re: Формат tar-архива, куда поместить длинное имя элемента архива?

Сообщение /dev/random »

куда поместить длинное имя элемента архива?
Зависит от варианта формата tar.
  • v7 (древний tar):
    никуда, 100 байт - это максимум.
  • ustar (старый POSIX tar, сейчас считается классическим tar, документирован практически где угодно):
    разделяется на 2 части (только по разделителю путей) и вписывается в поля "prefix" (до 155 байт) и "name" (до 100 байт).
  • pax (современный POSIX tar, документирован в POSIX и man 1p pax):
    перед файлом добавляется псевдо-файл с typeflag=x; содержимое - дополнительная информация о файле, набор строк вида "длина ключ=значение"; полное имя указывается с ключом "path".
  • oldgnu (старый вариант GNU tar, почти не документирован):
    не знаю
  • gnu (современный вариант GNU tar, очень плохо документирован):
    перед файлом добавляется псевдо-файл с typeflag=L; содержимое - полное имя файла.
Спасибо сказали:
Аватара пользователя
жучара
Сообщения: 1051
ОС: астралинукс

Re: Формат tar-архива, куда поместить длинное имя элемента архива?

Сообщение жучара »

/dev/random писал:
27.12.2024 14:47
gnu (современный вариант GNU tar, очень плохо документирован):
перед файлом добавляется псевдо-файл с typeflag=L; содержимое - полное имя файла.
так это, получается, мой вариант, или можно поточнее узнать как-нибудь?
Я просто читаю маны.
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5372
ОС: Gentoo

Re: Формат tar-архива, куда поместить длинное имя элемента архива?

Сообщение /dev/random »

жучара писал(а):
27.12.2024 15:04
так это, получается, мой вариант, или можно поточнее узнать как-нибудь?
Да, это ваш вариант, судя по тому, что лежит в приложенном вами файле. И в большинстве Linux-дистрибутивов он сейчас используется по умолчанию. Если хотите узнать точно, то введите tar --help. В GNU tar (используемой в большинстве дистрибутивов реализации tar) в последней строке вывода будет указан используемый по умолчанию формат (обычно --format=gnu). Если хотите другой, указывайте его явно при создании архива.
Спасибо сказали:
Аватара пользователя
жучара
Сообщения: 1051
ОС: астралинукс

Re: Формат tar-архива, куда поместить длинное имя элемента архива?

Сообщение жучара »

/dev/random писал:
27.12.2024 15:20
жучара писал(а):
27.12.2024 15:04
так это, получается, мой вариант, или можно поточнее узнать как-нибудь?
Да, это ваш вариант, судя по тому, что лежит в приложенном вами файле. И в большинстве Linux-дистрибутивов он сейчас используется по умолчанию. Если хотите узнать точно, то введите tar --help. В GNU tar (используемой в большинстве дистрибутивов реализации tar) в последней строке вывода будет указан используемый по умолчанию формат (обычно --format=gnu). Если хотите другой, указывайте его явно при создании архива.

Shell

$ tar --help | tail -n 2
--format=gnu -f- -b20 --quoting-style=escape --rmt-command=/usr/sbin/rmt
--rsh-command=/usr/bin/rsh
$
эх, как жаль. И да, маркера какого-либо внутры *.tar файла не предусмотрено- ну в прилагаемом файле их нет, по крайней мере. Только по косвенным признакам ориентироваться, что это за версия тар-архива- по typeflag=L, например. В *.snar-файле, например, такие метки есть.
Я просто читаю маны.
Спасибо сказали: