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}