#ifndef WINSOCK_H
#define WINSOCK_H

/* defines missing from netlib that Winsock and BSD use - this
 * is dodgy...
 * 14 Dec 2003: Now provided by TCPIPLibs

#define HOST_NOT_FOUND 11001
#define TRY_AGAIN      11002
#define NO_RECOVERY    11003
#define NO_DATA        11004
*/

/* dummy defines for Windows event codes - these don't have an equivalent in Unix */
#define FD_READ        1
#define FD_CLOSE       2

/* setsockopt flags - Netlib doesn't have these */

#ifndef IPTOS_LOWDELAY
#define	IPTOS_LOWDELAY		0x10
#define	IPTOS_THROUGHPUT	0x08
#define	IPTOS_RELIABILITY	0x04
#endif

#ifndef IP_TOS
#define	IP_TOS		      3	   /* IP type of service   */
#endif


#define SOCKET_ERROR            (-1)

extern int WSAGetLastError(void);
extern int WSAAsyncSelect(SOCKET socket, HWND hWnd, unsigned int wMsg, long lEvent);

struct hostent *winsock_multitask_gethostbyname(const char *name);
#define gethostbyname winsock_multitask_gethostbyname

#define HIWORD(x) (x & 0xffff0000)>>16
#define LOWORD(x) (x & 0x0000ffff)
#define WSAGETSELECTERROR(lParam)            HIWORD(lParam)

#define WSAGETSELECTEVENT(lParam)            LOWORD(lParam)


/* Microsoft Windows Extended data types */
typedef struct sockaddr_in SOCKADDR_IN;
typedef struct sockaddr_in *PSOCKADDR_IN;
typedef struct sockaddr_in FAR *LPSOCKADDR_IN;


#define	WSAEPERM EPERM
#define	WSAENOENT ENOENT
#define	WSAESRCH ESRCH
#define	WSAEINTR EINTR
#define	WSAEIO EIO
#define	WSAENXIO ENXIO
#define	WSAE2BIG E2BIG
#define	WSAENOEXEC ENOEXEC
#define	WSAEBADF EBADF
#define	WSAECHILD ECHILD
#define	WSAEAGAIN EAGAIN
#define	WSAENOMEM        ENOMEM
#define	WSAEACCES EACCES
#define	WSAEFAULT EFAULT
#define	WSAENOTBLK ENOTBLK
#define	WSAEBUSY EBUSY
#define	WSAEEXIST EEXIST
#define	WSAEXDEV EXDEV
#define	WSAENODEV ENODEV
#define	WSAENOTDIR ENOTDIR
#define	WSAEISDIR EISDIR
#define	WSAEINVAL EINVAL
#define	WSAENFILE ENFILE
#define	WSAEMFILE EMFILE
#define	WSAENOTTY ENOTTY
#define	WSAETXTBSY ETXTBSY
#define	WSAEFBIG EFBIG
#define	WSAENOSPC ENOSPC
#define	WSAESPIPE ESPIPE
#define	WSAEROFS EROFS
#define	WSAEMLINK EMLINK
#define	WSAEPIPE EPIPE

/* math software */
#define	WSAEDOM EDOM
#define	WSAERANGE ERANGE

/* non-blocking and interrupt i/o */
#define	WSAEWOULDBLOCK EWOULDBLOCK
#define	WSAEINPROGRESS EINPROGRESS
#define	WSAEALREADY EALREADY

/* ipc/network software */

	/* argument errors */
#define	WSAENOTSOCK ENOTSOCK
#define	WSAEDESTADDRREQ EDESTADDRREQ
#define	WSAEMSGSIZE EMSGSIZE
#define	WSAEPROTOTYPE EPROTOTYPE
#define	WSAENOPROTOOPT ENOPROTOOPT
#define	WSAEPROTONOSUPPORT EPROTONOSUPPORT
#define	WSAESOCKTNOSUPPORT ESOCKTNOSUPPORT
#define	WSAEOPNOTSUPP EOPNOTSUPP
#define	WSAEPFNOSUPPORT EPFNOSUPPORT
#define	WSAEAFNOSUPPORT EAFNOSUPPORT
#define	WSAEADDRINUSE EADDRINUSE
#define	WSAEADDRNOTAVAIL EADDRNOTAVAIL

	/* operational errors */
#define	WSAENETDOWN ENETDOWN
#define	WSAENETUNREACH ENETUNREACH
#define	WSAENETRESET ENETRESET
#define	WSAECONNABORTED ECONNABORTED
#define	WSAECONNRESET ECONNRESET
#define	WSAENOBUFS ENOBUFS
#define	WSAEISCONN EISCONN
#define	WSAENOTCONN ENOTCONN
#define	WSAESHUTDOWN ESHUTDOWN
#define	WSAETOOMANYREFS ETOOMANYREFS
#define	WSAETIMEDOUT ETIMEDOUT
#define	WSAECONNREFUSED ECONNREFUSED

	/* */
#define	WSAELOOP LOOP
#define	WSAENAMETOOLONG ENAMETOOLONG

/* should be rearranged */
#define	WSAEHOSTDOWN HOSTDOWN
#define	WSAEHOSTUNREACH EHOSTUNREACH
#define	WSAENOTEMPTY ENOTEMPTY

/* quotas & mush */
#define	WSAEPROCLIM EPROCLIM
#define	WSAEUSERS EUSERS
#define	WSAEDQUOT EDQUOT

/* Network File System */
#define	WSAESTALE ESTALE
#define	WSAEREMOTE EREMOTE

/* SystemV Record Locking */
#define	WSAEDEADLK EDEADLK
#define	WSAENOLCK ENOLCK

/* SystemV IPC */
#define	WSAENOMSG ENOMSG
#define	WSAEIDRM EIDRM

/* Shared libraries */
#define	WSAELIBVER ELIBVER
#define	WSAELIBACC ELIBACC
#define	WSAELIBLIM ELIBLIM
#define	WSAELIBNOENT ELIBNOENT
#define	WSAELIBNOEXEC ELIBNOEXEC

#define WSAHOST_NOT_FOUND HOST_NOT_FOUND
#define WSATRY_AGAIN TRY_AGAIN
#define WSANO_DATA NO_DATA

#endif
