• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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