* secapi/wmemcpy_s.c: New file.
        * secapi/memcpy_s.c: New file.


git-svn-id: svn+ssh://svn.code.sf.net/p/mingw-w64/code/trunk@5348 4407c894-4637-0410-b4f5-ada5f102cad1
diff --git a/mingw-w64-crt/secapi/memcpy_s.c b/mingw-w64-crt/secapi/memcpy_s.c
new file mode 100644
index 0000000..0f16fca
--- /dev/null
+++ b/mingw-w64-crt/secapi/memcpy_s.c
@@ -0,0 +1,60 @@
+#include <windows.h>
+#include <malloc.h>
+#include <errno.h>
+
+HMODULE __mingw_get_msvcrt_handle (void);
+errno_t __cdecl memcpy_s (void *, size_t, const void *, size_t);
+static errno_t __cdecl _int_memcpy_s (void *, size_t, const void *, size_t);
+static errno_t __cdecl _stub (void *, size_t, const void *, size_t);
+
+errno_t __cdecl (*__MINGW_IMP_SYMBOL(memcpy_s))(void *, size_t, const void *, size_t) = 
+ _stub;
+
+static errno_t __cdecl
+_stub (void *d, size_t dn, const void *s, size_t n)
+{
+  errno_t __cdecl (*f)(void *, size_t, const void *, size_t) = __MINGW_IMP_SYMBOL(memcpy_s);
+
+  if (f == _stub)
+    {
+	f = (errno_t __cdecl (*)(void *, size_t, const void *, size_t))
+	    GetProcAddress (__mingw_get_msvcrt_handle (), "memcpy_s");
+	if (!f)
+	  f = _int_memcpy_s;
+	__MINGW_IMP_SYMBOL(memcpy_s) = f;
+    }
+  return (*f)(d, dn, s, n);
+}
+
+errno_t __cdecl
+memcpy_s (void *d, size_t dn, const void *s, size_t n)
+{
+  return _stub (d, dn, s, n);
+}
+
+static errno_t __cdecl
+_int_memcpy_s (void *d, size_t dn, const void *s, size_t n)
+{
+  if (!n)
+    return 0;
+
+  if (!d || !s)
+    {
+      if (d)
+        memset (d, 0, dn);
+      errno = EINVAL;
+      return EINVAL;
+    }
+
+  if (dn < n)
+    {
+      memset (d, 0, dn);
+
+      errno = ERANGE;
+      return ERANGE;
+    }
+
+  memcpy (d, s, n);
+
+  return 0;
+}