xref: /aosp_15_r20/external/lzma/CPP/7zip/Archive/Tar/TarHeader.cpp (revision f6dc9357d832569d4d1f5d24eacdb3935a1ae8e6)
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