syscall_errno_windows.go

 1package sys
 2
 3import "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-
 9const (
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_NOT_A_REPARSE_POINT is a Windows error returned by os.Readlink
27	// instead of syscall.EINVAL
28	_ERROR_NOT_A_REPARSE_POINT = syscall.Errno(0x1126)
29
30	// _ERROR_INVALID_SOCKET is a Windows error returned by winsock_select
31	// when a given handle is not a socket.
32	_ERROR_INVALID_SOCKET = syscall.Errno(0x2736)
33)
34
35func errorToErrno(err error) Errno {
36	switch err := err.(type) {
37	case Errno:
38		return err
39	case syscall.Errno:
40		// Note: In windows, _ERROR_PATH_NOT_FOUND(0x3) maps to syscall.ENOTDIR
41		switch err {
42		case syscall.ERROR_ALREADY_EXISTS:
43			return EEXIST
44		case _ERROR_DIRECTORY:
45			return ENOTDIR
46		case syscall.ERROR_DIR_NOT_EMPTY:
47			return ENOTEMPTY
48		case syscall.ERROR_FILE_EXISTS:
49			return EEXIST
50		case _ERROR_INVALID_HANDLE, _ERROR_INVALID_SOCKET:
51			return EBADF
52		case syscall.ERROR_ACCESS_DENIED:
53			// POSIX read and write functions expect EBADF, not EACCES when not
54			// open for reading or writing.
55			return EBADF
56		case syscall.ERROR_PRIVILEGE_NOT_HELD:
57			return EPERM
58		case _ERROR_NEGATIVE_SEEK, _ERROR_INVALID_NAME, _ERROR_NOT_A_REPARSE_POINT:
59			return EINVAL
60		}
61		errno, _ := syscallToErrno(err)
62		return errno
63	default:
64		return EIO
65	}
66}