Rietveld Code Review Tool
Help | Bug tracker | Discussion group | Source code | Sign in
(118)

Side by Side Diff: src/pkg/archive/tar/common.go

Issue 7305072: code review 7305072: archive/tar: add Header.FileInfo method. Add more cases... (Closed)
Patch Set: diff -r 85d759cdb33d https://code.google.com/p/go Created 11 years, 1 month ago
Left:
Right:
Use n/p to move between diff chunks; N/P to move between comments. Please Sign in to add in-line comments.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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 }
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
RSS Feeds Recent Issues | This issue
This is Rietveld f62528b