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