diff options
author | Daniel Turing <mail@danielturing.com> | 2016-02-08 10:57:24 +0100 |
---|---|---|
committer | Roman Reiss <me@silverwind.io> | 2016-02-08 17:30:38 +0100 |
commit | dbdbdd4998e163deecefbb1d34cda84f749844a4 (patch) | |
tree | 3a5156f8797323f342e82f627a579a7362e852ab /src/cares_wrap.cc | |
parent | c4ab861a494eea9c18698fbf955025ca265b0b92 (diff) | |
download | node-new-dbdbdd4998e163deecefbb1d34cda84f749844a4.tar.gz |
dns: add resolvePtr to query plain DNS PTR records
Resolving plain PTR records is used beyond reverse DNS, most
prominently with DNS-SD (RFC6763). This adds dns.resolvePtr(),
and uses it (instead of dns.reverse()) in dns.resolve().
PR-URL: https://github.com/nodejs/node/pull/4921
Reviewed-By: Roman Reiss <me@silverwind.io>
Reviewed-By: Brian White <mscdex@mscdex.net>
Diffstat (limited to 'src/cares_wrap.cc')
-rw-r--r-- | src/cares_wrap.cc | 44 |
1 files changed, 44 insertions, 0 deletions
diff --git a/src/cares_wrap.cc b/src/cares_wrap.cc index 46636c528b..0f5581b3f3 100644 --- a/src/cares_wrap.cc +++ b/src/cares_wrap.cc @@ -698,6 +698,49 @@ class QuerySrvWrap: public QueryWrap { } }; +class QueryPtrWrap: public QueryWrap { + public: + explicit QueryPtrWrap(Environment* env, Local<Object> req_wrap_obj) + : QueryWrap(env, req_wrap_obj) { + } + + int Send(const char* name) override { + ares_query(env()->cares_channel(), + name, + ns_c_in, + ns_t_ptr, + Callback, + GetQueryArg()); + return 0; + } + + size_t self_size() const override { return sizeof(*this); } + + protected: + void Parse(unsigned char* buf, int len) override { + HandleScope handle_scope(env()->isolate()); + Context::Scope context_scope(env()->context()); + + struct hostent* host; + + int status = ares_parse_ptr_reply(buf, len, NULL, 0, AF_INET, &host); + if (status != ARES_SUCCESS) { + ParseError(status); + return; + } + + Local<Array> aliases = Array::New(env()->isolate()); + + for (uint32_t i = 0; host->h_aliases[i] != NULL; i++) { + aliases->Set(i, OneByteString(env()->isolate(), host->h_aliases[i])); + } + + ares_free_hostent(host); + + this->CallOnComplete(aliases); + } +}; + class QueryNaptrWrap: public QueryWrap { public: explicit QueryNaptrWrap(Environment* env, Local<Object> req_wrap_obj) @@ -1276,6 +1319,7 @@ static void Initialize(Local<Object> target, env->SetMethod(target, "queryNs", Query<QueryNsWrap>); env->SetMethod(target, "queryTxt", Query<QueryTxtWrap>); env->SetMethod(target, "querySrv", Query<QuerySrvWrap>); + env->SetMethod(target, "queryPtr", Query<QueryPtrWrap>); env->SetMethod(target, "queryNaptr", Query<QueryNaptrWrap>); env->SetMethod(target, "querySoa", Query<QuerySoaWrap>); env->SetMethod(target, "getHostByAddr", Query<GetHostByAddrWrap>); |