summaryrefslogtreecommitdiff
path: root/doc/header.texi
diff options
context:
space:
mode:
Diffstat (limited to 'doc/header.texi')
-rw-r--r--doc/header.texi242
1 files changed, 242 insertions, 0 deletions
diff --git a/doc/header.texi b/doc/header.texi
new file mode 100644
index 0000000..0d1616e
--- /dev/null
+++ b/doc/header.texi
@@ -0,0 +1,242 @@
+@comment GNU tar Archive Format description.
+@comment
+@comment Copyright (C) 1988, 1989, 1991, 1992, 1993, 1994, 1995, 1996, 1997,
+@comment 2000, 2001, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
+@comment
+@comment This program is free software; you can redistribute it and/or modify it
+@comment under the terms of the GNU General Public License as published by the
+@comment Free Software Foundation; either version 2, or (at your option) any later
+@comment version.
+@comment
+@comment This program is distributed in the hope that it will be useful, but
+@comment WITHOUT ANY WARRANTY; without even the implied warranty of
+@comment MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+@comment Public License for more details.
+@comment
+@comment You should have received a copy of the GNU General Public License along
+@comment with this program; if not, write to the Free Software Foundation, Inc.,
+@comment 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+/*@r{ tar Header Block, from POSIX 1003.1-1990. }*/
+
+/*@r{ POSIX header. }*/
+
+struct posix_header
+@{ /*@r{ byte offset }*/
+ char name[100]; /*@r{ 0 }*/
+ char mode[8]; /*@r{ 100 }*/
+ char uid[8]; /*@r{ 108 }*/
+ char gid[8]; /*@r{ 116 }*/
+ char size[12]; /*@r{ 124 }*/
+ char mtime[12]; /*@r{ 136 }*/
+ char chksum[8]; /*@r{ 148 }*/
+ char typeflag; /*@r{ 156 }*/
+ char linkname[100]; /*@r{ 157 }*/
+ char magic[6]; /*@r{ 257 }*/
+ char version[2]; /*@r{ 263 }*/
+ char uname[32]; /*@r{ 265 }*/
+ char gname[32]; /*@r{ 297 }*/
+ char devmajor[8]; /*@r{ 329 }*/
+ char devminor[8]; /*@r{ 337 }*/
+ char prefix[155]; /*@r{ 345 }*/
+ /*@r{ 500 }*/
+@};
+
+#define TMAGIC "ustar" /*@r{ ustar and a null }*/
+#define TMAGLEN 6
+#define TVERSION "00" /*@r{ 00 and no null }*/
+#define TVERSLEN 2
+
+/*@r{ Values used in typeflag field. }*/
+#define REGTYPE '0' /*@r{ regular file }*/
+#define AREGTYPE '\0' /*@r{ regular file }*/
+#define LNKTYPE '1' /*@r{ link }*/
+#define SYMTYPE '2' /*@r{ reserved }*/
+#define CHRTYPE '3' /*@r{ character special }*/
+#define BLKTYPE '4' /*@r{ block special }*/
+#define DIRTYPE '5' /*@r{ directory }*/
+#define FIFOTYPE '6' /*@r{ FIFO special }*/
+#define CONTTYPE '7' /*@r{ reserved }*/
+
+#define XHDTYPE 'x' /*@r{ Extended header referring to the
+ next file in the archive }*/
+#define XGLTYPE 'g' /*@r{ Global extended header }*/
+
+/*@r{ Bits used in the mode field, values in octal. }*/
+#define TSUID 04000 /*@r{ set UID on execution }*/
+#define TSGID 02000 /*@r{ set GID on execution }*/
+#define TSVTX 01000 /*@r{ reserved }*/
+ /*@r{ file permissions }*/
+#define TUREAD 00400 /*@r{ read by owner }*/
+#define TUWRITE 00200 /*@r{ write by owner }*/
+#define TUEXEC 00100 /*@r{ execute/search by owner }*/
+#define TGREAD 00040 /*@r{ read by group }*/
+#define TGWRITE 00020 /*@r{ write by group }*/
+#define TGEXEC 00010 /*@r{ execute/search by group }*/
+#define TOREAD 00004 /*@r{ read by other }*/
+#define TOWRITE 00002 /*@r{ write by other }*/
+#define TOEXEC 00001 /*@r{ execute/search by other }*/
+
+/*@r{ tar Header Block, GNU extensions. }*/
+
+/*@r{ In GNU tar, SYMTYPE is for to symbolic links, and CONTTYPE is for
+ contiguous files, so maybe disobeying the `reserved' comment in POSIX
+ header description. I suspect these were meant to be used this way, and
+ should not have really been `reserved' in the published standards. }*/
+
+/*@r{ *BEWARE* *BEWARE* *BEWARE* that the following information is still
+ boiling, and may change. Even if the OLDGNU format description should be
+ accurate, the so-called GNU format is not yet fully decided. It is
+ surely meant to use only extensions allowed by POSIX, but the sketch
+ below repeats some ugliness from the OLDGNU format, which should rather
+ go away. Sparse files should be saved in such a way that they do *not*
+ require two passes at archive creation time. Huge files get some POSIX
+ fields to overflow, alternate solutions have to be sought for this. }*/
+
+/*@r{ Descriptor for a single file hole. }*/
+
+struct sparse
+@{ /*@r{ byte offset }*/
+ char offset[12]; /*@r{ 0 }*/
+ char numbytes[12]; /*@r{ 12 }*/
+ /*@r{ 24 }*/
+@};
+
+/*@r{ Sparse files are not supported in POSIX ustar format. For sparse files
+ with a POSIX header, a GNU extra header is provided which holds overall
+ sparse information and a few sparse descriptors. When an old GNU header
+ replaces both the POSIX header and the GNU extra header, it holds some
+ sparse descriptors too. Whether POSIX or not, if more sparse descriptors
+ are still needed, they are put into as many successive sparse headers as
+ necessary. The following constants tell how many sparse descriptors fit
+ in each kind of header able to hold them. }*/
+
+#define SPARSES_IN_EXTRA_HEADER 16
+#define SPARSES_IN_OLDGNU_HEADER 4
+#define SPARSES_IN_SPARSE_HEADER 21
+
+/*@r{ Extension header for sparse files, used immediately after the GNU extra
+ header, and used only if all sparse information cannot fit into that
+ extra header. There might even be many such extension headers, one after
+ the other, until all sparse information has been recorded. }*/
+
+struct sparse_header
+@{ /*@r{ byte offset }*/
+ struct sparse sp[SPARSES_IN_SPARSE_HEADER];
+ /*@r{ 0 }*/
+ char isextended; /*@r{ 504 }*/
+ /*@r{ 505 }*/
+@};
+
+/*@r{ The old GNU format header conflicts with POSIX format in such a way that
+ POSIX archives may fool old GNU tar's, and POSIX tar's might well be
+ fooled by old GNU tar archives. An old GNU format header uses the space
+ used by the prefix field in a POSIX header, and cumulates information
+ normally found in a GNU extra header. With an old GNU tar header, we
+ never see any POSIX header nor GNU extra header. Supplementary sparse
+ headers are allowed, however. }*/
+
+struct oldgnu_header
+@{ /*@r{ byte offset }*/
+ char unused_pad1[345]; /*@r{ 0 }*/
+ char atime[12]; /*@r{ 345 Incr. archive: atime of the file }*/
+ char ctime[12]; /*@r{ 357 Incr. archive: ctime of the file }*/
+ char offset[12]; /*@r{ 369 Multivolume archive: the offset of
+ the start of this volume }*/
+ char longnames[4]; /*@r{ 381 Not used }*/
+ char unused_pad2; /*@r{ 385 }*/
+ struct sparse sp[SPARSES_IN_OLDGNU_HEADER];
+ /*@r{ 386 }*/
+ char isextended; /*@r{ 482 Sparse file: Extension sparse header
+ follows }*/
+ char realsize[12]; /*@r{ 483 Sparse file: Real size}*/
+ /*@r{ 495 }*/
+@};
+
+/*@r{ OLDGNU_MAGIC uses both magic and version fields, which are contiguous.
+ Found in an archive, it indicates an old GNU header format, which will be
+ hopefully become obsolescent. With OLDGNU_MAGIC, uname and gname are
+ valid, though the header is not truly POSIX conforming. }*/
+#define OLDGNU_MAGIC "ustar " /*@r{ 7 chars and a null }*/
+
+/*@r{ The standards committee allows only capital A through capital Z for
+ user-defined expansion. Other letters in use include:
+
+ 'A' Solaris Access Control List
+ 'E' Solaris Extended Attribute File
+ 'I' Inode only, as in 'star'
+ 'N' Obsolete GNU tar, for file names that do not fit into the main header.
+ 'X' POSIX 1003.1-2001 eXtended (VU version) }*/
+
+/*@r{ This is a dir entry that contains the names of files that were in the
+ dir at the time the dump was made. }*/
+#define GNUTYPE_DUMPDIR 'D'
+
+/*@r{ Identifies the *next* file on the tape as having a long linkname. }*/
+#define GNUTYPE_LONGLINK 'K'
+
+/*@r{ Identifies the *next* file on the tape as having a long name. }*/
+#define GNUTYPE_LONGNAME 'L'
+
+/*@r{ This is the continuation of a file that began on another volume. }*/
+#define GNUTYPE_MULTIVOL 'M'
+
+/*@r{ This is for sparse files. }*/
+#define GNUTYPE_SPARSE 'S'
+
+/*@r{ This file is a tape/volume header. Ignore it on extraction. }*/
+#define GNUTYPE_VOLHDR 'V'
+
+/*@r{ Solaris extended header }*/
+#define SOLARIS_XHDTYPE 'X'
+
+/*@r{ J@"org Schilling star header }*/
+
+struct star_header
+@{ /*@r{ byte offset }*/
+ char name[100]; /*@r{ 0 }*/
+ char mode[8]; /*@r{ 100 }*/
+ char uid[8]; /*@r{ 108 }*/
+ char gid[8]; /*@r{ 116 }*/
+ char size[12]; /*@r{ 124 }*/
+ char mtime[12]; /*@r{ 136 }*/
+ char chksum[8]; /*@r{ 148 }*/
+ char typeflag; /*@r{ 156 }*/
+ char linkname[100]; /*@r{ 157 }*/
+ char magic[6]; /*@r{ 257 }*/
+ char version[2]; /*@r{ 263 }*/
+ char uname[32]; /*@r{ 265 }*/
+ char gname[32]; /*@r{ 297 }*/
+ char devmajor[8]; /*@r{ 329 }*/
+ char devminor[8]; /*@r{ 337 }*/
+ char prefix[131]; /*@r{ 345 }*/
+ char atime[12]; /*@r{ 476 }*/
+ char ctime[12]; /*@r{ 488 }*/
+ /*@r{ 500 }*/
+@};
+
+#define SPARSES_IN_STAR_HEADER 4
+#define SPARSES_IN_STAR_EXT_HEADER 21
+
+struct star_in_header
+@{
+ char fill[345]; /*@r{ 0 Everything that is before t_prefix }*/
+ char prefix[1]; /*@r{ 345 t_name prefix }*/
+ char fill2; /*@r{ 346 }*/
+ char fill3[8]; /*@r{ 347 }*/
+ char isextended; /*@r{ 355 }*/
+ struct sparse sp[SPARSES_IN_STAR_HEADER]; /*@r{ 356 }*/
+ char realsize[12]; /*@r{ 452 Actual size of the file }*/
+ char offset[12]; /*@r{ 464 Offset of multivolume contents }*/
+ char atime[12]; /*@r{ 476 }*/
+ char ctime[12]; /*@r{ 488 }*/
+ char mfill[8]; /*@r{ 500 }*/
+ char xmagic[4]; /*@r{ 508 "tar" }*/
+@};
+
+struct star_ext_header
+@{
+ struct sparse sp[SPARSES_IN_STAR_EXT_HEADER];
+ char isextended;
+@};
+