From 06c60a7f189ba3172c0ac6da47c0b7412501ff5a Mon Sep 17 00:00:00 2001 From: Matthew Flatt Date: Wed, 23 Nov 2005 21:06:08 +0000 Subject: [PATCH] last round of Linux IPv6 fixes svn: r1388 --- src/mzscheme/src/network.c | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/src/mzscheme/src/network.c b/src/mzscheme/src/network.c index 3b7a9dce73..76b6472f43 100644 --- a/src/mzscheme/src/network.c +++ b/src/mzscheme/src/network.c @@ -1838,6 +1838,11 @@ tcp_listen(int argc, Scheme_Object *argv[]) if ((v6_loop && (addr->ai_family != PF_INET6)) || (skip_v6 && (addr->ai_family == PF_INET6))) { addr = addr->ai_next; + if (v6_loop && !addr) { + v6_loop = 0; + skip_v6 = 1; + addr = tcp_listen_addr; + } continue; } #endif @@ -1865,11 +1870,18 @@ tcp_listen(int argc, Scheme_Object *argv[]) # else ok = -1; # endif - if (ok && !pos) { - /* IPV6_V6ONLY doesn't work */ - no_ipv6 = 1; - freeaddrinfo(tcp_listen_addr); - goto retry; + if (ok) { + if (!pos) { + /* IPV6_V6ONLY doesn't work */ + no_ipv6 = 1; + freeaddrinfo(tcp_listen_addr); + goto retry; + } else { + errid = errno; + closesocket(s); + errno = errid; + s = INVALID_SOCKET; + } } } }