1 // field paths that every tar file must have.
2 // header is padded to 512 bytes.
5 , path = fields.path = f++
6 , mode = fields.mode = f++
7 , uid = fields.uid = f++
8 , gid = fields.gid = f++
9 , size = fields.size = f++
10 , mtime = fields.mtime = f++
11 , cksum = fields.cksum = f++
12 , type = fields.type = f++
13 , linkpath = fields.linkpath = f++
26 fieldSize[linkpath] = 100
28 // "ustar\0" may introduce another bunch of headers.
29 // these are optional, and will be nulled out if not present.
31 var ustar = fields.ustar = f++
32 , ustarver = fields.ustarver = f++
33 , uname = fields.uname = f++
34 , gname = fields.gname = f++
35 , devmaj = fields.devmaj = f++
36 , devmin = fields.devmin = f++
37 , prefix = fields.prefix = f++
38 , fill = fields.fill = f++
44 fieldSize[ustarver] = 2
49 fieldSize[prefix] = 155
52 // nb: prefix field may in fact be 130 bytes of prefix,
53 // a null char, 12 bytes for atime, 12 bytes for ctime.
55 // To recognize this format:
56 // 1. prefix[130] === ' ' or '\0'
57 // 2. atime and ctime are octal numeric values
58 // 3. atime and ctime have ' ' in their last byte
63 for (var i = 0; i < f; i ++) {
65 fieldEnds[i] = (fe += fieldSize[i])
68 // build a translation table of field paths.
69 Object.keys(fields).forEach(function (f) {
70 if (fields[f] !== null) fields[fields[f]] = f
73 // different values of the 'type' field
74 // paths match the values of Stats.isX() functions, where appropriate
77 , "\0": "OldFile" // like 0
81 , 3: "CharacterDevice"
85 , 7: "ContiguousFile" // like 0
87 , g: "GlobalExtendedHeader" // k=v for the rest of the archive
88 , x: "ExtendedHeader" // k=v for the next file
89 // vendor-specific stuff
90 , A: "SolarisACL" // skip
91 , D: "GNUDumpDir" // like 5, but with data, which should be skipped
92 , I: "Inode" // metadata only, skip
93 , K: "NextFileHasLongLinkpath" // data = link path of next file
94 , L: "NextFileHasLongPath" // data = path of next file
95 , M: "ContinuationFile" // skip
96 , N: "OldGnuLongPath" // like L
97 , S: "SparseFile" // skip
98 , V: "TapeVolumeHeader" // skip
99 , X: "OldExtendedHeader" // like x
102 Object.keys(types).forEach(function (t) {
103 types[types[t]] = types[types[t]] || t
106 // values for the mode field
108 { suid: 04000 // set uid on extraction
109 , sgid: 02000 // set gid on extraction
110 , svtx: 01000 // set restricted deletion flag on dirs on extraction
139 Object.keys(modes).forEach(function (t) {
140 modes[modes[t]] = modes[modes[t]] || t
160 exports.fields = fields
161 exports.fieldSize = fieldSize
162 exports.fieldOffs = fieldOffs
163 exports.fieldEnds = fieldEnds
164 exports.types = types
165 exports.modes = modes
166 exports.numeric = numeric
167 exports.headerSize = headerSize
168 exports.blockSize = blockSize
169 exports.knownExtended = knownExtended
171 exports.Pack = require("./lib/pack.js")
172 exports.Parse = require("./lib/parse.js")
173 exports.Extract = require("./lib/extract.js")