Skip to content

Commit 07d46a8

Browse files
maclover7BethGriggs
authored andcommitted
src: extract common Bind method
`TCPWrap::Bind` and `TCPWrap::Bind6` share a large amount of functionality, so a common `Bind` was extracted to remove duplication. Backport-PR-URL: #28222 PR-URL: #22315 Reviewed-By: James M Snell <jasnell@gmail.com> Reviewed-By: Anna Henningsen <anna@addaleax.net> Reviewed-By: Fedor Indutny <fedor.indutny@gmail.com> Reviewed-By: Denys Otrishko <shishugi@gmail.com>
1 parent 8a3ffca commit 07d46a8

File tree

2 files changed

+24
-20
lines changed

2 files changed

+24
-20
lines changed

src/tcp_wrap.cc

+19-20
Original file line numberDiff line numberDiff line change
@@ -219,18 +219,28 @@ void TCPWrap::Open(const FunctionCallbackInfo<Value>& args) {
219219
args.GetReturnValue().Set(err);
220220
}
221221

222-
223-
void TCPWrap::Bind(const FunctionCallbackInfo<Value>& args) {
222+
template <typename T>
223+
void TCPWrap::Bind(
224+
const FunctionCallbackInfo<Value>& args,
225+
int family,
226+
std::function<int(const char* ip_address, int port, T* addr)> uv_ip_addr) {
224227
TCPWrap* wrap;
225228
ASSIGN_OR_RETURN_UNWRAP(&wrap,
226229
args.Holder(),
227230
args.GetReturnValue().Set(UV_EBADF));
228231
Environment* env = wrap->env();
229232
node::Utf8Value ip_address(env->isolate(), args[0]);
230233
int port;
234+
unsigned int flags = 0;
231235
if (!args[1]->Int32Value(env->context()).To(&port)) return;
232-
sockaddr_in addr;
233-
int err = uv_ip4_addr(*ip_address, port, &addr);
236+
if (family == AF_INET6 &&
237+
!args[2]->Uint32Value(env->context()).To(&flags)) {
238+
return;
239+
}
240+
241+
T addr;
242+
int err = uv_ip_addr(*ip_address, port, &addr);
243+
234244
if (err == 0) {
235245
err = uv_tcp_bind(&wrap->handle_,
236246
reinterpret_cast<const sockaddr*>(&addr),
@@ -239,24 +249,13 @@ void TCPWrap::Bind(const FunctionCallbackInfo<Value>& args) {
239249
args.GetReturnValue().Set(err);
240250
}
241251

252+
void TCPWrap::Bind(const FunctionCallbackInfo<Value>& args) {
253+
Bind<sockaddr_in>(args, AF_INET, uv_ip4_addr);
254+
}
255+
242256

243257
void TCPWrap::Bind6(const FunctionCallbackInfo<Value>& args) {
244-
TCPWrap* wrap;
245-
ASSIGN_OR_RETURN_UNWRAP(&wrap,
246-
args.Holder(),
247-
args.GetReturnValue().Set(UV_EBADF));
248-
Environment* env = wrap->env();
249-
node::Utf8Value ip6_address(env->isolate(), args[0]);
250-
int port;
251-
if (!args[1]->Int32Value(env->context()).To(&port)) return;
252-
sockaddr_in6 addr;
253-
int err = uv_ip6_addr(*ip6_address, port, &addr);
254-
if (err == 0) {
255-
err = uv_tcp_bind(&wrap->handle_,
256-
reinterpret_cast<const sockaddr*>(&addr),
257-
0);
258-
}
259-
args.GetReturnValue().Set(err);
258+
Bind<sockaddr_in6>(args, AF_INET6, uv_ip6_addr);
260259
}
261260

262261

src/tcp_wrap.h

+5
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,11 @@ class TCPWrap : public ConnectionWrap<TCPWrap, uv_tcp_t> {
7979
static void Connect(const v8::FunctionCallbackInfo<v8::Value>& args,
8080
std::function<int(const char* ip_address, T* addr)> uv_ip_addr);
8181
static void Open(const v8::FunctionCallbackInfo<v8::Value>& args);
82+
template <typename T>
83+
static void Bind(
84+
const v8::FunctionCallbackInfo<v8::Value>& args,
85+
int family,
86+
std::function<int(const char* ip_address, int port, T* addr)> uv_ip_addr);
8287

8388
#ifdef _WIN32
8489
static void SetSimultaneousAccepts(

0 commit comments

Comments
 (0)