]> gitweb.factorcode.org Git - factor.git/commitdiff
Make a way to get DNS server ips on Windows
authorDoug Coleman <doug.coleman@gmail.com>
Wed, 29 Sep 2010 20:36:56 +0000 (15:36 -0500)
committerDoug Coleman <doug.coleman@gmail.com>
Wed, 29 Sep 2010 20:36:56 +0000 (15:36 -0500)
basis/windows/errors/errors.factor
basis/windows/iphlpapi/authors.txt [new file with mode: 0644]
basis/windows/iphlpapi/iphlpapi.factor [new file with mode: 0644]
basis/windows/iphlpapi/platforms.txt [new file with mode: 0644]
basis/windows/windows.factor

index 99284bdb8051beeafc40c8bd5a016633f0fc8a95..b90b766883b2d76d12062d089998b5f49e293892 100755 (executable)
@@ -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 (file)
index 0000000..7c1b2f2
--- /dev/null
@@ -0,0 +1 @@
+Doug Coleman
diff --git a/basis/windows/iphlpapi/iphlpapi.factor b/basis/windows/iphlpapi/iphlpapi.factor
new file mode 100644 (file)
index 0000000..cb00dde
--- /dev/null
@@ -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 <struct> dup byte-length <ulong>
+    [ 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 (file)
index 0000000..8e1a559
--- /dev/null
@@ -0,0 +1 @@
+windows
index dcdcb8b2272b352a93cce79fadc0e209a9389ddf..4996d55f2e218bcae0375310e61e766017abd082 100644 (file)
@@ -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 }