#include <windows.h>
#include <io.h>
#include <errno.h>
#include <msvcrt.h>

errno_t __cdecl _sopen_s(int *, const char *, int, int, int);
static errno_t __cdecl _int_sopen_s(int *, const char *, int, int, int);
static errno_t __cdecl _stub(int *, const char *, int, int, int);

errno_t __cdecl (*__MINGW_IMP_SYMBOL(_sopen_s))(int *, const char *, int, int, int) = _stub;

static errno_t __cdecl
_stub (int* pfh, const char *filename, int oflag, int shflag, int pmode)
{
    errno_t __cdecl (*f)(int *, const char *, int, int, int) = __MINGW_IMP_SYMBOL(_sopen_s);

    if (f == _stub) {
        f = (errno_t __cdecl (*)(int *, const char *, int, int, int))
            GetProcAddress (__mingw_get_msvcrt_handle (), "_sopen_s");
        if (f == NULL)
            f = _int_sopen_s;
        __MINGW_IMP_SYMBOL(_sopen_s) = f;
    }

    return (*f)(pfh, filename, oflag, shflag, pmode);
}

static errno_t __cdecl _int_sopen_s(int* pfh, const char *filename, int oflag, int shflag, int pmode)
{
    if (pfh == NULL || filename == NULL) {
        if (pfh != NULL) *pfh = -1;
        errno = EINVAL;
        return EINVAL;
    }

    *pfh = _sopen(filename, oflag, shflag, pmode);
    return errno;
}

errno_t __cdecl _sopen_s(int* pfh, const char *filename, int oflag, int shflag, int pmode)
{
    return _stub (pfh, filename, oflag, shflag, pmode);
}
