Mercurial > projects > ddbg_continued
diff win32/winsock.d @ 1:4a9dcbd9e54f
-files of 0.13 beta
-fixes so that it now compiles with the current dmd version
author | marton@basel.hu |
---|---|
date | Tue, 05 Apr 2011 20:44:01 +0200 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/win32/winsock.d Tue Apr 05 20:44:01 2011 +0200 @@ -0,0 +1,583 @@ +/***********************************************************************\ +* winsock.d * +* * +* Windows API header module * +* * +* Translated from MinGW Windows headers * +* by Stewart Gordon * +\***********************************************************************/ +module win32.winsock; + +/* + Definitions for winsock 1.1 + + Portions Copyright (c) 1980, 1983, 1988, 1993 + The Regents of the University of California. All rights reserved. + + Portions Copyright (c) 1993 by Digital Equipment Corporation. + */ + +/* DRK: This module should not be included if -version=Win32_Winsock2 has + * been set. If it has, assert. I think it's better that way than letting + * the user believe that it's worked. + * + * SG: It has now been changed so that winsock2 is the default, and + * -version=Win32_Winsock1 must be set to use winsock. + */ +version(Win32_Winsock1) {} +else { + pragma(msg, "Cannot use win32.winsock without " + ~ "Win32_Winsock1 defined."); + static assert(false); +} + +import win32.windef; + +alias char u_char; +alias ushort u_short; +alias uint u_int, u_long, SOCKET; + +const size_t FD_SETSIZE = 64; + +// shutdown() how types +enum : int { + SD_RECEIVE, + SD_SEND, + SD_BOTH +} + +struct FD_SET { + u_int fd_count; + SOCKET[FD_SETSIZE] fd_array; + + static void opCall(SOCKET fd, FD_SET* set) { + if (set.fd_count < FD_SETSIZE) set.fd_array[set.fd_count++] = fd; + } +} +alias FD_SET* PFD_SET, LPFD_SET; + +extern(Pascal) int __WSAFDIsSet(SOCKET, FD_SET*); +alias __WSAFDIsSet FD_ISSET; + +void FD_CLR(SOCKET fd, FD_SET* set) { + for (u_int i = 0; i < set.fd_count; i++) { + if (set.fd_array[i] == fd) { + while (i < set.fd_count - 1) { + set.fd_array[i] = set.fd_array[i+1]; + i++; + } + set.fd_count--; + break; + } + } +} + +/+void FD_SET(SOCKET fd, FD_SET* set) { + if (set.fd_count < FD_SETSIZE) set.fd_array[set.fd_count++] = fd; +}+/ + +void FD_ZERO(FD_SET* set) { + set.fd_count = 0; +} + + +struct TIMEVAL { + int tv_sec; + int tv_usec; + + int opCmp(TIMEVAL tv) { + if (tv_sec < tv.tv_sec) return -1; + if (tv_sec > tv.tv_sec) return 1; + if (tv_usec < tv.tv_usec) return -1; + if (tv_usec > tv.tv_usec) return 1; + return 0; + } +} +alias TIMEVAL* PTIMEVAL, LPTIMEVAL; + +bool timerisset(TIMEVAL tvp) { + return tvp.tv_sec || tvp.tv_usec; +} + +void timerclear(inout TIMEVAL tvp) { + tvp.tv_sec = tvp.tv_usec = 0; +} + +struct HOSTENT { + char* h_name; + char** h_aliases; + short h_addrtype; + short h_length; + char** h_addr_list; + + char* h_addr() { return h_addr_list[0]; } + char* h_addr(char* h) { return h_addr_list[0] = h; } +} +alias HOSTENT* PHOSTENT, LPHOSTENT; + +struct LINGER { + u_short l_onoff; + u_short l_linger; +} +alias LINGER* PLINGER, LPLINGER; + +// TOTHINKABOUT: do we need these, or are they just for internal use? +/+ +#define IOCPARM_MASK 0x7f +#define IOC_VOID 0x20000000 +#define IOC_OUT 0x40000000 +#define IOC_IN 0x80000000 +#define IOC_INOUT (IOC_IN|IOC_OUT) + +#define _IO(x,y) (IOC_VOID|((x)<<8)|(y)) +#define _IOR(x,y,t) (IOC_OUT|(((int)sizeof(t)&IOCPARM_MASK)<<16)|((x)<<8)|(y)) +#define _IOW(x,y,t) (IOC_IN|(((int)sizeof(t)&IOCPARM_MASK)<<16)|((x)<<8)|(y)) + +#define FIONBIO _IOW('f', 126, u_long) +#define FIONREAD _IOR('f', 127, u_long) +#define FIOASYNC _IOW('f', 125, u_long) +#define SIOCSHIWAT _IOW('s', 0, u_long) +#define SIOCGHIWAT _IOR('s', 1, u_long) +#define SIOCSLOWAT _IOW('s', 2, u_long) +#define SIOCGLOWAT _IOR('s', 3, u_long) +#define SIOCATMARK _IOR('s', 7, u_long) ++/ + +enum : DWORD { + FIONBIO = 0x8004667E, + FIONREAD = 0x4004667F, + FIOASYNC = 0x8004667D, + SIOCSHIWAT = 0x80047300, + SIOCGHIWAT = 0x40047301, + SIOCSLOWAT = 0x80047302, + SIOCGLOWAT = 0x40047303, + SIOCATMARK = 0x40047307 +} + +struct netent { + char* n_name; + char** n_aliases; + short n_addrtype; + u_long n_net; +} + +struct SERVENT { + char* s_name; + char** s_aliases; + short s_port; + char* s_proto; +} +alias SERVENT* PSERVENT, LPSERVENT; + +struct PROTOENT { + char* p_name; + char** p_aliases; + short p_proto; +} +alias PROTOENT* PPROTOENT, LPPROTOENT; + +enum : int { + IPPROTO_IP = 0, + IPPROTO_ICMP = 1, + IPPROTO_IGMP = 2, + IPPROTO_GGP = 3, + IPPROTO_TCP = 6, + IPPROTO_PUP = 12, + IPPROTO_UDP = 17, + IPPROTO_IDP = 22, + IPPROTO_ND = 77, + IPPROTO_RAW = 255, + IPPROTO_MAX = 256 +} + +// These are not documented on the MSDN site +enum { + IPPORT_ECHO = 7, + IPPORT_DISCARD = 9, + IPPORT_SYSTAT = 11, + IPPORT_DAYTIME = 13, + IPPORT_NETSTAT = 15, + IPPORT_FTP = 21, + IPPORT_TELNET = 23, + IPPORT_SMTP = 25, + IPPORT_TIMESERVER = 37, + IPPORT_NAMESERVER = 42, + IPPORT_WHOIS = 43, + IPPORT_MTP = 57, + IPPORT_TFTP = 69, + IPPORT_RJE = 77, + IPPORT_FINGER = 79, + IPPORT_TTYLINK = 87, + IPPORT_SUPDUP = 95, + IPPORT_EXECSERVER = 512, + IPPORT_LOGINSERVER = 513, + IPPORT_CMDSERVER = 514, + IPPORT_EFSSERVER = 520, + IPPORT_BIFFUDP = 512, + IPPORT_WHOSERVER = 513, + IPPORT_ROUTESERVER = 520, + IPPORT_RESERVED = 1024 +} + +// These are not documented on the MSDN site +enum { + IMPLINK_IP = 155, + IMPLINK_LOWEXPER = 156, + IMPLINK_HIGHEXPER = 158 +} + +struct IN_ADDR { + union { + struct { u_char s_net, s_host, s_lh, s_impno; } + struct { u_short s_w1, s_imp; } + u_long s_addr; + } +} +alias IN_ADDR* PIN_ADDR, LPIN_ADDR; + +// IN_CLASSx are not used anywhere or documented on MSDN. +bool IN_CLASSA(int i) { + return (i & 0x80000000) == 0; +} + +const IN_CLASSA_NET = 0xff000000; +const IN_CLASSA_NSHIFT = 24; +const IN_CLASSA_HOST = 0x00ffffff; +const IN_CLASSA_MAX = 128; + +bool IN_CLASSB(int i) { + return (i & 0xC0000000) == 0x80000000; +} + +const IN_CLASSB_NET = 0xffff0000; +const IN_CLASSB_NSHIFT = 16; +const IN_CLASSB_HOST = 0x0000ffff; +const IN_CLASSB_MAX = 65536; + +bool IN_CLASSC(int i) { + return (i & 0xE0000000) == 0xC0000000; +} + +const IN_CLASSC_NET = 0xffffff00; +const IN_CLASSC_NSHIFT = 8; +const IN_CLASSC_HOST = 0x000000ff; + +const u_long + INADDR_ANY = 0, + INADDR_LOOPBACK = 0x7F000001, + INADDR_BROADCAST = 0xFFFFFFFF, + INADDR_NONE = 0xFFFFFFFF; + +struct SOCKADDR_IN { + short sin_family; + u_short sin_port; + IN_ADDR sin_addr; + char[8] sin_zero; +} +alias SOCKADDR_IN* PSOCKADDR_IN, LPSOCKADDR_IN; + +const size_t + WSADESCRIPTION_LEN = 256, + WSASYS_STATUS_LEN = 128; + +struct WSADATA { + WORD wVersion; + WORD wHighVersion; + char[WSADESCRIPTION_LEN+1] szDescription; + char[WSASYS_STATUS_LEN+1] szSystemStatus; + ushort iMaxSockets; + ushort iMaxUdpDg; + char* lpVendorInfo; +} +alias WSADATA* LPWSADATA; + +// This is not documented on the MSDN site +const IP_OPTIONS = 1; + +const int + SO_DEBUG = 1, + SO_ACCEPTCONN = 2, + SO_REUSEADDR = 4, + SO_KEEPALIVE = 8, + SO_DONTROUTE = 16, + SO_BROADCAST = 32, + SO_USELOOPBACK = 64, + SO_LINGER = 128, + SO_OOBINLINE = 256, + SO_DONTLINGER = ~SO_LINGER; + +enum : int { + SO_SNDBUF = 0x1001, + SO_RCVBUF, + SO_SNDLOWAT, + SO_RCVLOWAT, + SO_SNDTIMEO, + SO_RCVTIMEO, + SO_ERROR, + SO_TYPE // = 0x1008 +} + +/* + * Note that the next 5 IP defines are specific to WinSock 1.1 (wsock32.dll). + * They will cause errors or unexpected results if used with the + * (gs)etsockopts exported from the WinSock 2 lib, ws2_32.dll. Refer ws2tcpip.h. + */ +enum : int { + IP_MULTICAST_IF = 2, + IP_MULTICAST_TTL, + IP_MULTICAST_LOOP, + IP_ADD_MEMBERSHIP, + IP_DROP_MEMBERSHIP +} + +// These are not documented on the MSDN site +const IP_DEFAULT_MULTICAST_TTL = 1; +const IP_DEFAULT_MULTICAST_LOOP = 1; +const IP_MAX_MEMBERSHIPS = 20; + +struct ip_mreq { + IN_ADDR imr_multiaddr; + IN_ADDR imr_interface; +} + +const SOCKET INVALID_SOCKET = uint.max; +const int SOCKET_ERROR = -1; + +enum : int { + SOCK_STREAM = 1, + SOCK_DGRAM, + SOCK_RAW, + SOCK_RDM, + SOCK_SEQPACKET +} + +const int TCP_NODELAY = 1; + +enum : int { + AF_UNSPEC, + AF_UNIX, + AF_INET, + AF_IMPLINK, + AF_PUP, + AF_CHAOS, + AF_IPX, // = 6 + AF_NS = 6, + AF_ISO, + AF_OSI = AF_ISO, + AF_ECMA, + AF_DATAKIT, + AF_CCITT, + AF_SNA, + AF_DECnet, + AF_DLI, + AF_LAT, + AF_HYLINK, + AF_APPLETALK, + AF_NETBIOS, + AF_VOICEVIEW, + AF_FIREFOX, + AF_UNKNOWN1, + AF_BAN, + AF_ATM, + AF_INET6, + AF_MAX // = 24 +} + +struct SOCKADDR { + u_short sa_family; + char[14] sa_data; +} +alias SOCKADDR* PSOCKADDR, LPSOCKADDR; + +struct sockproto { + u_short sp_family; + u_short sp_protocol; +} + +enum : int { + PF_UNSPEC = AF_UNSPEC, + PF_UNIX = AF_UNIX, + PF_INET = AF_INET, + PF_IMPLINK = AF_IMPLINK, + PF_PUP = AF_PUP, + PF_CHAOS = AF_CHAOS, + PF_NS = AF_NS, + PF_IPX = AF_IPX, + PF_ISO = AF_ISO, + PF_OSI = AF_OSI, + PF_ECMA = AF_ECMA, + PF_DATAKIT = AF_DATAKIT, + PF_CCITT = AF_CCITT, + PF_SNA = AF_SNA, + PF_DECnet = AF_DECnet, + PF_DLI = AF_DLI, + PF_LAT = AF_LAT, + PF_HYLINK = AF_HYLINK, + PF_APPLETALK = AF_APPLETALK, + PF_VOICEVIEW = AF_VOICEVIEW, + PF_FIREFOX = AF_FIREFOX, + PF_UNKNOWN1 = AF_UNKNOWN1, + PF_BAN = AF_BAN, + PF_ATM = AF_ATM, + PF_INET6 = AF_INET6, + PF_MAX = AF_MAX +} + +const int SOL_SOCKET = 0xFFFF; + +const int SOMAXCONN = 5; + +const int + MSG_OOB = 1, + MSG_PEEK = 2, + MSG_DONTROUTE = 4, + MSG_MAXIOVLEN = 16, + MSG_PARTIAL = 0x8000; + +const size_t MAXGETHOSTSTRUCT = 1024; + +const int + FD_READ = 1, + FD_WRITE = 2, + FD_OOB = 4, + FD_ACCEPT = 8, + FD_CONNECT = 16, + FD_CLOSE = 32; + +enum : int { + WSABASEERR = 10000, + WSAEINTR = 10004, + WSAEBADF = 10009, + WSAEACCES = 10013, + WSAEFAULT = 10014, + WSAEINVAL = 10022, + WSAEMFILE = 10024, + WSAEWOULDBLOCK = 10035, + WSAEINPROGRESS = 10036, + WSAEALREADY = 10037, + WSAENOTSOCK = 10038, + WSAEDESTADDRREQ = 10039, + WSAEMSGSIZE = 10040, + WSAEPROTOTYPE = 10041, + WSAENOPROTOOPT = 10042, + WSAEPROTONOSUPPORT = 10043, + WSAESOCKTNOSUPPORT = 10044, + WSAEOPNOTSUPP = 10045, + WSAEPFNOSUPPORT = 10046, + WSAEAFNOSUPPORT = 10047, + WSAEADDRINUSE = 10048, + WSAEADDRNOTAVAIL = 10049, + WSAENETDOWN = 10050, + WSAENETUNREACH = 10051, + WSAENETRESET = 10052, + WSAECONNABORTED = 10053, + WSAECONNRESET = 10054, + WSAENOBUFS = 10055, + WSAEISCONN = 10056, + WSAENOTCONN = 10057, + WSAESHUTDOWN = 10058, + WSAETOOMANYREFS = 10059, + WSAETIMEDOUT = 10060, + WSAECONNREFUSED = 10061, + WSAELOOP = 10062, + WSAENAMETOOLONG = 10063, + WSAEHOSTDOWN = 10064, + WSAEHOSTUNREACH = 10065, + WSAENOTEMPTY = 10066, + WSAEPROCLIM = 10067, + WSAEUSERS = 10068, + WSAEDQUOT = 10069, + WSAESTALE = 10070, + WSAEREMOTE = 10071, + WSAEDISCON = 10101, + WSASYSNOTREADY = 10091, + WSAVERNOTSUPPORTED = 10092, + WSANOTINITIALISED = 10093, + WSAHOST_NOT_FOUND = 11001, + WSATRY_AGAIN = 11002, + WSANO_RECOVERY = 11003, + WSANO_DATA = 11004, + WSANO_ADDRESS = WSANO_DATA +} + +alias WSAGetLastError h_errno; + +enum : int { + HOST_NOT_FOUND = WSAHOST_NOT_FOUND, + TRY_AGAIN = WSATRY_AGAIN, + NO_RECOVERY = WSANO_RECOVERY, + NO_DATA = WSANO_DATA, + NO_ADDRESS = WSANO_ADDRESS +} + +extern (Pascal) { + SOCKET accept(SOCKET, SOCKADDR*, int*); + int bind(SOCKET, SOCKADDR*, int); + int closesocket(SOCKET); + int connect(SOCKET, SOCKADDR*, int); + int ioctlsocket(SOCKET, int, u_long*); + int getpeername(SOCKET, SOCKADDR*, int*); + int getsockname(SOCKET, SOCKADDR*, int*); + int getsockopt(SOCKET, int, int, char*, int*); + uint inet_addr(char*); + int listen(SOCKET, int); + int recv(SOCKET, char*, int, int); + int recvfrom(SOCKET, char*, int, int, SOCKADDR*, int*); + int send(SOCKET, char*, int, int); + int sendto(SOCKET, char*, int, int, SOCKADDR*, int); + int setsockopt(SOCKET, int, int, char*, int); + int shutdown(SOCKET, int); + SOCKET socket(int, int, int); + int WSAStartup(WORD, LPWSADATA); + int WSACleanup(); + void WSASetLastError(int); + int WSAGetLastError(); + BOOL WSAIsBlocking(); + int WSAUnhookBlockingHook(); + FARPROC WSASetBlockingHook(FARPROC); + int WSACancelBlockingCall(); + HANDLE WSAAsyncGetServByName(HWND, u_int, char*, char*, char*, int); + HANDLE WSAAsyncGetServByPort(HWND, u_int, int, char*, char*, int); + HANDLE WSAAsyncGetProtoByName(HWND, u_int, char*, char*, int); + HANDLE WSAAsyncGetProtoByNumber(HWND, u_int, int, char*, int); + HANDLE WSAAsyncGetHostByName(HWND, u_int, char*, char*, int); + HANDLE WSAAsyncGetHostByAddr(HWND, u_int, char*, int, int, char*, int); + int WSACancelAsyncRequest(HANDLE); + int WSAAsyncSelect(SOCKET, HWND, u_int, int); + u_long htonl(u_long); + u_long ntohl(u_long); + u_short htons(u_short); + u_short ntohs(u_short); + int select(int nfds, FD_SET*, FD_SET*, FD_SET*, TIMEVAL*); + int gethostname(char*, int); +} + +extern (Windows) { + char* inet_ntoa(IN_ADDR); + HOSTENT* gethostbyaddr(char*, int, int); + HOSTENT* gethostbyname(char*); + SERVENT* getservbyport(int, char*); + SERVENT* getservbyname(char*, char*); + PROTOENT* getprotobynumber(int); + PROTOENT* getprotobyname(char*); +} + +alias MAKELONG WSAMAKEASYNCREPLY, WSAMAKESELECTREPLY; +alias LOWORD WSAGETASYNCBUFLEN, WSAGETSELECTEVENT; +alias HIWORD WSAGETASYNCERROR, WSAGETSELECTERROR; + + +/* + * Recent MSDN docs indicate that the MS-specific extensions exported from + * mswsock.dll (AcceptEx, TransmitFile. WSARecEx and GetAcceptExSockaddrs) are + * declared in mswsock.h. These extensions are not supported on W9x or WinCE. + * However, code using WinSock 1.1 API may expect the declarations and + * associated defines to be in this header. Thus we include mswsock.h here. + * + * When linking against the WinSock 1.1 lib, wsock32.dll, the mswsock functions + * are automatically routed to mswsock.dll (on platforms with support). + * The WinSock 2 lib, ws2_32.dll, does not contain any references to + * the mswsock extensions. + */ + +import win32.mswsock;