4e2933c620 2015-04-21 kinaba: /***********************************************************************\ 4e2933c620 2015-04-21 kinaba: * ws2tcpip.d * 4e2933c620 2015-04-21 kinaba: * * 4e2933c620 2015-04-21 kinaba: * Windows API header module * 4e2933c620 2015-04-21 kinaba: * * 4e2933c620 2015-04-21 kinaba: * Translated from MinGW Windows headers * 4e2933c620 2015-04-21 kinaba: * * 4e2933c620 2015-04-21 kinaba: * Placed into public domain * 4e2933c620 2015-04-21 kinaba: \***********************************************************************/ 4e2933c620 2015-04-21 kinaba: 4e2933c620 2015-04-21 kinaba: module win32.ws2tcpip; 4e2933c620 2015-04-21 kinaba: 4e2933c620 2015-04-21 kinaba: import win32.w32api; 4e2933c620 2015-04-21 kinaba: //import win32.winbase; 4e2933c620 2015-04-21 kinaba: import win32.windef; 4e2933c620 2015-04-21 kinaba: //import win32.basetyps; 4e2933c620 2015-04-21 kinaba: import win32.winsock2; 4e2933c620 2015-04-21 kinaba: 4e2933c620 2015-04-21 kinaba: enum { 4e2933c620 2015-04-21 kinaba: IP_OPTIONS = 1, 4e2933c620 2015-04-21 kinaba: 4e2933c620 2015-04-21 kinaba: IP_HDRINCL = 2, 4e2933c620 2015-04-21 kinaba: IP_TOS = 3, 4e2933c620 2015-04-21 kinaba: IP_TTL = 4, 4e2933c620 2015-04-21 kinaba: IP_MULTICAST_IF = 9, 4e2933c620 2015-04-21 kinaba: IP_MULTICAST_TTL = 10, 4e2933c620 2015-04-21 kinaba: IP_MULTICAST_LOOP = 11, 4e2933c620 2015-04-21 kinaba: IP_ADD_MEMBERSHIP = 12, 4e2933c620 2015-04-21 kinaba: IP_DROP_MEMBERSHIP = 13, 4e2933c620 2015-04-21 kinaba: IP_DONTFRAGMENT = 14, 4e2933c620 2015-04-21 kinaba: IP_ADD_SOURCE_MEMBERSHIP = 15, 4e2933c620 2015-04-21 kinaba: IP_DROP_SOURCE_MEMBERSHIP = 16, 4e2933c620 2015-04-21 kinaba: IP_BLOCK_SOURCE = 17, 4e2933c620 2015-04-21 kinaba: IP_UNBLOCK_SOURCE = 18, 4e2933c620 2015-04-21 kinaba: IP_PKTINFO = 19 4e2933c620 2015-04-21 kinaba: } 4e2933c620 2015-04-21 kinaba: 4e2933c620 2015-04-21 kinaba: enum { 4e2933c620 2015-04-21 kinaba: IPV6_UNICAST_HOPS = 4, 4e2933c620 2015-04-21 kinaba: IPV6_MULTICAST_IF = 9, 4e2933c620 2015-04-21 kinaba: IPV6_MULTICAST_HOPS = 10, 4e2933c620 2015-04-21 kinaba: IPV6_MULTICAST_LOOP = 11, 4e2933c620 2015-04-21 kinaba: IPV6_ADD_MEMBERSHIP = 12, 4e2933c620 2015-04-21 kinaba: IPV6_DROP_MEMBERSHIP = 13, 4e2933c620 2015-04-21 kinaba: IPV6_JOIN_GROUP = IPV6_ADD_MEMBERSHIP, 4e2933c620 2015-04-21 kinaba: IPV6_LEAVE_GROUP = IPV6_DROP_MEMBERSHIP, 4e2933c620 2015-04-21 kinaba: IPV6_PKTINFO = 19 4e2933c620 2015-04-21 kinaba: } 4e2933c620 2015-04-21 kinaba: 4e2933c620 2015-04-21 kinaba: const IP_DEFAULT_MULTICAST_TTL = 1; 4e2933c620 2015-04-21 kinaba: const IP_DEFAULT_MULTICAST_LOOP = 1; 4e2933c620 2015-04-21 kinaba: const IP_MAX_MEMBERSHIPS = 20; 4e2933c620 2015-04-21 kinaba: 4e2933c620 2015-04-21 kinaba: const TCP_EXPEDITED_1122 = 2; 4e2933c620 2015-04-21 kinaba: 4e2933c620 2015-04-21 kinaba: const UDP_NOCHECKSUM = 1; 4e2933c620 2015-04-21 kinaba: 4e2933c620 2015-04-21 kinaba: enum { 4e2933c620 2015-04-21 kinaba: IFF_UP = 1, 4e2933c620 2015-04-21 kinaba: IFF_BROADCAST = 2, 4e2933c620 2015-04-21 kinaba: IFF_LOOPBACK = 4, 4e2933c620 2015-04-21 kinaba: IFF_POINTTOPOINT = 8, 4e2933c620 2015-04-21 kinaba: IFF_MULTICAST = 16 4e2933c620 2015-04-21 kinaba: } 4e2933c620 2015-04-21 kinaba: 4e2933c620 2015-04-21 kinaba: const SIO_GET_INTERFACE_LIST = _IOR!('t', 127, u_long); 4e2933c620 2015-04-21 kinaba: 4e2933c620 2015-04-21 kinaba: const INET_ADDRSTRLEN = 16; 4e2933c620 2015-04-21 kinaba: const INET6_ADDRSTRLEN = 46; 4e2933c620 2015-04-21 kinaba: 4e2933c620 2015-04-21 kinaba: const NI_MAXHOST = 1025; 4e2933c620 2015-04-21 kinaba: const NI_MAXSERV = 32; 4e2933c620 2015-04-21 kinaba: 4e2933c620 2015-04-21 kinaba: const NI_NOFQDN = 0x01; 4e2933c620 2015-04-21 kinaba: const NI_NUMERICHOST = 0x02; 4e2933c620 2015-04-21 kinaba: const NI_NAMEREQD = 0x04; 4e2933c620 2015-04-21 kinaba: const NI_NUMERICSERV = 0x08; 4e2933c620 2015-04-21 kinaba: const NI_DGRAM = 0x10; 4e2933c620 2015-04-21 kinaba: 4e2933c620 2015-04-21 kinaba: const AI_PASSIVE = 1; 4e2933c620 2015-04-21 kinaba: const AI_CANONNAME = 2; 4e2933c620 2015-04-21 kinaba: const AI_NUMERICHOST = 4; 4e2933c620 2015-04-21 kinaba: 4e2933c620 2015-04-21 kinaba: const EAI_AGAIN = WSATRY_AGAIN; 4e2933c620 2015-04-21 kinaba: const EAI_BADFLAGS = WSAEINVAL; 4e2933c620 2015-04-21 kinaba: const EAI_FAIL = WSANO_RECOVERY; 4e2933c620 2015-04-21 kinaba: const EAI_FAMILY = WSAEAFNOSUPPORT; 4e2933c620 2015-04-21 kinaba: const EAI_MEMORY = WSA_NOT_ENOUGH_MEMORY; 4e2933c620 2015-04-21 kinaba: const EAI_NODATA = WSANO_DATA; 4e2933c620 2015-04-21 kinaba: const EAI_NONAME = WSAHOST_NOT_FOUND; 4e2933c620 2015-04-21 kinaba: const EAI_SERVICE = WSATYPE_NOT_FOUND; 4e2933c620 2015-04-21 kinaba: const EAI_SOCKTYPE = WSAESOCKTNOSUPPORT; 4e2933c620 2015-04-21 kinaba: 4e2933c620 2015-04-21 kinaba: struct ip_mreq { 4e2933c620 2015-04-21 kinaba: IN_ADDR imr_multiaddr; 4e2933c620 2015-04-21 kinaba: IN_ADDR imr_interface; 4e2933c620 2015-04-21 kinaba: } 4e2933c620 2015-04-21 kinaba: 4e2933c620 2015-04-21 kinaba: struct ip_mreq_source { 4e2933c620 2015-04-21 kinaba: IN_ADDR imr_multiaddr; 4e2933c620 2015-04-21 kinaba: IN_ADDR imr_sourceaddr; 4e2933c620 2015-04-21 kinaba: IN_ADDR imr_interface; 4e2933c620 2015-04-21 kinaba: } 4e2933c620 2015-04-21 kinaba: 4e2933c620 2015-04-21 kinaba: struct ip_msfilter { 4e2933c620 2015-04-21 kinaba: IN_ADDR imsf_multiaddr; 4e2933c620 2015-04-21 kinaba: IN_ADDR imsf_interface; 4e2933c620 2015-04-21 kinaba: u_long imsf_fmode; 4e2933c620 2015-04-21 kinaba: u_long imsf_numsrc; 4e2933c620 2015-04-21 kinaba: IN_ADDR[1] imsf_slist; 4e2933c620 2015-04-21 kinaba: } 4e2933c620 2015-04-21 kinaba: 4e2933c620 2015-04-21 kinaba: template IP_MSFILTER_SIZE(ULONG numsrc) { 4e2933c620 2015-04-21 kinaba: const DWORD IP_MSFILTER_SIZE = ip_msfilter.sizeof - IN_ADDR.sizeof + numsrc * IN_ADDR.sizeof; 4e2933c620 2015-04-21 kinaba: } 4e2933c620 2015-04-21 kinaba: 4e2933c620 2015-04-21 kinaba: struct IN_PKTINFO { 4e2933c620 2015-04-21 kinaba: IN_ADDR ipi_addr; 4e2933c620 2015-04-21 kinaba: UINT ipi_ifindex; 4e2933c620 2015-04-21 kinaba: } 4e2933c620 2015-04-21 kinaba: 4e2933c620 2015-04-21 kinaba: struct IN6_ADDR { 4e2933c620 2015-04-21 kinaba: union { 4e2933c620 2015-04-21 kinaba: u_char[16] _S6_u8; 4e2933c620 2015-04-21 kinaba: u_short[8] _S6_u16; 4e2933c620 2015-04-21 kinaba: u_long[4] _S6_u32; 4e2933c620 2015-04-21 kinaba: } 4e2933c620 2015-04-21 kinaba: } 4e2933c620 2015-04-21 kinaba: alias IN6_ADDR* PIN6_ADDR, LPIN6_ADDR; 4e2933c620 2015-04-21 kinaba: 4e2933c620 2015-04-21 kinaba: struct SOCKADDR_IN6 { 4e2933c620 2015-04-21 kinaba: short sin6_family; 4e2933c620 2015-04-21 kinaba: u_short sin6_port; 4e2933c620 2015-04-21 kinaba: u_long sin6_flowinfo; 4e2933c620 2015-04-21 kinaba: IN6_ADDR sin6_addr; 4e2933c620 2015-04-21 kinaba: u_long sin6_scope_id; 4e2933c620 2015-04-21 kinaba: }; 4e2933c620 2015-04-21 kinaba: alias SOCKADDR_IN6* PSOCKADDR_IN6, LPSOCKADDR_IN6; 4e2933c620 2015-04-21 kinaba: 4e2933c620 2015-04-21 kinaba: extern IN6_ADDR in6addr_any; 4e2933c620 2015-04-21 kinaba: extern IN6_ADDR in6addr_loopback; 4e2933c620 2015-04-21 kinaba: 4e2933c620 2015-04-21 kinaba: /+ TODO: 4e2933c620 2015-04-21 kinaba: #define IN6_ARE_ADDR_EQUAL(a, b) \ 4e2933c620 2015-04-21 kinaba: (memcmp ((void*)(a), (void*)(b), sizeof (struct in6_addr)) == 0) 4e2933c620 2015-04-21 kinaba: 4e2933c620 2015-04-21 kinaba: #define IN6_IS_ADDR_UNSPECIFIED(_addr) \ 4e2933c620 2015-04-21 kinaba: ( (((const u_long *)(_addr))[0] == 0) \ 4e2933c620 2015-04-21 kinaba: && (((const u_long *)(_addr))[1] == 0) \ 4e2933c620 2015-04-21 kinaba: && (((const u_long *)(_addr))[2] == 0) \ 4e2933c620 2015-04-21 kinaba: && (((const u_long *)(_addr))[3] == 0)) 4e2933c620 2015-04-21 kinaba: 4e2933c620 2015-04-21 kinaba: #define IN6_IS_ADDR_LOOPBACK(_addr) \ 4e2933c620 2015-04-21 kinaba: ( (((const u_long *)(_addr))[0] == 0) \ 4e2933c620 2015-04-21 kinaba: && (((const u_long *)(_addr))[1] == 0) \ 4e2933c620 2015-04-21 kinaba: && (((const u_long *)(_addr))[2] == 0) \ 4e2933c620 2015-04-21 kinaba: && (((const u_long *)(_addr))[3] == 0x01000000)) 4e2933c620 2015-04-21 kinaba: 4e2933c620 2015-04-21 kinaba: #define IN6_IS_ADDR_MULTICAST(_addr) (((const u_char *) (_addr))[0] == 0xff) 4e2933c620 2015-04-21 kinaba: 4e2933c620 2015-04-21 kinaba: #define IN6_IS_ADDR_LINKLOCAL(_addr) \ 4e2933c620 2015-04-21 kinaba: ( (((const u_char *)(_addr))[0] == 0xfe) \ 4e2933c620 2015-04-21 kinaba: && ((((const u_char *)(_addr))[1] & 0xc0) == 0x80)) 4e2933c620 2015-04-21 kinaba: 4e2933c620 2015-04-21 kinaba: #define IN6_IS_ADDR_SITELOCAL(_addr) \ 4e2933c620 2015-04-21 kinaba: ( (((const u_char *)(_addr))[0] == 0xfe) \ 4e2933c620 2015-04-21 kinaba: && ((((const u_char *)(_addr))[1] & 0xc0) == 0xc0)) 4e2933c620 2015-04-21 kinaba: 4e2933c620 2015-04-21 kinaba: #define IN6_IS_ADDR_V4MAPPED(_addr) \ 4e2933c620 2015-04-21 kinaba: ( (((const u_long *)(_addr))[0] == 0) \ 4e2933c620 2015-04-21 kinaba: && (((const u_long *)(_addr))[1] == 0) \ 4e2933c620 2015-04-21 kinaba: && (((const u_long *)(_addr))[2] == 0xffff0000)) 4e2933c620 2015-04-21 kinaba: 4e2933c620 2015-04-21 kinaba: #define IN6_IS_ADDR_V4COMPAT(_addr) \ 4e2933c620 2015-04-21 kinaba: ( (((const u_long *)(_addr))[0] == 0) \ 4e2933c620 2015-04-21 kinaba: && (((const u_long *)(_addr))[1] == 0) \ 4e2933c620 2015-04-21 kinaba: && (((const u_long *)(_addr))[2] == 0) \ 4e2933c620 2015-04-21 kinaba: && (((const u_long *)(_addr))[3] != 0) \ 4e2933c620 2015-04-21 kinaba: && (((const u_long *)(_addr))[3] != 0x01000000)) 4e2933c620 2015-04-21 kinaba: 4e2933c620 2015-04-21 kinaba: #define IN6_IS_ADDR_MC_NODELOCAL(_addr) \ 4e2933c620 2015-04-21 kinaba: ( IN6_IS_ADDR_MULTICAST(_addr) \ 4e2933c620 2015-04-21 kinaba: && ((((const u_char *)(_addr))[1] & 0xf) == 0x1)) 4e2933c620 2015-04-21 kinaba: 4e2933c620 2015-04-21 kinaba: #define IN6_IS_ADDR_MC_LINKLOCAL(_addr) \ 4e2933c620 2015-04-21 kinaba: ( IN6_IS_ADDR_MULTICAST (_addr) \ 4e2933c620 2015-04-21 kinaba: && ((((const u_char *)(_addr))[1] & 0xf) == 0x2)) 4e2933c620 2015-04-21 kinaba: 4e2933c620 2015-04-21 kinaba: #define IN6_IS_ADDR_MC_SITELOCAL(_addr) \ 4e2933c620 2015-04-21 kinaba: ( IN6_IS_ADDR_MULTICAST(_addr) \ 4e2933c620 2015-04-21 kinaba: && ((((const u_char *)(_addr))[1] & 0xf) == 0x5)) 4e2933c620 2015-04-21 kinaba: 4e2933c620 2015-04-21 kinaba: #define IN6_IS_ADDR_MC_ORGLOCAL(_addr) \ 4e2933c620 2015-04-21 kinaba: ( IN6_IS_ADDR_MULTICAST(_addr) \ 4e2933c620 2015-04-21 kinaba: && ((((const u_char *)(_addr))[1] & 0xf) == 0x8)) 4e2933c620 2015-04-21 kinaba: 4e2933c620 2015-04-21 kinaba: #define IN6_IS_ADDR_MC_GLOBAL(_addr) \ 4e2933c620 2015-04-21 kinaba: ( IN6_IS_ADDR_MULTICAST(_addr) \ 4e2933c620 2015-04-21 kinaba: && ((((const u_char *)(_addr))[1] & 0xf) == 0xe)) 4e2933c620 2015-04-21 kinaba: +/ 4e2933c620 2015-04-21 kinaba: 4e2933c620 2015-04-21 kinaba: alias int socklen_t; 4e2933c620 2015-04-21 kinaba: 4e2933c620 2015-04-21 kinaba: struct IPV6_MREG { 4e2933c620 2015-04-21 kinaba: IN6_ADDR ipv6mr_multiaddr; 4e2933c620 2015-04-21 kinaba: uint ipv6mr_interface; 4e2933c620 2015-04-21 kinaba: } 4e2933c620 2015-04-21 kinaba: 4e2933c620 2015-04-21 kinaba: struct IN6_PKTINFO { 4e2933c620 2015-04-21 kinaba: IN6_ADDR ipi6_addr; 4e2933c620 2015-04-21 kinaba: UINT ipi6_ifindex; 4e2933c620 2015-04-21 kinaba: } 4e2933c620 2015-04-21 kinaba: 4e2933c620 2015-04-21 kinaba: struct addrinfo { 4e2933c620 2015-04-21 kinaba: int ai_flags; 4e2933c620 2015-04-21 kinaba: int ai_family; 4e2933c620 2015-04-21 kinaba: int ai_socktype; 4e2933c620 2015-04-21 kinaba: int ai_protocol; 4e2933c620 2015-04-21 kinaba: size_t ai_addrlen; 4e2933c620 2015-04-21 kinaba: char* ai_canonname; 4e2933c620 2015-04-21 kinaba: SOCKADDR* ai_addr; 4e2933c620 2015-04-21 kinaba: addrinfo* ai_next; 4e2933c620 2015-04-21 kinaba: } 4e2933c620 2015-04-21 kinaba: 4e2933c620 2015-04-21 kinaba: extern(Windows) { 4e2933c620 2015-04-21 kinaba: static if (_WIN32_WINNT >= 0x0501) { 4e2933c620 2015-04-21 kinaba: void freeaddrinfo(addrinfo*); 4e2933c620 2015-04-21 kinaba: int getaddrinfo (CPtr!(char), CPtr!(char), CPtr!(addrinfo), addrinfo**); 4e2933c620 2015-04-21 kinaba: int getnameinfo(CPtr!(SOCKADDR), socklen_t, char*, DWORD, char*, DWORD, int); 4e2933c620 2015-04-21 kinaba: } 4e2933c620 2015-04-21 kinaba: } 4e2933c620 2015-04-21 kinaba: 4e2933c620 2015-04-21 kinaba: /+ TODO 4e2933c620 2015-04-21 kinaba: static __inline char* 4e2933c620 2015-04-21 kinaba: gai_strerrorA(int ecode) 4e2933c620 2015-04-21 kinaba: { 4e2933c620 2015-04-21 kinaba: static char message[1024+1]; 4e2933c620 2015-04-21 kinaba: DWORD dwFlags = FORMAT_MESSAGE_FROM_SYSTEM 4e2933c620 2015-04-21 kinaba: | FORMAT_MESSAGE_IGNORE_INSERTS 4e2933c620 2015-04-21 kinaba: | FORMAT_MESSAGE_MAX_WIDTH_MASK; 4e2933c620 2015-04-21 kinaba: DWORD dwLanguageId = MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT); 4e2933c620 2015-04-21 kinaba: FormatMessageA(dwFlags, NULL, ecode, dwLanguageId, (LPSTR)message, 1024, NULL); 4e2933c620 2015-04-21 kinaba: return message; 4e2933c620 2015-04-21 kinaba: } 4e2933c620 2015-04-21 kinaba: static __inline WCHAR* 4e2933c620 2015-04-21 kinaba: gai_strerrorW(int ecode) 4e2933c620 2015-04-21 kinaba: { 4e2933c620 2015-04-21 kinaba: static WCHAR message[1024+1]; 4e2933c620 2015-04-21 kinaba: DWORD dwFlags = FORMAT_MESSAGE_FROM_SYSTEM 4e2933c620 2015-04-21 kinaba: | FORMAT_MESSAGE_IGNORE_INSERTS 4e2933c620 2015-04-21 kinaba: | FORMAT_MESSAGE_MAX_WIDTH_MASK; 4e2933c620 2015-04-21 kinaba: DWORD dwLanguageId = MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT); 4e2933c620 2015-04-21 kinaba: FormatMessageW(dwFlags, NULL, ecode, dwLanguageId, (LPWSTR)message, 1024, NULL); 4e2933c620 2015-04-21 kinaba: return message; 4e2933c620 2015-04-21 kinaba: } 4e2933c620 2015-04-21 kinaba: #ifdef UNICODE 4e2933c620 2015-04-21 kinaba: #define gai_strerror gai_strerrorW 4e2933c620 2015-04-21 kinaba: #else 4e2933c620 2015-04-21 kinaba: #define gai_strerror gai_strerrorA 4e2933c620 2015-04-21 kinaba: #endif 4e2933c620 2015-04-21 kinaba: +/ 4e2933c620 2015-04-21 kinaba: 4e2933c620 2015-04-21 kinaba: extern(Windows) { 4e2933c620 2015-04-21 kinaba: INT getnameinfo(SOCKADDR* pSockaddr, socklen_t SockaddrLength, 4e2933c620 2015-04-21 kinaba: PCHAR pNodeBuffer, DWORD NodeBufferSize, PCHAR pServiceBuffer, 4e2933c620 2015-04-21 kinaba: DWORD ServiceBufferSize, INT Flags); 4e2933c620 2015-04-21 kinaba: 4e2933c620 2015-04-21 kinaba: static if (_WIN32_WINNT >= 0x0502) { 4e2933c620 2015-04-21 kinaba: INT GetNameInfoW(SOCKADDR* pSockaddr, socklen_t SockaddrLength, 4e2933c620 2015-04-21 kinaba: PWCHAR pNodeBuffer, DWORD NodeBufferSize, PWCHAR pServiceBuffer, 4e2933c620 2015-04-21 kinaba: DWORD ServiceBufferSize, INT Flags); 4e2933c620 2015-04-21 kinaba: 4e2933c620 2015-04-21 kinaba: alias getnameinfo GetNameInfoA; 4e2933c620 2015-04-21 kinaba: 4e2933c620 2015-04-21 kinaba: version(Unicode) { 4e2933c620 2015-04-21 kinaba: alias GetNameInfoW GetNameInfo; 4e2933c620 2015-04-21 kinaba: } else { 4e2933c620 2015-04-21 kinaba: alias GetNameInfoA GetNameInfo; 4e2933c620 2015-04-21 kinaba: } 4e2933c620 2015-04-21 kinaba: } 4e2933c620 2015-04-21 kinaba: }