github.com/tetratelabs/wazero@v1.7.3-0.20240513003603-48f702e154b5/experimental/sys/syscall_errno_windows.go (about)

     1  package sys
     2  
     3  import "syscall"
     4  
     5  // These are errors not defined in the syscall package. They are prefixed with
     6  // underscore to avoid exporting them.
     7  //
     8  // See https://learn.microsoft.com/en-us/windows/win32/debug/system-error-codes--0-499-
     9  const (
    10  	// _ERROR_INVALID_HANDLE is a Windows error returned by syscall.Write
    11  	// instead of syscall.EBADF
    12  	_ERROR_INVALID_HANDLE = syscall.Errno(6)
    13  
    14  	// _ERROR_INVALID_NAME is a Windows error returned by open when a file
    15  	// path has a trailing slash
    16  	_ERROR_INVALID_NAME = syscall.Errno(0x7B)
    17  
    18  	// _ERROR_NEGATIVE_SEEK is a Windows error returned by os.Truncate
    19  	// instead of syscall.EINVAL
    20  	_ERROR_NEGATIVE_SEEK = syscall.Errno(0x83)
    21  
    22  	// _ERROR_DIRECTORY is a Windows error returned by syscall.Rmdir
    23  	// instead of syscall.ENOTDIR
    24  	_ERROR_DIRECTORY = syscall.Errno(0x10B)
    25  
    26  	// _ERROR_INVALID_SOCKET is a Windows error returned by winsock_select
    27  	// when a given handle is not a socket.
    28  	_ERROR_INVALID_SOCKET = syscall.Errno(0x2736)
    29  )
    30  
    31  func errorToErrno(err error) Errno {
    32  	switch err := err.(type) {
    33  	case Errno:
    34  		return err
    35  	case syscall.Errno:
    36  		// Note: In windows, _ERROR_PATH_NOT_FOUND(0x3) maps to syscall.ENOTDIR
    37  		switch err {
    38  		case syscall.ERROR_ALREADY_EXISTS:
    39  			return EEXIST
    40  		case _ERROR_DIRECTORY:
    41  			return ENOTDIR
    42  		case syscall.ERROR_DIR_NOT_EMPTY:
    43  			return ENOTEMPTY
    44  		case syscall.ERROR_FILE_EXISTS:
    45  			return EEXIST
    46  		case _ERROR_INVALID_HANDLE, _ERROR_INVALID_SOCKET:
    47  			return EBADF
    48  		case syscall.ERROR_ACCESS_DENIED:
    49  			// POSIX read and write functions expect EBADF, not EACCES when not
    50  			// open for reading or writing.
    51  			return EBADF
    52  		case syscall.ERROR_PRIVILEGE_NOT_HELD:
    53  			return EPERM
    54  		case _ERROR_NEGATIVE_SEEK, _ERROR_INVALID_NAME:
    55  			return EINVAL
    56  		}
    57  		errno, _ := syscallToErrno(err)
    58  		return errno
    59  	default:
    60  		return EIO
    61  	}
    62  }