unix: add UV_HANDLE_IPV6 flag to tcp and udp handles

This commit is contained in:
Saúl Ibarra Corretgé 2014-03-28 09:39:13 +01:00
parent 3558d65d2f
commit 7a4c42a054
5 changed files with 20 additions and 6 deletions

View File

@ -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 {

View File

@ -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;
}

View File

@ -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) {

View File

@ -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

View File

@ -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);