function dns.random(...) -- - - - - - - - - - - - - - - - - - - dns.random
- math.randomseed(math.floor(10000*socket.gettime()));
+ math.randomseed(math.floor(10000*socket.gettime()) % 0x100000000);
dns.random = math.random;
return dns.random(...);
end
local remember, pointers = nil, 0;
local len = self:byte();
local n = {};
+ if len == 0 then return "." end -- Root label
while len > 0 do
if len >= 0xc0 then -- name is "compressed"
pointers = pointers + 1;
if not force then
if not self.active[response.header.id] or not self.active[response.header.id][response.question.raw] then
+ self.active[response.header.id] = nil;
return nil;
end
end
local err;
sock, err = socket.udp();
+ if sock and self.socket_wrapper then sock, err = self.socket_wrapper(sock, self); end
if not sock then
return nil, err;
end
- if self.socket_wrapper then sock = self.socket_wrapper(sock, self); end
sock:settimeout(0);
-- todo: attempt to use a random port, fallback to 0
sock:setsockname('*', 0);
self.socket[self.socketset[sock]] = nil;
self.socketset[sock] = nil;
end
+ sock:close();
end
function resolver:socket_wrapper_set(func) -- - - - - - - socket_wrapper_set
end
end
end
- else self.cache = {}; end
+ else self.cache = setmetatable({}, cache_metatable); end
end
end
end
end
+ if next(queries) == nil then
+ self.active[id] = nil;
+ end
end
if num == self.best_server then
set(self.wanted, q.class, q.type, q.name, nil);
end
end
+
end
end
end
return _resolver:settimeout(...);
end
+function dns.cache()
+ return _resolver.cache;
+end
+
function dns.socket_wrapper_set(...) -- - - - - - - - - socket_wrapper_set
return _resolver:socket_wrapper_set(...);
end