summaryrefslogtreecommitdiff
path: root/vendor/github.com/tetratelabs/wazero/experimental/sys/syscall_errno_windows.go
blob: 761a1f9dc220f5b8851d4ab32b62d45e25c7988a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
package sys

import "syscall"

// These are errors not defined in the syscall package. They are prefixed with
// underscore to avoid exporting them.
//
// See https://learn.microsoft.com/en-us/windows/win32/debug/system-error-codes--0-499-
const (
	// _ERROR_INVALID_HANDLE is a Windows error returned by syscall.Write
	// instead of syscall.EBADF
	_ERROR_INVALID_HANDLE = syscall.Errno(6)

	// _ERROR_INVALID_NAME is a Windows error returned by open when a file
	// path has a trailing slash
	_ERROR_INVALID_NAME = syscall.Errno(0x7B)

	// _ERROR_NEGATIVE_SEEK is a Windows error returned by os.Truncate
	// instead of syscall.EINVAL
	_ERROR_NEGATIVE_SEEK = syscall.Errno(0x83)

	// _ERROR_DIRECTORY is a Windows error returned by syscall.Rmdir
	// instead of syscall.ENOTDIR
	_ERROR_DIRECTORY = syscall.Errno(0x10B)

	// _ERROR_INVALID_SOCKET is a Windows error returned by winsock_select
	// when a given handle is not a socket.
	_ERROR_INVALID_SOCKET = syscall.Errno(0x2736)
)

func errorToErrno(err error) Errno {
	switch err := err.(type) {
	case Errno:
		return err
	case syscall.Errno:
		// Note: In windows, _ERROR_PATH_NOT_FOUND(0x3) maps to syscall.ENOTDIR
		switch err {
		case syscall.ERROR_ALREADY_EXISTS:
			return EEXIST
		case _ERROR_DIRECTORY:
			return ENOTDIR
		case syscall.ERROR_DIR_NOT_EMPTY:
			return ENOTEMPTY
		case syscall.ERROR_FILE_EXISTS:
			return EEXIST
		case _ERROR_INVALID_HANDLE, _ERROR_INVALID_SOCKET:
			return EBADF
		case syscall.ERROR_ACCESS_DENIED:
			// POSIX read and write functions expect EBADF, not EACCES when not
			// open for reading or writing.
			return EBADF
		case syscall.ERROR_PRIVILEGE_NOT_HELD:
			return EPERM
		case _ERROR_NEGATIVE_SEEK, _ERROR_INVALID_NAME:
			return EINVAL
		}
		errno, _ := syscallToErrno(err)
		return errno
	default:
		return EIO
	}
}