Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/nodejs/node.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJon Moss <me@jonathanmoss.me>2018-08-14 17:35:40 +0300
committerBeth Griggs <Bethany.Griggs@uk.ibm.com>2019-07-16 19:37:59 +0300
commit0dee60740917cc9034497a60c6d7227cb2ec9682 (patch)
tree4c4b94689dc0c272242b491b679a50abe26b4e0f /src
parent65ef26fdcbc59ee861010938f7b8057619d79b4a (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.cc39
-rw-r--r--src/tcp_wrap.h5
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(