]> Dogcows Code - chaz/tar/blobdiff - src/tar.h
Update copyright years.
[chaz/tar] / src / tar.h
index 271410955e1d1ec9ee0b6d50ef426f6dc837406a..cb7d70cf62534c268b5e1b04f85d985ae6e78f31 100644 (file)
--- a/src/tar.h
+++ b/src/tar.h
@@ -1,32 +1,22 @@
-/* Format of tar archives.
-   Copyright (C) 1988, 92, 93, 94, 96, 97 Free Software Foundation, Inc.
+/* GNU tar Archive Format description.
 
-   This program is free software; you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published by the
-   Free Software Foundation; either version 2, or (at your option) any later
-   version.
+   Copyright 1988-1989, 1991-1997, 2000-2001, 2003-2007, 2012-2014 Free
+   Software Foundation, Inc.
 
-   This program is distributed in the hope that it will be useful, but
-   WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General
-   Public License for more details.
+   This file is part of GNU tar.
 
-   You should have received a copy of the GNU General Public License along
-   with this program; if not, write to the Free Software Foundation, Inc.,
-   59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
+   GNU tar is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
 
-/* GNU tar Archive Format description.  */
+   GNU tar is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
 
-/* If OLDGNU_COMPATIBILITY is not zero, tar produces archives which, by
-   default, are readable by older versions of GNU tar.  This can be
-   overriden by using --posix; in this case, POSIXLY_CORRECT in environment
-   may be set for enforcing stricter conformance.  If OLDGNU_COMPATIBILITY
-   is zero or undefined, tar will eventually produces archives which, by
-   default, POSIX compatible; then either using --posix or defining
-   POSIXLY_CORRECT enforces stricter conformance.
-
-   This #define will disappear in a few years.  FP, June 1995.  */
-#define OLDGNU_COMPATIBILITY 1
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
 
 /* tar Header Block, from POSIX 1003.1-1990.  */
 
@@ -69,6 +59,10 @@ struct posix_header
 #define FIFOTYPE '6'           /* FIFO special */
 #define CONTTYPE '7'           /* reserved */
 
+#define XHDTYPE  'x'            /* Extended header referring to the
+                                  next file in the archive */
+#define XGLTYPE  'g'            /* Global extended header */
+
 /* Bits used in the mode field, values in octal.  */
 #define TSUID    04000         /* set UID on execution */
 #define TSGID    02000         /* set GID on execution */
@@ -87,9 +81,9 @@ struct posix_header
 /* tar Header Block, GNU extensions.  */
 
 /* In GNU tar, SYMTYPE is for to symbolic links, and CONTTYPE is for
-   contiguous files, so maybe disobeying the `reserved' comment in POSIX
+   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.  */
+   should not have really been "reserved" in the published standards.  */
 
 /* *BEWARE* *BEWARE* *BEWARE* that the following information is still
    boiling, and may change.  Even if the OLDGNU format description should be
@@ -122,26 +116,6 @@ struct sparse
 #define SPARSES_IN_OLDGNU_HEADER 4
 #define SPARSES_IN_SPARSE_HEADER 21
 
-/* The GNU extra header contains some information GNU tar needs, but not
-   foreseen in POSIX header format.  It is only used after a POSIX header
-   (and never with old GNU headers), and immediately follows this POSIX
-   header, when typeflag is a letter rather than a digit, so signaling a GNU
-   extension.  */
-
-struct extra_header
-{                              /* byte offset */
-  char atime[12];              /*   0 */
-  char ctime[12];              /*  12 */
-  char offset[12];             /*  24 */
-  char realsize[12];           /*  36 */
-  char longnames[4];           /*  48 */
-  char unused_pad1[68];                /*  52 */
-  struct sparse sp[SPARSES_IN_EXTRA_HEADER];
-                               /* 120 */
-  char isextended;             /* 504 */
-                               /* 505 */
-};
-
 /* 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
@@ -166,15 +140,17 @@ struct sparse_header
 struct oldgnu_header
 {                              /* byte offset */
   char unused_pad1[345];       /*   0 */
-  char atime[12];              /* 345 */
-  char ctime[12];              /* 357 */
-  char offset[12];             /* 369 */
-  char longnames[4];           /* 381 */
+  char atime[12];              /* 345 Incr. archive: atime of the file */
+  char ctime[12];              /* 357 Incr. archive: ctime of the file */
+  char offset[12];             /* 369 Multivolume archive: the offset of
+                                  the start of this volume */
+  char longnames[4];           /* 381 Not used */
   char unused_pad2;            /* 385 */
   struct sparse sp[SPARSES_IN_OLDGNU_HEADER];
                                /* 386 */
-  char isextended;             /* 482 */
-  char realsize[12];           /* 483 */
+  char isextended;             /* 482 Sparse file: Extension sparse header
+                                  follows */
+  char realsize[12];           /* 483 Sparse file: Real size*/
                                /* 495 */
 };
 
@@ -185,7 +161,13 @@ struct oldgnu_header
 #define OLDGNU_MAGIC "ustar  " /* 7 chars and a null */
 
 /* The standards committee allows only capital A through capital Z for
-   user-defined expansion.  */
+   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)  */
 
 /* This is a dir entry that contains the names of files that were in the
    dir at the time the dump was made.  */
@@ -200,15 +182,68 @@ struct oldgnu_header
 /* This is the continuation of a file that began on another volume.  */
 #define GNUTYPE_MULTIVOL 'M'
 
-/* For storing filenames that do not fit into the main header.  */
-#define GNUTYPE_NAMES 'N'
-
 /* This is for sparse files.  */
 #define GNUTYPE_SPARSE 'S'
 
 /* This file is a tape/volume header.  Ignore it on extraction.  */
 #define GNUTYPE_VOLHDR 'V'
 
+/* Solaris extended header */
+#define SOLARIS_XHDTYPE 'X'
+
+/* J@"org Schilling star header */
+
+struct star_header
+{                              /* byte offset */
+  char name[100];              /*   0 */
+  char mode[8];                        /* 100 */
+  char uid[8];                 /* 108 */
+  char gid[8];                 /* 116 */
+  char size[12];               /* 124 */
+  char mtime[12];              /* 136 */
+  char chksum[8];              /* 148 */
+  char typeflag;               /* 156 */
+  char linkname[100];          /* 157 */
+  char magic[6];               /* 257 */
+  char version[2];             /* 263 */
+  char uname[32];              /* 265 */
+  char gname[32];              /* 297 */
+  char devmajor[8];            /* 329 */
+  char devminor[8];            /* 337 */
+  char prefix[131];            /* 345 */
+  char atime[12];               /* 476 */
+  char ctime[12];               /* 488 */
+                                /* 500 */
+};
+
+#define SPARSES_IN_STAR_HEADER      4
+#define SPARSES_IN_STAR_EXT_HEADER  21
+
+struct star_in_header
+{
+  char fill[345];       /*   0  Everything that is before t_prefix */
+  char prefix[1];       /* 345  t_name prefix */
+  char fill2;           /* 346  */
+  char fill3[8];        /* 347  */
+  char isextended;      /* 355  */
+  struct sparse sp[SPARSES_IN_STAR_HEADER]; /* 356  */
+  char realsize[12];    /* 452  Actual size of the file */
+  char offset[12];      /* 464  Offset of multivolume contents */
+  char atime[12];       /* 476  */
+  char ctime[12];       /* 488  */
+  char mfill[8];        /* 500  */
+  char xmagic[4];       /* 508  "tar" */
+};
+
+struct star_ext_header
+{
+  struct sparse sp[SPARSES_IN_STAR_EXT_HEADER];
+  char isextended;
+};
+
+/* END */
+\f
+
 /* tar Header Block, overall structure.  */
 
 /* tar files are made in basic blocks of this size.  */
@@ -219,17 +254,119 @@ enum archive_format
   DEFAULT_FORMAT,              /* format to be decided later */
   V7_FORMAT,                   /* old V7 tar format */
   OLDGNU_FORMAT,               /* GNU format as per before tar 1.12 */
-  POSIX_FORMAT,                        /* restricted, pure POSIX format */
-  GNU_FORMAT                   /* POSIX format with GNU extensions */
+  USTAR_FORMAT,                 /* POSIX.1-1988 (ustar) format */
+  POSIX_FORMAT,                        /* POSIX.1-2001 format */
+  STAR_FORMAT,                  /* Star format defined in 1994 */
+  GNU_FORMAT                   /* Same as OLDGNU_FORMAT with one exception:
+                                   see FIXME note for to_chars() function
+                                   (create.c:189) */
+};
+
+/* Information about a sparse file.  */
+struct sp_array
+{
+  off_t offset;
+  off_t numbytes;
+};
+
+struct xheader
+{
+  struct obstack *stk;
+  size_t size;
+  char *buffer;
+  uintmax_t string_length;
+};
+
+/* Information about xattrs for a file.  */
+struct xattr_array
+  {
+    char *xkey;
+    char *xval_ptr;
+    size_t xval_len;
+  };
+
+struct tar_stat_info
+{
+  char *orig_file_name;     /* name of file read from the archive header */
+  char *file_name;          /* name of file for the current archive entry
+                              after being normalized.  */
+  bool had_trailing_slash;  /* true if the current archive entry had a
+                              trailing slash before it was normalized. */
+  char *link_name;          /* name of link for the current archive entry.  */
+
+  char          *uname;     /* user name of owner */
+  char          *gname;     /* group name of owner */
+
+  char *cntx_name;          /* SELinux context for the current archive entry. */
+
+  char *acls_a_ptr;         /* Access ACLs for the current archive entry. */
+  size_t acls_a_len;        /* Access ACLs for the current archive entry. */
+
+  char *acls_d_ptr;         /* Default ACLs for the current archive entry. */
+  size_t acls_d_len;        /* Default ACLs for the current archive entry. */
+
+  struct stat   stat;       /* regular filesystem stat */
+
+  /* STAT doesn't always have access, data modification, and status
+     change times in a convenient form, so store them separately.  */
+  struct timespec atime;
+  struct timespec mtime;
+  struct timespec ctime;
+
+  off_t archive_file_size;  /* Size of file as stored in the archive.
+                              Equals stat.st_size for non-sparse files */
+
+  bool   is_sparse;         /* Is the file sparse */
+
+  /* For sparse files: */
+  unsigned sparse_major;
+  unsigned sparse_minor;
+  size_t sparse_map_avail;  /* Index to the first unused element in
+                              sparse_map array. Zero if the file is
+                              not sparse */
+  size_t sparse_map_size;   /* Size of the sparse map */
+  struct sp_array *sparse_map;
+
+  size_t xattr_map_size;   /* Size of the xattr map */
+  struct xattr_array *xattr_map;
+
+  /* Extended headers */
+  struct xheader xhdr;
+
+  /* For dumpdirs */
+  bool is_dumpdir;          /* Is the member a dumpdir? */
+  bool skipped;             /* The member contents is already read
+                              (for GNUTYPE_DUMPDIR) */
+  char *dumpdir;            /* Contents of the dump directory */
+
+  /* Parent directory, if creating an archive.  This is null if the
+     file is at the top level.  */
+  struct tar_stat_info *parent;
+
+  /* Directory stream.  If this is not null, it is in control of FD,
+     and should be closed instead of FD.  */
+  DIR *dirstream;
+
+  /* File descriptor, if creating an archive, and if a directory or a
+     regular file or a contiguous file.
+
+     It is zero if no file descriptor is available, either because it
+     was never needed or because it was open and then closed to
+     conserve on file descriptors.  (Standard input is never used
+     here, so zero cannot be a valid file descriptor.)
+
+     It is negative if it could not be reopened after it was closed.
+     Negate it to find out what errno was when the reopen failed.  */
+  int fd;
 };
 
 union block
 {
   char buffer[BLOCKSIZE];
   struct posix_header header;
-  struct extra_header extra_header;
+  struct star_header star_header;
   struct oldgnu_header oldgnu_header;
   struct sparse_header sparse_header;
+  struct star_in_header star_in_header;
+  struct star_ext_header star_ext_header;
 };
-
-/* End of Format description.  */
This page took 0.022167 seconds and 4 git commands to generate.