Zackery Spytz | 19052a1 | 2019-09-09 03:35:08 -0600 | [diff] [blame] | 1 | int |
| 2 | winerror_to_errno(int winerror) |
Thomas Wouters | 477c8d5 | 2006-05-27 19:21:47 +0000 | [diff] [blame] | 3 | { |
Zackery Spytz | 19052a1 | 2019-09-09 03:35:08 -0600 | [diff] [blame] | 4 | // Unwrap FACILITY_WIN32 HRESULT errors. |
| 5 | if ((winerror & 0xFFFF0000) == 0x80070000) { |
| 6 | winerror &= 0x0000FFFF; |
| 7 | } |
| 8 | |
| 9 | // Winsock error codes (10000-11999) are errno values. |
| 10 | if (winerror >= 10000 && winerror < 12000) { |
| 11 | switch (winerror) { |
| 12 | case WSAEINTR: |
| 13 | case WSAEBADF: |
| 14 | case WSAEACCES: |
| 15 | case WSAEFAULT: |
| 16 | case WSAEINVAL: |
| 17 | case WSAEMFILE: |
| 18 | // Winsock definitions of errno values. See WinSock2.h |
| 19 | return winerror - 10000; |
| 20 | default: |
| 21 | return winerror; |
| 22 | } |
| 23 | } |
| 24 | |
| 25 | switch (winerror) { |
| 26 | case ERROR_FILE_NOT_FOUND: // 2 |
| 27 | case ERROR_PATH_NOT_FOUND: // 3 |
| 28 | case ERROR_INVALID_DRIVE: // 15 |
| 29 | case ERROR_NO_MORE_FILES: // 18 |
| 30 | case ERROR_BAD_NETPATH: // 53 |
| 31 | case ERROR_BAD_NET_NAME: // 67 |
| 32 | case ERROR_BAD_PATHNAME: // 161 |
| 33 | case ERROR_FILENAME_EXCED_RANGE: // 206 |
| 34 | return ENOENT; |
| 35 | |
| 36 | case ERROR_BAD_ENVIRONMENT: // 10 |
| 37 | return E2BIG; |
| 38 | |
| 39 | case ERROR_BAD_FORMAT: // 11 |
| 40 | case ERROR_INVALID_STARTING_CODESEG: // 188 |
| 41 | case ERROR_INVALID_STACKSEG: // 189 |
| 42 | case ERROR_INVALID_MODULETYPE: // 190 |
| 43 | case ERROR_INVALID_EXE_SIGNATURE: // 191 |
| 44 | case ERROR_EXE_MARKED_INVALID: // 192 |
| 45 | case ERROR_BAD_EXE_FORMAT: // 193 |
| 46 | case ERROR_ITERATED_DATA_EXCEEDS_64k: // 194 |
| 47 | case ERROR_INVALID_MINALLOCSIZE: // 195 |
| 48 | case ERROR_DYNLINK_FROM_INVALID_RING: // 196 |
| 49 | case ERROR_IOPL_NOT_ENABLED: // 197 |
| 50 | case ERROR_INVALID_SEGDPL: // 198 |
| 51 | case ERROR_AUTODATASEG_EXCEEDS_64k: // 199 |
| 52 | case ERROR_RING2SEG_MUST_BE_MOVABLE: // 200 |
| 53 | case ERROR_RELOC_CHAIN_XEEDS_SEGLIM: // 201 |
| 54 | case ERROR_INFLOOP_IN_RELOC_CHAIN: // 202 |
| 55 | return ENOEXEC; |
| 56 | |
| 57 | case ERROR_INVALID_HANDLE: // 6 |
| 58 | case ERROR_INVALID_TARGET_HANDLE: // 114 |
| 59 | case ERROR_DIRECT_ACCESS_HANDLE: // 130 |
| 60 | return EBADF; |
| 61 | |
| 62 | case ERROR_WAIT_NO_CHILDREN: // 128 |
| 63 | case ERROR_CHILD_NOT_COMPLETE: // 129 |
| 64 | return ECHILD; |
| 65 | |
| 66 | case ERROR_NO_PROC_SLOTS: // 89 |
| 67 | case ERROR_MAX_THRDS_REACHED: // 164 |
| 68 | case ERROR_NESTING_NOT_ALLOWED: // 215 |
| 69 | return EAGAIN; |
| 70 | |
| 71 | case ERROR_ARENA_TRASHED: // 7 |
| 72 | case ERROR_NOT_ENOUGH_MEMORY: // 8 |
| 73 | case ERROR_INVALID_BLOCK: // 9 |
| 74 | case ERROR_NOT_ENOUGH_QUOTA: // 1816 |
| 75 | return ENOMEM; |
| 76 | |
| 77 | case ERROR_ACCESS_DENIED: // 5 |
| 78 | case ERROR_CURRENT_DIRECTORY: // 16 |
| 79 | case ERROR_WRITE_PROTECT: // 19 |
| 80 | case ERROR_BAD_UNIT: // 20 |
| 81 | case ERROR_NOT_READY: // 21 |
| 82 | case ERROR_BAD_COMMAND: // 22 |
| 83 | case ERROR_CRC: // 23 |
| 84 | case ERROR_BAD_LENGTH: // 24 |
| 85 | case ERROR_SEEK: // 25 |
| 86 | case ERROR_NOT_DOS_DISK: // 26 |
| 87 | case ERROR_SECTOR_NOT_FOUND: // 27 |
| 88 | case ERROR_OUT_OF_PAPER: // 28 |
| 89 | case ERROR_WRITE_FAULT: // 29 |
| 90 | case ERROR_READ_FAULT: // 30 |
| 91 | case ERROR_GEN_FAILURE: // 31 |
| 92 | case ERROR_SHARING_VIOLATION: // 32 |
| 93 | case ERROR_LOCK_VIOLATION: // 33 |
| 94 | case ERROR_WRONG_DISK: // 34 |
| 95 | case ERROR_SHARING_BUFFER_EXCEEDED: // 36 |
| 96 | case ERROR_NETWORK_ACCESS_DENIED: // 65 |
| 97 | case ERROR_CANNOT_MAKE: // 82 |
| 98 | case ERROR_FAIL_I24: // 83 |
| 99 | case ERROR_DRIVE_LOCKED: // 108 |
| 100 | case ERROR_SEEK_ON_DEVICE: // 132 |
| 101 | case ERROR_NOT_LOCKED: // 158 |
| 102 | case ERROR_LOCK_FAILED: // 167 |
| 103 | case 35: // 35 (undefined) |
| 104 | return EACCES; |
| 105 | |
| 106 | case ERROR_FILE_EXISTS: // 80 |
| 107 | case ERROR_ALREADY_EXISTS: // 183 |
| 108 | return EEXIST; |
| 109 | |
| 110 | case ERROR_NOT_SAME_DEVICE: // 17 |
| 111 | return EXDEV; |
| 112 | |
| 113 | case ERROR_DIRECTORY: // 267 (bpo-12802) |
| 114 | return ENOTDIR; |
| 115 | |
| 116 | case ERROR_TOO_MANY_OPEN_FILES: // 4 |
| 117 | return EMFILE; |
| 118 | |
| 119 | case ERROR_DISK_FULL: // 112 |
| 120 | return ENOSPC; |
| 121 | |
| 122 | case ERROR_BROKEN_PIPE: // 109 |
| 123 | case ERROR_NO_DATA: // 232 (bpo-13063) |
| 124 | return EPIPE; |
| 125 | |
| 126 | case ERROR_DIR_NOT_EMPTY: // 145 |
| 127 | return ENOTEMPTY; |
| 128 | |
| 129 | case ERROR_NO_UNICODE_TRANSLATION: // 1113 |
| 130 | return EILSEQ; |
| 131 | |
| 132 | case ERROR_INVALID_FUNCTION: // 1 |
| 133 | case ERROR_INVALID_ACCESS: // 12 |
| 134 | case ERROR_INVALID_DATA: // 13 |
| 135 | case ERROR_INVALID_PARAMETER: // 87 |
| 136 | case ERROR_NEGATIVE_SEEK: // 131 |
| 137 | default: |
| 138 | return EINVAL; |
Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 139 | } |
Thomas Wouters | 477c8d5 | 2006-05-27 19:21:47 +0000 | [diff] [blame] | 140 | } |