Skip to content

Commit 05292cb

Browse files
danbevaddaleax
authored andcommittedFeb 17, 2019
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: nodejs#26070 Reviewed-By: Anna Henningsen <anna@addaleax.net> Reviewed-By: James M Snell <jasnell@gmail.com> Reviewed-By: Richard Lau <riclau@uk.ibm.com>
1 parent 48491ce commit 05292cb

File tree

1 file changed

+19
-32
lines changed

1 file changed

+19
-32
lines changed
 

‎src/udp_wrap.cc

+19-32
Original file line numberDiff line numberDiff line change
@@ -175,6 +175,19 @@ void UDPWrap::GetFD(const FunctionCallbackInfo<Value>& args) {
175175
args.GetReturnValue().Set(fd);
176176
}
177177

178+
int sockaddr_for_family(int address_family,
179+
const char* address,
180+
const unsigned short port,
181+
struct sockaddr_storage* addr) {
182+
switch (address_family) {
183+
case AF_INET:
184+
return uv_ip4_addr(address, port, reinterpret_cast<sockaddr_in*>(addr));
185+
case AF_INET6:
186+
return uv_ip6_addr(address, port, reinterpret_cast<sockaddr_in6*>(addr));
187+
default:
188+
CHECK(0 && "unexpected address family");
189+
}
190+
}
178191

179192
void UDPWrap::DoBind(const FunctionCallbackInfo<Value>& args, int family) {
180193
UDPWrap* wrap;
@@ -191,24 +204,11 @@ void UDPWrap::DoBind(const FunctionCallbackInfo<Value>& args, int family) {
191204
if (!args[1]->Uint32Value(ctx).To(&port) ||
192205
!args[2]->Uint32Value(ctx).To(&flags))
193206
return;
194-
char addr[sizeof(sockaddr_in6)];
195-
int err;
196-
197-
switch (family) {
198-
case AF_INET:
199-
err = uv_ip4_addr(*address, port, reinterpret_cast<sockaddr_in*>(&addr));
200-
break;
201-
case AF_INET6:
202-
err = uv_ip6_addr(*address, port, reinterpret_cast<sockaddr_in6*>(&addr));
203-
break;
204-
default:
205-
CHECK(0 && "unexpected address family");
206-
ABORT();
207-
}
208-
207+
struct sockaddr_storage addr_storage;
208+
int err = sockaddr_for_family(family, address.out(), port, &addr_storage);
209209
if (err == 0) {
210210
err = uv_udp_bind(&wrap->handle_,
211-
reinterpret_cast<const sockaddr*>(&addr),
211+
reinterpret_cast<const sockaddr*>(&addr_storage),
212212
flags);
213213
}
214214

@@ -392,27 +392,14 @@ void UDPWrap::DoSend(const FunctionCallbackInfo<Value>& args, int family) {
392392

393393
req_wrap->msg_size = msg_size;
394394

395-
char addr[sizeof(sockaddr_in6)];
396-
int err;
397-
398-
switch (family) {
399-
case AF_INET:
400-
err = uv_ip4_addr(*address, port, reinterpret_cast<sockaddr_in*>(&addr));
401-
break;
402-
case AF_INET6:
403-
err = uv_ip6_addr(*address, port, reinterpret_cast<sockaddr_in6*>(&addr));
404-
break;
405-
default:
406-
CHECK(0 && "unexpected address family");
407-
ABORT();
408-
}
409-
395+
struct sockaddr_storage addr_storage;
396+
int err = sockaddr_for_family(family, address.out(), port, &addr_storage);
410397
if (err == 0) {
411398
err = req_wrap->Dispatch(uv_udp_send,
412399
&wrap->handle_,
413400
*bufs,
414401
count,
415-
reinterpret_cast<const sockaddr*>(&addr),
402+
reinterpret_cast<const sockaddr*>(&addr_storage),
416403
OnSend);
417404
}
418405

0 commit comments

Comments
 (0)
Please sign in to comment.