From: Doug Coleman Date: Wed, 29 Sep 2010 20:36:56 +0000 (-0500) Subject: Make a way to get DNS server ips on Windows X-Git-Tag: 0.97~4257^2~41 X-Git-Url: https://gitweb.factorcode.org/gitweb.cgi?p=factor.git;a=commitdiff_plain;h=f981b6db3c084f0061e1a2c32fdb36e66061aee1 Make a way to get DNS server ips on Windows --- diff --git a/basis/windows/errors/errors.factor b/basis/windows/errors/errors.factor index 99284bdb80..b90b766883 100755 --- a/basis/windows/errors/errors.factor +++ b/basis/windows/errors/errors.factor @@ -734,6 +734,13 @@ ERROR: windows-error n string ; : win32-error<0 ( n -- ) 0 < [ win32-error ] when ; : win32-error<>0 ( n -- ) zero? [ win32-error ] unless ; +: n>win32-error-check ( n -- ) + dup ERROR_SUCCESS = [ + drop + ] [ + dup n>win32-error-string windows-error + ] if ; + : check-invalid-handle ( handle -- handle ) dup INVALID_HANDLE_VALUE = [ win32-error-string throw ] when ; diff --git a/basis/windows/iphlpapi/authors.txt b/basis/windows/iphlpapi/authors.txt new file mode 100644 index 0000000000..7c1b2f2279 --- /dev/null +++ b/basis/windows/iphlpapi/authors.txt @@ -0,0 +1 @@ +Doug Coleman diff --git a/basis/windows/iphlpapi/iphlpapi.factor b/basis/windows/iphlpapi/iphlpapi.factor new file mode 100644 index 0000000000..cb00dde66b --- /dev/null +++ b/basis/windows/iphlpapi/iphlpapi.factor @@ -0,0 +1,75 @@ +! Copyright (C) 2010 Doug Coleman. +! See http://factorcode.org/license.txt for BSD license. +USING: accessors alien alien.c-types alien.syntax +classes.struct io.encodings.string io.encodings.utf8 kernel +make sequences windows.errors windows.types ; +IN: windows.iphlpapi + +LIBRARY: iphlpapi + +<< +CONSTANT: DEFAULT_MINIMUM_ENTITIES 32 +CONSTANT: MAX_ADAPTER_ADDRESS_LENGTH 8 +CONSTANT: MAX_ADAPTER_DESCRIPTION_LENGTH 128 +CONSTANT: MAX_ADAPTER_NAME_LENGTH 256 +CONSTANT: MAX_DOMAIN_NAME_LEN 128 +CONSTANT: MAX_HOSTNAME_LEN 128 +CONSTANT: MAX_SCOPE_ID_LEN 256 +CONSTANT: BROADCAST_NODETYPE 1 +CONSTANT: PEER_TO_PEER_NODETYPE 2 +CONSTANT: MIXED_NODETYPE 4 +CONSTANT: HYBRID_NODETYPE 8 +CONSTANT: IF_OTHER_ADAPTERTYPE 0 +CONSTANT: IF_ETHERNET_ADAPTERTYPE 1 +CONSTANT: IF_TOKEN_RING_ADAPTERTYPE 2 +CONSTANT: IF_FDDI_ADAPTERTYPE 3 +CONSTANT: IF_PPP_ADAPTERTYPE 4 +CONSTANT: IF_LOOPBACK_ADAPTERTYPE 5 +>> + +CONSTANT: MAX_DOMAIN_NAME_LEN+4 132 +CONSTANT: MAX_HOSTNAME_LEN+4 132 +CONSTANT: MAX_SCOPE_ID_LEN+4 260 + +STRUCT: IP_ADDRESS_STRING + { String char[16] } ; + +TYPEDEF: IP_ADDRESS_STRING* PIP_ADDRESS_STRING +TYPEDEF: IP_ADDRESS_STRING IP_MASK_STRING +TYPEDEF: IP_MASK_STRING* PIP_MASK_STRING + +STRUCT: IP_ADDR_STRING + { Next IP_ADDR_STRING* } + { IpAddress IP_ADDRESS_STRING } + { IpMask IP_MASK_STRING } + { Context DWORD } ; + +TYPEDEF: IP_ADDR_STRING* PIP_ADDR_STRING + +STRUCT: FIXED_INFO + { HostName char[MAX_HOSTNAME_LEN+4] } + { DomainName char[MAX_DOMAIN_NAME_LEN+4] } + { CurrentDnsServer PIP_ADDR_STRING } + { DnsServerList IP_ADDR_STRING } + { NodeType UINT } + { ScopeId char[MAX_SCOPE_ID_LEN+4] } + { EnableRouting UINT } + { EnableProxy UINT } + { EnableDns UINT } + { ExtraSpace char[4096] } ; + +TYPEDEF: FIXED_INFO* PFIXED_INFO + +FUNCTION: DWORD GetNetworkParams ( PFIXED_INFO pFixedInfo, PULONG pOutBufLen ) ; + +: get-fixed-info ( -- FIXED_INFO ) + FIXED_INFO dup byte-length + [ GetNetworkParams n>win32-error-check ] 2keep drop ; + +: dns-server-ips ( -- sequence ) + get-fixed-info DnsServerList>> [ + [ + [ IpAddress>> String>> [ 0 = ] trim-tail utf8 decode , ] + [ Next>> ] bi dup + ] loop drop + ] { } make ; \ No newline at end of file diff --git a/basis/windows/iphlpapi/platforms.txt b/basis/windows/iphlpapi/platforms.txt new file mode 100644 index 0000000000..8e1a55995e --- /dev/null +++ b/basis/windows/iphlpapi/platforms.txt @@ -0,0 +1 @@ +windows diff --git a/basis/windows/windows.factor b/basis/windows/windows.factor index dcdcb8b227..4996d55f2e 100644 --- a/basis/windows/windows.factor +++ b/basis/windows/windows.factor @@ -14,6 +14,7 @@ CONSTANT: MAX_UNICODE_PATH 32768 { "winsock" "ws2_32.dll" stdcall } { "mswsock" "mswsock.dll" stdcall } { "shell32" "shell32.dll" stdcall } + { "iphlpapi" "iphlpapi.dll" stdcall } { "libc" "msvcrt.dll" cdecl } { "libm" "msvcrt.dll" cdecl } { "gl" "opengl32.dll" stdcall }