src: extract common sockaddr creation code
This commit extracts code to create sockaddr which is shared by both UDPWrap::DoBind and UDPWrap::DoSend. PR-URL: https://github.com/nodejs/node/pull/26070 Reviewed-By: Anna Henningsen <anna@addaleax.net> Reviewed-By: James M Snell <jasnell@gmail.com> Reviewed-By: Richard Lau <riclau@uk.ibm.com>
This commit is contained in:
parent
48491ce405
commit
05292cbf6f
@ -175,6 +175,19 @@ void UDPWrap::GetFD(const FunctionCallbackInfo<Value>& args) {
|
|||||||
args.GetReturnValue().Set(fd);
|
args.GetReturnValue().Set(fd);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int sockaddr_for_family(int address_family,
|
||||||
|
const char* address,
|
||||||
|
const unsigned short port,
|
||||||
|
struct sockaddr_storage* addr) {
|
||||||
|
switch (address_family) {
|
||||||
|
case AF_INET:
|
||||||
|
return uv_ip4_addr(address, port, reinterpret_cast<sockaddr_in*>(addr));
|
||||||
|
case AF_INET6:
|
||||||
|
return uv_ip6_addr(address, port, reinterpret_cast<sockaddr_in6*>(addr));
|
||||||
|
default:
|
||||||
|
CHECK(0 && "unexpected address family");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void UDPWrap::DoBind(const FunctionCallbackInfo<Value>& args, int family) {
|
void UDPWrap::DoBind(const FunctionCallbackInfo<Value>& args, int family) {
|
||||||
UDPWrap* wrap;
|
UDPWrap* wrap;
|
||||||
@ -191,24 +204,11 @@ void UDPWrap::DoBind(const FunctionCallbackInfo<Value>& args, int family) {
|
|||||||
if (!args[1]->Uint32Value(ctx).To(&port) ||
|
if (!args[1]->Uint32Value(ctx).To(&port) ||
|
||||||
!args[2]->Uint32Value(ctx).To(&flags))
|
!args[2]->Uint32Value(ctx).To(&flags))
|
||||||
return;
|
return;
|
||||||
char addr[sizeof(sockaddr_in6)];
|
struct sockaddr_storage addr_storage;
|
||||||
int err;
|
int err = sockaddr_for_family(family, address.out(), port, &addr_storage);
|
||||||
|
|
||||||
switch (family) {
|
|
||||||
case AF_INET:
|
|
||||||
err = uv_ip4_addr(*address, port, reinterpret_cast<sockaddr_in*>(&addr));
|
|
||||||
break;
|
|
||||||
case AF_INET6:
|
|
||||||
err = uv_ip6_addr(*address, port, reinterpret_cast<sockaddr_in6*>(&addr));
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
CHECK(0 && "unexpected address family");
|
|
||||||
ABORT();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (err == 0) {
|
if (err == 0) {
|
||||||
err = uv_udp_bind(&wrap->handle_,
|
err = uv_udp_bind(&wrap->handle_,
|
||||||
reinterpret_cast<const sockaddr*>(&addr),
|
reinterpret_cast<const sockaddr*>(&addr_storage),
|
||||||
flags);
|
flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -392,27 +392,14 @@ void UDPWrap::DoSend(const FunctionCallbackInfo<Value>& args, int family) {
|
|||||||
|
|
||||||
req_wrap->msg_size = msg_size;
|
req_wrap->msg_size = msg_size;
|
||||||
|
|
||||||
char addr[sizeof(sockaddr_in6)];
|
struct sockaddr_storage addr_storage;
|
||||||
int err;
|
int err = sockaddr_for_family(family, address.out(), port, &addr_storage);
|
||||||
|
|
||||||
switch (family) {
|
|
||||||
case AF_INET:
|
|
||||||
err = uv_ip4_addr(*address, port, reinterpret_cast<sockaddr_in*>(&addr));
|
|
||||||
break;
|
|
||||||
case AF_INET6:
|
|
||||||
err = uv_ip6_addr(*address, port, reinterpret_cast<sockaddr_in6*>(&addr));
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
CHECK(0 && "unexpected address family");
|
|
||||||
ABORT();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (err == 0) {
|
if (err == 0) {
|
||||||
err = req_wrap->Dispatch(uv_udp_send,
|
err = req_wrap->Dispatch(uv_udp_send,
|
||||||
&wrap->handle_,
|
&wrap->handle_,
|
||||||
*bufs,
|
*bufs,
|
||||||
count,
|
count,
|
||||||
reinterpret_cast<const sockaddr*>(&addr),
|
reinterpret_cast<const sockaddr*>(&addr_storage),
|
||||||
OnSend);
|
OnSend);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user