1 /***********************************************************************\ 2 * ws2tcpip.d * 3 * * 4 * Windows API header module * 5 * * 6 * Translated from MinGW Windows headers * 7 * * 8 * Placed into public domain * 9 \***********************************************************************/ 10 11 module win32.ws2tcpip; 12 13 import win32.w32api; 14 //import win32.winbase; 15 import win32.windef; 16 //import win32.basetyps; 17 import win32.winsock2; 18 19 enum { 20 IP_OPTIONS = 1, 21 22 IP_HDRINCL = 2, 23 IP_TOS = 3, 24 IP_TTL = 4, 25 IP_MULTICAST_IF = 9, 26 IP_MULTICAST_TTL = 10, 27 IP_MULTICAST_LOOP = 11, 28 IP_ADD_MEMBERSHIP = 12, 29 IP_DROP_MEMBERSHIP = 13, 30 IP_DONTFRAGMENT = 14, 31 IP_ADD_SOURCE_MEMBERSHIP = 15, 32 IP_DROP_SOURCE_MEMBERSHIP = 16, 33 IP_BLOCK_SOURCE = 17, 34 IP_UNBLOCK_SOURCE = 18, 35 IP_PKTINFO = 19 36 } 37 38 enum { 39 IPV6_UNICAST_HOPS = 4, 40 IPV6_MULTICAST_IF = 9, 41 IPV6_MULTICAST_HOPS = 10, 42 IPV6_MULTICAST_LOOP = 11, 43 IPV6_ADD_MEMBERSHIP = 12, 44 IPV6_DROP_MEMBERSHIP = 13, 45 IPV6_JOIN_GROUP = IPV6_ADD_MEMBERSHIP, 46 IPV6_LEAVE_GROUP = IPV6_DROP_MEMBERSHIP, 47 IPV6_PKTINFO = 19 48 } 49 50 const IP_DEFAULT_MULTICAST_TTL = 1; 51 const IP_DEFAULT_MULTICAST_LOOP = 1; 52 const IP_MAX_MEMBERSHIPS = 20; 53 54 const TCP_EXPEDITED_1122 = 2; 55 56 const UDP_NOCHECKSUM = 1; 57 58 enum { 59 IFF_UP = 1, 60 IFF_BROADCAST = 2, 61 IFF_LOOPBACK = 4, 62 IFF_POINTTOPOINT = 8, 63 IFF_MULTICAST = 16 64 } 65 66 const SIO_GET_INTERFACE_LIST = _IOR!('t', 127, u_long); 67 68 const INET_ADDRSTRLEN = 16; 69 const INET6_ADDRSTRLEN = 46; 70 71 const NI_MAXHOST = 1025; 72 const NI_MAXSERV = 32; 73 74 const NI_NOFQDN = 0x01; 75 const NI_NUMERICHOST = 0x02; 76 const NI_NAMEREQD = 0x04; 77 const NI_NUMERICSERV = 0x08; 78 const NI_DGRAM = 0x10; 79 80 const AI_PASSIVE = 1; 81 const AI_CANONNAME = 2; 82 const AI_NUMERICHOST = 4; 83 84 const EAI_AGAIN = WSATRY_AGAIN; 85 const EAI_BADFLAGS = WSAEINVAL; 86 const EAI_FAIL = WSANO_RECOVERY; 87 const EAI_FAMILY = WSAEAFNOSUPPORT; 88 const EAI_MEMORY = WSA_NOT_ENOUGH_MEMORY; 89 const EAI_NODATA = WSANO_DATA; 90 const EAI_NONAME = WSAHOST_NOT_FOUND; 91 const EAI_SERVICE = WSATYPE_NOT_FOUND; 92 const EAI_SOCKTYPE = WSAESOCKTNOSUPPORT; 93 94 struct ip_mreq { 95 IN_ADDR imr_multiaddr; 96 IN_ADDR imr_interface; 97 } 98 99 struct ip_mreq_source { 100 IN_ADDR imr_multiaddr; 101 IN_ADDR imr_sourceaddr; 102 IN_ADDR imr_interface; 103 } 104 105 struct ip_msfilter { 106 IN_ADDR imsf_multiaddr; 107 IN_ADDR imsf_interface; 108 u_long imsf_fmode; 109 u_long imsf_numsrc; 110 IN_ADDR[1] imsf_slist; 111 } 112 113 template IP_MSFILTER_SIZE(ULONG numsrc) { 114 const DWORD IP_MSFILTER_SIZE = ip_msfilter.sizeof - IN_ADDR.sizeof + numsrc * IN_ADDR.sizeof; 115 } 116 117 struct IN_PKTINFO { 118 IN_ADDR ipi_addr; 119 UINT ipi_ifindex; 120 } 121 122 struct IN6_ADDR { 123 union { 124 u_char[16] _S6_u8; 125 u_short[8] _S6_u16; 126 u_long[4] _S6_u32; 127 } 128 } 129 alias IN6_ADDR* PIN6_ADDR, LPIN6_ADDR; 130 131 struct SOCKADDR_IN6 { 132 short sin6_family; 133 u_short sin6_port; 134 u_long sin6_flowinfo; 135 IN6_ADDR sin6_addr; 136 u_long sin6_scope_id; 137 }; 138 alias SOCKADDR_IN6* PSOCKADDR_IN6, LPSOCKADDR_IN6; 139 140 extern IN6_ADDR in6addr_any; 141 extern IN6_ADDR in6addr_loopback; 142 143 /+ TODO: 144 #define IN6_ARE_ADDR_EQUAL(a, b) \ 145 (memcmp ((void*)(a), (void*)(b), sizeof (struct in6_addr)) == 0) 146 147 #define IN6_IS_ADDR_UNSPECIFIED(_addr) \ 148 ( (((const u_long *)(_addr))[0] == 0) \ 149 && (((const u_long *)(_addr))[1] == 0) \ 150 && (((const u_long *)(_addr))[2] == 0) \ 151 && (((const u_long *)(_addr))[3] == 0)) 152 153 #define IN6_IS_ADDR_LOOPBACK(_addr) \ 154 ( (((const u_long *)(_addr))[0] == 0) \ 155 && (((const u_long *)(_addr))[1] == 0) \ 156 && (((const u_long *)(_addr))[2] == 0) \ 157 && (((const u_long *)(_addr))[3] == 0x01000000)) 158 159 #define IN6_IS_ADDR_MULTICAST(_addr) (((const u_char *) (_addr))[0] == 0xff) 160 161 #define IN6_IS_ADDR_LINKLOCAL(_addr) \ 162 ( (((const u_char *)(_addr))[0] == 0xfe) \ 163 && ((((const u_char *)(_addr))[1] & 0xc0) == 0x80)) 164 165 #define IN6_IS_ADDR_SITELOCAL(_addr) \ 166 ( (((const u_char *)(_addr))[0] == 0xfe) \ 167 && ((((const u_char *)(_addr))[1] & 0xc0) == 0xc0)) 168 169 #define IN6_IS_ADDR_V4MAPPED(_addr) \ 170 ( (((const u_long *)(_addr))[0] == 0) \ 171 && (((const u_long *)(_addr))[1] == 0) \ 172 && (((const u_long *)(_addr))[2] == 0xffff0000)) 173 174 #define IN6_IS_ADDR_V4COMPAT(_addr) \ 175 ( (((const u_long *)(_addr))[0] == 0) \ 176 && (((const u_long *)(_addr))[1] == 0) \ 177 && (((const u_long *)(_addr))[2] == 0) \ 178 && (((const u_long *)(_addr))[3] != 0) \ 179 && (((const u_long *)(_addr))[3] != 0x01000000)) 180 181 #define IN6_IS_ADDR_MC_NODELOCAL(_addr) \ 182 ( IN6_IS_ADDR_MULTICAST(_addr) \ 183 && ((((const u_char *)(_addr))[1] & 0xf) == 0x1)) 184 185 #define IN6_IS_ADDR_MC_LINKLOCAL(_addr) \ 186 ( IN6_IS_ADDR_MULTICAST (_addr) \ 187 && ((((const u_char *)(_addr))[1] & 0xf) == 0x2)) 188 189 #define IN6_IS_ADDR_MC_SITELOCAL(_addr) \ 190 ( IN6_IS_ADDR_MULTICAST(_addr) \ 191 && ((((const u_char *)(_addr))[1] & 0xf) == 0x5)) 192 193 #define IN6_IS_ADDR_MC_ORGLOCAL(_addr) \ 194 ( IN6_IS_ADDR_MULTICAST(_addr) \ 195 && ((((const u_char *)(_addr))[1] & 0xf) == 0x8)) 196 197 #define IN6_IS_ADDR_MC_GLOBAL(_addr) \ 198 ( IN6_IS_ADDR_MULTICAST(_addr) \ 199 && ((((const u_char *)(_addr))[1] & 0xf) == 0xe)) 200 +/ 201 202 alias int socklen_t; 203 204 struct IPV6_MREG { 205 IN6_ADDR ipv6mr_multiaddr; 206 uint ipv6mr_interface; 207 } 208 209 struct IN6_PKTINFO { 210 IN6_ADDR ipi6_addr; 211 UINT ipi6_ifindex; 212 } 213 214 struct addrinfo { 215 int ai_flags; 216 int ai_family; 217 int ai_socktype; 218 int ai_protocol; 219 size_t ai_addrlen; 220 char* ai_canonname; 221 SOCKADDR* ai_addr; 222 addrinfo* ai_next; 223 } 224 225 extern(Windows) { 226 static if (_WIN32_WINNT >= 0x0501) { 227 void freeaddrinfo(addrinfo*); 228 int getaddrinfo (CPtr!(char), CPtr!(char), CPtr!(addrinfo), addrinfo**); 229 int getnameinfo(CPtr!(SOCKADDR), socklen_t, char*, DWORD, char*, DWORD, int); 230 } 231 } 232 233 /+ TODO 234 static __inline char* 235 gai_strerrorA(int ecode) 236 { 237 static char message[1024+1]; 238 DWORD dwFlags = FORMAT_MESSAGE_FROM_SYSTEM 239 | FORMAT_MESSAGE_IGNORE_INSERTS 240 | FORMAT_MESSAGE_MAX_WIDTH_MASK; 241 DWORD dwLanguageId = MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT); 242 FormatMessageA(dwFlags, NULL, ecode, dwLanguageId, (LPSTR)message, 1024, NULL); 243 return message; 244 } 245 static __inline WCHAR* 246 gai_strerrorW(int ecode) 247 { 248 static WCHAR message[1024+1]; 249 DWORD dwFlags = FORMAT_MESSAGE_FROM_SYSTEM 250 | FORMAT_MESSAGE_IGNORE_INSERTS 251 | FORMAT_MESSAGE_MAX_WIDTH_MASK; 252 DWORD dwLanguageId = MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT); 253 FormatMessageW(dwFlags, NULL, ecode, dwLanguageId, (LPWSTR)message, 1024, NULL); 254 return message; 255 } 256 #ifdef UNICODE 257 #define gai_strerror gai_strerrorW 258 #else 259 #define gai_strerror gai_strerrorA 260 #endif 261 +/ 262 263 extern(Windows) { 264 INT getnameinfo(SOCKADDR* pSockaddr, socklen_t SockaddrLength, 265 PCHAR pNodeBuffer, DWORD NodeBufferSize, PCHAR pServiceBuffer, 266 DWORD ServiceBufferSize, INT Flags); 267 268 static if (_WIN32_WINNT >= 0x0502) { 269 INT GetNameInfoW(SOCKADDR* pSockaddr, socklen_t SockaddrLength, 270 PWCHAR pNodeBuffer, DWORD NodeBufferSize, PWCHAR pServiceBuffer, 271 DWORD ServiceBufferSize, INT Flags); 272 273 alias getnameinfo GetNameInfoA; 274 275 version(Unicode) { 276 alias GetNameInfoW GetNameInfo; 277 } else { 278 alias GetNameInfoA GetNameInfo; 279 } 280 } 281 }