diff options
author | Vladimir Kurchatkin <vladimir.kurchatkin@gmail.com> | 2016-02-28 19:44:39 +0300 |
---|---|---|
committer | James M Snell <jasnell@gmail.com> | 2016-03-15 08:32:32 -0700 |
commit | 3b2094152e7be6fa6b1f9d57221a3b033b1bb7d3 (patch) | |
tree | 2e65affe8df4a1ae6a7a9efa4d90a17e051018b9 /src/cares_wrap.cc | |
parent | 64044813ac80baca734dcb35a1f0a241833b16a8 (diff) | |
download | android-node-v8-3b2094152e7be6fa6b1f9d57221a3b033b1bb7d3.tar.gz android-node-v8-3b2094152e7be6fa6b1f9d57221a3b033b1bb7d3.tar.bz2 android-node-v8-3b2094152e7be6fa6b1f9d57221a3b033b1bb7d3.zip |
net: make `isIPv4` and `isIPv6` more efficient
`isIPv4` and `isIPv6` are implemented on top of `isIP`, which in turn
checks the sting for being both IPv4 and IPv6, which can be inefficient
in some scenarios. This commit makes them use `uv_inet_pton` directly
instead.
PR-URL: https://github.com/nodejs/node/pull/5478
Reviewed-By: Evan Lucas <evanlucas@me.com>
Reviewed-By: James M Snell <jasnell@gmail.com>
Reviewed-By: Colin Ihrig <cjihrig@gmail.com>
Reviewed-By: Roman Reiss <me@silverwind.io>
Diffstat (limited to 'src/cares_wrap.cc')
-rw-r--r-- | src/cares_wrap.cc | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/src/cares_wrap.cc b/src/cares_wrap.cc index 62ad44bd99..a23b839fbb 100644 --- a/src/cares_wrap.cc +++ b/src/cares_wrap.cc @@ -1087,6 +1087,27 @@ static void IsIP(const FunctionCallbackInfo<Value>& args) { args.GetReturnValue().Set(rc); } +static void IsIPv4(const FunctionCallbackInfo<Value>& args) { + node::Utf8Value ip(args.GetIsolate(), args[0]); + char address_buffer[sizeof(struct in_addr)]; + + if (uv_inet_pton(AF_INET, *ip, &address_buffer) == 0) { + args.GetReturnValue().Set(true); + } else { + args.GetReturnValue().Set(false); + } +} + +static void IsIPv6(const FunctionCallbackInfo<Value>& args) { + node::Utf8Value ip(args.GetIsolate(), args[0]); + char address_buffer[sizeof(struct in6_addr)]; + + if (uv_inet_pton(AF_INET6, *ip, &address_buffer) == 0) { + args.GetReturnValue().Set(true); + } else { + args.GetReturnValue().Set(false); + } +} static void GetAddrInfo(const FunctionCallbackInfo<Value>& args) { Environment* env = Environment::GetCurrent(args); @@ -1327,6 +1348,8 @@ static void Initialize(Local<Object> target, env->SetMethod(target, "getaddrinfo", GetAddrInfo); env->SetMethod(target, "getnameinfo", GetNameInfo); env->SetMethod(target, "isIP", IsIP); + env->SetMethod(target, "isIPv4", IsIPv4); + env->SetMethod(target, "isIPv6", IsIPv6); env->SetMethod(target, "strerror", StrError); env->SetMethod(target, "getServers", GetServers); |