Quel est exactement le GNU tar././ @LongLink "trick"?

j'ai lu qu'une entrée tar de type 'L' (76) est utilisée par les utilitaires gnu tar et gnu Tar pour indiquer que la prochaine entrée dans l'archive a un nom "long". Dans ce cas, le bloc d'en-tête avec le type d'entrée " L " Code habituellement le nom ././ @LongLink .

ma question Est: où est le format du bloc suivant décrit?

Le format d'une archive tar est très simple: il est juste une série de blocs de 512 octets. Dans le cas normal, chaque fichier dans une archive tar est représenté comme une série de blocs. Le premier bloc est un bloc d'en-tête, contenant le nom du fichier, le type d'entrée, l'heure modifiée et d'autres métadonnées. Ensuite, les données brutes du fichier suivent, en utilisant autant de blocs de 512 octets que nécessaire. Alors la prochaine entrée.

si le nom du fichier est plus long que l'espace alloué dans le bloc d'en-tête, gnu tar utilise apparemment ce qu'on appelle" le ././ @LongLink astuce." Je ne trouve pas de description précise.

lorsque le type d'entrée est "L", Comment savoir combien de temps le nom de fichier" long " est? Est-ce que le nom long est limité à 512 octets, en d'autres termes, tout ce qui convient dans un bloc?

le plus important: où cela est-il documenté?

14
demandé sur Cheeso 2010-01-16 23:15:17

2 réponses

juste en observant une seule archive voici ce que j'ai supposé sur le type d'entrée "L" dans les archives tar, et le"././ @LongLink "nom:

l'entrée" L "est présente dans un en-tête pour une série de blocs de 512 octets ou plus qui contiennent juste le nom de fichier pour un fichier ou un répertoire dont le nom dépasse 100 caractères. Par exemple, si le nom du fichier est 1200 caractères de long, alors la taille dans le bloc d'en-tête sera 1200, et il y aura 3 blocs supplémentaires avec les données de nom de fichier; le dernier bloc est partiellement rempli.

après cette série est un autre bloc d'en - tête, sous la forme traditionnelle-un en-tête avec le type '0' (fichier régulier) ou '5' (répertoire), suivi du nombre approprié de blocs de données avec les données d'entrée. Dans l'en-tête de cette série, le nom sera tronqué pour les 100 premiers caractères du nom réel.

MODIFIER

Voir mon mise en œuvre ici: http://cheesoexamples.codeplex.com/SourceControl/changeset/view/99885#1868643

12
répondu Cheeso 2013-04-02 18:23:25

notez que les informations sur tout cela peuvent être trouvées dans le projet libtar:

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

l'en-tête proposé est libtar.h (par opposition au goudron POSIX.h) qui inclut clairement un long nom de fichier et un long lien symbolique.

récupérez les en-têtes" faux "+ données pour les longs noms de fichier/liens puis l'en-tête" réel " (sauf pour le nom de fichier réel et le lien symbolique) après cela.

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

bien sûr, sous MS-Windows, vous ne manipulerez probablement pas les liens symboliques, bien qu'avec Win7 il soit dit que les liens symboliques sous MS-Windows fonctionnent (enfin.)

définition pertinente de libtar.h:

/* GNU extensions for typeflag */
#define GNU_LONGNAME_TYPE   'L'
#define GNU_LONGLINK_TYPE   'K'
2
répondu Alexis Wilke 2013-08-09 19:05:43