1 #include <windows.h>
2 #include <malloc.h>
3 #include <errno.h>
4 #include <msvcrt.h>
5 #include <sec_api/wchar_s.h>
6
7 static errno_t __cdecl _int_wmktemp_s (wchar_t *, size_t);
8 static errno_t __cdecl _stub (wchar_t *, size_t);
9
10 errno_t __cdecl (*__MINGW_IMP_SYMBOL(_wmktemp_s))(wchar_t *, size_t) =
11 _stub;
12
13 static errno_t __cdecl
_stub(wchar_t * d,size_t dn)14 _stub (wchar_t *d, size_t dn)
15 {
16 errno_t __cdecl (*f)(wchar_t *, size_t) = __MINGW_IMP_SYMBOL(_wmktemp_s);
17
18 if (f == _stub)
19 {
20 f = (errno_t __cdecl (*)(wchar_t *, size_t))
21 GetProcAddress (__mingw_get_msvcrt_handle (), "_wmktemp_s");
22 if (!f)
23 f = _int_wmktemp_s;
24 __MINGW_IMP_SYMBOL(_wmktemp_s) = f;
25 }
26 return (*f)(d, dn);
27 }
28
29 errno_t __cdecl
_wmktemp_s(wchar_t * d,size_t dn)30 _wmktemp_s (wchar_t *d, size_t dn)
31 {
32 return _stub (d, dn);
33 }
34
35 static errno_t __cdecl
_int_wmktemp_s(wchar_t * d,size_t dn)36 _int_wmktemp_s (wchar_t *d, size_t dn)
37 {
38 size_t sz;
39 if (!d || !dn)
40 {
41 _wmktemp (NULL);
42 return EINVAL;
43 }
44 sz = wcsnlen (d, dn);
45 if (sz >= dn || sz < 6)
46 {
47 d[0] = 0;
48 _wmktemp (NULL);
49 return EINVAL;
50 }
51 if (_wmktemp (d) != NULL)
52 return 0;
53 return errno;
54 }
55