2010-01-16 4 views
14

I read qu'un type d'entrée tar de 'L' (76) est utilisé par les utilitaires gnu tar et gnu-compliant tar pour indiquer que l'entrée suivante dans l'archive a un nom "long". Dans ce cas, le bloc d'en-tête avec le type d'entrée 'L' code généralement le nom ././@LongLink.Qu'est-ce que le "truc" GNU tar ././@LongLink?

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

Le format d'une archive tar est très simple: il s'agit juste d'une série de blocs de 512 octets. Dans le cas normal, chaque fichier d'une archive tar est représenté par 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 de fichier brutes suivent, en utilisant autant de blocs de 512 octets que nécessaire. Ensuite, l'entrée suivante.

Si le nom de fichier est plus long que celui qui correspond à l'espace alloué dans le bloc d'en-tête, gnu tar utilise apparemment ce que l'on appelle "l'astuce ././@LongLink". Je ne peux pas trouver une description précise pour cela.

Lorsque le type d'entrée est 'L', comment puis-je savoir combien de temps le "long" nom de fichier est? Le nom long est-il limité à 512 octets, en d'autres termes, tout ce qui tient dans un bloc?

Plus important encore: où est-ce documenté?

+4

Quelqu'un a voté pour fermer cela comme n'étant pas lié à la programmation. En fait, c'est lié à la programmation, parce que j'essaye de construire un tar dans .NET qui supporte le tour de GNU LongName. Si j'avais juste besoin d'extraire une archive, je pourrais bien sûr utiliser le gnu de gnu, et je n'aurais pas besoin de la réponse à cette question. – Cheeso

Répondre

12

Juste par l'observation d'une seule archive est ici ce que je devinais sur le type d'entrée « L » dans les archives de goudron, et le nom « ././@LongLink »:

L'entrée « L » est présent dans un en-tête pour une série de 1 ou plusieurs blocs de 512 octets qui contiennent juste le nom de fichier pour un fichier ou un répertoire avec un nom de plus de 100 caractères. Par exemple, si le nom de fichier a une longueur de 1200 caractères, la taille dans le bloc d'en-tête sera de 1200, et il y aura 3 blocs supplémentaires avec des données de nom de fichier; le dernier bloc est partiellement rempli. Suite à cette série est un autre bloc d'en-tête, dans 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é aux 100 premiers caractères du nom réel.

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

+1

J'ai aussi trouvé cette page qui en dit plus sur "LongLink": http://www.delorie.com/gnu/docs/tar/tar_114.html Vous pouvez également rencontrer les en-têtes "@@ MaNgLeD. *". Ils sont similaires à LongLink, mais le ou les blocs de données contiennent un script pour renommer un fichier de "@MaNgLeD .___" en son chemin d'accès réel. Ils peuvent être manipulés de manière très similaire au LongLink lorsque vous traitez un TAR vous-même. –

+1

D'après ce que je peux voir, la taille est strlen() + 1, donc dans votre exemple, la taille serait 1201 dans le fichier tar. Bien que cela ne soit pas important si vous n'enregistrez pas le terminateur NUL sauf si votre nom de fichier est un multiple exact de 512 octets. –

+0

@AlexisWilke - ça fait plusieurs années, mais si je me souviens bien, le caractère nul n'a pas été encodé. Vous avez peut-être raison. – Cheeso

2

Notez que les informations sur tout cela se trouve dans le projet libtar:

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

L'en-tête proposé est libtar .h (opposé à la tar.h POSIX) qui inclut clairement un long nom de fichier, et un long lien symbolique. Obtenez les "fausses" en-têtes + données pour les noms de fichiers/liens longs, puis l'en-tête "réel" (à l'exception du nom de fichier et du 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 serez probablement pas gérer les liens symboliques, mais avec Win7 il est dit que les liens symboliques sous MS Windows travaillent (enfin.)

définition Pertinent de libtar.h:

/* GNU extensions for typeflag */ 
#define GNU_LONGNAME_TYPE 'L' 
#define GNU_LONGLINK_TYPE 'K'