1
2
3
4
5
6
7
8
9
10
11
12 package tar
13
14 const (
15 blockSize = 512
16
17
18 TypeReg = '0'
19 TypeRegA = '\x00'
20 TypeLink = '1'
21 TypeSymlink = '2'
22 TypeChar = '3'
23 TypeBlock = '4'
24 TypeDir = '5'
25 TypeFifo = '6'
26 TypeCont = '7'
27 TypeXHeader = 'x'
28 TypeXGlobalHeader = 'g'
29 )
30
31
32
33 type Header struct {
34 Name string
35 Mode int64
36 Uid int
37 Gid int
38 Size int64
39 Mtime int64
40 Typeflag byte
41 Linkname string
42 Uname string
43 Gname string
44 Devmajor int64
45 Devminor int64
46 Atime int64
47 Ctime int64
48 }
49
50 var zeroBlock = make([]byte, blockSize)
51
52
53
54 func checksum(header []byte) (unsigned int64, signed int64) {
55 for i := 0; i < len(header); i++ {
56 if i == 148 {
57
58 unsigned += ' ' * 8
59 signed += ' ' * 8
60 i += 7
61 continue
62 }
63 unsigned += int64(header[i])
64 signed += int64(int8(header[i]))
65 }
66 return
67 }
68
69 type slicer []byte
70
71 func (sp *slicer) next(n int) (b []byte) {
72 s := *sp
73 b, *sp = s[0:n], s[n:]
74 return
75 }