Left: | ||
Right: |
OLD | NEW |
---|---|
1 // Copyright 2009 The Go Authors. All rights reserved. | 1 // Copyright 2009 The Go Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style | 2 // Use of this source code is governed by a BSD-style |
3 // license that can be found in the LICENSE file. | 3 // license that can be found in the LICENSE file. |
4 | 4 |
5 // Package tar implements access to tar archives. | 5 // Package tar implements access to tar archives. |
6 // It aims to cover most of the variations, including those produced | 6 // It aims to cover most of the variations, including those produced |
7 // by GNU and BSD tars. | 7 // by GNU and BSD tars. |
8 // | 8 // |
9 // References: | 9 // References: |
10 // http://www.freebsd.org/cgi/man.cgi?query=tar&sektion=5 | 10 // http://www.freebsd.org/cgi/man.cgi?query=tar&sektion=5 |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
47 Typeflag byte // type of header entry | 47 Typeflag byte // type of header entry |
48 Linkname string // target name of link | 48 Linkname string // target name of link |
49 Uname string // user name of owner | 49 Uname string // user name of owner |
50 Gname string // group name of owner | 50 Gname string // group name of owner |
51 Devmajor int64 // major number of character or block device | 51 Devmajor int64 // major number of character or block device |
52 Devminor int64 // minor number of character or block device | 52 Devminor int64 // minor number of character or block device |
53 AccessTime time.Time // access time | 53 AccessTime time.Time // access time |
54 ChangeTime time.Time // status change time | 54 ChangeTime time.Time // status change time |
55 } | 55 } |
56 | 56 |
57 // FileInfo returns an os.FileInfo for the Header. | |
58 func (h *Header) FileInfo() os.FileInfo { | |
59 return headerFileInfo{h} | |
60 } | |
61 | |
62 // headerFileInfo implements os.FileInfo. | |
63 type headerFileInfo struct { | |
64 h *Header | |
65 } | |
66 | |
67 func (fi headerFileInfo) Name() string { return fi.h.Name } | |
68 func (fi headerFileInfo) Size() int64 { return fi.h.Size } | |
69 func (fi headerFileInfo) IsDir() bool { return fi.Mode().IsDir() } | |
70 func (fi headerFileInfo) ModTime() time.Time { return fi.h.ModTime } | |
71 | |
72 // Mode returns the permission and mode bits for the headerFileInfo. | |
73 func (fi headerFileInfo) Mode() (mode os.FileMode) { | |
74 // Set file permission bits. | |
75 mode = os.FileMode(fi.h.Mode) & os.ModePerm | |
76 | |
77 // Set file mode bits. | |
78 m := os.FileMode(fi.h.Mode) &^ os.ModePerm | |
79 switch { | |
80 case m&c_ISDIR != 0: | |
81 mode |= os.ModeDir | |
82 case m&c_ISFIFO != 0: | |
83 mode |= os.ModeNamedPipe | |
u
2013/02/09 20:21:11
Could someone please verify that os.ModeNamedPipe
| |
84 case m&c_ISREG != 0: | |
85 // regular file | |
u
2013/02/09 20:21:11
Should we remove this nop case?
| |
86 case m&c_ISLNK != 0: | |
87 mode |= os.ModeSymlink | |
88 case m&c_ISBLK != 0: | |
89 mode |= os.ModeDevice | |
90 case m&c_ISCHR != 0: | |
91 mode |= os.ModeDevice | |
92 mode |= os.ModeCharDevice | |
93 case m&c_ISSOCK != 0: | |
94 mode |= os.ModeSocket | |
95 } | |
96 | |
97 switch fi.h.Typeflag { | |
98 case '0', '\x00': | |
99 // regular file | |
u
2013/02/09 20:21:11
Should we remove nop cases ('0', '\x00', '7', 'x',
| |
100 case '1', '2': | |
101 // hard link, symbolic link | |
102 mode |= os.ModeSymlink | |
u
2013/02/09 20:21:11
Is there a way to differentiate a hard link from a
| |
103 case '3': | |
104 // character device node | |
105 mode |= os.ModeDevice | |
106 mode |= os.ModeCharDevice | |
107 case '4': | |
108 // block device node | |
109 mode |= os.ModeDevice | |
110 case '5': | |
111 // directory | |
112 mode |= os.ModeDir | |
113 case '6': | |
114 // fifo node | |
115 mode |= os.ModeNamedPipe | |
u
2013/02/09 20:21:11
Could someone please verify that os.ModeNamedPipe
| |
116 case '7': | |
117 // reserved | |
118 case 'x': | |
119 // extended header | |
120 case 'g': | |
121 // global extended header | |
122 } | |
123 | |
124 return mode | |
125 } | |
126 | |
127 func (fi headerFileInfo) Sys() interface{} { return fi.h } | |
128 | |
57 // sysStat, if non-nil, populates h from system-dependent fields of fi. | 129 // sysStat, if non-nil, populates h from system-dependent fields of fi. |
58 var sysStat func(fi os.FileInfo, h *Header) error | 130 var sysStat func(fi os.FileInfo, h *Header) error |
59 | 131 |
60 // Mode constants from the tar spec. | 132 // Mode constants from the tar spec. |
61 const ( | 133 const ( |
62 c_ISDIR = 040000 | 134 c_ISDIR = 040000 |
63 c_ISFIFO = 010000 | 135 c_ISFIFO = 010000 |
64 c_ISREG = 0100000 | 136 c_ISREG = 0100000 |
65 c_ISLNK = 0120000 | 137 c_ISLNK = 0120000 |
66 c_ISBLK = 060000 | 138 c_ISBLK = 060000 |
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
129 return | 201 return |
130 } | 202 } |
131 | 203 |
132 type slicer []byte | 204 type slicer []byte |
133 | 205 |
134 func (sp *slicer) next(n int) (b []byte) { | 206 func (sp *slicer) next(n int) (b []byte) { |
135 s := *sp | 207 s := *sp |
136 b, *sp = s[0:n], s[n:] | 208 b, *sp = s[0:n], s[n:] |
137 return | 209 return |
138 } | 210 } |
OLD | NEW |