From: Doug Coleman Date: Mon, 17 Sep 2012 15:05:23 +0000 (-0700) Subject: windows: Start adding GetBestInterface. X-Git-Tag: 0.97~2401 X-Git-Url: https://gitweb.factorcode.org/gitweb.cgi?p=factor.git;a=commitdiff_plain;h=b72040d3b688d8eb69c84c21e83cdb48e6ab4734 windows: Start adding GetBestInterface. --- diff --git a/basis/windows/iphlpapi/iphlpapi.factor b/basis/windows/iphlpapi/iphlpapi.factor index a4c6aa17dd..42152ad7b5 100644 --- a/basis/windows/iphlpapi/iphlpapi.factor +++ b/basis/windows/iphlpapi/iphlpapi.factor @@ -3,8 +3,9 @@ USING: accessors alien alien.c-types alien.data alien.strings alien.syntax arrays byte-arrays classes.struct combinators combinators.smart destructors io.encodings.string -io.encodings.utf8 kernel libc make sequences sequences.extras -windows.errors windows.kernel32 windows.types windows.winsock ; +io.encodings.utf8 io.sockets io.sockets.private kernel libc +make refs sequences sequences.extras windows.errors +windows.kernel32 windows.types windows.winsock fry ; IN: windows.iphlpapi LIBRARY: iphlpapi @@ -43,7 +44,7 @@ CONSTANT: MIB_IF_TYPE_LOOPBACK 24 CONSTANT: MIB_IF_TYPE_SLIP 28 CONSTANT: MAX_DNS_SUFFIX_STRING_LENGTH 256 ! 246? CONSTANT: MAX_DHCPV6_DUID_LENGTH 130 - +CONSTANT: MAX_ADAPTER_NAME 128 STRUCT: IP_ADDRESS_STRING { String char[16] } ; @@ -330,6 +331,45 @@ TYPEDEF: IP_ADAPTER_ADDRESSES* PIP_ADAPTER_ADDRESSES TYPEDEF: FIXED_INFO* PFIXED_INFO +STRUCT: S_un_b + { s_b1 uchar } + { s_b2 uchar } + { s_b3 uchar } + { s_b4 uchar } ; + +STRUCT: S_un_w + { s_w1 ushort } + { s_w2 ushort } ; + +UNION-STRUCT: IPAddr + { S_un_b S_un_b } + { S_un_w S_un_w } + { S_addr ulong } ; + +UNION-STRUCT: S_un + { S_un_b S_un_b } + { S_un_w S_un_w } + { S_addr ulong } ; + +STRUCT: IP_ADAPTER_INDEX_MAP + { Index ULONG } + { Name WCHAR[MAX_ADAPTER_NAME] } ; +TYPEDEF: IP_ADAPTER_INDEX_MAP* PIP_ADAPTER_INDEX_MAP + +FUNCTION: DWORD IpReleaseAddress ( PIP_ADAPTER_INDEX_MAP AdapterInfo ) ; +FUNCTION: DWORD IpRenewAddress ( PIP_ADAPTER_INDEX_MAP AdapterInfo ) ; + + +FUNCTION: DWORD GetBestInterface ( + IPAddr dwDestAddr, + PDWORD pdwBestIfIndex +) ; + +FUNCTION: DWORD GetBestInterfaceEx ( + sockaddr* pDestAddr, + PDWORD pdwBestIfIndex +) ; + FUNCTION: ULONG GetAdaptersAddresses ( ULONG Family, ULONG Flags, @@ -376,7 +416,6 @@ FUNCTION: DWORD GetNetworkParams ( PFIXED_INFO pFixedInfo, PULONG pOutBufLen ) ; PRIVATE> - : interfaces-each ( quot -- seq ) [ [ iterate-interfaces ] dip each ] with-destructors ; inline @@ -398,3 +437,7 @@ PRIVATE> [ FirstUnicastAddress>> loop-list [ Address>> SOCKET_ADDRESS>sockaddr sockaddr>ip ] map ] } cleave>array ] interfaces-map ; + +: get-best-interface ( inet -- interface ) + make-sockaddr 0 DWORD + [ GetBestInterfaceEx win32-error=0/f ] keep DWORD deref ;