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