summaryrefslogtreecommitdiff
path: root/lib/dns.js
diff options
context:
space:
mode:
Diffstat (limited to 'lib/dns.js')
-rw-r--r--lib/dns.js148
1 files changed, 121 insertions, 27 deletions
diff --git a/lib/dns.js b/lib/dns.js
index cd7bc817d3..6794ef426f 100644
--- a/lib/dns.js
+++ b/lib/dns.js
@@ -1,4 +1,72 @@
-var dns = process.binding('dns');
+var dns = process.binding('cares');
+
+
+var watchers = {};
+var activeWatchers = {};
+
+
+var timer = new process.Timer();
+
+timer.callback = function () {
+ for (var socket in activeWatchers) {
+ var s = parseInt(socket);
+ channel.processFD( watchers[socket].read ? s : dns.SOCKET_BAD
+ , watchers[socket].write ? s : dns.SOCKET_BAD
+ );
+ }
+ updateTimer();
+}
+
+
+function updateTimer() {
+ timer.stop();
+
+ for (var socket in activeWatchers) { // if !empty(activeWatchers)
+ var max = 20000;
+ var timeout = channel.timeout(max);
+
+ timer.start(timeout, 0);
+
+ return;
+ }
+}
+
+
+var channel = new dns.Channel({SOCK_STATE_CB: function (socket, read, write) {
+ var watcher;
+
+ if (socket in watchers) {
+ watcher = watchers[socket].watcher;
+ } else {
+ watcher = new process.IOWatcher();
+ watchers[socket] = { read: read
+ , write: write
+ , watcher: watcher
+ };
+
+ watcher.callback = function(read, write) {
+ channel.processFD( read ? socket : dns.SOCKET_BAD
+ , write ? socket : dns.SOCKET_BAD
+ );
+ updateTimer();
+ }
+ }
+
+ watcher.set(socket, read == 1, write == 1);
+
+ if (!(read || write)) {
+ watcher.stop();
+ delete activeWatchers[socket];
+ return;
+ } else {
+ watcher.start();
+ activeWatchers[socket] = watcher;
+ }
+
+ updateTimer();
+}});
+
+
exports.resolve = function (domain, type_, callback_) {
var type, callback;
@@ -19,38 +87,64 @@ exports.resolve = function (domain, type_, callback_) {
}
}
-exports.resolve4 = dns.resolve4;
-exports.resolve6 = dns.resolve6;
-exports.resolveMx = dns.resolveMx;
-exports.resolveTxt = dns.resolveTxt;
-exports.resolveSrv = dns.resolveSrv;
-exports.reverse = dns.reverse;
-
-// ERROR CODES
-
-// timeout, SERVFAIL or similar.
-exports.TEMPFAIL = dns.TEMPFAIL;
-// got garbled reply.
-exports.PROTOCOL = dns.PROTOCOL;
+exports.getHostByName = function (domain, callback) {
+ channel.getHostByName(domain, dns.AF_INET, callback);
+};
-// domain does not exists.
-exports.NXDOMAIN = dns.NXDOMAIN;
+// Easy DNS A/AAAA look up
+exports.lookup = function (domain, callback) {
+ var addressType = dns.isIP(domain);
+ if (addressType) {
+ process.nextTick(function () {
+ callback(null, domain, addressType);
+ });
+ } else {
+ channel.getHostByName(domain, dns.AF_INET, function (err, domains4) {
+ if (domains4 && domains4.length) {
+ callback(null, domains4[0], 4);
+ } else {
+ channel.getHostByName(domain, dns.AF_INET6, function (err, domains6) {
+ if (domains6 && domains6.length) {
+ callback(null, domains6[0], 6);
+ } else {
+ callback(err, []);
+ }
+ });
+ }
+ });
+ }
+};
-// domain exists but no data of reqd type.
-exports.NODATA = dns.NODATA;
-// out of memory while processing.
-exports.NOMEM = dns.NOMEM;
+exports.resolve4 = function(domain, callback) { channel.query(domain, dns.A, callback) };
+exports.resolve6 = function(domain, callback) { channel.query(domain, dns.AAAA, 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) };
+exports.resolveNs = function(domain, callback) { channel.query(domain, dns.NS, callback) };
-// the query is malformed.
-exports.BADQUERY = dns.BADQUERY;
var resolveMap = {
- 'A': exports.resolve4,
+ 'A' : exports.resolve4,
'AAAA': exports.resolve6,
- 'MX': exports.resolveMx,
- 'TXT': exports.resolveTxt,
- 'SRV': exports.resolveSrv,
- 'PTR': exports.reverse,
+ 'TXT' : exports.resolveTxt,
+ 'SRV' : exports.resolveSrv,
+ 'PTR' : exports.resolvePtr,
+ 'NS' : exports.resolveNs,
};
+
+// ERROR CODES
+exports.NODATA = dns.NODATA;
+exports.FORMERR = dns.FORMERR;
+exports.BADRESP = dns.BADRESP;
+exports.NOTFOUND = dns.NOTFOUND;
+exports.BADNAME = dns.BADNAME;
+exports.TIMEOUT = dns.TIMEOUT;
+exports.CONNREFUSED = dns.CONNREFUSED;
+exports.NOMEM = dns.NOMEM;
+exports.DESTRUCTION = dns.DESTRUCTION;
+
+exports.NOTIMP = dns.NOTIMP;
+exports.EREFUSED = dns.EREFUSED;
+exports.SERVFAIL = dns.SERVFAIL;