From: Kim Alvefur Date: Sun, 9 Nov 2014 19:30:04 +0000 (+0100) Subject: Merge 0.9 -> 0.10 X-Git-Url: https://git.enpas.org/?a=commitdiff_plain;h=72fb60fd799e0f75daa96534cb2583823e8c8f0b;p=prosody.git Merge 0.9 -> 0.10 --- 72fb60fd799e0f75daa96534cb2583823e8c8f0b diff --cc net/adns.lua index 15814fe7,3fc958f4..87f2876b --- a/net/adns.lua +++ b/net/adns.lua @@@ -73,10 -73,10 +73,10 @@@ function new_async_socket(sock, resolve if not handler then return nil, err; end - + handler.settimeout = function () end handler.setsockname = function (_, ...) return sock:setsockname(...); end - handler.setpeername = function (_, ...) peername = (...); local ret = sock:setpeername(...); _:set_send(dummy_send); return ret; end + handler.setpeername = function (_, ...) peername = (...); local ret, err = sock:setpeername(...); _:set_send(dummy_send); return ret, err; end handler.connect = function (_, ...) return sock:connect(...) end --handler.send = function (_, data) _:write(data); return _.sendbuffer and _.sendbuffer(); end handler.send = function (_, data) diff --cc net/dns.lua index 2b03caf6,13417cee..2cb677f6 --- a/net/dns.lua +++ b/net/dns.lua @@@ -624,23 -622,22 +624,27 @@@ function resolver:getsocket(servernum local sock = self.socket[servernum]; if sock then return sock; end - local err; + local ok, err; - sock, err = socket.udp(); + local peer = self.server[servernum]; + if peer:find(":") then + sock, err = socket.udp6(); + else + sock, err = socket.udp(); + end if sock and self.socket_wrapper then sock, err = self.socket_wrapper(sock, self); end if not sock then return nil, err; end sock:settimeout(0); -- todo: attempt to use a random port, fallback to 0 - sock:setsockname('*', 0); - sock:setpeername(peer, 53); self.socket[servernum] = sock; self.socketset[sock] = servernum; + -- set{sock,peer}name can fail, eg because of local routing table + -- if so, try the next server + ok, err = sock:setsockname('*', 0); + if not ok then return self:servfail(sock, err); end - ok, err = sock:setpeername(self.server[servernum], 53); ++ ok, err = sock:setpeername(peer, 53); + if not ok then return self:servfail(sock, err); end return sock; end