| // Copyright 2009 The Go Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style | |
| // license that can be found in the LICENSE file. | |
| package os | |
| import ( | |
| "syscall" | |
| "time" | |
| ) | |
| func fillFileStatFromSys(fs *fileStat, name string) { | |
| fs.name = basename(name) | |
| fs.size = int64(fs.sys.Size) | |
| fs.modTime = timespecToTime(fs.sys.Mtim) | |
| fs.mode = FileMode(fs.sys.Mode & 0777) | |
| switch fs.sys.Mode & syscall.S_IFMT { | |
| case syscall.S_IFBLK: | |
| fs.mode |= ModeDevice | |
| case syscall.S_IFCHR: | |
| fs.mode |= ModeDevice | ModeCharDevice | |
| case syscall.S_IFDIR: | |
| fs.mode |= ModeDir | |
| case syscall.S_IFIFO: | |
| fs.mode |= ModeNamedPipe | |
| case syscall.S_IFLNK: | |
| fs.mode |= ModeSymlink | |
| case syscall.S_IFREG: | |
| // nothing to do | |
| case syscall.S_IFSOCK: | |
| fs.mode |= ModeSocket | |
| } | |
| if fs.sys.Mode&syscall.S_ISGID != 0 { | |
| fs.mode |= ModeSetgid | |
| } | |
| if fs.sys.Mode&syscall.S_ISUID != 0 { | |
| fs.mode |= ModeSetuid | |
| } | |
| if fs.sys.Mode&syscall.S_ISVTX != 0 { | |
| fs.mode |= ModeSticky | |
| } | |
| } | |
| func timespecToTime(ts syscall.Timespec) time.Time { | |
| return time.Unix(int64(ts.Sec), int64(ts.Nsec)) | |
| } | |
| // For testing. | |
| func atime(fi FileInfo) time.Time { | |
| return timespecToTime(fi.Sys().(*syscall.Stat_t).Atim) | |
| } |