17db96d56Sopenharmony_ciint 27db96d56Sopenharmony_ciwinerror_to_errno(int winerror) 37db96d56Sopenharmony_ci{ 47db96d56Sopenharmony_ci // Unwrap FACILITY_WIN32 HRESULT errors. 57db96d56Sopenharmony_ci if ((winerror & 0xFFFF0000) == 0x80070000) { 67db96d56Sopenharmony_ci winerror &= 0x0000FFFF; 77db96d56Sopenharmony_ci } 87db96d56Sopenharmony_ci 97db96d56Sopenharmony_ci // Winsock error codes (10000-11999) are errno values. 107db96d56Sopenharmony_ci if (winerror >= 10000 && winerror < 12000) { 117db96d56Sopenharmony_ci switch (winerror) { 127db96d56Sopenharmony_ci case WSAEINTR: 137db96d56Sopenharmony_ci case WSAEBADF: 147db96d56Sopenharmony_ci case WSAEACCES: 157db96d56Sopenharmony_ci case WSAEFAULT: 167db96d56Sopenharmony_ci case WSAEINVAL: 177db96d56Sopenharmony_ci case WSAEMFILE: 187db96d56Sopenharmony_ci // Winsock definitions of errno values. See WinSock2.h 197db96d56Sopenharmony_ci return winerror - 10000; 207db96d56Sopenharmony_ci default: 217db96d56Sopenharmony_ci return winerror; 227db96d56Sopenharmony_ci } 237db96d56Sopenharmony_ci } 247db96d56Sopenharmony_ci 257db96d56Sopenharmony_ci switch (winerror) { 267db96d56Sopenharmony_ci case ERROR_FILE_NOT_FOUND: // 2 277db96d56Sopenharmony_ci case ERROR_PATH_NOT_FOUND: // 3 287db96d56Sopenharmony_ci case ERROR_INVALID_DRIVE: // 15 297db96d56Sopenharmony_ci case ERROR_NO_MORE_FILES: // 18 307db96d56Sopenharmony_ci case ERROR_BAD_NETPATH: // 53 317db96d56Sopenharmony_ci case ERROR_BAD_NET_NAME: // 67 327db96d56Sopenharmony_ci case ERROR_BAD_PATHNAME: // 161 337db96d56Sopenharmony_ci case ERROR_FILENAME_EXCED_RANGE: // 206 347db96d56Sopenharmony_ci return ENOENT; 357db96d56Sopenharmony_ci 367db96d56Sopenharmony_ci case ERROR_BAD_ENVIRONMENT: // 10 377db96d56Sopenharmony_ci return E2BIG; 387db96d56Sopenharmony_ci 397db96d56Sopenharmony_ci case ERROR_BAD_FORMAT: // 11 407db96d56Sopenharmony_ci case ERROR_INVALID_STARTING_CODESEG: // 188 417db96d56Sopenharmony_ci case ERROR_INVALID_STACKSEG: // 189 427db96d56Sopenharmony_ci case ERROR_INVALID_MODULETYPE: // 190 437db96d56Sopenharmony_ci case ERROR_INVALID_EXE_SIGNATURE: // 191 447db96d56Sopenharmony_ci case ERROR_EXE_MARKED_INVALID: // 192 457db96d56Sopenharmony_ci case ERROR_BAD_EXE_FORMAT: // 193 467db96d56Sopenharmony_ci case ERROR_ITERATED_DATA_EXCEEDS_64k: // 194 477db96d56Sopenharmony_ci case ERROR_INVALID_MINALLOCSIZE: // 195 487db96d56Sopenharmony_ci case ERROR_DYNLINK_FROM_INVALID_RING: // 196 497db96d56Sopenharmony_ci case ERROR_IOPL_NOT_ENABLED: // 197 507db96d56Sopenharmony_ci case ERROR_INVALID_SEGDPL: // 198 517db96d56Sopenharmony_ci case ERROR_AUTODATASEG_EXCEEDS_64k: // 199 527db96d56Sopenharmony_ci case ERROR_RING2SEG_MUST_BE_MOVABLE: // 200 537db96d56Sopenharmony_ci case ERROR_RELOC_CHAIN_XEEDS_SEGLIM: // 201 547db96d56Sopenharmony_ci case ERROR_INFLOOP_IN_RELOC_CHAIN: // 202 557db96d56Sopenharmony_ci return ENOEXEC; 567db96d56Sopenharmony_ci 577db96d56Sopenharmony_ci case ERROR_INVALID_HANDLE: // 6 587db96d56Sopenharmony_ci case ERROR_INVALID_TARGET_HANDLE: // 114 597db96d56Sopenharmony_ci case ERROR_DIRECT_ACCESS_HANDLE: // 130 607db96d56Sopenharmony_ci return EBADF; 617db96d56Sopenharmony_ci 627db96d56Sopenharmony_ci case ERROR_WAIT_NO_CHILDREN: // 128 637db96d56Sopenharmony_ci case ERROR_CHILD_NOT_COMPLETE: // 129 647db96d56Sopenharmony_ci return ECHILD; 657db96d56Sopenharmony_ci 667db96d56Sopenharmony_ci case ERROR_NO_PROC_SLOTS: // 89 677db96d56Sopenharmony_ci case ERROR_MAX_THRDS_REACHED: // 164 687db96d56Sopenharmony_ci case ERROR_NESTING_NOT_ALLOWED: // 215 697db96d56Sopenharmony_ci return EAGAIN; 707db96d56Sopenharmony_ci 717db96d56Sopenharmony_ci case ERROR_ARENA_TRASHED: // 7 727db96d56Sopenharmony_ci case ERROR_NOT_ENOUGH_MEMORY: // 8 737db96d56Sopenharmony_ci case ERROR_INVALID_BLOCK: // 9 747db96d56Sopenharmony_ci case ERROR_NOT_ENOUGH_QUOTA: // 1816 757db96d56Sopenharmony_ci return ENOMEM; 767db96d56Sopenharmony_ci 777db96d56Sopenharmony_ci case ERROR_ACCESS_DENIED: // 5 787db96d56Sopenharmony_ci case ERROR_CURRENT_DIRECTORY: // 16 797db96d56Sopenharmony_ci case ERROR_WRITE_PROTECT: // 19 807db96d56Sopenharmony_ci case ERROR_BAD_UNIT: // 20 817db96d56Sopenharmony_ci case ERROR_NOT_READY: // 21 827db96d56Sopenharmony_ci case ERROR_BAD_COMMAND: // 22 837db96d56Sopenharmony_ci case ERROR_CRC: // 23 847db96d56Sopenharmony_ci case ERROR_BAD_LENGTH: // 24 857db96d56Sopenharmony_ci case ERROR_SEEK: // 25 867db96d56Sopenharmony_ci case ERROR_NOT_DOS_DISK: // 26 877db96d56Sopenharmony_ci case ERROR_SECTOR_NOT_FOUND: // 27 887db96d56Sopenharmony_ci case ERROR_OUT_OF_PAPER: // 28 897db96d56Sopenharmony_ci case ERROR_WRITE_FAULT: // 29 907db96d56Sopenharmony_ci case ERROR_READ_FAULT: // 30 917db96d56Sopenharmony_ci case ERROR_GEN_FAILURE: // 31 927db96d56Sopenharmony_ci case ERROR_SHARING_VIOLATION: // 32 937db96d56Sopenharmony_ci case ERROR_LOCK_VIOLATION: // 33 947db96d56Sopenharmony_ci case ERROR_WRONG_DISK: // 34 957db96d56Sopenharmony_ci case ERROR_SHARING_BUFFER_EXCEEDED: // 36 967db96d56Sopenharmony_ci case ERROR_NETWORK_ACCESS_DENIED: // 65 977db96d56Sopenharmony_ci case ERROR_CANNOT_MAKE: // 82 987db96d56Sopenharmony_ci case ERROR_FAIL_I24: // 83 997db96d56Sopenharmony_ci case ERROR_DRIVE_LOCKED: // 108 1007db96d56Sopenharmony_ci case ERROR_SEEK_ON_DEVICE: // 132 1017db96d56Sopenharmony_ci case ERROR_NOT_LOCKED: // 158 1027db96d56Sopenharmony_ci case ERROR_LOCK_FAILED: // 167 1037db96d56Sopenharmony_ci case 35: // 35 (undefined) 1047db96d56Sopenharmony_ci return EACCES; 1057db96d56Sopenharmony_ci 1067db96d56Sopenharmony_ci case ERROR_FILE_EXISTS: // 80 1077db96d56Sopenharmony_ci case ERROR_ALREADY_EXISTS: // 183 1087db96d56Sopenharmony_ci return EEXIST; 1097db96d56Sopenharmony_ci 1107db96d56Sopenharmony_ci case ERROR_NOT_SAME_DEVICE: // 17 1117db96d56Sopenharmony_ci return EXDEV; 1127db96d56Sopenharmony_ci 1137db96d56Sopenharmony_ci case ERROR_DIRECTORY: // 267 (bpo-12802) 1147db96d56Sopenharmony_ci return ENOTDIR; 1157db96d56Sopenharmony_ci 1167db96d56Sopenharmony_ci case ERROR_TOO_MANY_OPEN_FILES: // 4 1177db96d56Sopenharmony_ci return EMFILE; 1187db96d56Sopenharmony_ci 1197db96d56Sopenharmony_ci case ERROR_DISK_FULL: // 112 1207db96d56Sopenharmony_ci return ENOSPC; 1217db96d56Sopenharmony_ci 1227db96d56Sopenharmony_ci case ERROR_BROKEN_PIPE: // 109 1237db96d56Sopenharmony_ci case ERROR_NO_DATA: // 232 (bpo-13063) 1247db96d56Sopenharmony_ci return EPIPE; 1257db96d56Sopenharmony_ci 1267db96d56Sopenharmony_ci case ERROR_DIR_NOT_EMPTY: // 145 1277db96d56Sopenharmony_ci return ENOTEMPTY; 1287db96d56Sopenharmony_ci 1297db96d56Sopenharmony_ci case ERROR_NO_UNICODE_TRANSLATION: // 1113 1307db96d56Sopenharmony_ci return EILSEQ; 1317db96d56Sopenharmony_ci 1327db96d56Sopenharmony_ci case ERROR_INVALID_FUNCTION: // 1 1337db96d56Sopenharmony_ci case ERROR_INVALID_ACCESS: // 12 1347db96d56Sopenharmony_ci case ERROR_INVALID_DATA: // 13 1357db96d56Sopenharmony_ci case ERROR_INVALID_PARAMETER: // 87 1367db96d56Sopenharmony_ci case ERROR_NEGATIVE_SEEK: // 131 1377db96d56Sopenharmony_ci default: 1387db96d56Sopenharmony_ci return EINVAL; 1397db96d56Sopenharmony_ci } 1407db96d56Sopenharmony_ci} 141