bpo-37705: Improve the implementation of winerror_to_errno() (GH-15623)

winerror_to_errno() is no longer automatically generated.
Do not rely on the old _dosmapperr() function.
Add ERROR_NO_UNICODE_TRANSLATION (1113) -> EILSEQ.
This commit is contained in:
Zackery Spytz 2019-09-09 03:35:08 -06:00 committed by Steve Dower
parent 5e5e951502
commit 19052a1131
3 changed files with 138 additions and 109 deletions

View File

@ -0,0 +1 @@
Improve the implementation of ``winerror_to_errno()``.

View File

@ -1,80 +1,140 @@
/* Generated file. Do not edit. */ int
int winerror_to_errno(int winerror) winerror_to_errno(int winerror)
{ {
// Unwrap FACILITY_WIN32 HRESULT errors.
if ((winerror & 0xFFFF0000) == 0x80070000) {
winerror &= 0x0000FFFF;
}
// Winsock error codes (10000-11999) are errno values.
if (winerror >= 10000 && winerror < 12000) {
switch (winerror) { switch (winerror) {
case 2: return 2; case WSAEINTR:
case 3: return 2; case WSAEBADF:
case 4: return 24; case WSAEACCES:
case 5: return 13; case WSAEFAULT:
case 6: return 9; case WSAEINVAL:
case 7: return 12; case WSAEMFILE:
case 8: return 12; // Winsock definitions of errno values. See WinSock2.h
case 9: return 12; return winerror - 10000;
case 10: return 7; default:
case 11: return 8; return winerror;
case 15: return 2; }
case 16: return 13; }
case 17: return 18;
case 18: return 2; switch (winerror) {
case 19: return 13; case ERROR_FILE_NOT_FOUND: // 2
case 20: return 13; case ERROR_PATH_NOT_FOUND: // 3
case 21: return 13; case ERROR_INVALID_DRIVE: // 15
case 22: return 13; case ERROR_NO_MORE_FILES: // 18
case 23: return 13; case ERROR_BAD_NETPATH: // 53
case 24: return 13; case ERROR_BAD_NET_NAME: // 67
case 25: return 13; case ERROR_BAD_PATHNAME: // 161
case 26: return 13; case ERROR_FILENAME_EXCED_RANGE: // 206
case 27: return 13; return ENOENT;
case 28: return 13;
case 29: return 13; case ERROR_BAD_ENVIRONMENT: // 10
case 30: return 13; return E2BIG;
case 31: return 13;
case 32: return 13; case ERROR_BAD_FORMAT: // 11
case 33: return 13; case ERROR_INVALID_STARTING_CODESEG: // 188
case 34: return 13; case ERROR_INVALID_STACKSEG: // 189
case 35: return 13; case ERROR_INVALID_MODULETYPE: // 190
case 36: return 13; case ERROR_INVALID_EXE_SIGNATURE: // 191
case 53: return 2; case ERROR_EXE_MARKED_INVALID: // 192
case 65: return 13; case ERROR_BAD_EXE_FORMAT: // 193
case 67: return 2; case ERROR_ITERATED_DATA_EXCEEDS_64k: // 194
case 80: return 17; case ERROR_INVALID_MINALLOCSIZE: // 195
case 82: return 13; case ERROR_DYNLINK_FROM_INVALID_RING: // 196
case 83: return 13; case ERROR_IOPL_NOT_ENABLED: // 197
case 89: return 11; case ERROR_INVALID_SEGDPL: // 198
case 108: return 13; case ERROR_AUTODATASEG_EXCEEDS_64k: // 199
case 109: return 32; case ERROR_RING2SEG_MUST_BE_MOVABLE: // 200
case 112: return 28; case ERROR_RELOC_CHAIN_XEEDS_SEGLIM: // 201
case 114: return 9; case ERROR_INFLOOP_IN_RELOC_CHAIN: // 202
case 128: return 10; return ENOEXEC;
case 129: return 10;
case 130: return 9; case ERROR_INVALID_HANDLE: // 6
case 132: return 13; case ERROR_INVALID_TARGET_HANDLE: // 114
case 145: return 41; case ERROR_DIRECT_ACCESS_HANDLE: // 130
case 158: return 13; return EBADF;
case 161: return 2;
case 164: return 11; case ERROR_WAIT_NO_CHILDREN: // 128
case 167: return 13; case ERROR_CHILD_NOT_COMPLETE: // 129
case 183: return 17; return ECHILD;
case 188: return 8;
case 189: return 8; case ERROR_NO_PROC_SLOTS: // 89
case 190: return 8; case ERROR_MAX_THRDS_REACHED: // 164
case 191: return 8; case ERROR_NESTING_NOT_ALLOWED: // 215
case 192: return 8; return EAGAIN;
case 193: return 8;
case 194: return 8; case ERROR_ARENA_TRASHED: // 7
case 195: return 8; case ERROR_NOT_ENOUGH_MEMORY: // 8
case 196: return 8; case ERROR_INVALID_BLOCK: // 9
case 197: return 8; case ERROR_NOT_ENOUGH_QUOTA: // 1816
case 198: return 8; return ENOMEM;
case 199: return 8;
case 200: return 8; case ERROR_ACCESS_DENIED: // 5
case 201: return 8; case ERROR_CURRENT_DIRECTORY: // 16
case 202: return 8; case ERROR_WRITE_PROTECT: // 19
case 206: return 2; case ERROR_BAD_UNIT: // 20
case 215: return 11; case ERROR_NOT_READY: // 21
case 232: return 32; case ERROR_BAD_COMMAND: // 22
case 267: return 20; case ERROR_CRC: // 23
case 1816: return 12; case ERROR_BAD_LENGTH: // 24
default: return EINVAL; case ERROR_SEEK: // 25
case ERROR_NOT_DOS_DISK: // 26
case ERROR_SECTOR_NOT_FOUND: // 27
case ERROR_OUT_OF_PAPER: // 28
case ERROR_WRITE_FAULT: // 29
case ERROR_READ_FAULT: // 30
case ERROR_GEN_FAILURE: // 31
case ERROR_SHARING_VIOLATION: // 32
case ERROR_LOCK_VIOLATION: // 33
case ERROR_WRONG_DISK: // 34
case ERROR_SHARING_BUFFER_EXCEEDED: // 36
case ERROR_NETWORK_ACCESS_DENIED: // 65
case ERROR_CANNOT_MAKE: // 82
case ERROR_FAIL_I24: // 83
case ERROR_DRIVE_LOCKED: // 108
case ERROR_SEEK_ON_DEVICE: // 132
case ERROR_NOT_LOCKED: // 158
case ERROR_LOCK_FAILED: // 167
case 35: // 35 (undefined)
return EACCES;
case ERROR_FILE_EXISTS: // 80
case ERROR_ALREADY_EXISTS: // 183
return EEXIST;
case ERROR_NOT_SAME_DEVICE: // 17
return EXDEV;
case ERROR_DIRECTORY: // 267 (bpo-12802)
return ENOTDIR;
case ERROR_TOO_MANY_OPEN_FILES: // 4
return EMFILE;
case ERROR_DISK_FULL: // 112
return ENOSPC;
case ERROR_BROKEN_PIPE: // 109
case ERROR_NO_DATA: // 232 (bpo-13063)
return EPIPE;
case ERROR_DIR_NOT_EMPTY: // 145
return ENOTEMPTY;
case ERROR_NO_UNICODE_TRANSLATION: // 1113
return EILSEQ;
case ERROR_INVALID_FUNCTION: // 1
case ERROR_INVALID_ACCESS: // 12
case ERROR_INVALID_DATA: // 13
case ERROR_INVALID_PARAMETER: // 87
case ERROR_NEGATIVE_SEEK: // 131
default:
return EINVAL;
} }
} }

View File

@ -1,32 +0,0 @@
#include <windows.h>
#include <fcntl.h>
#include <io.h>
#include <stdio.h>
#include <errno.h>
/* Extract the mapping of Win32 error codes to errno */
int main()
{
int i;
_setmode(fileno(stdout), O_BINARY);
printf("/* Generated file. Do not edit. */\n");
printf("int winerror_to_errno(int winerror)\n");
printf("{\n switch(winerror) {\n");
for(i=1; i < 65000; i++) {
_dosmaperr(i);
if (errno == EINVAL) {
/* Issue #12802 */
if (i == ERROR_DIRECTORY)
errno = ENOTDIR;
/* Issue #13063 */
else if (i == ERROR_NO_DATA)
errno = EPIPE;
else
continue;
}
printf(" case %d: return %d;\n", i, errno);
}
printf(" default: return EINVAL;\n");
printf(" }\n}\n");
}