diff --git a/basis/io/sockets/sockets-docs.factor b/basis/io/sockets/sockets-docs.factor index a83465f009..d40991991b 100644 --- a/basis/io/sockets/sockets-docs.factor +++ b/basis/io/sockets/sockets-docs.factor @@ -228,6 +228,7 @@ HELP: send HELP: resolve-host { $values { "addrspec" "an address specifier" } { "seq" "a sequence of address specifiers" } } { $description "Resolves host names to IP addresses." } +{ $errors "Throws an " { $link addrinfo-error } " if the host name cannot be resolved." } { $examples { $code "\"www.facebook.com\" resolve-host . " @@ -235,7 +236,6 @@ HELP: resolve-host } } ; - HELP: with-local-address { $values { "addr" "an " { $link inet4 } " or " { $link inet6 } " address specifier" } { "quot" quotation } } { $description "Client sockets opened within the scope of the quotation passed to this combinator will have their local address bound to the given address." } diff --git a/basis/io/sockets/sockets-tests.factor b/basis/io/sockets/sockets-tests.factor index 7adcc93cb6..9e146dacfb 100644 --- a/basis/io/sockets/sockets-tests.factor +++ b/basis/io/sockets/sockets-tests.factor @@ -1,5 +1,5 @@ -USING: io.sockets io.sockets.private sequences math tools.test -namespaces accessors kernel destructors calendar io.timeouts +USING: continuations io.sockets io.sockets.private sequences math +tools.test namespaces accessors kernel destructors calendar io.timeouts io.encodings.utf8 io concurrency.promises threads io.streams.string present system ; IN: io.sockets.tests @@ -172,3 +172,7 @@ os unix? [ [ 80 ] [ "http" protocol-port ] unit-test [ f ] [ f protocol-port ] unit-test + +[ t ] [ + [ "you-cant-resolve-me!" resolve-host ] [ addrinfo-error? ] recover +] unit-test diff --git a/basis/io/sockets/sockets.factor b/basis/io/sockets/sockets.factor index 4e5c3a72a4..51e5979c2f 100644 --- a/basis/io/sockets/sockets.factor +++ b/basis/io/sockets/sockets.factor @@ -228,6 +228,8 @@ M: inet6 present M: inet6 protocol drop 0 ; +ERROR: addrinfo-error n string ; + addrspec ] map sift ; -HOOK: addrinfo-error io-backend ( n -- ) +HOOK: addrinfo-error-string io-backend ( n -- string ) : prepare-addrinfo ( -- addrinfo ) addrinfo @@ -407,8 +409,11 @@ M: inet present C: inet M: string resolve-host - f prepare-addrinfo f void* - [ getaddrinfo addrinfo-error ] keep void* deref addrinfo memory>struct + f prepare-addrinfo f void* [ + getaddrinfo 0 or [ + dup addrinfo-error-string addrinfo-error + ] unless-zero + ] keep void* deref addrinfo memory>struct [ parse-addrinfo-list ] keep freeaddrinfo ; M: string with-port ; diff --git a/basis/io/sockets/unix/unix.factor b/basis/io/sockets/unix/unix.factor index 09e57edb5b..73fa906085 100644 --- a/basis/io/sockets/unix/unix.factor +++ b/basis/io/sockets/unix/unix.factor @@ -1,7 +1,7 @@ ! Copyright (C) 2004, 2008 Slava Pestov, Ivan Tikhonov. ! See http://factorcode.org/license.txt for BSD license. USING: accessors alien alien.c-types alien.data alien.strings -classes.struct combinators destructors io.backend.unix +arrays classes.struct combinators destructors io.backend.unix io.encodings.utf8 io.files io.pathnames io.sockets.private kernel libc locals math namespaces sequences system unix unix.ffi vocabs ; @@ -15,8 +15,8 @@ IN: io.sockets.unix : set-socket-option ( fd level opt -- ) [ handle-fd ] 2dip 1 int dup byte-length setsockopt io-error ; -M: unix addrinfo-error ( n -- ) - [ gai_strerror throw ] unless-zero ; +M: unix addrinfo-error-string ( n -- string ) + gai_strerror ; M: unix sockaddr-of-family ( alien af -- addrspec ) { diff --git a/basis/io/sockets/windows/windows.factor b/basis/io/sockets/windows/windows.factor index 2df94f8544..86e5555ddd 100755 --- a/basis/io/sockets/windows/windows.factor +++ b/basis/io/sockets/windows/windows.factor @@ -14,8 +14,8 @@ IN: io.sockets.windows : set-ioctl-socket ( handle cmd arg -- ) [ handle>> ] 2dip ulong ioctlsocket socket-error ; -M: windows addrinfo-error ( n -- ) - winsock-return-check ; +M: windows addrinfo-error-string ( n -- string ) + n>win32-error-string ; M: windows sockaddr-of-family ( alien af -- addrspec ) {