diff --git a/src/unix/internal.h b/src/unix/internal.h index 2aa080c5..e4ff91b8 100644 --- a/src/unix/internal.h +++ b/src/unix/internal.h @@ -136,7 +136,8 @@ enum { UV_STREAM_READ_EOF = 0x200, /* read(2) read EOF. */ UV_TCP_NODELAY = 0x400, /* Disable Nagle. */ UV_TCP_KEEPALIVE = 0x800, /* Turn on keep-alive. */ - UV_TCP_SINGLE_ACCEPT = 0x1000 /* Only accept() when idle. */ + UV_TCP_SINGLE_ACCEPT = 0x1000, /* Only accept() when idle. */ + UV_HANDLE_IPV6 = 0x2000 /* Handle is bound to a IPv6 socket. */ }; typedef enum { diff --git a/src/unix/tcp.c b/src/unix/tcp.c index 9c50b2d8..80b5471a 100644 --- a/src/unix/tcp.c +++ b/src/unix/tcp.c @@ -89,8 +89,11 @@ int uv__tcp_bind(uv_tcp_t* tcp, errno = 0; if (bind(tcp->io_watcher.fd, addr, addrlen) && errno != EADDRINUSE) return -errno; - tcp->delayed_error = -errno; + + if (addr->sa_family == AF_INET6) + tcp->flags |= UV_HANDLE_IPV6; + return 0; } diff --git a/src/unix/udp.c b/src/unix/udp.c index 003be583..efc180c7 100644 --- a/src/unix/udp.c +++ b/src/unix/udp.c @@ -349,6 +349,9 @@ int uv__udp_bind(uv_udp_t* handle, goto out; } + if (addr->sa_family == AF_INET6) + handle->flags |= UV_HANDLE_IPV6; + return 0; out: @@ -634,8 +637,13 @@ int uv_udp_set_multicast_interface(uv_udp_t* handle, const char* interface_addr) if (!interface_addr) { memset(&addr_st, 0, sizeof addr_st); - addr_st.ss_family = AF_INET; - addr4->sin_addr.s_addr = htonl(INADDR_ANY); + if (handle->flags & UV_HANDLE_IPV6) { + addr_st.ss_family = AF_INET6; + addr6->sin6_scope_id = 0; + } else { + addr_st.ss_family = AF_INET; + addr4->sin_addr.s_addr = htonl(INADDR_ANY); + } } else if (uv_ip4_addr(interface_addr, 0, addr4) == 0) { /* nothing, address was parsed */ } else if (uv_ip6_addr(interface_addr, 0, addr6) == 0) { diff --git a/src/win/internal.h b/src/win/internal.h index 82f8eb60..45ce177e 100644 --- a/src/win/internal.h +++ b/src/win/internal.h @@ -84,8 +84,10 @@ extern __declspec( thread ) int uv__crt_assert_enabled; #define UV_HANDLE_EMULATE_IOCP 0x00100000 #define UV_HANDLE_BLOCKING_WRITES 0x00200000 -/* Only used by uv_tcp_t handles. */ +/* Used by uv_tcp_t and uv_udp_t handles */ #define UV_HANDLE_IPV6 0x01000000 + +/* Only used by uv_tcp_t handles. */ #define UV_HANDLE_TCP_NODELAY 0x02000000 #define UV_HANDLE_TCP_KEEPALIVE 0x04000000 #define UV_HANDLE_TCP_SINGLE_ACCEPT 0x08000000 diff --git a/test/test-udp-multicast-interface6.c b/test/test-udp-multicast-interface6.c index e10e7563..e58d7711 100644 --- a/test/test-udp-multicast-interface6.c +++ b/test/test-udp-multicast-interface6.c @@ -72,7 +72,7 @@ TEST_IMPL(udp_multicast_interface6) { #if defined(__APPLE__) r = uv_udp_set_multicast_interface(&server, "::1%lo0"); #else - r = uv_udp_set_multicast_interface(&server, "::1"); + r = uv_udp_set_multicast_interface(&server, NULL); #endif ASSERT(r == 0);