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  }