From a4505c698f94bde7e32848d06963e8fc38a31123 Mon Sep 17 00:00:00 2001 From: Jon Moss Date: Tue, 14 Aug 2018 10:35:40 -0400 Subject: [PATCH] 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. PR-URL: https://github.com/nodejs/node/pull/22315 Reviewed-By: James M Snell Reviewed-By: Anna Henningsen Reviewed-By: Fedor Indutny Reviewed-By: Denys Otrishko --- src/tcp_wrap.cc | 43 ++++++++++++++++++++----------------------- src/tcp_wrap.h | 5 +++++ 2 files changed, 25 insertions(+), 23 deletions(-) diff --git a/src/tcp_wrap.cc b/src/tcp_wrap.cc index 5adab06df456bb..dac621ec879e5c 100644 --- a/src/tcp_wrap.cc +++ b/src/tcp_wrap.cc @@ -225,8 +225,11 @@ void TCPWrap::Open(const FunctionCallbackInfo& args) { args.GetReturnValue().Set(err); } - -void TCPWrap::Bind(const FunctionCallbackInfo& args) { +template +void TCPWrap::Bind( + const FunctionCallbackInfo& args, + int family, + std::function uv_ip_addr) { TCPWrap* wrap; ASSIGN_OR_RETURN_UNWRAP(&wrap, args.Holder(), @@ -234,31 +237,16 @@ void TCPWrap::Bind(const FunctionCallbackInfo& args) { Environment* env = wrap->env(); node::Utf8Value ip_address(env->isolate(), args[0]); int port; + unsigned int flags = 0; if (!args[1]->Int32Value(env->context()).To(&port)) return; - sockaddr_in addr; - int err = uv_ip4_addr(*ip_address, port, &addr); - if (err == 0) { - err = uv_tcp_bind(&wrap->handle_, - reinterpret_cast(&addr), - 0); + if (family == AF_INET6 && + !args[2]->Uint32Value(env->context()).To(&flags)) { + return; } - args.GetReturnValue().Set(err); -} + T addr; + int err = uv_ip_addr(*ip_address, port, &addr); -void TCPWrap::Bind6(const FunctionCallbackInfo& args) { - TCPWrap* wrap; - ASSIGN_OR_RETURN_UNWRAP(&wrap, - args.Holder(), - args.GetReturnValue().Set(UV_EBADF)); - Environment* env = wrap->env(); - node::Utf8Value ip6_address(env->isolate(), args[0]); - int port; - unsigned int flags; - if (!args[1]->Int32Value(env->context()).To(&port)) return; - if (!args[2]->Uint32Value(env->context()).To(&flags)) return; - sockaddr_in6 addr; - int err = uv_ip6_addr(*ip6_address, port, &addr); if (err == 0) { err = uv_tcp_bind(&wrap->handle_, reinterpret_cast(&addr), @@ -267,6 +255,15 @@ void TCPWrap::Bind6(const FunctionCallbackInfo& args) { args.GetReturnValue().Set(err); } +void TCPWrap::Bind(const FunctionCallbackInfo& args) { + Bind(args, AF_INET, uv_ip4_addr); +} + + +void TCPWrap::Bind6(const FunctionCallbackInfo& args) { + Bind(args, AF_INET6, uv_ip6_addr); +} + void TCPWrap::Listen(const FunctionCallbackInfo& args) { TCPWrap* wrap; diff --git a/src/tcp_wrap.h b/src/tcp_wrap.h index a554832841aa31..db269f65281639 100644 --- a/src/tcp_wrap.h +++ b/src/tcp_wrap.h @@ -80,6 +80,11 @@ class TCPWrap : public ConnectionWrap { static void Connect(const v8::FunctionCallbackInfo& args, std::function uv_ip_addr); static void Open(const v8::FunctionCallbackInfo& args); + template + static void Bind( + const v8::FunctionCallbackInfo& args, + int family, + std::function uv_ip_addr); #ifdef _WIN32 static void SetSimultaneousAccepts(