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  }