diff options
author | Jon Moss <me@jonathanmoss.me> | 2018-08-14 17:35:40 +0300 |
---|---|---|
committer | Beth Griggs <Bethany.Griggs@uk.ibm.com> | 2019-07-16 19:37:59 +0300 |
commit | 0dee60740917cc9034497a60c6d7227cb2ec9682 (patch) | |
tree | 4c4b94689dc0c272242b491b679a50abe26b4e0f /src | |
parent | 65ef26fdcbc59ee861010938f7b8057619d79b4a (diff) |
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: https://github.com/nodejs/node/pull/28222
PR-URL: https://github.com/nodejs/node/pull/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>
Diffstat (limited to 'src')
-rw-r--r-- | src/tcp_wrap.cc | 39 | ||||
-rw-r--r-- | src/tcp_wrap.h | 5 |
2 files changed, 24 insertions, 20 deletions
diff --git a/src/tcp_wrap.cc b/src/tcp_wrap.cc index a6cc01f1288..8eb940034de 100644 --- a/src/tcp_wrap.cc +++ b/src/tcp_wrap.cc @@ -219,8 +219,11 @@ void TCPWrap::Open(const FunctionCallbackInfo<Value>& args) { args.GetReturnValue().Set(err); } - -void TCPWrap::Bind(const FunctionCallbackInfo<Value>& args) { +template <typename T> +void TCPWrap::Bind( + const FunctionCallbackInfo<Value>& args, + int family, + std::function<int(const char* ip_address, int port, T* addr)> uv_ip_addr) { TCPWrap* wrap; ASSIGN_OR_RETURN_UNWRAP(&wrap, args.Holder(), @@ -228,9 +231,16 @@ void TCPWrap::Bind(const FunctionCallbackInfo<Value>& 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 (family == AF_INET6 && + !args[2]->Uint32Value(env->context()).To(&flags)) { + return; + } + + T addr; + int err = uv_ip_addr(*ip_address, port, &addr); + if (err == 0) { err = uv_tcp_bind(&wrap->handle_, reinterpret_cast<const sockaddr*>(&addr), @@ -239,24 +249,13 @@ void TCPWrap::Bind(const FunctionCallbackInfo<Value>& args) { args.GetReturnValue().Set(err); } +void TCPWrap::Bind(const FunctionCallbackInfo<Value>& args) { + Bind<sockaddr_in>(args, AF_INET, uv_ip4_addr); +} + void TCPWrap::Bind6(const FunctionCallbackInfo<Value>& 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; - if (!args[1]->Int32Value(env->context()).To(&port)) return; - sockaddr_in6 addr; - int err = uv_ip6_addr(*ip6_address, port, &addr); - if (err == 0) { - err = uv_tcp_bind(&wrap->handle_, - reinterpret_cast<const sockaddr*>(&addr), - 0); - } - args.GetReturnValue().Set(err); + Bind<sockaddr_in6>(args, AF_INET6, uv_ip6_addr); } diff --git a/src/tcp_wrap.h b/src/tcp_wrap.h index 3cbeae6d64a..62176c002d2 100644 --- a/src/tcp_wrap.h +++ b/src/tcp_wrap.h @@ -79,6 +79,11 @@ class TCPWrap : public ConnectionWrap<TCPWrap, uv_tcp_t> { static void Connect(const v8::FunctionCallbackInfo<v8::Value>& args, std::function<int(const char* ip_address, T* addr)> uv_ip_addr); static void Open(const v8::FunctionCallbackInfo<v8::Value>& args); + template <typename T> + static void Bind( + const v8::FunctionCallbackInfo<v8::Value>& args, + int family, + std::function<int(const char* ip_address, int port, T* addr)> uv_ip_addr); #ifdef _WIN32 static void SetSimultaneousAccepts( |