X-Git-Url: https://git.enpas.org/?a=blobdiff_plain;f=net%2Fadns.lua;h=c9cb9476a17eea1af38b4b3f084bfee4ac23398a;hb=4e9ad86f42f78e32d5a983b62277a0552c853a9c;hp=6062da73990d2da998c5e1f400e2f43e9f0869f1;hpb=b51cc2052aacde5b3385b813b6b0426ec98758f3;p=prosody.git diff --git a/net/adns.lua b/net/adns.lua index 6062da73..c9cb9476 100644 --- a/net/adns.lua +++ b/net/adns.lua @@ -1,8 +1,17 @@ +-- Prosody IM +-- Copyright (C) 2008-2009 Matthew Wild +-- Copyright (C) 2008-2009 Waqas Hussain +-- +-- This project is MIT/X11 licensed. Please see the +-- COPYING file in the source package for more information. +-- + local server = require "net.server"; local dns = require "net.dns"; local log = require "util.logger".init("adns"); +local t_insert, t_remove = table.insert, table.remove; local coroutine, tostring, pcall = coroutine, tostring, pcall; module "adns" @@ -20,32 +29,46 @@ function lookup(handler, qname, qtype, qclass) log("debug", "Reply for %s (%s)", qname, tostring(coroutine.running())); local ok, err = pcall(handler, dns.peek(qname, qtype, qclass)); if not ok then - log("debug", "Error in DNS response handler: %s", tostring(err)); + log("error", "Error in DNS response handler: %s", tostring(err)); end end)(dns.peek(qname, qtype, qclass)); end function cancel(handle, call_handler) + log("warn", "Cancelling DNS lookup for %s", tostring(handle[3])); dns.cancel(handle); if call_handler then - handle[4]() + coroutine.resume(handle[4]); end end -function new_async_socket(sock) - local newconn = {}; +function new_async_socket(sock, resolver) + local newconn, peername = {}, ""; local listener = {}; - function listener.incoming(conn, data) + function listener.onincoming(conn, data) dns.feed(sock, data); end - function listener.disconnect() + function listener.ondisconnect(conn, err) + log("warn", "DNS socket for %s disconnected: %s", peername, err); + local servers = resolver.server; + if resolver.socketset[newconn.handler] == resolver.best_server and resolver.best_server == #servers then + log("error", "Exhausted all %d configured DNS servers, next lookup will try %s again", #servers, servers[1]); + end + + resolver:servfail(conn); -- Let the magic commence end newconn.handler, newconn._socket = server.wrapclient(sock, "dns", 53, listener); + if not newconn.handler then + log("warn", "handler is nil"); + end + if not newconn._socket then + log("warn", "socket is nil"); + end newconn.handler.settimeout = function () end newconn.handler.setsockname = function (_, ...) return sock:setsockname(...); end - newconn.handler.setpeername = function (_, ...) local ret = sock:setpeername(...); _.setsend(sock.send); return ret; end + newconn.handler.setpeername = function (_, ...) peername = (...); local ret = sock:setpeername(...); _.setsend(sock.send); return ret; end newconn.handler.connect = function (_, ...) return sock:connect(...) end - newconn.handler.send = function (_, data) _.write(data); return _.sendbuffer(); end + newconn.handler.send = function (_, data) _.write(_, data); return _.sendbuffer(); end return newconn.handler; end