Home | History | Annotate | Download | only in os
      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 
      5 package os
      6 
      7 import (
      8 	"syscall"
      9 	"time"
     10 )
     11 
     12 func 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 
     18 func 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:
     28 		fs.mode |= ModeDevice
     29 	case syscall.S_IFCHR:
     30 		fs.mode |= ModeDevice | ModeCharDevice
     31 	case syscall.S_IFDIR:
     32 		fs.mode |= ModeDir
     33 	case syscall.S_IFIFO:
     34 		fs.mode |= ModeNamedPipe
     35 	case syscall.S_IFLNK:
     36 		fs.mode |= ModeSymlink
     37 	case syscall.S_IFREG:
     38 		// nothing to do
     39 	case syscall.S_IFSOCK:
     40 		fs.mode |= ModeSocket
     41 	}
     42 	if st.Mode&syscall.S_ISGID != 0 {
     43 		fs.mode |= ModeSetgid
     44 	}
     45 	if st.Mode&syscall.S_ISUID != 0 {
     46 		fs.mode |= ModeSetuid
     47 	}
     48 	if st.Mode&syscall.S_ISVTX != 0 {
     49 		fs.mode |= ModeSticky
     50 	}
     51 	return fs
     52 }
     53 
     54 func timespecToTime(ts syscall.Timespec) time.Time {
     55 	return time.Unix(int64(ts.Sec), int64(ts.Nsec))
     56 }
     57 
     58 // For testing.
     59 func atime(fi FileInfo) time.Time {
     60 	return timespecToTime(fi.Sys().(*syscall.Stat_t).Atim)
     61 }
     62