1*f6dc9357SAndroid Build Coastguard Worker // Archive/TarHeader.cpp 2*f6dc9357SAndroid Build Coastguard Worker 3*f6dc9357SAndroid Build Coastguard Worker #include "StdAfx.h" 4*f6dc9357SAndroid Build Coastguard Worker 5*f6dc9357SAndroid Build Coastguard Worker #include "TarHeader.h" 6*f6dc9357SAndroid Build Coastguard Worker 7*f6dc9357SAndroid Build Coastguard Worker namespace NArchive { 8*f6dc9357SAndroid Build Coastguard Worker namespace NTar { 9*f6dc9357SAndroid Build Coastguard Worker namespace NFileHeader { 10*f6dc9357SAndroid Build Coastguard Worker 11*f6dc9357SAndroid Build Coastguard Worker const char * const kLongLink = "././@LongLink"; 12*f6dc9357SAndroid Build Coastguard Worker const char * const kLongLink2 = "@LongLink"; 13*f6dc9357SAndroid Build Coastguard Worker 14*f6dc9357SAndroid Build Coastguard Worker // The magic field is filled with this if uname and gname are valid. 15*f6dc9357SAndroid Build Coastguard Worker namespace NMagic 16*f6dc9357SAndroid Build Coastguard Worker { 17*f6dc9357SAndroid Build Coastguard Worker // const char * const kUsTar = "ustar"; // 5 chars 18*f6dc9357SAndroid Build Coastguard Worker // const char * const kGNUTar = "GNUtar "; // 7 chars and a null 19*f6dc9357SAndroid Build Coastguard Worker // const char * const kEmpty = "\0\0\0\0\0\0\0\0"; 20*f6dc9357SAndroid Build Coastguard Worker // 7-Zip used kUsTar_00 before 21.07: 21*f6dc9357SAndroid Build Coastguard Worker const char k_Posix_ustar_00[8] = { 'u', 's', 't', 'a', 'r', 0, '0', '0' } ; 22*f6dc9357SAndroid Build Coastguard Worker // GNU TAR uses such header: 23*f6dc9357SAndroid Build Coastguard Worker const char k_GNU_ustar[8] = { 'u', 's', 't', 'a', 'r', ' ', ' ', 0 } ; 24*f6dc9357SAndroid Build Coastguard Worker } 25*f6dc9357SAndroid Build Coastguard Worker 26*f6dc9357SAndroid Build Coastguard Worker /* 27*f6dc9357SAndroid Build Coastguard Worker pre-POSIX.1-1988 (i.e. v7) tar header: 28*f6dc9357SAndroid Build Coastguard Worker ----- 29*f6dc9357SAndroid Build Coastguard Worker Link indicator: 30*f6dc9357SAndroid Build Coastguard Worker '0' or 0 : Normal file 31*f6dc9357SAndroid Build Coastguard Worker '1' : Hard link 32*f6dc9357SAndroid Build Coastguard Worker '2' : Symbolic link 33*f6dc9357SAndroid Build Coastguard Worker Some pre-POSIX.1-1988 tar implementations indicated a directory by having 34*f6dc9357SAndroid Build Coastguard Worker a trailing slash (/) in the name. 35*f6dc9357SAndroid Build Coastguard Worker 36*f6dc9357SAndroid Build Coastguard Worker Numeric values : octal with leading zeroes. 37*f6dc9357SAndroid Build Coastguard Worker For historical reasons, a final NUL or space character should also be used. 38*f6dc9357SAndroid Build Coastguard Worker Thus only 11 octal digits can be stored from 12 bytes field. 39*f6dc9357SAndroid Build Coastguard Worker 40*f6dc9357SAndroid Build Coastguard Worker 2001 star : introduced a base-256 coding that is indicated by 41*f6dc9357SAndroid Build Coastguard Worker setting the high-order bit of the leftmost byte of a numeric field. 42*f6dc9357SAndroid Build Coastguard Worker GNU-tar and BSD-tar followed this idea. 43*f6dc9357SAndroid Build Coastguard Worker 44*f6dc9357SAndroid Build Coastguard Worker versions of tar from before the first POSIX standard from 1988 45*f6dc9357SAndroid Build Coastguard Worker pad the values with spaces instead of zeroes. 46*f6dc9357SAndroid Build Coastguard Worker 47*f6dc9357SAndroid Build Coastguard Worker UStar 48*f6dc9357SAndroid Build Coastguard Worker ----- 49*f6dc9357SAndroid Build Coastguard Worker UStar (Unix Standard TAR) : POSIX IEEE P1003.1 : 1988. 50*f6dc9357SAndroid Build Coastguard Worker 257 signature: "ustar", 0, "00" 51*f6dc9357SAndroid Build Coastguard Worker 265 32 Owner user name 52*f6dc9357SAndroid Build Coastguard Worker 297 32 Owner group name 53*f6dc9357SAndroid Build Coastguard Worker 329 8 Device major number 54*f6dc9357SAndroid Build Coastguard Worker 337 8 Device minor number 55*f6dc9357SAndroid Build Coastguard Worker 345 155 Filename prefix 56*f6dc9357SAndroid Build Coastguard Worker 57*f6dc9357SAndroid Build Coastguard Worker POSIX.1-2001/pax 58*f6dc9357SAndroid Build Coastguard Worker ---- 59*f6dc9357SAndroid Build Coastguard Worker format is known as extended tar format or pax format 60*f6dc9357SAndroid Build Coastguard Worker vendor-tagged vendor-specific enhancements. 61*f6dc9357SAndroid Build Coastguard Worker tags Defined by the POSIX standard: 62*f6dc9357SAndroid Build Coastguard Worker atime, mtime, path, linkpath, uname, gname, size, uid, gid, ... 63*f6dc9357SAndroid Build Coastguard Worker 64*f6dc9357SAndroid Build Coastguard Worker 65*f6dc9357SAndroid Build Coastguard Worker PAX EXTENSION 66*f6dc9357SAndroid Build Coastguard Worker ----------- 67*f6dc9357SAndroid Build Coastguard Worker Hard links 68*f6dc9357SAndroid Build Coastguard Worker A further difference from the ustar header block is that data blocks 69*f6dc9357SAndroid Build Coastguard Worker for files of typeflag 1 (hard link) may be included, 70*f6dc9357SAndroid Build Coastguard Worker which means that the size field may be greater than zero. 71*f6dc9357SAndroid Build Coastguard Worker Archives created by pax -o linkdata shall include these data 72*f6dc9357SAndroid Build Coastguard Worker blocks with the hard links. 73*f6dc9357SAndroid Build Coastguard Worker * 74*f6dc9357SAndroid Build Coastguard Worker 75*f6dc9357SAndroid Build Coastguard Worker compatiblity 76*f6dc9357SAndroid Build Coastguard Worker ------------ 77*f6dc9357SAndroid Build Coastguard Worker 7-Zip 16.03 supports "PaxHeader/" 78*f6dc9357SAndroid Build Coastguard Worker 7-Zip 20.01 supports "PaxHeaders.X/" with optional "./" 79*f6dc9357SAndroid Build Coastguard Worker 7-Zip 21.02 supports "@PaxHeader" with optional "./" "./" 80*f6dc9357SAndroid Build Coastguard Worker 81*f6dc9357SAndroid Build Coastguard Worker GNU tar --format=posix uses "PaxHeaders/" in folder of file 82*f6dc9357SAndroid Build Coastguard Worker 83*f6dc9357SAndroid Build Coastguard Worker 84*f6dc9357SAndroid Build Coastguard Worker GNU TAR format 85*f6dc9357SAndroid Build Coastguard Worker ============== 86*f6dc9357SAndroid Build Coastguard Worker v7 - Unix V7 87*f6dc9357SAndroid Build Coastguard Worker oldgnu - GNU tar <=1.12 : writes zero in last character in name 88*f6dc9357SAndroid Build Coastguard Worker gnu - GNU tar 1.13 : doesn't write zero in last character in name 89*f6dc9357SAndroid Build Coastguard Worker as 7-zip 21.07 90*f6dc9357SAndroid Build Coastguard Worker ustar - POSIX.1-1988 91*f6dc9357SAndroid Build Coastguard Worker posix (pax) - POSIX.1-2001 92*f6dc9357SAndroid Build Coastguard Worker 93*f6dc9357SAndroid Build Coastguard Worker gnu tar: 94*f6dc9357SAndroid Build Coastguard Worker if (S_ISCHR (st->stat.st_mode) || S_ISBLK (st->stat.st_mode)) { 95*f6dc9357SAndroid Build Coastguard Worker major_t devmajor = major (st->stat.st_rdev); 96*f6dc9357SAndroid Build Coastguard Worker minor_t devminor = minor (st->stat.st_rdev); } 97*f6dc9357SAndroid Build Coastguard Worker */ 98*f6dc9357SAndroid Build Coastguard Worker 99*f6dc9357SAndroid Build Coastguard Worker }}} 100