1 #include <windows.h>
2 #include <malloc.h>
3 #include <errno.h>
4 #include <msvcrt.h>
5 #include <sec_api/stdio_s.h>
6
7 static errno_t __cdecl _int_strerror_s (char *, size_t, int);
8 static errno_t __cdecl _stub (char *, size_t, int);
9
10 errno_t __cdecl (*__MINGW_IMP_SYMBOL(strerror_s))(char *, size_t, int) = _stub;
11
12 static errno_t __cdecl
_stub(char * buffer,size_t numberOfElements,int errnum)13 _stub (char *buffer, size_t numberOfElements, int errnum)
14 {
15 errno_t __cdecl (*f)(char *, size_t, int) = __MINGW_IMP_SYMBOL(strerror_s);
16
17 if (f == _stub)
18 {
19 f = (errno_t __cdecl (*)(char *, size_t, int))
20 GetProcAddress (__mingw_get_msvcrt_handle (), "strerror_s");
21 if (!f)
22 f = _int_strerror_s;
23 __MINGW_IMP_SYMBOL(strerror_s) = f;
24 }
25 return (*f)(buffer, numberOfElements, errnum);
26 }
27
28 errno_t __cdecl
strerror_s(char * buffer,size_t numberOfElements,int errnum)29 strerror_s (char *buffer, size_t numberOfElements, int errnum)
30 {
31 return _stub (buffer, numberOfElements, errnum);
32 }
33
34 static errno_t __cdecl
_int_strerror_s(char * buffer,size_t numberOfElements,int errnum)35 _int_strerror_s (char *buffer, size_t numberOfElements, int errnum)
36 {
37 char *errmsg = strerror(errnum);
38
39 if (!errmsg || !buffer || numberOfElements == 0)
40 {
41 errno = EINVAL;
42 return EINVAL;
43 }
44
45 if (sprintf_s(buffer, numberOfElements, "%s", errmsg) == -1)
46 {
47 errno = EINVAL;
48 return EINVAL;
49 }
50
51 return 0;
52 }
53