From 5caf53a0539c2f4a12be09f22f99931f3cc87008 Mon Sep 17 00:00:00 2001 From: =?utf8?q?J=C3=A9r=C3=A9my=20Lal?= Date: Mon, 26 Apr 2010 22:26:16 +0200 Subject: [PATCH] Add support for MX queries in dns module, works with c-ares upstream patch. --- lib/dns.js | 2 ++ src/node_cares.cc | 35 +++++++++++++++++++++++++++++++++++ test/disabled/test-dns.js | 2 +- 3 files changed, 38 insertions(+), 1 deletion(-) diff --git a/lib/dns.js b/lib/dns.js index 9bfca47..e57b9b4 100644 --- a/lib/dns.js +++ b/lib/dns.js @@ -124,6 +124,7 @@ exports.lookup = function (domain, callback) { exports.resolve4 = function(domain, callback) { channel.query(domain, dns.A, callback) }; exports.resolve6 = function(domain, callback) { channel.query(domain, dns.AAAA, callback) }; +exports.resolveMx = function(domain, callback) { channel.query(domain, dns.MX, callback) }; exports.resolveTxt = function(domain, callback) { channel.query(domain, dns.TXT, callback) }; exports.resolveSrv = function(domain, callback) { channel.query(domain, dns.SRV, callback) }; exports.reverse = function(domain, callback) { channel.query(domain, dns.PTR, callback) }; @@ -133,6 +134,7 @@ exports.resolveNs = function(domain, callback) { channel.query(domain, dns.NS, var resolveMap = { 'A' : exports.resolve4, 'AAAA': exports.resolve6, + 'MX' : exports.resolveMx, 'TXT' : exports.resolveTxt, 'SRV' : exports.resolveSrv, 'PTR' : exports.resolvePtr, diff --git a/src/node_cares.cc b/src/node_cares.cc index f453f28..c09ee84 100644 --- a/src/node_cares.cc +++ b/src/node_cares.cc @@ -86,6 +86,7 @@ static Persistent weight_symbol; static Persistent port_symbol; static Persistent name_symbol; static Persistent callback_symbol; +static Persistent exchange_symbol; void Cares::Initialize(Handle target) { @@ -105,12 +106,14 @@ void Cares::Initialize(Handle target) { weight_symbol = NODE_PSYMBOL("weight"); port_symbol = NODE_PSYMBOL("port"); name_symbol = NODE_PSYMBOL("name"); + exchange_symbol = NODE_PSYMBOL("exchange"); target->Set(String::NewSymbol("AF_INET"), Integer::New(AF_INET)); target->Set(String::NewSymbol("AF_INET6"), Integer::New(AF_INET6)); target->Set(String::NewSymbol("A"), Integer::New(ns_t_a)); target->Set(String::NewSymbol("AAAA"), Integer::New(ns_t_aaaa)); + target->Set(String::NewSymbol("MX"), Integer::New(ns_t_mx)); target->Set(String::NewSymbol("NS"), Integer::New(ns_t_ns)); target->Set(String::NewSymbol("PTR"), Integer::New(ns_t_ptr)); target->Set(String::NewSymbol("TXT"), Integer::New(ns_t_txt)); @@ -288,6 +291,34 @@ static void ParseAnswerAAAA(QueryArg *arg, unsigned char* abuf, int alen) { cb_call(arg->js_cb, 2, argv); } +static void ParseAnswerMX(QueryArg *arg, unsigned char* abuf, int alen) { + HandleScope scope; + + struct ares_mx_reply *mx_out; + + int status = ares_parse_mx_reply(abuf, alen, &mx_out); + if (status != ARES_SUCCESS) { + ResolveError(arg->js_cb, status); + return; + } + + Local mx_records = Array::New(); + + struct ares_mx_reply *current = mx_out; + for (int i = 0; current; ++i, current = current->next) { + Local mx = Object::New(); + + mx->Set(priority_symbol, Integer::New(current->priority)); + mx->Set(exchange_symbol, String::New(current->host)); + + mx_records->Set(Integer::New(i), mx); + } + ares_free_data(mx_out); + + Local argv[2] = { Local::New(Null()), mx_records }; + cb_call(arg->js_cb, 2, argv); +} + static void ParseAnswerNS(QueryArg *arg, unsigned char* abuf, int alen) { HandleScope scope; @@ -471,6 +502,10 @@ Handle Channel::Query(const Arguments& args) { parse_cb = ParseAnswerAAAA; break; + case ns_t_mx: + parse_cb = ParseAnswerMX; + break; + case ns_t_ns: parse_cb = ParseAnswerNS; break; diff --git a/test/disabled/test-dns.js b/test/disabled/test-dns.js index e2a0ac2..a6b1113 100644 --- a/test/disabled/test-dns.js +++ b/test/disabled/test-dns.js @@ -21,7 +21,7 @@ var hosts = ['example.com', 'example.org', '_xmpp-client._tcp.google.com', // SRV 'oakalynhall.co.uk']; // Multiple PTR replies -var records = ['A', 'AAAA', 'TXT', 'SRV']; +var records = ['A', 'AAAA', 'MX', 'TXT', 'SRV']; var i = hosts.length; while (i--) { -- 2.7.4