File Annotation

Not logged in
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: }