Skip to content

Commit dc1f4eb

Browse files
blazzyry
authored andcommitted
c-ares based dns module
1 parent e9a116f commit dc1f4eb

5 files changed

Lines changed: 809 additions & 0 deletions

File tree

lib/dns_cares.js

Lines changed: 121 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,121 @@
1+
var dns = process.binding('cares');
2+
3+
4+
var watchers = {};
5+
var activeWatchers = {};
6+
7+
8+
var timer = new process.Timer();
9+
10+
timer.callback = function () {
11+
for (var socket in activeWatchers) {
12+
var s = parseInt(socket);
13+
channel.processFD( watchers[socket].read ? s : dns.SOCKET_BAD
14+
, watchers[socket].write ? s : dns.SOCKET_BAD
15+
);
16+
}
17+
updateTimer();
18+
}
19+
20+
21+
function updateTimer() {
22+
timer.stop();
23+
24+
for (var socket in activeWatchers) { // if !empty(activeWatchers)
25+
var max = 20000;
26+
var timeout = channel.timeout(max);
27+
28+
timer.start(timeout, 0);
29+
30+
return;
31+
}
32+
}
33+
34+
35+
var channel = new dns.Channel({SOCK_STATE_CB: function (socket, read, write) {
36+
var watcher;
37+
38+
if (socket in watchers) {
39+
watcher = watchers[socket].watcher;
40+
} else {
41+
watcher = new process.IOWatcher();
42+
watchers[socket] = { read: read
43+
, write: write
44+
, watcher: watcher
45+
};
46+
47+
watcher.callback = function(read, write) {
48+
channel.processFD( read ? socket : dns.SOCKET_BAD
49+
, write ? socket : dns.SOCKET_BAD
50+
);
51+
updateTimer();
52+
}
53+
}
54+
55+
watcher.set(socket, read == 1, write == 1);
56+
57+
if (!(read || write)) {
58+
watcher.stop();
59+
delete activeWatchers[socket];
60+
return;
61+
} else {
62+
watcher.start();
63+
activeWatchers[socket] = watcher;
64+
}
65+
66+
updateTimer();
67+
}});
68+
69+
70+
71+
exports.resolve = function (domain, type_, callback_) {
72+
var type, callback;
73+
if (typeof(type_) == 'string') {
74+
type = type_;
75+
callback = callback_;
76+
} else {
77+
type = 'A';
78+
callback = arguments[1];
79+
}
80+
81+
var resolveFunc = resolveMap[type];
82+
83+
if (typeof(resolveFunc) == 'function') {
84+
resolveFunc(domain, callback);
85+
} else {
86+
throw new Error('Unknown type "' + type + '"');
87+
}
88+
}
89+
90+
91+
exports.resolve4 = function(domain, callback) { channel.query(domain, dns.A, callback) };
92+
exports.resolve6 = function(domain, callback) { channel.query(domain, dns.AAAA, callback) };
93+
exports.resolveTxt = function(domain, callback) { channel.query(domain, dns.TXT, callback) };
94+
exports.resolveSrv = function(domain, callback) { channel.query(domain, dns.SRV, callback) };
95+
exports.reverse = function(domain, callback) { channel.query(domain, dns.PTR, callback) };
96+
exports.resolveNs = function(domain, callback) { channel.query(domain, dns.NS, callback) };
97+
98+
99+
var resolveMap = {
100+
'A' : exports.resolve4,
101+
'AAAA': exports.resolve6,
102+
'TXT' : exports.resolveTxt,
103+
'SRV' : exports.resolveSrv,
104+
'PTR' : exports.resolvePtr,
105+
'NS' : exports.resolveNs,
106+
};
107+
108+
// ERROR CODES
109+
exports.NODATA = dns.NODATA;
110+
exports.FORMERR = dns.FORMERR;
111+
exports.BADRESP = dns.BADRESP;
112+
exports.NOTFOUND = dns.NOTFOUND;
113+
exports.BADNAME = dns.BADNAME;
114+
exports.TIMEOUT = dns.TIMEOUT;
115+
exports.CONNREFUSED = dns.CONNREFUSED;
116+
exports.NOMEM = dns.NOMEM;
117+
exports.DESTRUCTION = dns.DESTRUCTION;
118+
119+
exports.NOTIMP = dns.NOTIMP;
120+
exports.EREFUSED = dns.EREFUSED;
121+
exports.SERVFAIL = dns.SERVFAIL;

src/node.cc

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
#include <node_net2.h>
2020
#include <node_events.h>
2121
#include <node_dns.h>
22+
#include <node_cares.h>
2223
#include <node_net.h>
2324
#include <node_file.h>
2425
#include <node_idle_watcher.h>
@@ -1194,6 +1195,15 @@ static Handle<Value> Binding(const Arguments& args) {
11941195
binding_cache->Set(module, exports);
11951196
}
11961197

1198+
} else if (!strcmp(*module_v, "cares")) {
1199+
if (binding_cache->Has(module)) {
1200+
exports = binding_cache->Get(module)->ToObject();
1201+
} else {
1202+
exports = Object::New();
1203+
Cares::Initialize(exports);
1204+
binding_cache->Set(module, exports);
1205+
}
1206+
11971207
} else if (!strcmp(*module_v, "fs")) {
11981208
if (binding_cache->Has(module)) {
11991209
exports = binding_cache->Get(module)->ToObject();
@@ -1266,6 +1276,7 @@ static Handle<Value> Binding(const Arguments& args) {
12661276
exports->Set(String::New("buffer"), String::New(native_buffer));
12671277
exports->Set(String::New("child_process"),String::New(native_child_process));
12681278
exports->Set(String::New("dns"), String::New(native_dns));
1279+
exports->Set(String::New("dns_cares"), String::New(native_dns_cares));
12691280
exports->Set(String::New("events"), String::New(native_events));
12701281
exports->Set(String::New("file"), String::New(native_file));
12711282
exports->Set(String::New("fs"), String::New(native_fs));

0 commit comments

Comments
 (0)