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