Fix resolver on FreeBSD

db4
Slava Pestov 2008-01-23 06:32:51 -04:00
parent bc5bc22072
commit 83d6e10ac0
1 changed files with 22 additions and 11 deletions

View File

@ -51,10 +51,13 @@ M: inet4 make-sockaddr ( inet -- sockaddr )
"0.0.0.0" or "0.0.0.0" or
rot inet-pton *uint over set-sockaddr-in-addr ; rot inet-pton *uint over set-sockaddr-in-addr ;
SYMBOL: port-override
: (port) port-override get [ ] [ ] ?if ;
M: inet4 parse-sockaddr M: inet4 parse-sockaddr
>r dup sockaddr-in-addr <uint> r> inet-ntop >r dup sockaddr-in-addr <uint> r> inet-ntop
swap sockaddr-in-port ntohs <inet4> ; swap sockaddr-in-port ntohs (port) <inet4> ;
M: inet6 inet-ntop ( data addrspec -- str ) M: inet6 inet-ntop ( data addrspec -- str )
drop 16 memory>string 2 <groups> [ be> >hex ] map ":" join ; drop 16 memory>string 2 <groups> [ be> >hex ] map ":" join ;
@ -80,7 +83,7 @@ M: inet6 make-sockaddr ( inet -- sockaddr )
M: inet6 parse-sockaddr M: inet6 parse-sockaddr
>r dup sockaddr-in6-addr r> inet-ntop >r dup sockaddr-in6-addr r> inet-ntop
swap sockaddr-in6-port ntohs <inet6> ; swap sockaddr-in6-port ntohs (port) <inet6> ;
: addrspec-of-family ( af -- addrspec ) : addrspec-of-family ( af -- addrspec )
{ {
@ -102,15 +105,23 @@ M: f parse-sockaddr nip ;
[ dup addrinfo-next swap addrinfo>addrspec ] [ dup addrinfo-next swap addrinfo>addrspec ]
[ ] unfold nip [ ] subset ; [ ] unfold nip [ ] subset ;
: prepare-resolve-host ( host serv passive? -- host' serv' flags )
>r
>r string>char-alien r>
dup integer? [ port-override set f ] [ string>char-alien ] if
r> AI_PASSIVE 0 ? ;
M: object resolve-host ( host serv passive? -- seq ) M: object resolve-host ( host serv passive? -- seq )
>r dup integer? [ number>string ] when [
"addrinfo" <c-object> prepare-resolve-host
r> [ AI_PASSIVE over set-addrinfo-flags ] when "addrinfo" <c-object>
PF_UNSPEC over set-addrinfo-family [ set-addrinfo-flags ] keep
IPPROTO_TCP over set-addrinfo-protocol PF_UNSPEC over set-addrinfo-family
f <void*> [ getaddrinfo addrinfo-error ] keep *void* IPPROTO_TCP over set-addrinfo-protocol
[ parse-addrinfo-list ] keep f <void*> [ getaddrinfo addrinfo-error ] keep *void*
freeaddrinfo ; [ parse-addrinfo-list ] keep
freeaddrinfo
] with-scope ;
M: object host-name ( -- name ) M: object host-name ( -- name )
256 <byte-array> dup dup length gethostname 256 <byte-array> dup dup length gethostname