github.com/tetratelabs/wazero@v1.2.1/internal/platform/error.go (about) 1 package platform 2 3 import ( 4 "io" 5 "io/fs" 6 "os" 7 "syscall" 8 ) 9 10 // UnwrapOSError returns a syscall.Errno or zero if the input is nil. 11 func UnwrapOSError(err error) syscall.Errno { 12 if err == nil { 13 return 0 14 } 15 err = underlyingError(err) 16 if se, ok := err.(syscall.Errno); ok { 17 return adjustErrno(se) 18 } 19 // Below are all the fs.ErrXXX in fs.go. 20 // 21 // Note: Once we have our own file type, we should never see these. 22 switch err { 23 case nil, io.EOF: 24 return 0 // EOF is not a syscall.Errno 25 case fs.ErrInvalid: 26 return syscall.EINVAL 27 case fs.ErrPermission: 28 return syscall.EPERM 29 case fs.ErrExist: 30 return syscall.EEXIST 31 case fs.ErrNotExist: 32 return syscall.ENOENT 33 case fs.ErrClosed: 34 return syscall.EBADF 35 } 36 return syscall.EIO 37 } 38 39 // underlyingError returns the underlying error if a well-known OS error type. 40 // 41 // This impl is basically the same as os.underlyingError in os/error.go 42 func underlyingError(err error) error { 43 switch err := err.(type) { 44 case *os.PathError: 45 return err.Err 46 case *os.LinkError: 47 return err.Err 48 case *os.SyscallError: 49 return err.Err 50 } 51 return err 52 }