Merge ae1d2ae2a7 into 901e28384b
This commit is contained in:
commit
8a4490d10d
@ -749,6 +749,20 @@ int uv__udp_try_send(uv_udp_t* handle,
|
||||
return uv__count_bufs(bufs, nbufs);
|
||||
}
|
||||
|
||||
static int uv__udp_membership_optname(uv_membership membership, int join_opt,
|
||||
int leave_opt, int* optname) {
|
||||
|
||||
switch (membership) {
|
||||
case UV_JOIN_GROUP:
|
||||
*optname = join_opt;
|
||||
return 0;
|
||||
case UV_LEAVE_GROUP:
|
||||
*optname = leave_opt;
|
||||
return 0;
|
||||
default:
|
||||
return UV_EINVAL;
|
||||
}
|
||||
}
|
||||
|
||||
static int uv__udp_set_membership4(uv_udp_t* handle,
|
||||
const struct sockaddr_in* multicast_addr,
|
||||
@ -770,16 +784,10 @@ static int uv__udp_set_membership4(uv_udp_t* handle,
|
||||
|
||||
mreq.imr_multiaddr.s_addr = multicast_addr->sin_addr.s_addr;
|
||||
|
||||
switch (membership) {
|
||||
case UV_JOIN_GROUP:
|
||||
optname = IP_ADD_MEMBERSHIP;
|
||||
break;
|
||||
case UV_LEAVE_GROUP:
|
||||
optname = IP_DROP_MEMBERSHIP;
|
||||
break;
|
||||
default:
|
||||
return UV_EINVAL;
|
||||
}
|
||||
err = uv__udp_membership_optname(membership, IP_ADD_MEMBERSHIP,
|
||||
IP_DROP_MEMBERSHIP, &optname);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
if (setsockopt(handle->io_watcher.fd,
|
||||
IPPROTO_IP,
|
||||
@ -804,6 +812,7 @@ static int uv__udp_set_membership6(uv_udp_t* handle,
|
||||
int optname;
|
||||
struct ipv6_mreq mreq;
|
||||
struct sockaddr_in6 addr6;
|
||||
int err;
|
||||
|
||||
memset(&mreq, 0, sizeof mreq);
|
||||
|
||||
@ -817,16 +826,10 @@ static int uv__udp_set_membership6(uv_udp_t* handle,
|
||||
|
||||
mreq.ipv6mr_multiaddr = multicast_addr->sin6_addr;
|
||||
|
||||
switch (membership) {
|
||||
case UV_JOIN_GROUP:
|
||||
optname = IPV6_ADD_MEMBERSHIP;
|
||||
break;
|
||||
case UV_LEAVE_GROUP:
|
||||
optname = IPV6_DROP_MEMBERSHIP;
|
||||
break;
|
||||
default:
|
||||
return UV_EINVAL;
|
||||
}
|
||||
err = uv__udp_membership_optname(membership, IPV6_ADD_MEMBERSHIP,
|
||||
IPV6_DROP_MEMBERSHIP, &optname);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
if (setsockopt(handle->io_watcher.fd,
|
||||
IPPROTO_IPV6,
|
||||
|
||||
Loading…
Reference in New Issue
Block a user