Skip to content

Commit a43af39

Browse files
committed
src: DRY getsockname/getpeername code
Extract the common logic into a template function. No functional changes, just code cleanup. PR-URL: #956 Reviewed-By: Sam Roberts <vieuxtech@gmail.com> Reviewed-By: Trevor Norris <trev.norris@gmail.com>
1 parent d6714ff commit a43af39

File tree

5 files changed

+31
-72
lines changed

5 files changed

+31
-72
lines changed

src/node_internals.h

+13
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,19 @@ v8::Local<v8::Object> AddressToJS(
7979
const sockaddr* addr,
8080
v8::Local<v8::Object> info = v8::Handle<v8::Object>());
8181

82+
template <typename T, int (*F)(const typename T::HandleType*, sockaddr*, int*)>
83+
void GetSockOrPeerName(const v8::FunctionCallbackInfo<v8::Value>& args) {
84+
T* const wrap = Unwrap<T>(args.Holder());
85+
CHECK(args[0]->IsObject());
86+
sockaddr_storage storage;
87+
int addrlen = sizeof(storage);
88+
sockaddr* const addr = reinterpret_cast<sockaddr*>(&storage);
89+
const int err = F(&wrap->handle_, addr, &addrlen);
90+
if (err == 0)
91+
AddressToJS(wrap->env(), addr, args[0].As<v8::Object>());
92+
args.GetReturnValue().Set(err);
93+
}
94+
8295
#ifdef _WIN32
8396
// emulate snprintf() on windows, _snprintf() doesn't zero-terminate the buffer
8497
// on overflow...

src/tcp_wrap.cc

+4-46
Original file line numberDiff line numberDiff line change
@@ -98,8 +98,10 @@ void TCPWrap::Initialize(Handle<Object> target,
9898
env->SetProtoMethod(t, "connect", Connect);
9999
env->SetProtoMethod(t, "bind6", Bind6);
100100
env->SetProtoMethod(t, "connect6", Connect6);
101-
env->SetProtoMethod(t, "getsockname", GetSockName);
102-
env->SetProtoMethod(t, "getpeername", GetPeerName);
101+
env->SetProtoMethod(t, "getsockname",
102+
GetSockOrPeerName<TCPWrap, uv_tcp_getsockname>);
103+
env->SetProtoMethod(t, "getpeername",
104+
GetSockOrPeerName<TCPWrap, uv_tcp_getpeername>);
103105
env->SetProtoMethod(t, "setNoDelay", SetNoDelay);
104106
env->SetProtoMethod(t, "setKeepAlive", SetKeepAlive);
105107

@@ -162,50 +164,6 @@ TCPWrap::~TCPWrap() {
162164
}
163165

164166

165-
void TCPWrap::GetSockName(const FunctionCallbackInfo<Value>& args) {
166-
Environment* env = Environment::GetCurrent(args);
167-
struct sockaddr_storage address;
168-
169-
TCPWrap* wrap = Unwrap<TCPWrap>(args.Holder());
170-
171-
CHECK(args[0]->IsObject());
172-
Local<Object> out = args[0].As<Object>();
173-
174-
int addrlen = sizeof(address);
175-
int err = uv_tcp_getsockname(&wrap->handle_,
176-
reinterpret_cast<sockaddr*>(&address),
177-
&addrlen);
178-
if (err == 0) {
179-
const sockaddr* addr = reinterpret_cast<const sockaddr*>(&address);
180-
AddressToJS(env, addr, out);
181-
}
182-
183-
args.GetReturnValue().Set(err);
184-
}
185-
186-
187-
void TCPWrap::GetPeerName(const FunctionCallbackInfo<Value>& args) {
188-
Environment* env = Environment::GetCurrent(args);
189-
struct sockaddr_storage address;
190-
191-
TCPWrap* wrap = Unwrap<TCPWrap>(args.Holder());
192-
193-
CHECK(args[0]->IsObject());
194-
Local<Object> out = args[0].As<Object>();
195-
196-
int addrlen = sizeof(address);
197-
int err = uv_tcp_getpeername(&wrap->handle_,
198-
reinterpret_cast<sockaddr*>(&address),
199-
&addrlen);
200-
if (err == 0) {
201-
const sockaddr* addr = reinterpret_cast<const sockaddr*>(&address);
202-
AddressToJS(env, addr, out);
203-
}
204-
205-
args.GetReturnValue().Set(err);
206-
}
207-
208-
209167
void TCPWrap::SetNoDelay(const FunctionCallbackInfo<Value>& args) {
210168
TCPWrap* wrap = Unwrap<TCPWrap>(args.Holder());
211169
int enable = static_cast<int>(args[0]->BooleanValue());

src/tcp_wrap.h

+6-2
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,16 @@ class TCPWrap : public StreamWrap {
1919
size_t self_size() const override { return sizeof(*this); }
2020

2121
private:
22+
typedef uv_tcp_t HandleType;
23+
24+
template <typename T,
25+
int (*F)(const typename T::HandleType*, sockaddr*, int*)>
26+
friend void GetSockOrPeerName(const v8::FunctionCallbackInfo<v8::Value>&);
27+
2228
TCPWrap(Environment* env, v8::Handle<v8::Object> object, AsyncWrap* parent);
2329
~TCPWrap();
2430

2531
static void New(const v8::FunctionCallbackInfo<v8::Value>& args);
26-
static void GetSockName(const v8::FunctionCallbackInfo<v8::Value>& args);
27-
static void GetPeerName(const v8::FunctionCallbackInfo<v8::Value>& args);
2832
static void SetNoDelay(const v8::FunctionCallbackInfo<v8::Value>& args);
2933
static void SetKeepAlive(const v8::FunctionCallbackInfo<v8::Value>& args);
3034
static void Bind(const v8::FunctionCallbackInfo<v8::Value>& args);

src/udp_wrap.cc

+2-24
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,8 @@ void UDPWrap::Initialize(Handle<Object> target,
9696
env->SetProtoMethod(t, "close", Close);
9797
env->SetProtoMethod(t, "recvStart", RecvStart);
9898
env->SetProtoMethod(t, "recvStop", RecvStop);
99-
env->SetProtoMethod(t, "getsockname", GetSockName);
99+
env->SetProtoMethod(t, "getsockname",
100+
GetSockOrPeerName<UDPWrap, uv_udp_getsockname>);
100101
env->SetProtoMethod(t, "addMembership", AddMembership);
101102
env->SetProtoMethod(t, "dropMembership", DropMembership);
102103
env->SetProtoMethod(t, "setMulticastTTL", SetMulticastTTL);
@@ -325,29 +326,6 @@ void UDPWrap::RecvStop(const FunctionCallbackInfo<Value>& args) {
325326
}
326327

327328

328-
void UDPWrap::GetSockName(const FunctionCallbackInfo<Value>& args) {
329-
Environment* env = Environment::GetCurrent(args);
330-
331-
struct sockaddr_storage address;
332-
UDPWrap* wrap = Unwrap<UDPWrap>(args.Holder());
333-
334-
CHECK(args[0]->IsObject());
335-
Local<Object> obj = args[0].As<Object>();
336-
337-
int addrlen = sizeof(address);
338-
int err = uv_udp_getsockname(&wrap->handle_,
339-
reinterpret_cast<sockaddr*>(&address),
340-
&addrlen);
341-
342-
if (err == 0) {
343-
const sockaddr* addr = reinterpret_cast<const sockaddr*>(&address);
344-
AddressToJS(env, addr, obj);
345-
}
346-
347-
args.GetReturnValue().Set(err);
348-
}
349-
350-
351329
// TODO(bnoordhuis) share with StreamWrap::AfterWrite() in stream_wrap.cc
352330
void UDPWrap::OnSend(uv_udp_send_t* req, int status) {
353331
SendWrap* req_wrap = static_cast<SendWrap*>(req->data);

src/udp_wrap.h

+6
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,12 @@ class UDPWrap: public HandleWrap {
4040
size_t self_size() const override { return sizeof(*this); }
4141

4242
private:
43+
typedef uv_udp_t HandleType;
44+
45+
template <typename T,
46+
int (*F)(const typename T::HandleType*, sockaddr*, int*)>
47+
friend void GetSockOrPeerName(const v8::FunctionCallbackInfo<v8::Value>&);
48+
4349
UDPWrap(Environment* env, v8::Handle<v8::Object> object, AsyncWrap* parent);
4450

4551
static void DoBind(const v8::FunctionCallbackInfo<v8::Value>& args,

0 commit comments

Comments
 (0)