summaryrefslogtreecommitdiff
path: root/src/cares_wrap.cc
diff options
context:
space:
mode:
authorVladimir Kurchatkin <vladimir.kurchatkin@gmail.com>2016-02-28 19:44:39 +0300
committerJames M Snell <jasnell@gmail.com>2016-03-15 08:32:32 -0700
commit3b2094152e7be6fa6b1f9d57221a3b033b1bb7d3 (patch)
tree2e65affe8df4a1ae6a7a9efa4d90a17e051018b9 /src/cares_wrap.cc
parent64044813ac80baca734dcb35a1f0a241833b16a8 (diff)
downloadandroid-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.cc23
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);