#ifndef NIXIO_MINGW_COMPAT_H_
#define NIXIO_MINGW_COMPAT_H_

#include <winsock2.h>
#include <ws2tcpip.h>
#include <io.h>
#include <process.h>
#include <stdint.h>
#include <sys/stat.h>
#include <errno.h>

typedef unsigned int uint;
typedef unsigned long ulong;

#define S_ISLNK(m) 0
#define S_ISSOCK(m) 0

#define EWOULDBLOCK WSAEWOULDBLOCK
#define EAFNOSUPPORT WSAEAFNOSUPPORT
#define ENOPROTOOPT WSAENOPROTOOPT

#define SHUT_RD		SD_RECEIVE
#define SHUT_WR		SD_SEND
#define SHUT_RDWR	SD_BOTH

#define pipe(fds) _pipe(fds, 65536, 0)
#define fsync _commit
#define lseek lseek64
#define stat _stati64
#define lstat _stati64
#define fstat _fstati64


#define F_LOCK 1
#define F_ULOCK 0
#define F_TLOCK 2
#define F_TEST 3
int nixio__mgw_lockf(int fd, int cmd, off_t len);
#define lockf nixio__mgw_lockf

const char* nixio__mgw_inet_ntop
(int af, const void *src, char *dst, socklen_t size);
#define inet_ntop nixio__mgw_inet_ntop

int nixio__mgw_inet_pton (int af, const char *src, void *dst);
#define inet_pton nixio__mgw_inet_pton


#ifndef POLLIN
#define POLLIN	0x001
#define POLLOUT	0x004
#define POLLERR 0x008
struct pollfd {
   int   fd;
   short events;
   short revents;
};
#endif

typedef int nfds_t;
int nixio__mgw_poll(struct pollfd *fds, nfds_t nfds, int timeout);
#define poll nixio__mgw_poll


struct timespec {
      time_t tv_sec;
      long   tv_nsec;
};

int nixio__mgw_nanosleep(const struct timespec *req, struct timespec *rem);
#define nanosleep nixio__mgw_nanosleep


char* nixio__mgw_realpath(const char *path, char *resolved);
#define realpath nixio__mgw_realpath


int nixio__mgw_link(const char *oldpath, const char *newpath);
#define link nixio__mgw_link


int nixio__mgw_utimes(const char *filename, const struct timeval times[2]);
#define utimes nixio__mgw_utimes


#define setenv(k, v, o) !SetEnvironmentVariable(k, v)
#define unsetenv(k) !SetEnvironmentVariable(k, NULL)

#define execv(p, a) execv(p, (const char* const*)a)
#define execvp(p, a) execvp(p, (const char* const*)a)
#define execve(p, a, e) execve(p, (const char* const*)a, (const char* const*)e)

#define mkdir(p, m) mkdir(p)


#define nixio__perror_s(L) \
	errno = WSAGetLastError(); \
	return nixio__perror(L);

#define nixio__pstatus_s(L, c) \
	errno = WSAGetLastError(); \
	return nixio__pstatus(L, c);



#define NIXIO_WSA_CONSTANT(x) \
	lua_pushinteger(L, x); \
	lua_setfield(L, -2, #x+3);

void nixio_open__mingw(lua_State *L);

#endif /* NIXIO_MINGW_COMPAT_H_ */