| #include <windows.h> | |
| #include <malloc.h> | |
| #include <errno.h> | |
| #include <msvcrt.h> | |
| #include <stdio.h> | |
| static errno_t __cdecl _int_strerror_s (char *, size_t, int); | |
| static errno_t __cdecl _stub (char *, size_t, int); | |
| errno_t __cdecl (*__MINGW_IMP_SYMBOL(strerror_s))(char *, size_t, int) = _stub; | |
| static errno_t __cdecl | |
| _stub (char *buffer, size_t numberOfElements, int errnum) | |
| { | |
| errno_t __cdecl (*f)(char *, size_t, int) = __MINGW_IMP_SYMBOL(strerror_s); | |
| if (f == _stub) | |
| { | |
| f = (void*) | |
| GetProcAddress (__mingw_get_msvcrt_handle (), "strerror_s"); | |
| if (!f) | |
| { | |
| f = _int_strerror_s; | |
| } | |
| __MINGW_IMP_SYMBOL(strerror_s) = f; | |
| } | |
| return (*f)(buffer, numberOfElements, errnum); | |
| } | |
| errno_t __cdecl | |
| strerror_s (char *buffer, size_t numberOfElements, int errnum) | |
| { | |
| return _stub (buffer, numberOfElements, errnum); | |
| } | |
| static errno_t __cdecl | |
| _int_strerror_s (char *buffer, size_t numberOfElements, int errnum) | |
| { | |
| char *errmsg = strerror(errnum); | |
| if (!errmsg || !buffer || numberOfElements == 0) | |
| { | |
| errno = EINVAL; | |
| return EINVAL; | |
| } | |
| if (sprintf_s(buffer, numberOfElements, "%s", errmsg) == -1) | |
| { | |
| errno = EINVAL; | |
| return EINVAL; | |
| } | |
| return 0; | |
| } |