Merge branch 'master' of git://factorcode.org/git/factor
commit
a2ee33f282
|
@ -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
|
||||
|
|
|
@ -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 ;
|
||||
|
||||
|
|
|
@ -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 <inet4> <datagram> 0 (socket) as-mutate ;
|
||||
: init-socket-on-port ( port -- )
|
||||
f swap <inet4> <datagram> 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 ;
|
||||
loop ;
|
||||
|
||||
! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
|
||||
: start ( -- ) init-socket init-upstream-server loop ;
|
||||
|
||||
MAIN: start
|
|
@ -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 ;
|
Loading…
Reference in New Issue