X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=src%2Ftar.h;h=c35ba5dd115ccb80f162815a9bd5bc66e2dd50e7;hb=de328a580ab6f5ff4a3237ce21f1ef0b7dd12984;hp=3e958ec80086a526560e4f31c33486cc528a5a06;hpb=d659cbaccdc1f3279c49107cf15f15a639738529;p=chaz%2Ftar diff --git a/src/tar.h b/src/tar.h index 3e958ec..c35ba5d 100644 --- a/src/tar.h +++ b/src/tar.h @@ -1,11 +1,11 @@ /* GNU tar Archive Format description. Copyright (C) 1988, 1989, 1991, 1992, 1993, 1994, 1995, 1996, 1997, - 2000, 2001, 2003, 2004, 2005 Free Software Foundation, Inc. + 2000, 2001, 2003, 2004, 2005, 2006, 2007 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 + Free Software Foundation; either version 3, or (at your option) any later version. This program is distributed in the hope that it will be useful, but @@ -165,6 +165,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 @@ -180,9 +181,6 @@ 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' @@ -192,8 +190,7 @@ struct oldgnu_header /* Solaris extended header */ #define SOLARIS_XHDTYPE 'X' - -/* Jörg Schilling star header */ +/* J@"org Schilling star header */ struct star_header { /* byte offset */ @@ -221,7 +218,8 @@ struct star_header #define SPARSES_IN_STAR_HEADER 4 #define SPARSES_IN_STAR_EXT_HEADER 21 -struct star_in_header { +struct star_in_header +{ char fill[345]; /* 0 Everything that is before t_prefix */ char prefix[1]; /* 345 t_name prefix */ char fill2; /* 346 */ @@ -236,11 +234,13 @@ struct star_in_header { char xmagic[4]; /* 508 "tar" */ }; -struct star_ext_header { +struct star_ext_header +{ struct sparse sp[SPARSES_IN_STAR_EXT_HEADER]; char isextended; }; +/* END */ /* tar Header Block, overall structure. */ @@ -263,17 +263,25 @@ enum archive_format /* Information about a sparse file. */ struct sp_array - { - off_t offset; - size_t numbytes; - }; +{ + off_t offset; + off_t numbytes; +}; + +struct xheader +{ + struct obstack *stk; + size_t size; + char *buffer; + uintmax_t string_length; +}; 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. */ @@ -281,16 +289,46 @@ struct tar_stat_info char *gname; /* group name of owner */ 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; + + /* 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; + + /* File descriptor, if creating an archive, and if a directory or a + regular file or a contiguous file. This is AT_FDCWD if it is the + working directory, which is possible only for a dummy parent node + just above the top level. It may be -1 if the file could not be + opened. Zero represents an otherwise-uninitialized value; + standard input is never used here. */ + int fd; }; union block @@ -303,5 +341,3 @@ union block struct star_in_header star_in_header; struct star_ext_header star_ext_header; }; - -/* End of Format description. */