This commit is contained in:
Levent Kaya 2026-03-27 17:01:46 +11:00 committed by GitHub
commit 8a4490d10d
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -749,6 +749,20 @@ int uv__udp_try_send(uv_udp_t* handle,
return uv__count_bufs(bufs, nbufs); 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, static int uv__udp_set_membership4(uv_udp_t* handle,
const struct sockaddr_in* multicast_addr, 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; mreq.imr_multiaddr.s_addr = multicast_addr->sin_addr.s_addr;
switch (membership) { err = uv__udp_membership_optname(membership, IP_ADD_MEMBERSHIP,
case UV_JOIN_GROUP: IP_DROP_MEMBERSHIP, &optname);
optname = IP_ADD_MEMBERSHIP; if (err)
break; return err;
case UV_LEAVE_GROUP:
optname = IP_DROP_MEMBERSHIP;
break;
default:
return UV_EINVAL;
}
if (setsockopt(handle->io_watcher.fd, if (setsockopt(handle->io_watcher.fd,
IPPROTO_IP, IPPROTO_IP,
@ -804,6 +812,7 @@ static int uv__udp_set_membership6(uv_udp_t* handle,
int optname; int optname;
struct ipv6_mreq mreq; struct ipv6_mreq mreq;
struct sockaddr_in6 addr6; struct sockaddr_in6 addr6;
int err;
memset(&mreq, 0, sizeof mreq); 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; mreq.ipv6mr_multiaddr = multicast_addr->sin6_addr;
switch (membership) { err = uv__udp_membership_optname(membership, IPV6_ADD_MEMBERSHIP,
case UV_JOIN_GROUP: IPV6_DROP_MEMBERSHIP, &optname);
optname = IPV6_ADD_MEMBERSHIP; if (err)
break; return err;
case UV_LEAVE_GROUP:
optname = IPV6_DROP_MEMBERSHIP;
break;
default:
return UV_EINVAL;
}
if (setsockopt(handle->io_watcher.fd, if (setsockopt(handle->io_watcher.fd,
IPPROTO_IPV6, IPPROTO_IPV6,