diff --git a/extra/combinators/lib/lib.factor b/extra/combinators/lib/lib.factor index 2c7f2bbb03..3976b36cb9 100755 --- a/extra/combinators/lib/lib.factor +++ b/extra/combinators/lib/lib.factor @@ -90,7 +90,7 @@ MACRO: 2|| ( quots -- ? ) [ [ 2dup ] prepend [ t ] ] f short-circuit [ 2nip ] append ; MACRO: 3|| ( quots -- ? ) - [ [ 2dup ] prepend [ t ] ] f short-circuit [ 2nip ] append ; + [ [ 3dup ] prepend [ t ] ] f short-circuit [ 3nip ] append ; ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! ifte diff --git a/extra/dns/cache/cache.factor b/extra/dns/cache/cache.factor index e32e081ad8..5c4539b913 100644 --- a/extra/dns/cache/cache.factor +++ b/extra/dns/cache/cache.factor @@ -80,10 +80,6 @@ SYMBOL: NX ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -! ERROR: name-error name ; - -! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - : cache-get ( query -- rrs/f ) dup cache-get* dup NX = [ drop name>> name-error ] [ nip ] if ; diff --git a/extra/dns/forwarding/forwarding.factor b/extra/dns/forwarding/forwarding.factor index 5da04e25b6..1c60532bbc 100644 --- a/extra/dns/forwarding/forwarding.factor +++ b/extra/dns/forwarding/forwarding.factor @@ -2,10 +2,12 @@ USING: kernel combinators vectors + sequences io.sockets accessors + combinators.lib newfx - dns dns.cache ; + dns dns.cache dns.misc ; IN: dns.forwarding @@ -17,7 +19,10 @@ IN: dns.forwarding : socket ( -- socket ) (socket) 1st ; -: init-socket ( -- ) f 5353 0 (socket) as-mutate ; +: init-socket-on-port ( port -- ) + f swap 0 (socket) as-mutate ; + +: init-socket ( -- ) 53 init-socket-on-port ; ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! @@ -27,30 +32,37 @@ IN: dns.forwarding : set-upstream-server ( ip -- ) 0 (upstream-server) as-mutate ; +: init-upstream-server ( -- ) + upstream-server not + [ resolv-conf-server set-upstream-server ] + when ; + ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +: 1&& <-&& ; + +! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +: rrs? ( obj -- ? ) { [ NX = not ] [ f = not ] } 1&& ; + : query->answer/cache ( query -- rrs/NX/f ) - { - { [ dup type>> CNAME = ] [ cache-get* ] } - { - [ dup clone CNAME >>type cache-get* vector? ] - [ - dup clone CNAME >>type cache-get* 1st ! query rr/cname - dup rdata>> ! query rr/cname cname - >r swap clone r> ! rr/cname query cname - >>name ! rr/cname query - query->answer/cache ! rr/cname rrs/NX/f - { - { [ dup vector? ] [ clone push-on ] } - { [ dup NX = ] [ nip ] } - { [ dup f = ] [ nip ] } - } - cond + dup cache-get* dup { [ rrs? ] [ NX = ] } 1|| + [ nip ] + [ + drop + dup clone CNAME >>type cache-get* dup { [ NX = ] [ f = ] } 1|| + [ nip ] + [ ! query rrs + tuck ! rrs query rrs + 1st ! rrs query rr/cname + rdata>> ! rrs query name + >r clone r> >>name ! rrs query + query->answer/cache ! rrs rrs/NX/f + dup rrs? [ append ] [ nip ] if ] - } - { [ t ] [ cache-get* ] } - } - cond ; + if + ] + if ; ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! @@ -88,4 +100,10 @@ IN: dns.forwarding message->ba ! addr-spec byte-array swap ! byte-array addr-spec socket send - loop ; \ No newline at end of file + loop ; + +! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +: start ( -- ) init-socket init-upstream-server loop ; + +MAIN: start \ No newline at end of file diff --git a/extra/dns/misc/misc.factor b/extra/dns/misc/misc.factor new file mode 100644 index 0000000000..90731cec43 --- /dev/null +++ b/extra/dns/misc/misc.factor @@ -0,0 +1,12 @@ + +USING: kernel sequences splitting io.files io.encodings.utf8 random newfx ; + +IN: dns.misc + +: resolv-conf-servers ( -- seq ) + "/etc/resolv.conf" utf8 file-lines + [ " " split ] map + [ 1st "nameserver" = ] filter + [ 2nd ] map ; + +: resolv-conf-server ( -- ip ) resolv-conf-servers random ; \ No newline at end of file