1 // Copyright 2011 The Go Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style
3 // license that can be found in the LICENSE file.
14 func fileInfoFromStat(d
*syscall
.Dir
) FileInfo
{
18 modTime
: time
.Unix(int64(d
.Mtime
), 0),
21 fs
.mode
= FileMode(d
.Mode
& 0777)
22 if d
.Mode
&syscall
.DMDIR
!= 0 {
25 if d
.Mode
&syscall
.DMAPPEND
!= 0 {
28 if d
.Mode
&syscall
.DMEXCL
!= 0 {
29 fs
.mode |
= ModeExclusive
31 if d
.Mode
&syscall
.DMTMP
!= 0 {
32 fs
.mode |
= ModeTemporary
34 // Consider all files not served by #M as device files.
41 // arg is an open *File or a path string.
42 func dirstat(arg
interface{}) (*syscall
.Dir
, error
) {
46 size
:= syscall
.STATFIXLEN
+ 16*4
48 for i
:= 0; i
< 2; i
++ {
49 buf
:= make([]byte, _BIT16SZ
+size
)
52 switch a
:= arg
.(type) {
55 n
, err
= syscall
.Fstat(a
.fd
, buf
)
58 n
, err
= syscall
.Stat(a
, buf
)
60 panic("phase error in dirstat")
64 return nil, &PathError
{"stat", name
, err
}
67 // Pull the real size out of the stat message.
68 size
= int(uint16(buf
[0]) |
uint16(buf
[1])<<8)
70 // If the stat message is larger than our buffer we will
71 // go around the loop and allocate one that is big enough.
73 d
, err
:= syscall
.UnmarshalDir(buf
[:n
])
75 return nil, &PathError
{"stat", name
, err
}
83 err
= syscall
.ErrBadStat
86 return nil, &PathError
{"stat", name
, err
}
89 // statNolog implements Stat for Plan 9.
90 func statNolog(name
string) (FileInfo
, error
) {
91 d
, err
:= dirstat(name
)
95 return fileInfoFromStat(d
), nil
98 // lstatNolog implements Lstat for Plan 9.
99 func lstatNolog(name
string) (FileInfo
, error
) {
100 return statNolog(name
)
104 func atime(fi FileInfo
) time
.Time
{
105 return time
.Unix(int64(fi
.Sys().(*syscall
.Dir
).Atime
), 0)