| int | 
 | 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) { | 
 |         case WSAEINTR: | 
 |         case WSAEBADF: | 
 |         case WSAEACCES: | 
 |         case WSAEFAULT: | 
 |         case WSAEINVAL: | 
 |         case WSAEMFILE: | 
 |             // Winsock definitions of errno values. See WinSock2.h | 
 |             return winerror - 10000; | 
 |         default: | 
 |             return winerror; | 
 |         } | 
 |     } | 
 |  | 
 |     switch (winerror) { | 
 |     case ERROR_FILE_NOT_FOUND:            //    2 | 
 |     case ERROR_PATH_NOT_FOUND:            //    3 | 
 |     case ERROR_INVALID_DRIVE:             //   15 | 
 |     case ERROR_NO_MORE_FILES:             //   18 | 
 |     case ERROR_BAD_NETPATH:               //   53 | 
 |     case ERROR_BAD_NET_NAME:              //   67 | 
 |     case ERROR_BAD_PATHNAME:              //  161 | 
 |     case ERROR_FILENAME_EXCED_RANGE:      //  206 | 
 |         return ENOENT; | 
 |  | 
 |     case ERROR_BAD_ENVIRONMENT:           //   10 | 
 |         return E2BIG; | 
 |  | 
 |     case ERROR_BAD_FORMAT:                //   11 | 
 |     case ERROR_INVALID_STARTING_CODESEG:  //  188 | 
 |     case ERROR_INVALID_STACKSEG:          //  189 | 
 |     case ERROR_INVALID_MODULETYPE:        //  190 | 
 |     case ERROR_INVALID_EXE_SIGNATURE:     //  191 | 
 |     case ERROR_EXE_MARKED_INVALID:        //  192 | 
 |     case ERROR_BAD_EXE_FORMAT:            //  193 | 
 |     case ERROR_ITERATED_DATA_EXCEEDS_64k: //  194 | 
 |     case ERROR_INVALID_MINALLOCSIZE:      //  195 | 
 |     case ERROR_DYNLINK_FROM_INVALID_RING: //  196 | 
 |     case ERROR_IOPL_NOT_ENABLED:          //  197 | 
 |     case ERROR_INVALID_SEGDPL:            //  198 | 
 |     case ERROR_AUTODATASEG_EXCEEDS_64k:   //  199 | 
 |     case ERROR_RING2SEG_MUST_BE_MOVABLE:  //  200 | 
 |     case ERROR_RELOC_CHAIN_XEEDS_SEGLIM:  //  201 | 
 |     case ERROR_INFLOOP_IN_RELOC_CHAIN:    //  202 | 
 |         return ENOEXEC; | 
 |  | 
 |     case ERROR_INVALID_HANDLE:            //    6 | 
 |     case ERROR_INVALID_TARGET_HANDLE:     //  114 | 
 |     case ERROR_DIRECT_ACCESS_HANDLE:      //  130 | 
 |         return EBADF; | 
 |  | 
 |     case ERROR_WAIT_NO_CHILDREN:          //  128 | 
 |     case ERROR_CHILD_NOT_COMPLETE:        //  129 | 
 |         return ECHILD; | 
 |  | 
 |     case ERROR_NO_PROC_SLOTS:             //   89 | 
 |     case ERROR_MAX_THRDS_REACHED:         //  164 | 
 |     case ERROR_NESTING_NOT_ALLOWED:       //  215 | 
 |         return EAGAIN; | 
 |  | 
 |     case ERROR_ARENA_TRASHED:             //    7 | 
 |     case ERROR_NOT_ENOUGH_MEMORY:         //    8 | 
 |     case ERROR_INVALID_BLOCK:             //    9 | 
 |     case ERROR_NOT_ENOUGH_QUOTA:          // 1816 | 
 |         return ENOMEM; | 
 |  | 
 |     case ERROR_ACCESS_DENIED:             //    5 | 
 |     case ERROR_CURRENT_DIRECTORY:         //   16 | 
 |     case ERROR_WRITE_PROTECT:             //   19 | 
 |     case ERROR_BAD_UNIT:                  //   20 | 
 |     case ERROR_NOT_READY:                 //   21 | 
 |     case ERROR_BAD_COMMAND:               //   22 | 
 |     case ERROR_CRC:                       //   23 | 
 |     case ERROR_BAD_LENGTH:                //   24 | 
 |     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; | 
 |     } | 
 | } |