1// Copyright 2009 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. 4 5package os 6 7import ( 8 "syscall" 9 "time" 10) 11 12func sameFile(fs1, fs2 *fileStat) bool { 13 stat1 := fs1.sys.(*syscall.Stat_t) 14 stat2 := fs2.sys.(*syscall.Stat_t) 15 return stat1.Dev == stat2.Dev && stat1.Ino == stat2.Ino 16} 17 18func fileInfoFromStat(st *syscall.Stat_t, name string) FileInfo { 19 fs := &fileStat{ 20 name: basename(name), 21 size: int64(st.Size), 22 modTime: timespecToTime(st.Mtim), 23 sys: st, 24 } 25 fs.mode = FileMode(st.Mode & 0777) 26 switch st.Mode & syscall.S_IFMT { 27 case syscall.S_IFBLK, syscall.S_IFCHR: 28 fs.mode |= ModeDevice 29 case syscall.S_IFDIR: 30 fs.mode |= ModeDir 31 case syscall.S_IFIFO: 32 fs.mode |= ModeNamedPipe 33 case syscall.S_IFLNK: 34 fs.mode |= ModeSymlink 35 case syscall.S_IFREG: 36 // nothing to do 37 case syscall.S_IFSOCK: 38 fs.mode |= ModeSocket 39 } 40 if st.Mode&syscall.S_ISGID != 0 { 41 fs.mode |= ModeSetgid 42 } 43 if st.Mode&syscall.S_ISUID != 0 { 44 fs.mode |= ModeSetuid 45 } 46 return fs 47} 48 49func timespecToTime(ts syscall.Timespec) time.Time { 50 return time.Unix(int64(ts.Sec), int64(ts.Nsec)) 51} 52 53// For testing. 54func atime(fi FileInfo) time.Time { 55 return timespecToTime(fi.Sys().(*syscall.Stat_t).Atim) 56} 57