#include <windows.h>
#include <malloc.h>
#include <errno.h>

HMODULE __mingw_get_msvcrt_handle(void);
int __cdecl _waccess (const wchar_t *e, int);
errno_t __cdecl _waccess_s (const wchar_t *, int);
static errno_t __cdecl _int_waccess_s (const wchar_t *, int);
static errno_t __cdecl _stub (const wchar_t *, int);

errno_t __cdecl (*__MINGW_IMP_SYMBOL(_waccess_s))(const wchar_t *, int) = 
 _stub;

static errno_t __cdecl
_stub (const wchar_t *s, int m)
{
  errno_t __cdecl (*f)(const wchar_t *, int) = __MINGW_IMP_SYMBOL(_waccess_s);

  if (f == _stub)
    {
	f = (errno_t __cdecl (*)(const wchar_t *, int))
	    GetProcAddress (__mingw_get_msvcrt_handle (), "_waccess_s");
	if (!f)
	  f = _int_waccess_s;
	__MINGW_IMP_SYMBOL(_waccess_s) = f;
    }
  return (*f)(s, m);
}

errno_t __cdecl
_waccess_s (const wchar_t *s, int m)
{
  return _stub (s, m);
}

static errno_t __cdecl
_int_access_s (const wchar_t *s, int m)
{
  if (!s || (m & ~6) != 0)
    {
      _waccess (NULL, m);
      return EINVAL;
    }
  if (!_waccess (s, m))
    return 0;
  return errno;
}
