github.com/tetratelabs/wazero@v1.2.1/internal/sysfs/stat_bsd.go (about) 1 //go:build (amd64 || arm64) && (darwin || freebsd) 2 3 package sysfs 4 5 import ( 6 "io/fs" 7 "os" 8 "syscall" 9 10 "github.com/tetratelabs/wazero/internal/fsapi" 11 "github.com/tetratelabs/wazero/internal/platform" 12 ) 13 14 func lstat(path string) (fsapi.Stat_t, syscall.Errno) { 15 if t, err := os.Lstat(path); err != nil { 16 return fsapi.Stat_t{}, platform.UnwrapOSError(err) 17 } else { 18 return statFromFileInfo(t), 0 19 } 20 } 21 22 func stat(path string) (fsapi.Stat_t, syscall.Errno) { 23 if t, err := os.Stat(path); err != nil { 24 return fsapi.Stat_t{}, platform.UnwrapOSError(err) 25 } else { 26 return statFromFileInfo(t), 0 27 } 28 } 29 30 func statFile(f *os.File) (fsapi.Stat_t, syscall.Errno) { 31 return defaultStatFile(f) 32 } 33 34 func inoFromFileInfo(_ string, t fs.FileInfo) (ino uint64, err syscall.Errno) { 35 if d, ok := t.Sys().(*syscall.Stat_t); ok { 36 ino = d.Ino 37 } 38 return 39 } 40 41 func statFromFileInfo(t fs.FileInfo) fsapi.Stat_t { 42 if d, ok := t.Sys().(*syscall.Stat_t); ok { 43 st := fsapi.Stat_t{} 44 st.Dev = uint64(d.Dev) 45 st.Ino = d.Ino 46 st.Uid = d.Uid 47 st.Gid = d.Gid 48 st.Mode = t.Mode() 49 st.Nlink = uint64(d.Nlink) 50 st.Size = d.Size 51 atime := d.Atimespec 52 st.Atim = atime.Sec*1e9 + atime.Nsec 53 mtime := d.Mtimespec 54 st.Mtim = mtime.Sec*1e9 + mtime.Nsec 55 ctime := d.Ctimespec 56 st.Ctim = ctime.Sec*1e9 + ctime.Nsec 57 return st 58 } 59 return StatFromDefaultFileInfo(t) 60 }