2 USING: kernel accessors namespaces continuations
3 io io.sockets io.binary io.timeouts io.encodings.binary
5 locals strings sequences random prettyprint calendar dns dns.misc ;
9 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
11 :: send-receive-udp ( BA SERVER -- ba )
12 T{ inet4 f f 0 } <datagram>
13 T{ duration { second 3 } } over set-timeout
14 [| SOCKET | BA SERVER SOCKET send SOCKET receive drop ]
17 :: send-receive-tcp ( BA SERVER -- ba )
18 [let | BA [ BA length 2 >be BA append ] |
21 T{ duration { second 3 } } input-stream get set-timeout
22 BA write flush 2 read be> read
26 :: send-receive-server ( BA SERVER -- msg )
27 [let | RESULT [ BA SERVER send-receive-udp parse-message ] |
29 [ BA SERVER send-receive-tcp parse-message ]
33 : >dns-inet4 ( obj -- inet4 ) dup string? [ 53 <inet4> ] [ ] if ;
35 :: send-receive-servers ( BA SERVERS -- msg )
36 SERVERS empty? [ "send-receive-servers: servers list empty" throw ] when
37 [let | SERVER [ SERVERS random >dns-inet4 ] |
38 ! if this throws an error ...
39 [ BA SERVER send-receive-server ]
40 ! we try with the other servers...
41 [ drop BA SERVER SERVERS remove send-receive-servers ]
44 :: ask-servers ( MSG SERVERS -- msg )
45 MSG message->ba SERVERS send-receive-servers ;
47 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
49 : fully-qualified ( name -- name ) dup "." tail? [ ] [ "." append ] if ;
51 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
53 : dns-servers ( -- seq )
56 [ resolv-conf-servers \ dns-servers set dns-servers ]
59 ! : dns-server ( -- server ) dns-servers random ;
61 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
63 : dns-ip4 ( name -- ips )
65 [let | MSG [ A IN query boa query->message dns-servers ask-servers ] |
66 MSG rcode>> NO-ERROR =
67 [ MSG answer-section>> [ type>> A = ] filter [ rdata>> ] map ]
68 [ "dns-ip: rcode = " MSG rcode>> unparse append throw ]
71 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!