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  }