]> gitweb.factorcode.org Git - factor.git/commitdiff
dns: handle dns aliases like paste.factorcode.org
authorDoug Coleman <doug.coleman@gmail.com>
Sat, 29 Jan 2022 06:35:20 +0000 (00:35 -0600)
committerDoug Coleman <doug.coleman@gmail.com>
Sat, 29 Jan 2022 06:35:20 +0000 (00:35 -0600)
"paste.factorcode.org" host

basis/dns/dns.factor
extra/tools/dns/dns.factor

index 1cecf555a81d51201fb5ac65ef2ff1ac40609454..0867e129c541bcbecedf1ad3832d53f42980aaee 100644 (file)
@@ -1,12 +1,12 @@
 ! Copyright (C) 2010 Doug Coleman.
 ! See http://factorcode.org/license.txt for BSD license.
-USING: accessors alien.enums alien.syntax arrays calendar
-combinators combinators.smart constructors endian
+USING: accessors alien.enums alien.syntax arrays ascii calendar
+combinators combinators.smart constructors continuations endian
 grouping io io.encodings.binary io.encodings.string
 io.encodings.utf8 io.sockets io.sockets.private
 io.streams.byte-array io.timeouts kernel make math math.bitwise
 math.parser namespaces random sequences slots.syntax splitting
-system vectors vocabs ascii ;
+system vectors vocabs ;
 IN: dns
 
 : with-input-seek ( n seek-type quot -- )
@@ -340,12 +340,17 @@ M: TXT rdata>byte-array
         [ send ] [ receive drop ] bi
     ] with-any-port-local-datagram ;
 
-: <dns-inet4> ( -- inet4 )
-    dns-servers get random 53 <inet4> ;
+: parse-ip ( str -- ipv4/ipv6 )
+    [ <ipv4> ] [ drop <ipv6> ] recover ;
+
+: <dns-inet> ( -- inet4 )
+    dns-servers get
+    [ parse-ip ] map [ ipv4? ] filter
+    random host>> 53 <inet4> ;
 
 : dns-query ( name type class -- message )
     <query> <message> message>byte-array
-    <dns-inet4> udp-query parse-message ;
+    <dns-inet> udp-query parse-message ;
 
 : dns-A-query ( name -- message ) A IN dns-query ;
 : dns-AAAA-query ( name -- message ) AAAA IN dns-query ;
@@ -392,7 +397,13 @@ M: TXT rdata>byte-array
     [ aaaa? ] filter-message-rdata>names ;
 
 : message>mxs ( message -- assoc )
-    answer-section>> [ rdata>> [ preference>> ] [ exchange>> ] bi 2array ] map ;
+    answer-section>> [
+        rdata>> dup cname? [
+            name>> 1array
+        ] [
+            [ preference>> ] [ exchange>> ] bi 2array
+        ] if
+    ] map ;
 
 : messages>names ( messages -- names )
     [ message>names ] map concat ;
index 56127b3d5a4b25a2590725a83523ff5e0286d2ce..1ed9707698670a0a221d9bf1ee924435037b93ca 100644 (file)
@@ -22,8 +22,13 @@ IN: tools.dns
     [ a-message. ] [ (aaaa-message.) ] bi ;
 
 : mx-line. ( host pair -- )
-    [ write " mail is handled by " write ]
-    [ first2 [ number>string write bl ] [ print ] bi* ] bi* ;
+    dup length 1 = [
+        [ write " is an alias for " write ]
+        [ first print ] bi*
+    ] [
+        [ write " mail is handled by " write ]
+        [ first2 [ number>string write bl ] [ print ] bi* ] bi*
+    ] if ;
 
 : mx-message. ( message -- )
     [ message>query-name ] [ message>mxs ] bi