2010-01-16 12 views
14

I read che un tipo di voce tar di "L" (76) viene utilizzato dalle utility tar di gnu tar e gnu per indicare che la voce successiva nell'archivio ha un nome "lungo". In questo caso il blocco di intestazione con il tipo di voce "L" codifica in genere il nome ././@LongLink.Che cosa è esattamente il tar di GNU ././@LongLink "trucco"?

La mia domanda è: dove è il formato del prossimo blocco descritto?

Il formato di un archivio tar è molto semplice: è solo una serie di blocchi da 512 byte. Nel caso normale, ogni file in un archivio tar è rappresentato come una serie di blocchi. Il primo blocco è un blocco di intestazione, contenente il nome del file, il tipo di voce, l'ora modificata e altri metadati. Quindi seguono i dati del file non elaborato, utilizzando tutti i blocchi di 512 byte necessari. Quindi la prossima voce.

Se il nome del file è più lungo di quello che verrà inserito nello spazio assegnato nel blocco di intestazione, gnu tar utilizza apparentemente il cosiddetto "trucco ././@LongLink". Non riesco a trovare una descrizione precisa per questo.

Quando il tipo di voce è 'L', come faccio a sapere quanto è lungo il nomefile "lungo"? Il nome lungo è limitato a 512 byte, in altre parole, qualunque cosa si adatti in un blocco?

Principalmente: dove è documentato?

+4

Qualcuno ha votato per chiudere questo come non relativo alla programmazione. In realtà, è legato alla programmazione, perché sto cercando di creare un tar in .NET che supporti il ​​trucco LongName di GNU. Se avessi solo bisogno di estrarre un archivio, potrei ovviamente usare semplicemente gnu's tar, e non avrei bisogno della risposta a questa domanda. – Cheeso

risposta

12

Proprio attraverso l'osservazione di un unico archivio qui è quello che ho ipotizzato la 'L' tipo di voce in archivi tar, e il "././@LongLink" Nome:

La voce 'L' è presente in un'intestazione per una serie di 1 o più blocchi da 512 byte che contengono solo il nome file per un file o una directory con un nome superiore a 100 caratteri. Ad esempio, se il nome del file è di 1200 caratteri, la dimensione nel blocco di intestazione sarà 1200 e ci saranno 3 blocchi aggiuntivi con i dati del nome del file; l'ultimo blocco è parzialmente riempito.

Seguendo questa serie è un altro blocco di intestazione, nella forma tradizionale - un'intestazione con tipo '0' (file normale) o '5' (directory), seguita dal numero appropriato di blocchi di dati con i dati di ingresso. Nell'intestazione di questa serie, il nome verrà troncato ai primi 100 caratteri del nome effettivo.

EDIT
Vedi la mia applicazione qui: http://cheesoexamples.codeplex.com/SourceControl/changeset/view/99885#1868643

+1

Ho anche trovato questa pagina che parla di "LongLink": http://www.delorie.com/gnu/docs/tar/tar_114.html Si possono anche incontrare anche intestazioni "@@ MaNgLeD. *". Questi sono simili a LongLink, ma i blocchi di dati contengono uno script per rinominare un file da "@MaNgLeD .___" al suo vero nome di percorso. Possono essere gestiti in modo molto simile a LongLink quando elaborate un TAR da soli. –

+1

Da quello che posso vedere, la dimensione è strlen() + 1, quindi nel tuo esempio la dimensione sarebbe 1201 nel file tar. Anche se potrebbe non avere importanza se non si salva il terminatore NUL eccetto se il nome file è un multiplo esatto di 512 byte. –

+0

@AlexisWilke - sono passati diversi anni, ma come ricordo il nul char non è stato codificato. potresti avere ragione però. – Cheeso

2

Nota che le informazioni su tutti che si può trovare nel progetto libtar:

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

L'intestazione proposto è libtar .h (opposto al POSIX tar.h) che include chiaramente un nome file lungo e un collegamento simbolico lungo.

Ottieni le intestazioni "false" + i dati per i nomi di file lunghi/i collegamenti, quindi l'intestazione "reale" (eccetto il nome file e il collegamento simbolico) dopo quello.

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 

Naturalmente, sotto MS-Windows, probabilmente non sarà gestire i collegamenti simbolici, anche se con Win7 non è detto che i collegamenti simbolici sotto MS-Windows stanno lavorando (finalmente).

Pertinente definizione dalla libtar.h:

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