X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=src%2Ftar.h;h=70055af214330b8fda18e24ef035a84eb24703d8;hb=a09e840507c16357ec11b17a02e103c3a26adebc;hp=6a5d4823cec34e4e8eb9beb3d15a8a98ee263347;hpb=040bc32535c71473a2afc170f73c55b85d86cc93;p=chaz%2Ftar diff --git a/src/tar.h b/src/tar.h index 6a5d482..70055af 100644 --- a/src/tar.h +++ b/src/tar.h @@ -1,21 +1,22 @@ /* GNU tar Archive Format description. - Copyright (C) 1988, 1989, 1991, 1992, 1993, 1994, 1995, 1996, 1997, - 2000, 2001, 2003 Free Software Foundation, Inc. + Copyright 1988-1989, 1991-1997, 2000-2001, 2003-2007, 2012-2013 + Free Software Foundation, Inc. - 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. + This file is part of GNU tar. - 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. + 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. - 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 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. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ /* tar Header Block, from POSIX 1003.1-1990. */ @@ -42,29 +43,6 @@ struct posix_header /* 500 */ }; -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 TMAGIC "ustar" /* ustar and a null */ #define TMAGLEN 6 #define TVERSION "00" /* 00 and no null */ @@ -103,9 +81,9 @@ struct star_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 @@ -162,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 */ }; @@ -186,6 +166,7 @@ struct oldgnu_header '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 @@ -201,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 */ + + /* tar Header Block, overall structure. */ /* tar files are made in basic blocks of this size. */ @@ -223,23 +257,107 @@ enum archive_format USTAR_FORMAT, /* POSIX.1-1988 (ustar) format */ POSIX_FORMAT, /* POSIX.1-2001 format */ STAR_FORMAT, /* Star format defined in 1994 */ - GNU_FORMAT /* POSIX format with GNU extensions */ + 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. */ - int had_trailing_slash; /* nonzero if the current archive entry had a + 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. */ - unsigned int devminor; /* device minor number */ - unsigned int devmajor; /* device major number */ char *uname; /* user name of owner */ char *gname; /* group name of owner */ - struct stat stat; /* regular filesystem stat */ + + 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 @@ -249,6 +367,6 @@ union block 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. */