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