25 #define LELY_UTIL_ERRNUM_INLINE extern inline
36 #define ERRSTR_SIZE 256
41 #if _POSIX_C_SOURCE >= 200112L && !defined(__NEWLIB__)
42 static const char *gai_strerror_r(
int ecode,
char *strerrbuf,
size_t buflen);
227 #ifdef ENOTRECOVERABLE
242 #if defined(EOPNOTSUPP) && EOPNOTSUPP != ENOTSUP
260 #ifdef EPROTONOSUPPORT
288 #if defined(EWOULDBLOCK) && EWOULDBLOCK != EAGAIN
304 return errc > 0 ? errc : 0;
331 case ERROR_BEGINNING_OF_MEDIA:
return ERRNUM_IO;
345 case ERROR_CANT_RESOLVE_FILENAME:
return ERRNUM_LOOP;
353 case ERROR_DEVICE_DOOR_OPEN:
return ERRNUM_IO;
356 case ERROR_DEVICE_REQUIRES_CLEANING:
return ERRNUM_IO;
362 case ERROR_DISK_CORRUPT:
return ERRNUM_IO;
365 case ERROR_DS_GENERIC_ERROR:
return ERRNUM_IO;
370 #ifdef ERROR_ELEVATION_REQUIRED
374 case ERROR_EOM_OVERFLOW:
return ERRNUM_IO;
381 case ERROR_FILEMARK_DETECTED:
return ERRNUM_IO;
385 #ifdef ERROR_FLOAT_MULTIPLE_FAULTS
386 case ERROR_FLOAT_MULTIPLE_FAULTS:
return ERRNUM_DOM;
388 case ERROR_GEN_FAILURE:
return ERRNUM_IO;
392 #ifdef ERROR_ILLEGAL_CHARACTER
398 case ERROR_INVALID_AT_INTERRUPT_TIME:
return ERRNUM_INTR;
400 case ERROR_INVALID_BLOCK_LENGTH:
return ERRNUM_IO;
427 case ERROR_META_EXPANSION_TOO_LONG:
return ERRNUM_INVAL;
439 case ERROR_NONPAGED_SYSTEM_RESOURCES:
return ERRNUM_AGAIN;
443 case ERROR_NOT_ENOUGH_QUOTA:
return ERRNUM_IO;
450 case ERROR_NO_DATA_DETECTED:
return ERRNUM_IO;
455 case ERROR_NO_SIGNAL_SENT:
return ERRNUM_IO;
456 case ERROR_NO_SYSTEM_RESOURCES:
return ERRNUM_FBIG;
459 case ERROR_OPEN_FAILED:
return ERRNUM_IO;
481 case ERROR_SERVICE_REQUEST_TIMEOUT:
return ERRNUM_BUSY;
482 case ERROR_SETMARK_DETECTED:
return ERRNUM_IO;
483 case ERROR_SHARING_BUFFER_EXCEEDED:
return ERRNUM_NOLCK;
487 case ERROR_SIGNAL_REFUSED:
return ERRNUM_IO;
488 #ifdef ERROR_SYMLINK_NOT_SUPPORTED
496 case ERROR_UNEXP_NET_ERR:
return ERRNUM_IO;
499 case ERROR_WRITE_FAULT:
return ERRNUM_IO;
548 #if _POSIX_C_SOURCE >= 200112L && !defined(__NEWLIB__)
738 #ifdef ENOTRECOVERABLE
771 #ifdef EPROTONOSUPPORT
831 #ifdef ERROR_FLOAT_MULTIPLE_FAULTS
832 case ERRNUM_DOM:
return ERROR_FLOAT_MULTIPLE_FAULTS;
837 case ERRNUM_FBIG:
return ERROR_NO_SYSTEM_RESOURCES;
841 #ifdef ERROR_ILLEGAL_CHARACTER
851 case ERRNUM_LOOP:
return ERROR_CANT_RESOLVE_FILENAME;
913 #if _POSIX_C_SOURCE >= 200112L && !defined(__NEWLIB__)
935 return GetLastError();
960 strerror_s(strerrbuf, buflen,
errnum);
963 #elif _POSIX_C_SOURCE >= 200112L
966 return strerror_r(
errnum, strerrbuf, buflen);
968 int errc = strerror_r(
errnum, strerrbuf, buflen);
977 if (buflen && !memccpy(strerrbuf, strerror(
errnum),
'\0',
980 strerrbuf[buflen - 1] =
'\0';
992 static char errstr[ERRSTR_SIZE];
998 buflen =
sizeof(errstr);
1002 if (!FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM
1003 | FORMAT_MESSAGE_IGNORE_INSERTS,
1004 NULL, errc, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
1005 strerrbuf, buflen, NULL))
1009 size_t n = strlen(strerrbuf);
1011 strerrbuf[n - 2] =
'\0';
1014 #if _POSIX_C_SOURCE >= 200112L && !defined(__NEWLIB__)
1016 case -
ABS(EAI_AGAIN):
1017 return gai_strerror_r(EAI_AGAIN, strerrbuf, buflen);
1018 case -
ABS(EAI_BADFLAGS):
1019 return gai_strerror_r(EAI_BADFLAGS, strerrbuf, buflen);
1020 case -
ABS(EAI_FAIL):
return gai_strerror_r(EAI_FAIL, strerrbuf, buflen);
1021 case -
ABS(EAI_FAMILY):
1022 return gai_strerror_r(EAI_FAMILY, strerrbuf, buflen);
1023 case -
ABS(EAI_MEMORY):
1024 return gai_strerror_r(EAI_MEMORY, strerrbuf, buflen);
1025 case -
ABS(EAI_NONAME):
1026 return gai_strerror_r(EAI_NONAME, strerrbuf, buflen);
1027 case -
ABS(EAI_OVERFLOW):
1028 return gai_strerror_r(EAI_OVERFLOW, strerrbuf, buflen);
1029 case -
ABS(EAI_SERVICE):
1030 return gai_strerror_r(EAI_SERVICE, strerrbuf, buflen);
1031 case -
ABS(EAI_SOCKTYPE):
1032 return gai_strerror_r(EAI_SOCKTYPE, strerrbuf, buflen);
1039 #if _POSIX_C_SOURCE >= 200112L && !defined(__NEWLIB__)
1041 gai_strerror_r(
int ecode,
char *strerrbuf,
size_t buflen)
1045 if (buflen && !memccpy(strerrbuf, gai_strerror(ecode),
'\0',
1048 strerrbuf[buflen - 1] =
'\0';
1051 return gai_strerror(ecode);