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)
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;
- ok, err = sock:setpeername(self.server[servernum], 53);
+ -- 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(peer, 53);
+ if not ok then return self:servfail(sock, err); end
return sock;
end