2010-01-16 12 views
14

I read que un tar tipo de entrada de 'L' (76) es utilizado por utilidades tar de gnu tar y gnu para indicar que la siguiente entrada en el archivo tiene un nombre "largo". En este caso, el bloque de encabezado con el tipo de entrada de 'L' generalmente codifica el nombre ././@LongLink.¿Qué es exactamente el truco de GNU ././@LongLink "truco"?

Mi pregunta es: ¿dónde se describe el siguiente siguiente bloque?

El formato de un archivo tar es muy simple: es solo una serie de bloques de 512 bytes. En el caso normal, cada archivo en un archivo tar se representa como una serie de bloques. El primer bloque es un bloque de encabezado, que contiene el nombre del archivo, el tipo de entrada, la hora modificada y otros metadatos. Luego siguen los datos del archivo sin procesar, utilizando tantos bloques de 512 bytes como sea necesario. Luego la siguiente entrada.

Si el nombre del archivo es más largo de lo que cabe en el espacio asignado en el bloque de encabezado, gnu tar aparentemente usa lo que se conoce como "el truco ././@LongLink". No puedo encontrar una descripción precisa para ello.

Cuando el tipo de entrada es 'L', ¿cómo sé por cuánto tiempo es el nombre de archivo "largo"? ¿El nombre largo está limitado a 512 bytes, en otras palabras, lo que cabe en un bloque?

Lo más importante: ¿dónde está esto documentado?

+4

Alguien ha votado a favor de cerrar esto como si no estuviera relacionado con la programación. En realidad, está relacionado con la programación, porque estoy tratando de construir un tar en .NET que soporte el truco LongName de GNU. Si solo tuviera que extraer un archivo, podría simplemente usar el tar de gnu, y no necesitaría la respuesta a esta pregunta. – Cheeso

Respuesta

12

Sólo mediante la observación de un solo archivo aquí es lo que conjeturó sobre el tipo de entrada 'L' en los archivos de alquitrán, y el nombre "././@LongLink":

La entrada de 'L' está presente en un encabezado para una serie de 1 o más bloques de 512 bytes que contienen solo el nombre de archivo para un archivo o directorio con un nombre de más de 100 caracteres. Por ejemplo, si el nombre de archivo es de 1200 caracteres de largo, entonces el tamaño en el bloque de encabezado será 1200 y habrá 3 bloques adicionales con datos de nombre de archivo; el último bloque está parcialmente lleno.

Siguiendo esa serie hay otro bloque de encabezado, en la forma tradicional - un encabezado con tipo '0' (archivo regular) o '5' (directorio), seguido del número apropiado de bloques de datos con los datos de entrada. En el encabezado de esta serie, el nombre se truncará a los primeros 100 caracteres del nombre real.

EDITAR
Ver mi aplicación aquí: http://cheesoexamples.codeplex.com/SourceControl/changeset/view/99885#1868643

+1

También encontré esta página que habla más sobre "LongLink": http://www.delorie.com/gnu/docs/tar/tar_114.html También puede encontrar encabezados "@@ MaNgLeD. *". Estos son similares a LongLink, pero los bloques de datos contienen una secuencia de comandos para cambiar el nombre de un archivo de "@MaNgLeD .___" a su nombre de ruta real. Se pueden manejar de forma muy similar a LongLink cuando está procesando un TAR por su cuenta. –

+1

Por lo que puedo ver, el tamaño es strlen() + 1, por lo que en su ejemplo el tamaño sería 1201 en el archivo tar. Aunque puede no importar si no guarda el terminador NUL, excepto si su nombre de archivo es un múltiplo exacto de 512 bytes. –

+0

@AlexisWilke - han pasado varios años, pero recuerdo que el nul char no estaba codificado. aunque tengas razón. – Cheeso

2

Tenga en cuenta que la información sobre todos los que se puede encontrar en el proyecto libtar:

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

La cabecera propuesta es libtar .h (opuesto al tar.h de POSIX) que incluye claramente un nombre de archivo largo y un enlace simbólico largo.

Obtenga los encabezados "falsos" + datos para los nombres y enlaces de archivos largos, luego el encabezado "real" (excepto el nombre de archivo real y el enlace simbólico) después de eso.

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 

Por supuesto, bajo MS-Windows, probablemente no va a manejar los enlaces simbólicos, aunque con Win7 se dice que los enlaces simbólicos en MS Windows están trabajando (por fin).

definición pertinente de Libtarh:

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