| #include <windows.h> |
| #include <malloc.h> |
| #include <errno.h> |
| #include <msvcrt.h> |
| #include <sec_api/stdio_s.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 = (errno_t __cdecl (*)(char *, size_t, int)) |
| 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; |
| } |