net/dns.lua
author Kim Alvefur <zash@zash.se>
Sat, 23 Mar 2024 20:48:19 +0100
changeset 13465 c673ff1075bd
parent 12978 ba409c67353b
permissions -rw-r--r--
mod_posix: Move everything to util.startup This allows greater control over the order of events. Notably, the internal ordering between daemonization, initialization of libunbound and setup of signal handling is sensitive. libunbound starts a separate thread for processing DNS requests. If this thread is started before signal handling has been set up, it will not inherit the signal handlers and instead behave as it would have before signal handlers were set up, i.e. cause the whole process to immediately exit. libunbound is usually initialized on the first DNS request, usually triggered by an outgoing s2s connection attempt. If daemonization happens before signals have been set up, signals may not be processed at all.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1523
841d61be198f Remove version number from copyright headers
Matthew Wild <mwild1@gmail.com>
parents: 1202
diff changeset
     1
-- Prosody IM
615
4ae3e81513f3 0.1 -> 0.2
Matthew Wild <mwild1@gmail.com>
parents: 519
diff changeset
     2
-- This file is included with Prosody IM. It has modifications,
4ae3e81513f3 0.1 -> 0.2
Matthew Wild <mwild1@gmail.com>
parents: 519
diff changeset
     3
-- which are hereby placed in the public domain.
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     4
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     5
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     6
-- todo: quick (default) header generation
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     7
-- todo: nxdomain, error handling
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     8
-- todo: cache results of encodeName
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     9
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    10
12608
bd9e006a7a74 various: Update IETF RFC URLs for tools.ietf.org transition
Kim Alvefur <zash@zash.se>
parents: 12391
diff changeset
    11
-- reference: https://www.rfc-editor.org/rfc/rfc1035.html
bd9e006a7a74 various: Update IETF RFC URLs for tools.ietf.org transition
Kim Alvefur <zash@zash.se>
parents: 12391
diff changeset
    12
-- reference: https://www.rfc-editor.org/rfc/rfc1876.html (LOC)
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    13
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    14
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
    15
local socket = require "socket";
12978
ba409c67353b net: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12608
diff changeset
    16
local have_timer, timer = pcall(require, "prosody.util.timer");
ba409c67353b net: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12608
diff changeset
    17
local new_ip = require "prosody.util.ip".new_ip;
ba409c67353b net: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12608
diff changeset
    18
local have_util_net, util_net = pcall(require, "prosody.util.net");
3324
070c8ba71b76 net.dns: Handle our own timeouts, including falling onto other servers in resolv.conf if necessary
Matthew Wild <mwild1@gmail.com>
parents: 3057
diff changeset
    19
12978
ba409c67353b net: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12608
diff changeset
    20
local log = require "prosody.util.logger".init("dns");
10959
7bcfac630b65 net.dns: Add some debug logging
Matthew Wild <mwild1@gmail.com>
parents: 10668
diff changeset
    21
12978
ba409c67353b net: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12608
diff changeset
    22
local _, windows = pcall(require, "prosody.util.windows");
2067
0ed6369605bf net.dns: Updated to use util.windows.get_nameservers for enumerating nameservers on Windows.
Waqas Hussain <waqas20@gmail.com>
parents: 2027
diff changeset
    23
local is_windows = (_ and windows) or os.getenv("WINDIR");
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    24
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
    25
local coroutine, io, math, string, table =
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
    26
      coroutine, io, math, string, table;
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    27
7530
936b78e9f399 net.dns: remove unused variable unpack [luacheck]
Anton Shestakov <av6@dwimlabs.net>
parents: 7503
diff changeset
    28
local ipairs, next, pairs, print, setmetatable, tostring, assert, error, select, type =
936b78e9f399 net.dns: remove unused variable unpack [luacheck]
Anton Shestakov <av6@dwimlabs.net>
parents: 7503
diff changeset
    29
      ipairs, next, pairs, print, setmetatable, tostring, assert, error, select, type;
3719
0f87632b87e9 net.dns: Removed dependency on util.ztact by moving ztact.get/set in.
Waqas Hussain <waqas20@gmail.com>
parents: 3544
diff changeset
    30
0f87632b87e9 net.dns: Removed dependency on util.ztact by moving ztact.get/set in.
Waqas Hussain <waqas20@gmail.com>
parents: 3544
diff changeset
    31
local ztact = { -- public domain 20080404 lua@ztact.com
0f87632b87e9 net.dns: Removed dependency on util.ztact by moving ztact.get/set in.
Waqas Hussain <waqas20@gmail.com>
parents: 3544
diff changeset
    32
	get = function(parent, ...)
0f87632b87e9 net.dns: Removed dependency on util.ztact by moving ztact.get/set in.
Waqas Hussain <waqas20@gmail.com>
parents: 3544
diff changeset
    33
		local len = select('#', ...);
0f87632b87e9 net.dns: Removed dependency on util.ztact by moving ztact.get/set in.
Waqas Hussain <waqas20@gmail.com>
parents: 3544
diff changeset
    34
		for i=1,len do
0f87632b87e9 net.dns: Removed dependency on util.ztact by moving ztact.get/set in.
Waqas Hussain <waqas20@gmail.com>
parents: 3544
diff changeset
    35
			parent = parent[select(i, ...)];
0f87632b87e9 net.dns: Removed dependency on util.ztact by moving ztact.get/set in.
Waqas Hussain <waqas20@gmail.com>
parents: 3544
diff changeset
    36
			if parent == nil then break; end
0f87632b87e9 net.dns: Removed dependency on util.ztact by moving ztact.get/set in.
Waqas Hussain <waqas20@gmail.com>
parents: 3544
diff changeset
    37
		end
0f87632b87e9 net.dns: Removed dependency on util.ztact by moving ztact.get/set in.
Waqas Hussain <waqas20@gmail.com>
parents: 3544
diff changeset
    38
		return parent;
0f87632b87e9 net.dns: Removed dependency on util.ztact by moving ztact.get/set in.
Waqas Hussain <waqas20@gmail.com>
parents: 3544
diff changeset
    39
	end;
0f87632b87e9 net.dns: Removed dependency on util.ztact by moving ztact.get/set in.
Waqas Hussain <waqas20@gmail.com>
parents: 3544
diff changeset
    40
	set = function(parent, ...)
0f87632b87e9 net.dns: Removed dependency on util.ztact by moving ztact.get/set in.
Waqas Hussain <waqas20@gmail.com>
parents: 3544
diff changeset
    41
		local len = select('#', ...);
0f87632b87e9 net.dns: Removed dependency on util.ztact by moving ztact.get/set in.
Waqas Hussain <waqas20@gmail.com>
parents: 3544
diff changeset
    42
		local key, value = select(len-1, ...);
0f87632b87e9 net.dns: Removed dependency on util.ztact by moving ztact.get/set in.
Waqas Hussain <waqas20@gmail.com>
parents: 3544
diff changeset
    43
		local cutpoint, cutkey;
0f87632b87e9 net.dns: Removed dependency on util.ztact by moving ztact.get/set in.
Waqas Hussain <waqas20@gmail.com>
parents: 3544
diff changeset
    44
0f87632b87e9 net.dns: Removed dependency on util.ztact by moving ztact.get/set in.
Waqas Hussain <waqas20@gmail.com>
parents: 3544
diff changeset
    45
		for i=1,len-2 do
0f87632b87e9 net.dns: Removed dependency on util.ztact by moving ztact.get/set in.
Waqas Hussain <waqas20@gmail.com>
parents: 3544
diff changeset
    46
			local key = select (i, ...)
0f87632b87e9 net.dns: Removed dependency on util.ztact by moving ztact.get/set in.
Waqas Hussain <waqas20@gmail.com>
parents: 3544
diff changeset
    47
			local child = parent[key]
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    48
3719
0f87632b87e9 net.dns: Removed dependency on util.ztact by moving ztact.get/set in.
Waqas Hussain <waqas20@gmail.com>
parents: 3544
diff changeset
    49
			if value == nil then
0f87632b87e9 net.dns: Removed dependency on util.ztact by moving ztact.get/set in.
Waqas Hussain <waqas20@gmail.com>
parents: 3544
diff changeset
    50
				if child == nil then
0f87632b87e9 net.dns: Removed dependency on util.ztact by moving ztact.get/set in.
Waqas Hussain <waqas20@gmail.com>
parents: 3544
diff changeset
    51
					return;
0f87632b87e9 net.dns: Removed dependency on util.ztact by moving ztact.get/set in.
Waqas Hussain <waqas20@gmail.com>
parents: 3544
diff changeset
    52
				elseif next(child, next(child)) then
0f87632b87e9 net.dns: Removed dependency on util.ztact by moving ztact.get/set in.
Waqas Hussain <waqas20@gmail.com>
parents: 3544
diff changeset
    53
					cutpoint = nil; cutkey = nil;
0f87632b87e9 net.dns: Removed dependency on util.ztact by moving ztact.get/set in.
Waqas Hussain <waqas20@gmail.com>
parents: 3544
diff changeset
    54
				elseif cutpoint == nil then
0f87632b87e9 net.dns: Removed dependency on util.ztact by moving ztact.get/set in.
Waqas Hussain <waqas20@gmail.com>
parents: 3544
diff changeset
    55
					cutpoint = parent; cutkey = key;
0f87632b87e9 net.dns: Removed dependency on util.ztact by moving ztact.get/set in.
Waqas Hussain <waqas20@gmail.com>
parents: 3544
diff changeset
    56
				end
0f87632b87e9 net.dns: Removed dependency on util.ztact by moving ztact.get/set in.
Waqas Hussain <waqas20@gmail.com>
parents: 3544
diff changeset
    57
			elseif child == nil then
0f87632b87e9 net.dns: Removed dependency on util.ztact by moving ztact.get/set in.
Waqas Hussain <waqas20@gmail.com>
parents: 3544
diff changeset
    58
				child = {};
0f87632b87e9 net.dns: Removed dependency on util.ztact by moving ztact.get/set in.
Waqas Hussain <waqas20@gmail.com>
parents: 3544
diff changeset
    59
				parent[key] = child;
0f87632b87e9 net.dns: Removed dependency on util.ztact by moving ztact.get/set in.
Waqas Hussain <waqas20@gmail.com>
parents: 3544
diff changeset
    60
			end
0f87632b87e9 net.dns: Removed dependency on util.ztact by moving ztact.get/set in.
Waqas Hussain <waqas20@gmail.com>
parents: 3544
diff changeset
    61
			parent = child
0f87632b87e9 net.dns: Removed dependency on util.ztact by moving ztact.get/set in.
Waqas Hussain <waqas20@gmail.com>
parents: 3544
diff changeset
    62
		end
0f87632b87e9 net.dns: Removed dependency on util.ztact by moving ztact.get/set in.
Waqas Hussain <waqas20@gmail.com>
parents: 3544
diff changeset
    63
0f87632b87e9 net.dns: Removed dependency on util.ztact by moving ztact.get/set in.
Waqas Hussain <waqas20@gmail.com>
parents: 3544
diff changeset
    64
		if value == nil and cutpoint then
0f87632b87e9 net.dns: Removed dependency on util.ztact by moving ztact.get/set in.
Waqas Hussain <waqas20@gmail.com>
parents: 3544
diff changeset
    65
			cutpoint[cutkey] = nil;
0f87632b87e9 net.dns: Removed dependency on util.ztact by moving ztact.get/set in.
Waqas Hussain <waqas20@gmail.com>
parents: 3544
diff changeset
    66
		else
0f87632b87e9 net.dns: Removed dependency on util.ztact by moving ztact.get/set in.
Waqas Hussain <waqas20@gmail.com>
parents: 3544
diff changeset
    67
			parent[key] = value;
0f87632b87e9 net.dns: Removed dependency on util.ztact by moving ztact.get/set in.
Waqas Hussain <waqas20@gmail.com>
parents: 3544
diff changeset
    68
			return value;
0f87632b87e9 net.dns: Removed dependency on util.ztact by moving ztact.get/set in.
Waqas Hussain <waqas20@gmail.com>
parents: 3544
diff changeset
    69
		end
0f87632b87e9 net.dns: Removed dependency on util.ztact by moving ztact.get/set in.
Waqas Hussain <waqas20@gmail.com>
parents: 3544
diff changeset
    70
	end;
0f87632b87e9 net.dns: Removed dependency on util.ztact by moving ztact.get/set in.
Waqas Hussain <waqas20@gmail.com>
parents: 3544
diff changeset
    71
};
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
    72
local get, set = ztact.get, ztact.set;
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    73
10963
877ceb4feb6d net.dns: Reduce default timeout to 5s
Matthew Wild <mwild1@gmail.com>
parents: 10962
diff changeset
    74
local default_timeout = 5;
10961
8902cecbdd39 net.dns: Add jitter to spread queries and reduce failures due to congestion
Matthew Wild <mwild1@gmail.com>
parents: 10960
diff changeset
    75
local default_jitter = 1;
8902cecbdd39 net.dns: Add jitter to spread queries and reduce failures due to congestion
Matthew Wild <mwild1@gmail.com>
parents: 10960
diff changeset
    76
local default_retry_jitter = 2;
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    77
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    78
-------------------------------------------------- module dns
6783
647adfd8f738 net.*: Remove use of module() function
Kim Alvefur <zash@zash.se>
parents: 6756
diff changeset
    79
local _ENV = nil;
8558
4f0f5b49bb03 vairious: Add annotation when an empty environment is set [luacheck]
Kim Alvefur <zash@zash.se>
parents: 8443
diff changeset
    80
-- luacheck: std none
6783
647adfd8f738 net.*: Remove use of module() function
Kim Alvefur <zash@zash.se>
parents: 6756
diff changeset
    81
local dns = {};
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    82
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    83
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    84
-- dns type & class codes ------------------------------ dns type & class codes
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    85
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    86
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    87
local append = table.insert
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    88
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    89
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
    90
local function highbyte(i)    -- - - - - - - - - - - - - - - - - - -  highbyte
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
    91
	return (i-(i%0x100))/0x100;
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
    92
end
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    93
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    94
8911
144666d0ad2f net.dns: Lazily generate unknown RR type names
Kim Alvefur <zash@zash.se>
parents: 8910
diff changeset
    95
local function augment (t, prefix)  -- - - - - - - - - - - - - - - - -  augment
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
    96
	local a = {};
8910
b7b960d30eef Backed out changeset eae606b9266c: Used a lot of memory
Kim Alvefur <zash@zash.se>
parents: 8904
diff changeset
    97
	for i,s in pairs(t) do
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
    98
		a[i] = s;
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
    99
		a[s] = s;
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   100
		a[string.lower(s)] = s;
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   101
	end
8911
144666d0ad2f net.dns: Lazily generate unknown RR type names
Kim Alvefur <zash@zash.se>
parents: 8910
diff changeset
   102
	setmetatable(a, {
144666d0ad2f net.dns: Lazily generate unknown RR type names
Kim Alvefur <zash@zash.se>
parents: 8910
diff changeset
   103
		__index = function (_, i)
144666d0ad2f net.dns: Lazily generate unknown RR type names
Kim Alvefur <zash@zash.se>
parents: 8910
diff changeset
   104
			if type(i) == "number" then
144666d0ad2f net.dns: Lazily generate unknown RR type names
Kim Alvefur <zash@zash.se>
parents: 8910
diff changeset
   105
				return ("%s%d"):format(prefix, i);
144666d0ad2f net.dns: Lazily generate unknown RR type names
Kim Alvefur <zash@zash.se>
parents: 8910
diff changeset
   106
			elseif type(i) == "string" then
144666d0ad2f net.dns: Lazily generate unknown RR type names
Kim Alvefur <zash@zash.se>
parents: 8910
diff changeset
   107
				return i:upper();
144666d0ad2f net.dns: Lazily generate unknown RR type names
Kim Alvefur <zash@zash.se>
parents: 8910
diff changeset
   108
			end
144666d0ad2f net.dns: Lazily generate unknown RR type names
Kim Alvefur <zash@zash.se>
parents: 8910
diff changeset
   109
		end;
144666d0ad2f net.dns: Lazily generate unknown RR type names
Kim Alvefur <zash@zash.se>
parents: 8910
diff changeset
   110
	})
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   111
	return a;
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   112
end
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   113
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   114
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   115
local function encode (t)    -- - - - - - - - - - - - - - - - - - - - -  encode
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   116
	local code = {};
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   117
	for i,s in pairs(t) do
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   118
		local word = string.char(highbyte(i), i%0x100);
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   119
		code[i] = word;
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   120
		code[s] = word;
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   121
		code[string.lower(s)] = word;
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   122
	end
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   123
	return code;
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   124
end
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   125
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   126
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   127
dns.types = {
8906
c5d5dfaa8d38 net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents: 8905
diff changeset
   128
	[1] = "A", -- a host address,[RFC1035],,
c5d5dfaa8d38 net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents: 8905
diff changeset
   129
	[2] = "NS", -- an authoritative name server,[RFC1035],,
c5d5dfaa8d38 net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents: 8905
diff changeset
   130
	[3] = "MD", -- a mail destination (OBSOLETE - use MX),[RFC1035],,
c5d5dfaa8d38 net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents: 8905
diff changeset
   131
	[4] = "MF", -- a mail forwarder (OBSOLETE - use MX),[RFC1035],,
c5d5dfaa8d38 net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents: 8905
diff changeset
   132
	[5] = "CNAME", -- the canonical name for an alias,[RFC1035],,
c5d5dfaa8d38 net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents: 8905
diff changeset
   133
	[6] = "SOA", -- marks the start of a zone of authority,[RFC1035],,
c5d5dfaa8d38 net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents: 8905
diff changeset
   134
	[7] = "MB", -- a mailbox domain name (EXPERIMENTAL),[RFC1035],,
c5d5dfaa8d38 net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents: 8905
diff changeset
   135
	[8] = "MG", -- a mail group member (EXPERIMENTAL),[RFC1035],,
c5d5dfaa8d38 net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents: 8905
diff changeset
   136
	[9] = "MR", -- a mail rename domain name (EXPERIMENTAL),[RFC1035],,
c5d5dfaa8d38 net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents: 8905
diff changeset
   137
	[10] = "NULL", -- a null RR (EXPERIMENTAL),[RFC1035],,
c5d5dfaa8d38 net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents: 8905
diff changeset
   138
	[11] = "WKS", -- a well known service description,[RFC1035],,
c5d5dfaa8d38 net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents: 8905
diff changeset
   139
	[12] = "PTR", -- a domain name pointer,[RFC1035],,
c5d5dfaa8d38 net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents: 8905
diff changeset
   140
	[13] = "HINFO", -- host information,[RFC1035],,
c5d5dfaa8d38 net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents: 8905
diff changeset
   141
	[14] = "MINFO", -- mailbox or mail list information,[RFC1035],,
c5d5dfaa8d38 net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents: 8905
diff changeset
   142
	[15] = "MX", -- mail exchange,[RFC1035],,
c5d5dfaa8d38 net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents: 8905
diff changeset
   143
	[16] = "TXT", -- text strings,[RFC1035],,
c5d5dfaa8d38 net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents: 8905
diff changeset
   144
	[17] = "RP", -- for Responsible Person,[RFC1183],,
c5d5dfaa8d38 net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents: 8905
diff changeset
   145
	[18] = "AFSDB", -- for AFS Data Base location,[RFC1183][RFC5864],,
c5d5dfaa8d38 net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents: 8905
diff changeset
   146
	[19] = "X25", -- for X.25 PSDN address,[RFC1183],,
c5d5dfaa8d38 net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents: 8905
diff changeset
   147
	[20] = "ISDN", -- for ISDN address,[RFC1183],,
c5d5dfaa8d38 net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents: 8905
diff changeset
   148
	[21] = "RT", -- for Route Through,[RFC1183],,
c5d5dfaa8d38 net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents: 8905
diff changeset
   149
	[22] = "NSAP", -- "for NSAP address, NSAP style A record",[RFC1706],,
c5d5dfaa8d38 net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents: 8905
diff changeset
   150
	[23] = "NSAP-PTR", -- "for domain name pointer, NSAP style",[RFC1348][RFC1637][RFC1706],,
c5d5dfaa8d38 net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents: 8905
diff changeset
   151
	[24] = "SIG", -- for security signature,[RFC4034][RFC3755][RFC2535][RFC2536][RFC2537][RFC2931][RFC3110][RFC3008],,
c5d5dfaa8d38 net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents: 8905
diff changeset
   152
	[25] = "KEY", -- for security key,[RFC4034][RFC3755][RFC2535][RFC2536][RFC2537][RFC2539][RFC3008][RFC3110],,
c5d5dfaa8d38 net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents: 8905
diff changeset
   153
	[26] = "PX", -- X.400 mail mapping information,[RFC2163],,
c5d5dfaa8d38 net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents: 8905
diff changeset
   154
	[27] = "GPOS", -- Geographical Position,[RFC1712],,
c5d5dfaa8d38 net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents: 8905
diff changeset
   155
	[28] = "AAAA", -- IP6 Address,[RFC3596],,
c5d5dfaa8d38 net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents: 8905
diff changeset
   156
	[29] = "LOC", -- Location Information,[RFC1876],,
c5d5dfaa8d38 net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents: 8905
diff changeset
   157
	[30] = "NXT", -- Next Domain (OBSOLETE),[RFC3755][RFC2535],,
c5d5dfaa8d38 net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents: 8905
diff changeset
   158
	[31] = "EID", -- Endpoint Identifier,[Michael_Patton][http://ana-3.lcs.mit.edu/~jnc/nimrod/dns.txt],,1995-06
c5d5dfaa8d38 net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents: 8905
diff changeset
   159
	[32] = "NIMLOC", -- Nimrod Locator,[1][Michael_Patton][http://ana-3.lcs.mit.edu/~jnc/nimrod/dns.txt],,1995-06
c5d5dfaa8d38 net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents: 8905
diff changeset
   160
	[33] = "SRV", -- Server Selection,[1][RFC2782],,
c5d5dfaa8d38 net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents: 8905
diff changeset
   161
	[34] = "ATMA", -- ATM Address,"[ ATM Forum Technical Committee, ""ATM Name System, V2.0"", Doc ID: AF-DANS-0152.000, July 2000. Available from and held in escrow by IANA.]",,
c5d5dfaa8d38 net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents: 8905
diff changeset
   162
	[35] = "NAPTR", -- Naming Authority Pointer,[RFC2915][RFC2168][RFC3403],,
c5d5dfaa8d38 net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents: 8905
diff changeset
   163
	[36] = "KX", -- Key Exchanger,[RFC2230],,
c5d5dfaa8d38 net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents: 8905
diff changeset
   164
	[37] = "CERT", -- CERT,[RFC4398],,
c5d5dfaa8d38 net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents: 8905
diff changeset
   165
	[38] = "A6", -- A6 (OBSOLETE - use AAAA),[RFC3226][RFC2874][RFC6563],,
c5d5dfaa8d38 net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents: 8905
diff changeset
   166
	[39] = "DNAME", -- DNAME,[RFC6672],,
c5d5dfaa8d38 net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents: 8905
diff changeset
   167
	[40] = "SINK", -- SINK,[Donald_E_Eastlake][http://tools.ietf.org/html/draft-eastlake-kitchen-sink],,1997-11
c5d5dfaa8d38 net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents: 8905
diff changeset
   168
	[41] = "OPT", -- OPT,[RFC6891][RFC3225],,
c5d5dfaa8d38 net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents: 8905
diff changeset
   169
	[42] = "APL", -- APL,[RFC3123],,
c5d5dfaa8d38 net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents: 8905
diff changeset
   170
	[43] = "DS", -- Delegation Signer,[RFC4034][RFC3658],,
c5d5dfaa8d38 net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents: 8905
diff changeset
   171
	[44] = "SSHFP", -- SSH Key Fingerprint,[RFC4255],,
c5d5dfaa8d38 net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents: 8905
diff changeset
   172
	[45] = "IPSECKEY", -- IPSECKEY,[RFC4025],,
c5d5dfaa8d38 net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents: 8905
diff changeset
   173
	[46] = "RRSIG", -- RRSIG,[RFC4034][RFC3755],,
c5d5dfaa8d38 net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents: 8905
diff changeset
   174
	[47] = "NSEC", -- NSEC,[RFC4034][RFC3755],,
c5d5dfaa8d38 net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents: 8905
diff changeset
   175
	[48] = "DNSKEY", -- DNSKEY,[RFC4034][RFC3755],,
c5d5dfaa8d38 net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents: 8905
diff changeset
   176
	[49] = "DHCID", -- DHCID,[RFC4701],,
c5d5dfaa8d38 net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents: 8905
diff changeset
   177
	[50] = "NSEC3", -- NSEC3,[RFC5155],,
c5d5dfaa8d38 net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents: 8905
diff changeset
   178
	[51] = "NSEC3PARAM", -- NSEC3PARAM,[RFC5155],,
c5d5dfaa8d38 net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents: 8905
diff changeset
   179
	[52] = "TLSA", -- TLSA,[RFC6698],,
c5d5dfaa8d38 net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents: 8905
diff changeset
   180
	[53] = "SMIMEA", -- S/MIME cert association,[RFC8162],SMIMEA/smimea-completed-template,2015-12-01
c5d5dfaa8d38 net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents: 8905
diff changeset
   181
	-- [54] = "Unassigned", -- ,,,
c5d5dfaa8d38 net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents: 8905
diff changeset
   182
	[55] = "HIP", -- Host Identity Protocol,[RFC8005],,
c5d5dfaa8d38 net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents: 8905
diff changeset
   183
	[56] = "NINFO", -- NINFO,[Jim_Reid],NINFO/ninfo-completed-template,2008-01-21
c5d5dfaa8d38 net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents: 8905
diff changeset
   184
	[57] = "RKEY", -- RKEY,[Jim_Reid],RKEY/rkey-completed-template,2008-01-21
c5d5dfaa8d38 net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents: 8905
diff changeset
   185
	[58] = "TALINK", -- Trust Anchor LINK,[Wouter_Wijngaards],TALINK/talink-completed-template,2010-02-17
c5d5dfaa8d38 net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents: 8905
diff changeset
   186
	[59] = "CDS", -- Child DS,[RFC7344],CDS/cds-completed-template,2011-06-06
c5d5dfaa8d38 net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents: 8905
diff changeset
   187
	[60] = "CDNSKEY", -- DNSKEY(s) the Child wants reflected in DS,[RFC7344],,2014-06-16
c5d5dfaa8d38 net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents: 8905
diff changeset
   188
	[61] = "OPENPGPKEY", -- OpenPGP Key,[RFC7929],OPENPGPKEY/openpgpkey-completed-template,2014-08-12
c5d5dfaa8d38 net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents: 8905
diff changeset
   189
	[62] = "CSYNC", -- Child-To-Parent Synchronization,[RFC7477],,2015-01-27
c5d5dfaa8d38 net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents: 8905
diff changeset
   190
	-- [63 .. 98] = "Unassigned", -- ,,,
c5d5dfaa8d38 net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents: 8905
diff changeset
   191
	[99] = "SPF", -- ,[RFC7208],,
c5d5dfaa8d38 net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents: 8905
diff changeset
   192
	[100] = "UINFO", -- ,[IANA-Reserved],,
c5d5dfaa8d38 net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents: 8905
diff changeset
   193
	[101] = "UID", -- ,[IANA-Reserved],,
c5d5dfaa8d38 net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents: 8905
diff changeset
   194
	[102] = "GID", -- ,[IANA-Reserved],,
c5d5dfaa8d38 net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents: 8905
diff changeset
   195
	[103] = "UNSPEC", -- ,[IANA-Reserved],,
c5d5dfaa8d38 net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents: 8905
diff changeset
   196
	[104] = "NID", -- ,[RFC6742],ILNP/nid-completed-template,
c5d5dfaa8d38 net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents: 8905
diff changeset
   197
	[105] = "L32", -- ,[RFC6742],ILNP/l32-completed-template,
c5d5dfaa8d38 net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents: 8905
diff changeset
   198
	[106] = "L64", -- ,[RFC6742],ILNP/l64-completed-template,
c5d5dfaa8d38 net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents: 8905
diff changeset
   199
	[107] = "LP", -- ,[RFC6742],ILNP/lp-completed-template,
c5d5dfaa8d38 net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents: 8905
diff changeset
   200
	[108] = "EUI48", -- an EUI-48 address,[RFC7043],EUI48/eui48-completed-template,2013-03-27
c5d5dfaa8d38 net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents: 8905
diff changeset
   201
	[109] = "EUI64", -- an EUI-64 address,[RFC7043],EUI64/eui64-completed-template,2013-03-27
c5d5dfaa8d38 net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents: 8905
diff changeset
   202
	-- [110 .. 248] = "Unassigned", -- ,,,
c5d5dfaa8d38 net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents: 8905
diff changeset
   203
	[249] = "TKEY", -- Transaction Key,[RFC2930],,
c5d5dfaa8d38 net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents: 8905
diff changeset
   204
	[250] = "TSIG", -- Transaction Signature,[RFC2845],,
c5d5dfaa8d38 net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents: 8905
diff changeset
   205
	[251] = "IXFR", -- incremental transfer,[RFC1995],,
c5d5dfaa8d38 net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents: 8905
diff changeset
   206
	[252] = "AXFR", -- transfer of an entire zone,[RFC1035][RFC5936],,
c5d5dfaa8d38 net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents: 8905
diff changeset
   207
	[253] = "MAILB", -- "mailbox-related RRs (MB, MG or MR)",[RFC1035],,
c5d5dfaa8d38 net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents: 8905
diff changeset
   208
	[254] = "MAILA", -- mail agent RRs (OBSOLETE - see MX),[RFC1035],,
c5d5dfaa8d38 net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents: 8905
diff changeset
   209
	[255] = "*", -- A request for all records the server/cache has available,[RFC1035][RFC6895],,
c5d5dfaa8d38 net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents: 8905
diff changeset
   210
	[256] = "URI", -- URI,[RFC7553],URI/uri-completed-template,2011-02-22
c5d5dfaa8d38 net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents: 8905
diff changeset
   211
	[257] = "CAA", -- Certification Authority Restriction,[RFC6844],CAA/caa-completed-template,2011-04-07
c5d5dfaa8d38 net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents: 8905
diff changeset
   212
	[258] = "AVC", -- Application Visibility and Control,[Wolfgang_Riedel],AVC/avc-completed-template,2016-02-26
c5d5dfaa8d38 net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents: 8905
diff changeset
   213
	[259] = "DOA", -- Digital Object Architecture,[draft-durand-doa-over-dns],DOA/doa-completed-template,2017-08-30
c5d5dfaa8d38 net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents: 8905
diff changeset
   214
	-- [260 .. 32767] = "Unassigned", -- ,,,
c5d5dfaa8d38 net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents: 8905
diff changeset
   215
	[32768] = "TA", -- DNSSEC Trust Authorities,"[Sam_Weiler][http://cameo.library.cmu.edu/][ Deploying DNSSEC Without a Signed Root.  Technical Report 1999-19, Information Networking Institute, Carnegie Mellon University, April 2004.]",,2005-12-13
c5d5dfaa8d38 net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents: 8905
diff changeset
   216
	[32769] = "DLV", -- DNSSEC Lookaside Validation,[RFC4431],,
c5d5dfaa8d38 net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents: 8905
diff changeset
   217
	-- [32770 .. 65279] = "Unassigned", -- ,,,
c5d5dfaa8d38 net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents: 8905
diff changeset
   218
	-- [65280 .. 65534] = "Private use", -- ,,,
c5d5dfaa8d38 net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents: 8905
diff changeset
   219
	-- [65535] = "Reserved", -- ,,,
c5d5dfaa8d38 net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents: 8905
diff changeset
   220
}
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   221
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   222
dns.classes = { 'IN', 'CS', 'CH', 'HS', [255] = '*' };
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   223
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   224
8911
144666d0ad2f net.dns: Lazily generate unknown RR type names
Kim Alvefur <zash@zash.se>
parents: 8910
diff changeset
   225
dns.type      = augment (dns.types, "TYPE");
144666d0ad2f net.dns: Lazily generate unknown RR type names
Kim Alvefur <zash@zash.se>
parents: 8910
diff changeset
   226
dns.class     = augment (dns.classes, "CLASS");
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   227
dns.typecode  = encode  (dns.types);
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   228
dns.classcode = encode  (dns.classes);
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   229
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   230
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   231
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   232
local function standardize(qname, qtype, qclass)    -- - - - - - - standardize
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   233
	if string.byte(qname, -1) ~= 0x2E then qname = qname..'.';  end
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   234
	qname = string.lower(qname);
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   235
	return qname, dns.type[qtype or 'A'], dns.class[qclass or 'IN'];
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   236
end
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   237
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   238
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   239
local function prune(rrs, time, soft)    -- - - - - - - - - - - - - - -  prune
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   240
	time = time or socket.gettime();
6466
460584257cc9 net.dns: Avoid duplicate cache entries
Florian Zeitz <florob@babelmonkeys.de>
parents: 6310
diff changeset
   241
	for i,rr in ipairs(rrs) do
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   242
		if rr.tod then
8154
2c65f8be38aa net.dns: Simplify expiry calculation (fixes #919)
Kim Alvefur <zash@zash.se>
parents: 7096
diff changeset
   243
			if rr.tod < time then
6466
460584257cc9 net.dns: Avoid duplicate cache entries
Florian Zeitz <florob@babelmonkeys.de>
parents: 6310
diff changeset
   244
				rrs[rr[rr.type:lower()]] = nil;
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   245
				table.remove(rrs, i);
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   246
				return prune(rrs, time, soft); -- Re-iterate
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   247
			end
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   248
		elseif soft == 'soft' then    -- What is this?  I forget!
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   249
			assert(rr.ttl == 0);
6466
460584257cc9 net.dns: Avoid duplicate cache entries
Florian Zeitz <florob@babelmonkeys.de>
parents: 6310
diff changeset
   250
			rrs[rr[rr.type:lower()]] = nil;
460584257cc9 net.dns: Avoid duplicate cache entries
Florian Zeitz <florob@babelmonkeys.de>
parents: 6310
diff changeset
   251
			table.remove(rrs, i);
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   252
		end
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   253
	end
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   254
end
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   255
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   256
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   257
-- metatables & co. ------------------------------------------ metatables & co.
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   258
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   259
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   260
local resolver = {};
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   261
resolver.__index = resolver;
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   262
3327
b447682f2a8d net.dns: Make timeout configurable (default 15s)
Matthew Wild <mwild1@gmail.com>
parents: 3326
diff changeset
   263
resolver.timeout = default_timeout;
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   264
3747
7d5b135bf268 net.dns: Clean up tostring() of returned records, as a result PTR records can now be tostring()'d
Matthew Wild <mwild1@gmail.com>
parents: 3746
diff changeset
   265
local function default_rr_tostring(rr)
7d5b135bf268 net.dns: Clean up tostring() of returned records, as a result PTR records can now be tostring()'d
Matthew Wild <mwild1@gmail.com>
parents: 3746
diff changeset
   266
	local rr_val = rr.type and rr[rr.type:lower()];
7d5b135bf268 net.dns: Clean up tostring() of returned records, as a result PTR records can now be tostring()'d
Matthew Wild <mwild1@gmail.com>
parents: 3746
diff changeset
   267
	if type(rr_val) ~= "string" then
7d5b135bf268 net.dns: Clean up tostring() of returned records, as a result PTR records can now be tostring()'d
Matthew Wild <mwild1@gmail.com>
parents: 3746
diff changeset
   268
		return "<UNKNOWN RDATA TYPE>";
7d5b135bf268 net.dns: Clean up tostring() of returned records, as a result PTR records can now be tostring()'d
Matthew Wild <mwild1@gmail.com>
parents: 3746
diff changeset
   269
	end
7d5b135bf268 net.dns: Clean up tostring() of returned records, as a result PTR records can now be tostring()'d
Matthew Wild <mwild1@gmail.com>
parents: 3746
diff changeset
   270
	return rr_val;
7d5b135bf268 net.dns: Clean up tostring() of returned records, as a result PTR records can now be tostring()'d
Matthew Wild <mwild1@gmail.com>
parents: 3746
diff changeset
   271
end
7d5b135bf268 net.dns: Clean up tostring() of returned records, as a result PTR records can now be tostring()'d
Matthew Wild <mwild1@gmail.com>
parents: 3746
diff changeset
   272
7d5b135bf268 net.dns: Clean up tostring() of returned records, as a result PTR records can now be tostring()'d
Matthew Wild <mwild1@gmail.com>
parents: 3746
diff changeset
   273
local special_tostrings = {
7d5b135bf268 net.dns: Clean up tostring() of returned records, as a result PTR records can now be tostring()'d
Matthew Wild <mwild1@gmail.com>
parents: 3746
diff changeset
   274
	LOC = resolver.LOC_tostring;
4125
5cf13260edec net.dns: Fix tostring() for SRV records
Matthew Wild <mwild1@gmail.com>
parents: 3955
diff changeset
   275
	MX  = function (rr)
5cf13260edec net.dns: Fix tostring() for SRV records
Matthew Wild <mwild1@gmail.com>
parents: 3955
diff changeset
   276
		return string.format('%2i %s', rr.pref, rr.mx);
5cf13260edec net.dns: Fix tostring() for SRV records
Matthew Wild <mwild1@gmail.com>
parents: 3955
diff changeset
   277
	end;
5cf13260edec net.dns: Fix tostring() for SRV records
Matthew Wild <mwild1@gmail.com>
parents: 3955
diff changeset
   278
	SRV = function (rr)
5cf13260edec net.dns: Fix tostring() for SRV records
Matthew Wild <mwild1@gmail.com>
parents: 3955
diff changeset
   279
		local s = rr.srv;
5cf13260edec net.dns: Fix tostring() for SRV records
Matthew Wild <mwild1@gmail.com>
parents: 3955
diff changeset
   280
		return string.format('%5d %5d %5d %s', s.priority, s.weight, s.port, s.target);
5cf13260edec net.dns: Fix tostring() for SRV records
Matthew Wild <mwild1@gmail.com>
parents: 3955
diff changeset
   281
	end;
3747
7d5b135bf268 net.dns: Clean up tostring() of returned records, as a result PTR records can now be tostring()'d
Matthew Wild <mwild1@gmail.com>
parents: 3746
diff changeset
   282
};
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   283
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   284
local rr_metatable = {};   -- - - - - - - - - - - - - - - - - - -  rr_metatable
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   285
function rr_metatable.__tostring(rr)
3747
7d5b135bf268 net.dns: Clean up tostring() of returned records, as a result PTR records can now be tostring()'d
Matthew Wild <mwild1@gmail.com>
parents: 3746
diff changeset
   286
	local rr_string = (special_tostrings[rr.type] or default_rr_tostring)(rr);
7d5b135bf268 net.dns: Clean up tostring() of returned records, as a result PTR records can now be tostring()'d
Matthew Wild <mwild1@gmail.com>
parents: 3746
diff changeset
   287
	return string.format('%2s %-5s %6i %-28s %s', rr.class, rr.type, rr.ttl, rr.name, rr_string);
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   288
end
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   289
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   290
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   291
local rrs_metatable = {};    -- - - - - - - - - - - - - - - - - -  rrs_metatable
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   292
function rrs_metatable.__tostring(rrs)
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   293
	local t = {};
7472
363e4a5e9b0a net.dns: remove unused one-letter loop variables [luacheck]
Anton Shestakov <av6@dwimlabs.net>
parents: 7325
diff changeset
   294
	for _, rr in ipairs(rrs) do
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   295
		append(t, tostring(rr)..'\n');
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   296
	end
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   297
	return table.concat(t);
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   298
end
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   299
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   300
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   301
local cache_metatable = {};    -- - - - - - - - - - - - - - - -  cache_metatable
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   302
function cache_metatable.__tostring(cache)
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   303
	local time = socket.gettime();
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   304
	local t = {};
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   305
	for class,types in pairs(cache) do
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   306
		for type,names in pairs(types) do
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   307
			for name,rrs in pairs(names) do
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   308
				prune(rrs, time);
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   309
				append(t, tostring(rrs));
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   310
			end
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   311
		end
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   312
	end
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   313
	return table.concat(t);
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   314
end
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   315
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   316
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   317
-- packet layer -------------------------------------------------- packet layer
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   318
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   319
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   320
function dns.random(...)    -- - - - - - - - - - - - - - - - - - -  dns.random
6648
4f934cf03bc9 net.dns: Make sure argument to math.randomseed does not overflow a 32 bit *signed* int (blame Lua). Closes #439
Kim Alvefur <zash@zash.se>
parents: 6634
diff changeset
   321
	math.randomseed(math.floor(10000*socket.gettime()) % 0x80000000);
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   322
	dns.random = math.random;
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   323
	return dns.random(...);
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   324
end
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   325
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   326
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   327
local function encodeHeader(o)    -- - - - - - - - - - - - - - -  encodeHeader
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   328
	o = o or {};
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   329
	o.id = o.id or dns.random(0, 0xffff); -- 16b	(random) id
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   330
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   331
	o.rd = o.rd or 1;		--  1b  1 recursion desired
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   332
	o.tc = o.tc or 0;		--  1b	1 truncated response
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   333
	o.aa = o.aa or 0;		--  1b	1 authoritative response
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   334
	o.opcode = o.opcode or 0;	--  4b	0 query
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   335
				--  1 inverse query
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   336
				--	2 server status request
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   337
				--	3-15 reserved
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   338
	o.qr = o.qr or 0;		--  1b	0 query, 1 response
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   339
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   340
	o.rcode = o.rcode or 0;	--  4b  0 no error
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   341
				--	1 format error
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   342
				--	2 server failure
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   343
				--	3 name error
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   344
				--	4 not implemented
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   345
				--	5 refused
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   346
				--	6-15 reserved
12391
05c250fa335a Spelling: Fix various spelling mistakes (thanks timeless)
Kim Alvefur <zash@zash.se>
parents: 10980
diff changeset
   347
	o.z = o.z  or 0;		--  3b  0 reserved
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   348
	o.ra = o.ra or 0;		--  1b  1 recursion available
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   349
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   350
	o.qdcount = o.qdcount or 1;	-- 16b	number of question RRs
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   351
	o.ancount = o.ancount or 0;	-- 16b	number of answers RRs
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   352
	o.nscount = o.nscount or 0;	-- 16b	number of nameservers RRs
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   353
	o.arcount = o.arcount or 0;	-- 16b  number of additional RRs
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   354
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   355
	-- string.char() rounds, so prevent roundup with -0.4999
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   356
	local header = string.char(
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   357
		highbyte(o.id), o.id %0x100,
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   358
		o.rd + 2*o.tc + 4*o.aa + 8*o.opcode + 128*o.qr,
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   359
		o.rcode + 16*o.z + 128*o.ra,
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   360
		highbyte(o.qdcount),  o.qdcount %0x100,
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   361
		highbyte(o.ancount),  o.ancount %0x100,
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   362
		highbyte(o.nscount),  o.nscount %0x100,
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   363
		highbyte(o.arcount),  o.arcount %0x100
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   364
	);
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   365
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   366
	return header, o.id;
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   367
end
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   368
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   369
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   370
local function encodeName(name)    -- - - - - - - - - - - - - - - - encodeName
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   371
	local t = {};
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   372
	for part in string.gmatch(name, '[^.]+') do
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   373
		append(t, string.char(string.len(part)));
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   374
		append(t, part);
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   375
	end
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   376
	append(t, string.char(0));
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   377
	return table.concat(t);
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   378
end
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   379
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   380
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   381
local function encodeQuestion(qname, qtype, qclass)    -- - - - encodeQuestion
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   382
	qname  = encodeName(qname);
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   383
	qtype  = dns.typecode[qtype or 'a'];
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   384
	qclass = dns.classcode[qclass or 'in'];
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   385
	return qname..qtype..qclass;
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   386
end
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   387
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   388
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   389
function resolver:byte(len)    -- - - - - - - - - - - - - - - - - - - - - byte
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   390
	len = len or 1;
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   391
	local offset = self.offset;
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   392
	local last = offset + len - 1;
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   393
	if last > #self.packet then
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   394
		error(string.format('out of bounds: %i>%i', last, #self.packet));
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   395
	end
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   396
	self.offset = offset + len;
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   397
	return string.byte(self.packet, offset, last);
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   398
end
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   399
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   400
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   401
function resolver:word()    -- - - - - - - - - - - - - - - - - - - - - -  word
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   402
	local b1, b2 = self:byte(2);
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   403
	return 0x100*b1 + b2;
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   404
end
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   405
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   406
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   407
function resolver:dword ()    -- - - - - - - - - - - - - - - - - - - - -  dword
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   408
	local b1, b2, b3, b4 = self:byte(4);
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   409
	--print('dword', b1, b2, b3, b4);
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   410
	return 0x1000000*b1 + 0x10000*b2 + 0x100*b3 + b4;
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   411
end
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   412
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   413
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   414
function resolver:sub(len)    -- - - - - - - - - - - - - - - - - - - - - - sub
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   415
	len = len or 1;
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   416
	local s = string.sub(self.packet, self.offset, self.offset + len - 1);
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   417
	self.offset = self.offset + len;
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   418
	return s;
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   419
end
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   420
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   421
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   422
function resolver:header(force)    -- - - - - - - - - - - - - - - - - - header
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   423
	local id = self:word();
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   424
	--print(string.format(':header  id  %x', id));
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   425
	if not self.active[id] and not force then return nil; end
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   426
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   427
	local h = { id = id };
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   428
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   429
	local b1, b2 = self:byte(2);
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   430
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   431
	h.rd      = b1 %2;
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   432
	h.tc      = b1 /2%2;
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   433
	h.aa      = b1 /4%2;
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   434
	h.opcode  = b1 /8%16;
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   435
	h.qr      = b1 /128;
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   436
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   437
	h.rcode   = b2 %16;
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   438
	h.z       = b2 /16%8;
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   439
	h.ra      = b2 /128;
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   440
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   441
	h.qdcount = self:word();
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   442
	h.ancount = self:word();
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   443
	h.nscount = self:word();
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   444
	h.arcount = self:word();
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   445
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   446
	for k,v in pairs(h) do h[k] = v-v%1; end
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   447
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   448
	return h;
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   449
end
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   450
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   451
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   452
function resolver:name()    -- - - - - - - - - - - - - - - - - - - - - -  name
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   453
	local remember, pointers = nil, 0;
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   454
	local len = self:byte();
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   455
	local n = {};
4425
c25dee24623f s2smanager, net.dns: Fix handling for NXNAME and SRV target of "."
Florian Zeitz <florob@babelmonkeys.de>
parents: 4400
diff changeset
   456
	if len == 0 then return "." end -- Root label
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   457
	while len > 0 do
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   458
		if len >= 0xc0 then    -- name is "compressed"
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   459
			pointers = pointers + 1;
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   460
			if pointers >= 20 then error('dns error: 20 pointers'); end;
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   461
			local offset = ((len-0xc0)*0x100) + self:byte();
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   462
			remember = remember or self.offset;
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   463
			self.offset = offset + 1;    -- +1 for lua
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   464
		else    -- name is not compressed
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   465
			append(n, self:sub(len)..'.');
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   466
		end
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   467
		len = self:byte();
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   468
	end
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   469
	self.offset = remember or self.offset;
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   470
	return table.concat(n);
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   471
end
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   472
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   473
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   474
function resolver:question()    -- - - - - - - - - - - - - - - - - -  question
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   475
	local q = {};
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   476
	q.name  = self:name();
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   477
	q.type  = dns.type[self:word()];
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   478
	q.class = dns.class[self:word()];
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   479
	return q;
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   480
end
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   481
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   482
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   483
function resolver:A(rr)    -- - - - - - - - - - - - - - - - - - - - - - - -  A
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   484
	local b1, b2, b3, b4 = self:byte(4);
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   485
	rr.a = string.format('%i.%i.%i.%i', b1, b2, b3, b4);
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   486
end
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   487
8430
1371518f70ff net.dns: Use inet_ntop from util.net if available
Kim Alvefur <zash@zash.se>
parents: 8266
diff changeset
   488
if have_util_net and util_net.ntop then
1371518f70ff net.dns: Use inet_ntop from util.net if available
Kim Alvefur <zash@zash.se>
parents: 8266
diff changeset
   489
	function resolver:A(rr)
1371518f70ff net.dns: Use inet_ntop from util.net if available
Kim Alvefur <zash@zash.se>
parents: 8266
diff changeset
   490
		rr.a = util_net.ntop(self:sub(4));
1371518f70ff net.dns: Use inet_ntop from util.net if available
Kim Alvefur <zash@zash.se>
parents: 8266
diff changeset
   491
	end
1371518f70ff net.dns: Use inet_ntop from util.net if available
Kim Alvefur <zash@zash.se>
parents: 8266
diff changeset
   492
end
1371518f70ff net.dns: Use inet_ntop from util.net if available
Kim Alvefur <zash@zash.se>
parents: 8266
diff changeset
   493
4267
29d7eb6ff62c net.dns: Support for resolving AAAA records
Matthew Wild <mwild1@gmail.com>
parents: 4251
diff changeset
   494
function resolver:AAAA(rr)
29d7eb6ff62c net.dns: Support for resolving AAAA records
Matthew Wild <mwild1@gmail.com>
parents: 4251
diff changeset
   495
	local addr = {};
7503
4c519444d4a2 net.dns: remove unused one-letter loop variables [luacheck]
Anton Shestakov <av6@dwimlabs.net>
parents: 7483
diff changeset
   496
	for _ = 1, rr.rdlength, 2 do
4267
29d7eb6ff62c net.dns: Support for resolving AAAA records
Matthew Wild <mwild1@gmail.com>
parents: 4251
diff changeset
   497
		local b1, b2 = self:byte(2);
29d7eb6ff62c net.dns: Support for resolving AAAA records
Matthew Wild <mwild1@gmail.com>
parents: 4251
diff changeset
   498
		table.insert(addr, ("%02x%02x"):format(b1, b2));
29d7eb6ff62c net.dns: Support for resolving AAAA records
Matthew Wild <mwild1@gmail.com>
parents: 4251
diff changeset
   499
	end
4373
9a20acf315c9 net.dns: Shorten AAAA records
Kim Alvefur <zash@zash.se>
parents: 4267
diff changeset
   500
	addr = table.concat(addr, ":"):gsub("%f[%x]0+(%x)","%1");
9a20acf315c9 net.dns: Shorten AAAA records
Kim Alvefur <zash@zash.se>
parents: 4267
diff changeset
   501
	local zeros = {};
8424
3d21c63ec03f net.dns: Don't compress a single zero group in IPv6 addresses to match behaviour of inet_ntop
Kim Alvefur <zash@zash.se>
parents: 8266
diff changeset
   502
	for item in addr:gmatch(":[0:]+:[0:]+:") do
4373
9a20acf315c9 net.dns: Shorten AAAA records
Kim Alvefur <zash@zash.se>
parents: 4267
diff changeset
   503
		table.insert(zeros, item)
9a20acf315c9 net.dns: Shorten AAAA records
Kim Alvefur <zash@zash.se>
parents: 4267
diff changeset
   504
	end
9a20acf315c9 net.dns: Shorten AAAA records
Kim Alvefur <zash@zash.se>
parents: 4267
diff changeset
   505
	if #zeros == 0 then
9a20acf315c9 net.dns: Shorten AAAA records
Kim Alvefur <zash@zash.se>
parents: 4267
diff changeset
   506
		rr.aaaa = addr;
9a20acf315c9 net.dns: Shorten AAAA records
Kim Alvefur <zash@zash.se>
parents: 4267
diff changeset
   507
		return
9a20acf315c9 net.dns: Shorten AAAA records
Kim Alvefur <zash@zash.se>
parents: 4267
diff changeset
   508
	elseif #zeros > 1 then
9a20acf315c9 net.dns: Shorten AAAA records
Kim Alvefur <zash@zash.se>
parents: 4267
diff changeset
   509
		table.sort(zeros, function(a, b) return #a > #b end);
9a20acf315c9 net.dns: Shorten AAAA records
Kim Alvefur <zash@zash.se>
parents: 4267
diff changeset
   510
	end
9a20acf315c9 net.dns: Shorten AAAA records
Kim Alvefur <zash@zash.se>
parents: 4267
diff changeset
   511
	rr.aaaa = addr:gsub(zeros[1], "::", 1):gsub("^0::", "::"):gsub("::0$", "::");
4267
29d7eb6ff62c net.dns: Support for resolving AAAA records
Matthew Wild <mwild1@gmail.com>
parents: 4251
diff changeset
   512
end
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   513
8430
1371518f70ff net.dns: Use inet_ntop from util.net if available
Kim Alvefur <zash@zash.se>
parents: 8266
diff changeset
   514
if have_util_net and util_net.ntop then
1371518f70ff net.dns: Use inet_ntop from util.net if available
Kim Alvefur <zash@zash.se>
parents: 8266
diff changeset
   515
	function resolver:AAAA(rr)
1371518f70ff net.dns: Use inet_ntop from util.net if available
Kim Alvefur <zash@zash.se>
parents: 8266
diff changeset
   516
		rr.aaaa = util_net.ntop(self:sub(16));
1371518f70ff net.dns: Use inet_ntop from util.net if available
Kim Alvefur <zash@zash.se>
parents: 8266
diff changeset
   517
	end
1371518f70ff net.dns: Use inet_ntop from util.net if available
Kim Alvefur <zash@zash.se>
parents: 8266
diff changeset
   518
end
1371518f70ff net.dns: Use inet_ntop from util.net if available
Kim Alvefur <zash@zash.se>
parents: 8266
diff changeset
   519
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   520
function resolver:CNAME(rr)    -- - - - - - - - - - - - - - - - - - - -  CNAME
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   521
	rr.cname = self:name();
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   522
end
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   523
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   524
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   525
function resolver:MX(rr)    -- - - - - - - - - - - - - - - - - - - - - - -  MX
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   526
	rr.pref = self:word();
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   527
	rr.mx   = self:name();
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   528
end
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   529
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   530
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   531
function resolver:LOC_nibble_power()    -- - - - - - - - - -  LOC_nibble_power
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   532
	local b = self:byte();
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   533
	--print('nibbles', ((b-(b%0x10))/0x10), (b%0x10));
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   534
	return ((b-(b%0x10))/0x10) * (10^(b%0x10));
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   535
end
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   536
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   537
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   538
function resolver:LOC(rr)    -- - - - - - - - - - - - - - - - - - - - - -  LOC
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   539
	rr.version = self:byte();
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   540
	if rr.version == 0 then
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   541
		rr.loc           = rr.loc or {};
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   542
		rr.loc.size      = self:LOC_nibble_power();
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   543
		rr.loc.horiz_pre = self:LOC_nibble_power();
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   544
		rr.loc.vert_pre  = self:LOC_nibble_power();
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   545
		rr.loc.latitude  = self:dword();
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   546
		rr.loc.longitude = self:dword();
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   547
		rr.loc.altitude  = self:dword();
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   548
	end
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   549
end
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   550
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   551
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   552
local function LOC_tostring_degrees(f, pos, neg)    -- - - - - - - - - - - - -
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   553
	f = f - 0x80000000;
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   554
	if f < 0 then pos = neg; f = -f; end
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   555
	local deg, min, msec;
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   556
	msec = f%60000;
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   557
	f    = (f-msec)/60000;
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   558
	min  = f%60;
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   559
	deg = (f-min)/60;
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   560
	return string.format('%3d %2d %2.3f %s', deg, min, msec/1000, pos);
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   561
end
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   562
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   563
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   564
function resolver.LOC_tostring(rr)    -- - - - - - - - - - - - -  LOC_tostring
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   565
	local t = {};
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   566
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   567
	--[[
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   568
	for k,name in pairs { 'size', 'horiz_pre', 'vert_pre', 'latitude', 'longitude', 'altitude' } do
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   569
		append(t, string.format('%4s%-10s: %12.0f\n', '', name, rr.loc[name]));
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   570
	end
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   571
	--]]
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   572
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   573
	append(t, string.format(
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   574
		'%s    %s    %.2fm %.2fm %.2fm %.2fm',
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   575
		LOC_tostring_degrees (rr.loc.latitude, 'N', 'S'),
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   576
		LOC_tostring_degrees (rr.loc.longitude, 'E', 'W'),
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   577
		(rr.loc.altitude - 10000000) / 100,
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   578
		rr.loc.size / 100,
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   579
		rr.loc.horiz_pre / 100,
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   580
		rr.loc.vert_pre / 100
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   581
	));
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   582
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   583
	return table.concat(t);
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   584
end
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   585
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   586
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   587
function resolver:NS(rr)    -- - - - - - - - - - - - - - - - - - - - - - -  NS
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   588
	rr.ns = self:name();
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   589
end
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   590
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   591
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   592
function resolver:SOA(rr)    -- - - - - - - - - - - - - - - - - - - - - -  SOA
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   593
end
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   594
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   595
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   596
function resolver:SRV(rr)    -- - - - - - - - - - - - - - - - - - - - - -  SRV
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   597
	  rr.srv = {};
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   598
	  rr.srv.priority = self:word();
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   599
	  rr.srv.weight   = self:word();
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   600
	  rr.srv.port     = self:word();
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   601
	  rr.srv.target   = self:name();
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   602
end
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   603
3513
4cf5962747fc net.dns: Support for parsing PTR records
Matthew Wild <mwild1@gmail.com>
parents: 3512
diff changeset
   604
function resolver:PTR(rr)
4cf5962747fc net.dns: Support for parsing PTR records
Matthew Wild <mwild1@gmail.com>
parents: 3512
diff changeset
   605
	rr.ptr = self:name();
4cf5962747fc net.dns: Support for parsing PTR records
Matthew Wild <mwild1@gmail.com>
parents: 3512
diff changeset
   606
end
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   607
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   608
function resolver:TXT(rr)    -- - - - - - - - - - - - - - - - - - - - - -  TXT
4251
96e9d5f9ab3b net.dns: Fix TXT records
Kim Alvefur <zash@zash.se>
parents: 4125
diff changeset
   609
	rr.txt = self:sub (self:byte());
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   610
end
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   611
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   612
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   613
function resolver:rr()    -- - - - - - - - - - - - - - - - - - - - - - - -  rr
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   614
	local rr = {};
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   615
	setmetatable(rr, rr_metatable);
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   616
	rr.name     = self:name(self);
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   617
	rr.type     = dns.type[self:word()] or rr.type;
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   618
	rr.class    = dns.class[self:word()] or rr.class;
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   619
	rr.ttl      = 0x10000*self:word() + self:word();
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   620
	rr.rdlength = self:word();
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   621
8266
9b52b1f19b51 net.dns: Correctly apply lower bound of RTT (thanks Ge0rG)
Kim Alvefur <zash@zash.se>
parents: 8167
diff changeset
   622
	rr.tod = self.time + math.max(rr.ttl, 1);
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   623
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   624
	local remember = self.offset;
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   625
	local rr_parser = self[dns.type[rr.type]];
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   626
	if rr_parser then rr_parser(self, rr); end
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   627
	self.offset = remember;
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   628
	rr.rdata = self:sub(rr.rdlength);
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   629
	return rr;
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   630
end
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   631
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   632
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   633
function resolver:rrs (count)    -- - - - - - - - - - - - - - - - - - - - - rrs
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   634
	local rrs = {};
7503
4c519444d4a2 net.dns: remove unused one-letter loop variables [luacheck]
Anton Shestakov <av6@dwimlabs.net>
parents: 7483
diff changeset
   635
	for _ = 1, count do append(rrs, self:rr()); end
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   636
	return rrs;
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   637
end
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   638
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   639
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   640
function resolver:decode(packet, force)    -- - - - - - - - - - - - - - decode
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   641
	self.packet, self.offset = packet, 1;
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   642
	local header = self:header(force);
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   643
	if not header then return nil; end
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   644
	local response = { header = header };
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   645
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   646
	response.question = {};
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   647
	local offset = self.offset;
7503
4c519444d4a2 net.dns: remove unused one-letter loop variables [luacheck]
Anton Shestakov <av6@dwimlabs.net>
parents: 7483
diff changeset
   648
	for _ = 1, response.header.qdcount do
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   649
		append(response.question, self:question());
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   650
	end
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   651
	response.question.raw = string.sub(self.packet, offset, self.offset - 1);
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   652
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   653
	if not force then
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   654
		if not self.active[response.header.id] or not self.active[response.header.id][response.question.raw] then
5266
5c3a3ef6b769 net.dns: Clean up query list when a server is marked down
Matthew Wild <mwild1@gmail.com>
parents: 4425
diff changeset
   655
			self.active[response.header.id] = nil;
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   656
			return nil;
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   657
		end
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   658
	end
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   659
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   660
	response.answer     = self:rrs(response.header.ancount);
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   661
	response.authority  = self:rrs(response.header.nscount);
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   662
	response.additional = self:rrs(response.header.arcount);
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   663
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   664
	return response;
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   665
end
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   666
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   667
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   668
-- socket layer -------------------------------------------------- socket layer
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   669
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   670
10962
25680ece29c2 net.dns: Increase backoff delays
Matthew Wild <mwild1@gmail.com>
parents: 10961
diff changeset
   671
resolver.delays = { 1, 2, 3, 5 };
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   672
10961
8902cecbdd39 net.dns: Add jitter to spread queries and reduce failures due to congestion
Matthew Wild <mwild1@gmail.com>
parents: 10960
diff changeset
   673
resolver.jitter = have_timer and default_jitter or nil;
8902cecbdd39 net.dns: Add jitter to spread queries and reduce failures due to congestion
Matthew Wild <mwild1@gmail.com>
parents: 10960
diff changeset
   674
resolver.retry_jitter = have_timer and default_retry_jitter or nil;
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   675
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   676
function resolver:addnameserver(address)    -- - - - - - - - - - addnameserver
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   677
	self.server = self.server or {};
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   678
	append(self.server, address);
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   679
end
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   680
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   681
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   682
function resolver:setnameserver(address)    -- - - - - - - - - - setnameserver
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   683
	self.server = {};
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   684
	self:addnameserver(address);
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   685
end
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   686
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   687
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   688
function resolver:adddefaultnameservers()    -- - - - -  adddefaultnameservers
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   689
	if is_windows then
3544
f2aca3e0fe3b net.dns: Fixed a traceback when util/windows.dll is unavailable on windows.
Waqas Hussain <waqas20@gmail.com>
parents: 3540
diff changeset
   690
		if windows and windows.get_nameservers then
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   691
			for _, server in ipairs(windows.get_nameservers()) do
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   692
				self:addnameserver(server);
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   693
			end
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   694
		end
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   695
		if not self.server or #self.server == 0 then
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   696
			-- TODO log warning about no nameservers, adding opendns servers as fallback
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   697
			self:addnameserver("208.67.222.222");
2742
6c0a081cd766 net.dns: Trailing whitespace
Matthew Wild <mwild1@gmail.com>
parents: 2741
diff changeset
   698
			self:addnameserver("208.67.220.220");
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   699
		end
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   700
	else -- posix
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   701
		local resolv_conf = io.open("/etc/resolv.conf");
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   702
		if resolv_conf then
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   703
			for line in resolv_conf:lines() do
2741
fcd30b72c50c net.dns: More reliable parsing of resolv.conf - allow multiple nameserver IPs on one line (thanks dersd)
Matthew Wild <mwild1@gmail.com>
parents: 2620
diff changeset
   704
				line = line:gsub("#.*$", "")
7059
7b0651e4534f net.dns: Allow a zone id in resolv.conf (eg like %eth0)
Kim Alvefur <zash@zash.se>
parents: 7057
diff changeset
   705
					:match('^%s*nameserver%s+([%x:%.]*%%?%S*)%s*$');
2741
fcd30b72c50c net.dns: More reliable parsing of resolv.conf - allow multiple nameserver IPs on one line (thanks dersd)
Matthew Wild <mwild1@gmail.com>
parents: 2620
diff changeset
   706
				if line then
7057
94d5e2f33a10 net.dns: Support IPv6 addresses in resolv.conf [Backported from 0.10]
Florian Zeitz <florob@babelmonkeys.de>
parents: 6866
diff changeset
   707
					local ip = new_ip(line);
94d5e2f33a10 net.dns: Support IPv6 addresses in resolv.conf [Backported from 0.10]
Florian Zeitz <florob@babelmonkeys.de>
parents: 6866
diff changeset
   708
					if ip then
94d5e2f33a10 net.dns: Support IPv6 addresses in resolv.conf [Backported from 0.10]
Florian Zeitz <florob@babelmonkeys.de>
parents: 6866
diff changeset
   709
						self:addnameserver(ip.addr);
94d5e2f33a10 net.dns: Support IPv6 addresses in resolv.conf [Backported from 0.10]
Florian Zeitz <florob@babelmonkeys.de>
parents: 6866
diff changeset
   710
					end
2741
fcd30b72c50c net.dns: More reliable parsing of resolv.conf - allow multiple nameserver IPs on one line (thanks dersd)
Matthew Wild <mwild1@gmail.com>
parents: 2620
diff changeset
   711
				end
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   712
			end
9956
6402bc76f51a net.dns: Close resolv.conf handle when done (fixes #1342)
Kim Alvefur <zash@zash.se>
parents: 8912
diff changeset
   713
			resolv_conf:close();
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   714
		end
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   715
		if not self.server or #self.server == 0 then
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   716
			-- TODO log warning about no nameservers, adding localhost as the default nameserver
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   717
			self:addnameserver("127.0.0.1");
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   718
		end
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   719
	end
399
93b6587d9afb Added temporary fix for srv on windows: using opendns nameservers
Waqas Hussain <waqas20@gmail.com>
parents: 379
diff changeset
   720
end
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   721
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   722
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   723
function resolver:getsocket(servernum)    -- - - - - - - - - - - - - getsocket
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   724
	self.socket = self.socket or {};
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   725
	self.socketset = self.socketset or {};
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   726
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   727
	local sock = self.socket[servernum];
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   728
	if sock then return sock; end
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   729
6512
7cb69eba3e95 net.dns: Try next server if peer name can not be set (thanks wirehack7)
Kim Alvefur <zash@zash.se>
parents: 6511
diff changeset
   730
	local ok, err;
7057
94d5e2f33a10 net.dns: Support IPv6 addresses in resolv.conf [Backported from 0.10]
Florian Zeitz <florob@babelmonkeys.de>
parents: 6866
diff changeset
   731
	local peer = self.server[servernum];
94d5e2f33a10 net.dns: Support IPv6 addresses in resolv.conf [Backported from 0.10]
Florian Zeitz <florob@babelmonkeys.de>
parents: 6866
diff changeset
   732
	if peer:find(":") then
94d5e2f33a10 net.dns: Support IPv6 addresses in resolv.conf [Backported from 0.10]
Florian Zeitz <florob@babelmonkeys.de>
parents: 6866
diff changeset
   733
		sock, err = socket.udp6();
94d5e2f33a10 net.dns: Support IPv6 addresses in resolv.conf [Backported from 0.10]
Florian Zeitz <florob@babelmonkeys.de>
parents: 6866
diff changeset
   734
	else
6860
86fcc3fa1a97 net.dns: Use new IPv4-specific socket factory if available (fixes dns on libevent with latest development version of luasocket)
Kim Alvefur <zash@zash.se>
parents: 6783
diff changeset
   735
		sock, err = (socket.udp4 or socket.udp)();
7057
94d5e2f33a10 net.dns: Support IPv6 addresses in resolv.conf [Backported from 0.10]
Florian Zeitz <florob@babelmonkeys.de>
parents: 6866
diff changeset
   736
	end
5730
411e9e7d8035 net.dns, net.adns: Make sure errors from net.server are propagated (thanks asterix)
Kim Alvefur <zash@zash.se>
parents: 5566
diff changeset
   737
	if sock and self.socket_wrapper then sock, err = self.socket_wrapper(sock, self); end
3954
6e22b0cf3d72 net.dns: resolver:getsocket(): Return nil, err on failure
Matthew Wild <mwild1@gmail.com>
parents: 3747
diff changeset
   738
	if not sock then
6e22b0cf3d72 net.dns: resolver:getsocket(): Return nil, err on failure
Matthew Wild <mwild1@gmail.com>
parents: 3747
diff changeset
   739
		return nil, err;
6e22b0cf3d72 net.dns: resolver:getsocket(): Return nil, err on failure
Matthew Wild <mwild1@gmail.com>
parents: 3747
diff changeset
   740
	end
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   741
	sock:settimeout(0);
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   742
	-- todo: attempt to use a random port, fallback to 0
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   743
	self.socket[servernum] = sock;
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   744
	self.socketset[sock] = servernum;
6512
7cb69eba3e95 net.dns: Try next server if peer name can not be set (thanks wirehack7)
Kim Alvefur <zash@zash.se>
parents: 6511
diff changeset
   745
	-- set{sock,peer}name can fail, eg because of local routing table
7cb69eba3e95 net.dns: Try next server if peer name can not be set (thanks wirehack7)
Kim Alvefur <zash@zash.se>
parents: 6511
diff changeset
   746
	-- if so, try the next server
7cb69eba3e95 net.dns: Try next server if peer name can not be set (thanks wirehack7)
Kim Alvefur <zash@zash.se>
parents: 6511
diff changeset
   747
	ok, err = sock:setsockname('*', 0);
7cb69eba3e95 net.dns: Try next server if peer name can not be set (thanks wirehack7)
Kim Alvefur <zash@zash.se>
parents: 6511
diff changeset
   748
	if not ok then return self:servfail(sock, err); end
7057
94d5e2f33a10 net.dns: Support IPv6 addresses in resolv.conf [Backported from 0.10]
Florian Zeitz <florob@babelmonkeys.de>
parents: 6866
diff changeset
   749
	ok, err = sock:setpeername(peer, 53);
6512
7cb69eba3e95 net.dns: Try next server if peer name can not be set (thanks wirehack7)
Kim Alvefur <zash@zash.se>
parents: 6511
diff changeset
   750
	if not ok then return self:servfail(sock, err); end
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   751
	return sock;
1786
4016d8bc30b8 net.dns: Multiple internal changes and API extensions to allow for more reliable DNS lookups
Matthew Wild <mwild1@gmail.com>
parents: 1523
diff changeset
   752
end
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   753
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   754
function resolver:voidsocket(sock)
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   755
	if self.socket[sock] then
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   756
		self.socketset[self.socket[sock]] = nil;
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   757
		self.socket[sock] = nil;
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   758
	elseif self.socketset[sock] then
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   759
		self.socket[self.socketset[sock]] = nil;
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   760
		self.socketset[sock] = nil;
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   761
	end
5267
a2080e5c4eda net.dns: Close voided sockets, so they don't stay in net.server
Kim Alvefur <zash@zash.se>
parents: 5266
diff changeset
   762
	sock:close();
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   763
end
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   764
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   765
function resolver:socket_wrapper_set(func)  -- - - - - - - socket_wrapper_set
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   766
	self.socket_wrapper = func;
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   767
end
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   768
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   769
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   770
function resolver:closeall ()    -- - - - - - - - - - - - - - - - - -  closeall
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   771
	for i,sock in ipairs(self.socket) do
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   772
		self.socket[i] = nil;
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   773
		self.socketset[sock] = nil;
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   774
		sock:close();
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   775
	end
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   776
end
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   777
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   778
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   779
function resolver:remember(rr, type)    -- - - - - - - - - - - - - -  remember
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   780
	--print ('remember', type, rr.class, rr.type, rr.name)
2620
481c6724818f net.dns: Normalize records before placing them in the cache, fixes issues with CNAME targets in CAPS (fixes #161)
Matthew Wild <mwild1@gmail.com>
parents: 2619
diff changeset
   781
	local qname, qtype, qclass = standardize(rr.name, rr.type, rr.class);
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   782
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   783
	if type ~= '*' then
2620
481c6724818f net.dns: Normalize records before placing them in the cache, fixes issues with CNAME targets in CAPS (fixes #161)
Matthew Wild <mwild1@gmail.com>
parents: 2619
diff changeset
   784
		type = qtype;
481c6724818f net.dns: Normalize records before placing them in the cache, fixes issues with CNAME targets in CAPS (fixes #161)
Matthew Wild <mwild1@gmail.com>
parents: 2619
diff changeset
   785
		local all = get(self.cache, qclass, '*', qname);
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   786
		--print('remember all', all);
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   787
		if all then append(all, rr); end
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   788
	end
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   789
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   790
	self.cache = self.cache or setmetatable({}, cache_metatable);
2620
481c6724818f net.dns: Normalize records before placing them in the cache, fixes issues with CNAME targets in CAPS (fixes #161)
Matthew Wild <mwild1@gmail.com>
parents: 2619
diff changeset
   791
	local rrs = get(self.cache, qclass, type, qname) or
481c6724818f net.dns: Normalize records before placing them in the cache, fixes issues with CNAME targets in CAPS (fixes #161)
Matthew Wild <mwild1@gmail.com>
parents: 2619
diff changeset
   792
		set(self.cache, qclass, type, qname, setmetatable({}, rrs_metatable));
8903
fcf42bd7d067 net.dns: Don't attempt to cache unparsed data (fixes #1056)
Kim Alvefur <zash@zash.se>
parents: 8901
diff changeset
   793
	if rr[qtype:lower()] and not rrs[rr[qtype:lower()]] then
6466
460584257cc9 net.dns: Avoid duplicate cache entries
Florian Zeitz <florob@babelmonkeys.de>
parents: 6310
diff changeset
   794
		rrs[rr[qtype:lower()]] = true;
460584257cc9 net.dns: Avoid duplicate cache entries
Florian Zeitz <florob@babelmonkeys.de>
parents: 6310
diff changeset
   795
		append(rrs, rr);
460584257cc9 net.dns: Avoid duplicate cache entries
Florian Zeitz <florob@babelmonkeys.de>
parents: 6310
diff changeset
   796
	end
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   797
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   798
	if type == 'MX' then self.unsorted[rrs] = true; end
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   799
end
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   800
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   801
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   802
local function comp_mx(a, b)    -- - - - - - - - - - - - - - - - - - - comp_mx
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   803
	return (a.pref == b.pref) and (a.mx < b.mx) or (a.pref < b.pref);
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   804
end
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   805
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   806
6634
45222bfb206f net.dns, mod_s2s: Add chasing of CNAMEs to net.dns and remove it from mod_s2s
Kim Alvefur <zash@zash.se>
parents: 6512
diff changeset
   807
function resolver:peek (qname, qtype, qclass, n)    -- - - - - - - - - - - -  peek
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   808
	qname, qtype, qclass = standardize(qname, qtype, qclass);
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   809
	local rrs = get(self.cache, qclass, qtype, qname);
6634
45222bfb206f net.dns, mod_s2s: Add chasing of CNAMEs to net.dns and remove it from mod_s2s
Kim Alvefur <zash@zash.se>
parents: 6512
diff changeset
   810
	if not rrs then
45222bfb206f net.dns, mod_s2s: Add chasing of CNAMEs to net.dns and remove it from mod_s2s
Kim Alvefur <zash@zash.se>
parents: 6512
diff changeset
   811
		if n then if n <= 0 then return end else n = 3 end
45222bfb206f net.dns, mod_s2s: Add chasing of CNAMEs to net.dns and remove it from mod_s2s
Kim Alvefur <zash@zash.se>
parents: 6512
diff changeset
   812
		rrs = get(self.cache, qclass, "CNAME", qname);
45222bfb206f net.dns, mod_s2s: Add chasing of CNAMEs to net.dns and remove it from mod_s2s
Kim Alvefur <zash@zash.se>
parents: 6512
diff changeset
   813
		if not (rrs and rrs[1]) then return end
45222bfb206f net.dns, mod_s2s: Add chasing of CNAMEs to net.dns and remove it from mod_s2s
Kim Alvefur <zash@zash.se>
parents: 6512
diff changeset
   814
		return self:peek(rrs[1].cname, qtype, qclass, n - 1);
45222bfb206f net.dns, mod_s2s: Add chasing of CNAMEs to net.dns and remove it from mod_s2s
Kim Alvefur <zash@zash.se>
parents: 6512
diff changeset
   815
	end
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   816
	if prune(rrs, socket.gettime()) and qtype == '*' or not next(rrs) then
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   817
		set(self.cache, qclass, qtype, qname, nil);
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   818
		return nil;
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   819
	end
6634
45222bfb206f net.dns, mod_s2s: Add chasing of CNAMEs to net.dns and remove it from mod_s2s
Kim Alvefur <zash@zash.se>
parents: 6512
diff changeset
   820
	if self.unsorted[rrs] then table.sort (rrs, comp_mx); self.unsorted[rrs] = nil; end
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   821
	return rrs;
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   822
end
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   823
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   824
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   825
function resolver:purge(soft)    -- - - - - - - - - - - - - - - - - - -  purge
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   826
	if soft == 'soft' then
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   827
		self.time = socket.gettime();
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   828
		for class,types in pairs(self.cache or {}) do
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   829
			for type,names in pairs(types) do
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   830
				for name,rrs in pairs(names) do
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   831
					prune(rrs, self.time, 'soft')
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   832
				end
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   833
			end
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   834
		end
4400
ac651265766c net.dns: Preserve metatable on manual cache purge
Matthew Wild <mwild1@gmail.com>
parents: 4373
diff changeset
   835
	else self.cache = setmetatable({}, cache_metatable); end
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   836
end
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   837
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   838
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   839
function resolver:query(qname, qtype, qclass)    -- - - - - - - - - - -- query
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   840
	qname, qtype, qclass = standardize(qname, qtype, qclass)
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   841
6288
d122420542fb net.dns: Fix duplicated cache insertions by limiting outstanding queries per name to one
Kim Alvefur <zash@zash.se>
parents: 5730
diff changeset
   842
	local co = coroutine.running();
d122420542fb net.dns: Fix duplicated cache insertions by limiting outstanding queries per name to one
Kim Alvefur <zash@zash.se>
parents: 5730
diff changeset
   843
	local q = get(self.wanted, qclass, qtype, qname);
d122420542fb net.dns: Fix duplicated cache insertions by limiting outstanding queries per name to one
Kim Alvefur <zash@zash.se>
parents: 5730
diff changeset
   844
	if co and q then
d122420542fb net.dns: Fix duplicated cache insertions by limiting outstanding queries per name to one
Kim Alvefur <zash@zash.se>
parents: 5730
diff changeset
   845
		-- We are already waiting for a reply to an identical query.
d122420542fb net.dns: Fix duplicated cache insertions by limiting outstanding queries per name to one
Kim Alvefur <zash@zash.se>
parents: 5730
diff changeset
   846
		set(self.wanted, qclass, qtype, qname, co, true);
d122420542fb net.dns: Fix duplicated cache insertions by limiting outstanding queries per name to one
Kim Alvefur <zash@zash.se>
parents: 5730
diff changeset
   847
		return true;
d122420542fb net.dns: Fix duplicated cache insertions by limiting outstanding queries per name to one
Kim Alvefur <zash@zash.se>
parents: 5730
diff changeset
   848
	end
d122420542fb net.dns: Fix duplicated cache insertions by limiting outstanding queries per name to one
Kim Alvefur <zash@zash.se>
parents: 5730
diff changeset
   849
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   850
	if not self.server then self:adddefaultnameservers(); end
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   851
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   852
	local question = encodeQuestion(qname, qtype, qclass);
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   853
	local peek = self:peek (qname, qtype, qclass);
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   854
	if peek then return peek; end
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   855
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   856
	local header, id = encodeHeader();
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   857
	--print ('query  id', id, qclass, qtype, qname)
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   858
	local o = {
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   859
		packet = header..question,
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   860
		server = self.best_server,
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   861
		delay  = 1,
10961
8902cecbdd39 net.dns: Add jitter to spread queries and reduce failures due to congestion
Matthew Wild <mwild1@gmail.com>
parents: 10960
diff changeset
   862
		retry  = socket.gettime() + self.delays[1];
10960
03a09fa02e8e net.dns: Fix timeout retry logic
Matthew Wild <mwild1@gmail.com>
parents: 10959
diff changeset
   863
		qclass = qclass;
03a09fa02e8e net.dns: Fix timeout retry logic
Matthew Wild <mwild1@gmail.com>
parents: 10959
diff changeset
   864
		qtype  = qtype;
03a09fa02e8e net.dns: Fix timeout retry logic
Matthew Wild <mwild1@gmail.com>
parents: 10959
diff changeset
   865
		qname  = qname;
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   866
	};
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   867
3540
bc139431830b Monster whitespace commit (beware the whitespace monster).
Waqas Hussain <waqas20@gmail.com>
parents: 3513
diff changeset
   868
	-- remember the query
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   869
	self.active[id] = self.active[id] or {};
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   870
	self.active[id][question] = o;
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   871
3955
a096700d23d9 net.dns: resolver:query(): Handle getsocket() failures, and return true on success
Matthew Wild <mwild1@gmail.com>
parents: 3954
diff changeset
   872
	local conn, err = self:getsocket(o.server)
a096700d23d9 net.dns: resolver:query(): Handle getsocket() failures, and return true on success
Matthew Wild <mwild1@gmail.com>
parents: 3954
diff changeset
   873
	if not conn then
a096700d23d9 net.dns: resolver:query(): Handle getsocket() failures, and return true on success
Matthew Wild <mwild1@gmail.com>
parents: 3954
diff changeset
   874
		return nil, err;
a096700d23d9 net.dns: resolver:query(): Handle getsocket() failures, and return true on success
Matthew Wild <mwild1@gmail.com>
parents: 3954
diff changeset
   875
	end
10961
8902cecbdd39 net.dns: Add jitter to spread queries and reduce failures due to congestion
Matthew Wild <mwild1@gmail.com>
parents: 10960
diff changeset
   876
	if self.jitter then
8902cecbdd39 net.dns: Add jitter to spread queries and reduce failures due to congestion
Matthew Wild <mwild1@gmail.com>
parents: 10960
diff changeset
   877
		timer.add_task(math.random()*self.jitter, function ()
8902cecbdd39 net.dns: Add jitter to spread queries and reduce failures due to congestion
Matthew Wild <mwild1@gmail.com>
parents: 10960
diff changeset
   878
			conn:send(o.packet);
8902cecbdd39 net.dns: Add jitter to spread queries and reduce failures due to congestion
Matthew Wild <mwild1@gmail.com>
parents: 10960
diff changeset
   879
		end);
8902cecbdd39 net.dns: Add jitter to spread queries and reduce failures due to congestion
Matthew Wild <mwild1@gmail.com>
parents: 10960
diff changeset
   880
	else
8902cecbdd39 net.dns: Add jitter to spread queries and reduce failures due to congestion
Matthew Wild <mwild1@gmail.com>
parents: 10960
diff changeset
   881
		conn:send(o.packet);
8902cecbdd39 net.dns: Add jitter to spread queries and reduce failures due to congestion
Matthew Wild <mwild1@gmail.com>
parents: 10960
diff changeset
   882
	end
7096
388281be2bc7 net.dns: Remember query only after it was sent, in case it was not (fixes #598)
Kim Alvefur <zash@zash.se>
parents: 7062
diff changeset
   883
388281be2bc7 net.dns: Remember query only after it was sent, in case it was not (fixes #598)
Kim Alvefur <zash@zash.se>
parents: 7062
diff changeset
   884
	-- remember which coroutine wants the answer
388281be2bc7 net.dns: Remember query only after it was sent, in case it was not (fixes #598)
Kim Alvefur <zash@zash.se>
parents: 7062
diff changeset
   885
	if co then
388281be2bc7 net.dns: Remember query only after it was sent, in case it was not (fixes #598)
Kim Alvefur <zash@zash.se>
parents: 7062
diff changeset
   886
		set(self.wanted, qclass, qtype, qname, co, true);
388281be2bc7 net.dns: Remember query only after it was sent, in case it was not (fixes #598)
Kim Alvefur <zash@zash.se>
parents: 7062
diff changeset
   887
	end
12391
05c250fa335a Spelling: Fix various spelling mistakes (thanks timeless)
Kim Alvefur <zash@zash.se>
parents: 10980
diff changeset
   888
10668
c2b79b44ded7 net.dns: Handle being loaded outside of Prosody
Kim Alvefur <zash@zash.se>
parents: 9956
diff changeset
   889
	if have_timer and self.timeout then
3324
070c8ba71b76 net.dns: Handle our own timeouts, including falling onto other servers in resolv.conf if necessary
Matthew Wild <mwild1@gmail.com>
parents: 3057
diff changeset
   890
		local num_servers = #self.server;
070c8ba71b76 net.dns: Handle our own timeouts, including falling onto other servers in resolv.conf if necessary
Matthew Wild <mwild1@gmail.com>
parents: 3057
diff changeset
   891
		local i = 1;
3327
b447682f2a8d net.dns: Make timeout configurable (default 15s)
Matthew Wild <mwild1@gmail.com>
parents: 3326
diff changeset
   892
		timer.add_task(self.timeout, function ()
3324
070c8ba71b76 net.dns: Handle our own timeouts, including falling onto other servers in resolv.conf if necessary
Matthew Wild <mwild1@gmail.com>
parents: 3057
diff changeset
   893
			if get(self.wanted, qclass, qtype, qname, co) then
10959
7bcfac630b65 net.dns: Add some debug logging
Matthew Wild <mwild1@gmail.com>
parents: 10668
diff changeset
   894
				log("debug", "DNS request timeout %d/%d", i, num_servers)
3324
070c8ba71b76 net.dns: Handle our own timeouts, including falling onto other servers in resolv.conf if necessary
Matthew Wild <mwild1@gmail.com>
parents: 3057
diff changeset
   895
					i = i + 1;
10960
03a09fa02e8e net.dns: Fix timeout retry logic
Matthew Wild <mwild1@gmail.com>
parents: 10959
diff changeset
   896
					self:servfail(self.socket[o.server]);
03a09fa02e8e net.dns: Fix timeout retry logic
Matthew Wild <mwild1@gmail.com>
parents: 10959
diff changeset
   897
--				end
03a09fa02e8e net.dns: Fix timeout retry logic
Matthew Wild <mwild1@gmail.com>
parents: 10959
diff changeset
   898
			end
03a09fa02e8e net.dns: Fix timeout retry logic
Matthew Wild <mwild1@gmail.com>
parents: 10959
diff changeset
   899
			-- Still outstanding? (i.e. retried)
03a09fa02e8e net.dns: Fix timeout retry logic
Matthew Wild <mwild1@gmail.com>
parents: 10959
diff changeset
   900
			if get(self.wanted, qclass, qtype, qname, co) then
03a09fa02e8e net.dns: Fix timeout retry logic
Matthew Wild <mwild1@gmail.com>
parents: 10959
diff changeset
   901
				return self.timeout; -- Then wait
3324
070c8ba71b76 net.dns: Handle our own timeouts, including falling onto other servers in resolv.conf if necessary
Matthew Wild <mwild1@gmail.com>
parents: 3057
diff changeset
   902
			end
070c8ba71b76 net.dns: Handle our own timeouts, including falling onto other servers in resolv.conf if necessary
Matthew Wild <mwild1@gmail.com>
parents: 3057
diff changeset
   903
		end)
070c8ba71b76 net.dns: Handle our own timeouts, including falling onto other servers in resolv.conf if necessary
Matthew Wild <mwild1@gmail.com>
parents: 3057
diff changeset
   904
	end
3955
a096700d23d9 net.dns: resolver:query(): Handle getsocket() failures, and return true on success
Matthew Wild <mwild1@gmail.com>
parents: 3954
diff changeset
   905
	return true;
869
09019c452709 net.dns: Add methods necessary for allowing non-blocking DNS lookups
Matthew Wild <mwild1@gmail.com>
parents: 759
diff changeset
   906
end
09019c452709 net.dns: Add methods necessary for allowing non-blocking DNS lookups
Matthew Wild <mwild1@gmail.com>
parents: 759
diff changeset
   907
6512
7cb69eba3e95 net.dns: Try next server if peer name can not be set (thanks wirehack7)
Kim Alvefur <zash@zash.se>
parents: 6511
diff changeset
   908
function resolver:servfail(sock, err)
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   909
	-- Resend all queries for this server
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   910
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   911
	local num = self.socketset[sock]
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   912
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   913
	-- Socket is dead now
6511
4a28b8320d7f net.dns: Return new socket from servfail
Kim Alvefur <zash@zash.se>
parents: 6466
diff changeset
   914
	sock = self:voidsocket(sock);
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   915
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   916
	-- Find all requests to the down server, and retry on the next server
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   917
	self.time = socket.gettime();
10959
7bcfac630b65 net.dns: Add some debug logging
Matthew Wild <mwild1@gmail.com>
parents: 10668
diff changeset
   918
	log("debug", "servfail %d (of %d)", num, #self.server);
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   919
	for id,queries in pairs(self.active) do
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   920
		for question,o in pairs(queries) do
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   921
			if o.server == num then -- This request was to the broken server
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   922
				o.server = o.server + 1 -- Use next server
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   923
				if o.server > #self.server then
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   924
					o.server = 1;
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   925
				end
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   926
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   927
				o.retries = (o.retries or 0) + 1;
10960
03a09fa02e8e net.dns: Fix timeout retry logic
Matthew Wild <mwild1@gmail.com>
parents: 10959
diff changeset
   928
				local retried;
03a09fa02e8e net.dns: Fix timeout retry logic
Matthew Wild <mwild1@gmail.com>
parents: 10959
diff changeset
   929
				if o.retries < #self.server then
03a09fa02e8e net.dns: Fix timeout retry logic
Matthew Wild <mwild1@gmail.com>
parents: 10959
diff changeset
   930
					sock, err = self:getsocket(o.server);
03a09fa02e8e net.dns: Fix timeout retry logic
Matthew Wild <mwild1@gmail.com>
parents: 10959
diff changeset
   931
					if sock then
03a09fa02e8e net.dns: Fix timeout retry logic
Matthew Wild <mwild1@gmail.com>
parents: 10959
diff changeset
   932
						retried = true;
10961
8902cecbdd39 net.dns: Add jitter to spread queries and reduce failures due to congestion
Matthew Wild <mwild1@gmail.com>
parents: 10960
diff changeset
   933
						if self.retry_jitter then
8902cecbdd39 net.dns: Add jitter to spread queries and reduce failures due to congestion
Matthew Wild <mwild1@gmail.com>
parents: 10960
diff changeset
   934
							local delay = self.delays[((o.retries-1)%#self.delays)+1] + (math.random()*self.retry_jitter);
8902cecbdd39 net.dns: Add jitter to spread queries and reduce failures due to congestion
Matthew Wild <mwild1@gmail.com>
parents: 10960
diff changeset
   935
							log("debug", "retry %d in %0.2fs", o.retries, delay);
8902cecbdd39 net.dns: Add jitter to spread queries and reduce failures due to congestion
Matthew Wild <mwild1@gmail.com>
parents: 10960
diff changeset
   936
							timer.add_task(delay, function ()
8902cecbdd39 net.dns: Add jitter to spread queries and reduce failures due to congestion
Matthew Wild <mwild1@gmail.com>
parents: 10960
diff changeset
   937
								sock:send(o.packet);
8902cecbdd39 net.dns: Add jitter to spread queries and reduce failures due to congestion
Matthew Wild <mwild1@gmail.com>
parents: 10960
diff changeset
   938
							end);
8902cecbdd39 net.dns: Add jitter to spread queries and reduce failures due to congestion
Matthew Wild <mwild1@gmail.com>
parents: 10960
diff changeset
   939
						else
10960
03a09fa02e8e net.dns: Fix timeout retry logic
Matthew Wild <mwild1@gmail.com>
parents: 10959
diff changeset
   940
							log("debug", "retry %d (immediate)", o.retries);
03a09fa02e8e net.dns: Fix timeout retry logic
Matthew Wild <mwild1@gmail.com>
parents: 10959
diff changeset
   941
							sock:send(o.packet);
10961
8902cecbdd39 net.dns: Add jitter to spread queries and reduce failures due to congestion
Matthew Wild <mwild1@gmail.com>
parents: 10960
diff changeset
   942
						end
10960
03a09fa02e8e net.dns: Fix timeout retry logic
Matthew Wild <mwild1@gmail.com>
parents: 10959
diff changeset
   943
					end
12391
05c250fa335a Spelling: Fix various spelling mistakes (thanks timeless)
Kim Alvefur <zash@zash.se>
parents: 10980
diff changeset
   944
				end
10960
03a09fa02e8e net.dns: Fix timeout retry logic
Matthew Wild <mwild1@gmail.com>
parents: 10959
diff changeset
   945
				if not retried then
03a09fa02e8e net.dns: Fix timeout retry logic
Matthew Wild <mwild1@gmail.com>
parents: 10959
diff changeset
   946
					log("debug", 'tried all servers, giving up');
03a09fa02e8e net.dns: Fix timeout retry logic
Matthew Wild <mwild1@gmail.com>
parents: 10959
diff changeset
   947
					self:cancel(o.qclass, o.qtype, o.qname);
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   948
					queries[question] = nil;
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   949
				end
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   950
			end
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   951
		end
5266
5c3a3ef6b769 net.dns: Clean up query list when a server is marked down
Matthew Wild <mwild1@gmail.com>
parents: 4425
diff changeset
   952
		if next(queries) == nil then
5c3a3ef6b769 net.dns: Clean up query list when a server is marked down
Matthew Wild <mwild1@gmail.com>
parents: 4425
diff changeset
   953
			self.active[id] = nil;
5c3a3ef6b769 net.dns: Clean up query list when a server is marked down
Matthew Wild <mwild1@gmail.com>
parents: 4425
diff changeset
   954
		end
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   955
	end
3540
bc139431830b Monster whitespace commit (beware the whitespace monster).
Waqas Hussain <waqas20@gmail.com>
parents: 3513
diff changeset
   956
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   957
	if num == self.best_server then
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   958
		self.best_server = self.best_server + 1;
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   959
		if self.best_server > #self.server then
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   960
			-- Exhausted all servers, try first again
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   961
			self.best_server = 1;
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   962
		end
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   963
	end
6512
7cb69eba3e95 net.dns: Try next server if peer name can not be set (thanks wirehack7)
Kim Alvefur <zash@zash.se>
parents: 6511
diff changeset
   964
	return sock, err;
1786
4016d8bc30b8 net.dns: Multiple internal changes and API extensions to allow for more reliable DNS lookups
Matthew Wild <mwild1@gmail.com>
parents: 1523
diff changeset
   965
end
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   966
3327
b447682f2a8d net.dns: Make timeout configurable (default 15s)
Matthew Wild <mwild1@gmail.com>
parents: 3326
diff changeset
   967
function resolver:settimeout(seconds)
b447682f2a8d net.dns: Make timeout configurable (default 15s)
Matthew Wild <mwild1@gmail.com>
parents: 3326
diff changeset
   968
	self.timeout = seconds;
b447682f2a8d net.dns: Make timeout configurable (default 15s)
Matthew Wild <mwild1@gmail.com>
parents: 3326
diff changeset
   969
end
b447682f2a8d net.dns: Make timeout configurable (default 15s)
Matthew Wild <mwild1@gmail.com>
parents: 3326
diff changeset
   970
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   971
function resolver:receive(rset)    -- - - - - - - - - - - - - - - - -  receive
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   972
	--print('receive');  print(self.socket);
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   973
	self.time = socket.gettime();
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   974
	rset = rset or self.socket;
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   975
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   976
	local response;
7472
363e4a5e9b0a net.dns: remove unused one-letter loop variables [luacheck]
Anton Shestakov <av6@dwimlabs.net>
parents: 7325
diff changeset
   977
	for _, sock in pairs(rset) do
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   978
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   979
		if self.socketset[sock] then
2619
04158baefa34 net.dns: Update for new socket API
Matthew Wild <mwild1@gmail.com>
parents: 2578
diff changeset
   980
			local packet = sock:receive();
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   981
			if packet then
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   982
				response = self:decode(packet);
2278
8c10f13c0c20 modulemanager, net.dns: Remove trailing whitespace
Matthew Wild <mwild1@gmail.com>
parents: 2082
diff changeset
   983
				if response and self.active[response.header.id]
2081
b9bbb709d62e net.dns: Be more strict about checking the DNS replies we receive
Matthew Wild <mwild1@gmail.com>
parents: 2069
diff changeset
   984
					and self.active[response.header.id][response.question.raw] then
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   985
					--print('received response');
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   986
					--self.print(response);
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   987
7472
363e4a5e9b0a net.dns: remove unused one-letter loop variables [luacheck]
Anton Shestakov <av6@dwimlabs.net>
parents: 7325
diff changeset
   988
					for _, rr in pairs(response.answer) do
7062
7ec52755622f Backout 88d54bec26b7 prior to release, as it certainly requires more testing
Matthew Wild <mwild1@gmail.com>
parents: 7059
diff changeset
   989
						if rr.name:sub(-#response.question[1].name, -1) == response.question[1].name then
7ec52755622f Backout 88d54bec26b7 prior to release, as it certainly requires more testing
Matthew Wild <mwild1@gmail.com>
parents: 7059
diff changeset
   990
							self:remember(rr, response.question[1].type)
7ec52755622f Backout 88d54bec26b7 prior to release, as it certainly requires more testing
Matthew Wild <mwild1@gmail.com>
parents: 7059
diff changeset
   991
						end
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   992
					end
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   993
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   994
					-- retire the query
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   995
					local queries = self.active[response.header.id];
2082
1381b2071c2e net.dns: Be more strict about the records we cache
Matthew Wild <mwild1@gmail.com>
parents: 2081
diff changeset
   996
					queries[response.question.raw] = nil;
12391
05c250fa335a Spelling: Fix various spelling mistakes (thanks timeless)
Kim Alvefur <zash@zash.se>
parents: 10980
diff changeset
   997
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   998
					if not next(queries) then self.active[response.header.id] = nil; end
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   999
					if not next(self.active) then self:closeall(); end
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1000
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
  1001
					-- was the query on the wanted list?
2301
8a01b0898679 net.dns: Fix for blocking dns lookups to find waiting coroutines correctly (not that we use this in Prosody...)
Matthew Wild <mwild1@gmail.com>
parents: 2300
diff changeset
  1002
					local q = response.question[1];
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
  1003
					local cos = get(self.wanted, q.class, q.type, q.name);
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
  1004
					if cos then
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
  1005
						for co in pairs(cos) do
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
  1006
							if coroutine.status(co) == "suspended" then coroutine.resume(co); end
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
  1007
						end
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
  1008
						set(self.wanted, q.class, q.type, q.name, nil);
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
  1009
					end
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
  1010
				end
12391
05c250fa335a Spelling: Fix various spelling mistakes (thanks timeless)
Kim Alvefur <zash@zash.se>
parents: 10980
diff changeset
  1011
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
  1012
			end
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
  1013
		end
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
  1014
	end
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1015
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
  1016
	return response;
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
  1017
end
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1018
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1019
3512
e344b00f2cc9 net.dns: Add 'force' parameter to resolver:feed() to force decoding a packet even if it doesn't match an outstanding request
Matthew Wild <mwild1@gmail.com>
parents: 3360
diff changeset
  1020
function resolver:feed(sock, packet, force)
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
  1021
	--print('receive'); print(self.socket);
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
  1022
	self.time = socket.gettime();
869
09019c452709 net.dns: Add methods necessary for allowing non-blocking DNS lookups
Matthew Wild <mwild1@gmail.com>
parents: 759
diff changeset
  1023
3512
e344b00f2cc9 net.dns: Add 'force' parameter to resolver:feed() to force decoding a packet even if it doesn't match an outstanding request
Matthew Wild <mwild1@gmail.com>
parents: 3360
diff changeset
  1024
	local response = self:decode(packet, force);
2300
e182b5029ef2 net.dns: Port some DNS fixes to the resolver:feed() function for net.adns to use
Matthew Wild <mwild1@gmail.com>
parents: 2278
diff changeset
  1025
	if response and self.active[response.header.id]
e182b5029ef2 net.dns: Port some DNS fixes to the resolver:feed() function for net.adns to use
Matthew Wild <mwild1@gmail.com>
parents: 2278
diff changeset
  1026
		and self.active[response.header.id][response.question.raw] then
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
  1027
		--print('received response');
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
  1028
		--self.print(response);
869
09019c452709 net.dns: Add methods necessary for allowing non-blocking DNS lookups
Matthew Wild <mwild1@gmail.com>
parents: 759
diff changeset
  1029
7472
363e4a5e9b0a net.dns: remove unused one-letter loop variables [luacheck]
Anton Shestakov <av6@dwimlabs.net>
parents: 7325
diff changeset
  1030
		for _, rr in pairs(response.answer) do
8900
102242a7ee60 net.dns: Cache all records from the 'answer' section (fixes #487)
Kim Alvefur <zash@zash.se>
parents: 8424
diff changeset
  1031
			self:remember(rr, rr.type);
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
  1032
		end
869
09019c452709 net.dns: Add methods necessary for allowing non-blocking DNS lookups
Matthew Wild <mwild1@gmail.com>
parents: 759
diff changeset
  1033
8901
e6ba0e5260b4 net.dns: Also cache records from the 'additional' section
Kim Alvefur <zash@zash.se>
parents: 8900
diff changeset
  1034
		for _, rr in pairs(response.additional) do
e6ba0e5260b4 net.dns: Also cache records from the 'additional' section
Kim Alvefur <zash@zash.se>
parents: 8900
diff changeset
  1035
			self:remember(rr, rr.type);
e6ba0e5260b4 net.dns: Also cache records from the 'additional' section
Kim Alvefur <zash@zash.se>
parents: 8900
diff changeset
  1036
		end
e6ba0e5260b4 net.dns: Also cache records from the 'additional' section
Kim Alvefur <zash@zash.se>
parents: 8900
diff changeset
  1037
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
  1038
		-- retire the query
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
  1039
		local queries = self.active[response.header.id];
2300
e182b5029ef2 net.dns: Port some DNS fixes to the resolver:feed() function for net.adns to use
Matthew Wild <mwild1@gmail.com>
parents: 2278
diff changeset
  1040
		queries[response.question.raw] = nil;
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
  1041
		if not next(queries) then self.active[response.header.id] = nil; end
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
  1042
		if not next(self.active) then self:closeall(); end
869
09019c452709 net.dns: Add methods necessary for allowing non-blocking DNS lookups
Matthew Wild <mwild1@gmail.com>
parents: 759
diff changeset
  1043
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
  1044
		-- was the query on the wanted list?
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
  1045
		local q = response.question[1];
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
  1046
		if q then
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
  1047
			local cos = get(self.wanted, q.class, q.type, q.name);
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
  1048
			if cos then
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
  1049
				for co in pairs(cos) do
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
  1050
					if coroutine.status(co) == "suspended" then coroutine.resume(co); end
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
  1051
				end
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
  1052
				set(self.wanted, q.class, q.type, q.name, nil);
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
  1053
			end
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
  1054
		end
2742
6c0a081cd766 net.dns: Trailing whitespace
Matthew Wild <mwild1@gmail.com>
parents: 2741
diff changeset
  1055
	end
869
09019c452709 net.dns: Add methods necessary for allowing non-blocking DNS lookups
Matthew Wild <mwild1@gmail.com>
parents: 759
diff changeset
  1056
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
  1057
	return response;
869
09019c452709 net.dns: Add methods necessary for allowing non-blocking DNS lookups
Matthew Wild <mwild1@gmail.com>
parents: 759
diff changeset
  1058
end
09019c452709 net.dns: Add methods necessary for allowing non-blocking DNS lookups
Matthew Wild <mwild1@gmail.com>
parents: 759
diff changeset
  1059
6309
b6f76a52eb36 net.dns: Ensure all pending requests get notified of a timeout when looking up a record (fix for d122420542fb)
Matthew Wild <mwild1@gmail.com>
parents: 6288
diff changeset
  1060
function resolver:cancel(qclass, qtype, qname)
3326
fb95015bc646 net.dns, net.adns: Update resolver:cancel() API so that a table doesn't need to be created for each cancellation internal to net.dns
Matthew Wild <mwild1@gmail.com>
parents: 3325
diff changeset
  1061
	local cos = get(self.wanted, qclass, qtype, qname);
1202
e69fafc14491 net.dns: Add support for cancelling a coroutine-based request
Matthew Wild <mwild1@gmail.com>
parents: 896
diff changeset
  1062
	if cos then
6309
b6f76a52eb36 net.dns: Ensure all pending requests get notified of a timeout when looking up a record (fix for d122420542fb)
Matthew Wild <mwild1@gmail.com>
parents: 6288
diff changeset
  1063
		for co in pairs(cos) do
b6f76a52eb36 net.dns: Ensure all pending requests get notified of a timeout when looking up a record (fix for d122420542fb)
Matthew Wild <mwild1@gmail.com>
parents: 6288
diff changeset
  1064
			if coroutine.status(co) == "suspended" then coroutine.resume(co); end
3325
b3117a1da834 net.dns, net.adns: Move coroutine-calling logic into resolver:cancel()
Matthew Wild <mwild1@gmail.com>
parents: 3324
diff changeset
  1065
		end
6309
b6f76a52eb36 net.dns: Ensure all pending requests get notified of a timeout when looking up a record (fix for d122420542fb)
Matthew Wild <mwild1@gmail.com>
parents: 6288
diff changeset
  1066
		set(self.wanted, qclass, qtype, qname, nil);
1202
e69fafc14491 net.dns: Add support for cancelling a coroutine-based request
Matthew Wild <mwild1@gmail.com>
parents: 896
diff changeset
  1067
	end
e69fafc14491 net.dns: Add support for cancelling a coroutine-based request
Matthew Wild <mwild1@gmail.com>
parents: 896
diff changeset
  1068
end
869
09019c452709 net.dns: Add methods necessary for allowing non-blocking DNS lookups
Matthew Wild <mwild1@gmail.com>
parents: 759
diff changeset
  1069
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
  1070
function resolver:pulse()    -- - - - - - - - - - - - - - - - - - - - -  pulse
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
  1071
	--print(':pulse');
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
  1072
	while self:receive() do end
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
  1073
	if not next(self.active) then return nil; end
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1074
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
  1075
	self.time = socket.gettime();
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
  1076
	for id,queries in pairs(self.active) do
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
  1077
		for question,o in pairs(queries) do
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
  1078
			if self.time >= o.retry then
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1079
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
  1080
				o.server = o.server + 1;
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
  1081
				if o.server > #self.server then
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
  1082
					o.server = 1;
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
  1083
					o.delay = o.delay + 1;
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
  1084
				end
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1085
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
  1086
				if o.delay > #self.delays then
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
  1087
					--print('timeout');
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
  1088
					queries[question] = nil;
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
  1089
					if not next(queries) then self.active[id] = nil; end
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
  1090
					if not next(self.active) then return nil; end
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
  1091
				else
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
  1092
					--print('retry', o.server, o.delay);
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
  1093
					local _a = self.socket[o.server];
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
  1094
					if _a then _a:send(o.packet); end
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
  1095
					o.retry = self.time + self.delays[o.delay];
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
  1096
				end
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
  1097
			end
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
  1098
		end
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
  1099
	end
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1100
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
  1101
	if next(self.active) then return true; end
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
  1102
	return nil;
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
  1103
end
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1104
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1105
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
  1106
function resolver:lookup(qname, qtype, qclass)    -- - - - - - - - - -  lookup
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
  1107
	self:query (qname, qtype, qclass)
3049
e54774bd73a7 net/dns: Fix socket.select timeout.
Brian Cully <bjc@junctionnetworks.com>
parents: 2742
diff changeset
  1108
	while self:pulse() do
3540
bc139431830b Monster whitespace commit (beware the whitespace monster).
Waqas Hussain <waqas20@gmail.com>
parents: 3513
diff changeset
  1109
		local recvt = {}
bc139431830b Monster whitespace commit (beware the whitespace monster).
Waqas Hussain <waqas20@gmail.com>
parents: 3513
diff changeset
  1110
		for i, s in ipairs(self.socket) do
bc139431830b Monster whitespace commit (beware the whitespace monster).
Waqas Hussain <waqas20@gmail.com>
parents: 3513
diff changeset
  1111
			recvt[i] = s
bc139431830b Monster whitespace commit (beware the whitespace monster).
Waqas Hussain <waqas20@gmail.com>
parents: 3513
diff changeset
  1112
		end
bc139431830b Monster whitespace commit (beware the whitespace monster).
Waqas Hussain <waqas20@gmail.com>
parents: 3513
diff changeset
  1113
		socket.select(recvt, nil, 4)
bc139431830b Monster whitespace commit (beware the whitespace monster).
Waqas Hussain <waqas20@gmail.com>
parents: 3513
diff changeset
  1114
	end
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
  1115
	--print(self.cache);
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
  1116
	return self:peek(qname, qtype, qclass);
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
  1117
end
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1118
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
  1119
function resolver:lookupex(handler, qname, qtype, qclass)    -- - - - - - - - - -  lookup
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
  1120
	return self:peek(qname, qtype, qclass) or self:query(qname, qtype, qclass);
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
  1121
end
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1122
3746
9719316c854e net.dns: Add resolver:tohostname() and dns.tohostname()
Matthew Wild <mwild1@gmail.com>
parents: 3719
diff changeset
  1123
function resolver:tohostname(ip)
9719316c854e net.dns: Add resolver:tohostname() and dns.tohostname()
Matthew Wild <mwild1@gmail.com>
parents: 3719
diff changeset
  1124
	return dns.lookup(ip:gsub("(%d+)%.(%d+)%.(%d+)%.(%d+)", "%4.%3.%2.%1.in-addr.arpa."), "PTR");
9719316c854e net.dns: Add resolver:tohostname() and dns.tohostname()
Matthew Wild <mwild1@gmail.com>
parents: 3719
diff changeset
  1125
end
869
09019c452709 net.dns: Add methods necessary for allowing non-blocking DNS lookups
Matthew Wild <mwild1@gmail.com>
parents: 759
diff changeset
  1126
09019c452709 net.dns: Add methods necessary for allowing non-blocking DNS lookups
Matthew Wild <mwild1@gmail.com>
parents: 759
diff changeset
  1127
--print ---------------------------------------------------------------- print
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1128
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1129
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1130
local hints = {    -- - - - - - - - - - - - - - - - - - - - - - - - - - - hints
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
  1131
	qr = { [0]='query', 'response' },
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
  1132
	opcode = { [0]='query', 'inverse query', 'server status request' },
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
  1133
	aa = { [0]='non-authoritative', 'authoritative' },
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
  1134
	tc = { [0]='complete', 'truncated' },
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
  1135
	rd = { [0]='recursion not desired', 'recursion desired' },
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
  1136
	ra = { [0]='recursion not available', 'recursion available' },
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
  1137
	z  = { [0]='(reserved)' },
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
  1138
	rcode = { [0]='no error', 'format error', 'server failure', 'name error', 'not implemented' },
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1139
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
  1140
	type = dns.type,
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
  1141
	class = dns.class
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
  1142
};
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1143
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1144
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
  1145
local function hint(p, s)    -- - - - - - - - - - - - - - - - - - - - - - hint
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
  1146
	return (hints[s] and hints[s][p[s]]) or '';
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
  1147
end
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1148
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1149
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
  1150
function resolver.print(response)    -- - - - - - - - - - - - - resolver.print
7483
3dc7de31d3d1 net.dns: don't use "for s,s in pairs..." (unused loop variable s) [luacheck]
Anton Shestakov <av6@dwimlabs.net>
parents: 7472
diff changeset
  1151
	for _, s in pairs { 'id', 'qr', 'opcode', 'aa', 'tc', 'rd', 'ra', 'z',
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
  1152
						'rcode', 'qdcount', 'ancount', 'nscount', 'arcount' } do
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
  1153
		print( string.format('%-30s', 'header.'..s), response.header[s], hint(response.header, s) );
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
  1154
	end
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1155
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
  1156
	for i,question in ipairs(response.question) do
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
  1157
		print(string.format ('question[%i].name         ', i), question.name);
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
  1158
		print(string.format ('question[%i].type         ', i), question.type);
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
  1159
		print(string.format ('question[%i].class        ', i), question.class);
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
  1160
	end
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1161
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
  1162
	local common = { name=1, type=1, class=1, ttl=1, rdlength=1, rdata=1 };
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
  1163
	local tmp;
7483
3dc7de31d3d1 net.dns: don't use "for s,s in pairs..." (unused loop variable s) [luacheck]
Anton Shestakov <av6@dwimlabs.net>
parents: 7472
diff changeset
  1164
	for _, s in pairs({'answer', 'authority', 'additional'}) do
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
  1165
		for i,rr in pairs(response[s]) do
7503
4c519444d4a2 net.dns: remove unused one-letter loop variables [luacheck]
Anton Shestakov <av6@dwimlabs.net>
parents: 7483
diff changeset
  1166
			for _, t in pairs({ 'name', 'type', 'class', 'ttl', 'rdlength' }) do
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
  1167
				tmp = string.format('%s[%i].%s', s, i, t);
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
  1168
				print(string.format('%-30s', tmp), rr[t], hint(rr, t));
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
  1169
			end
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
  1170
			for j,t in pairs(rr) do
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
  1171
				if not common[j] then
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
  1172
					tmp = string.format('%s[%i].%s', s, i, j);
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
  1173
					print(string.format('%-30s  %s', tostring(tmp), tostring(t)));
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
  1174
				end
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
  1175
			end
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
  1176
		end
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
  1177
	end
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
  1178
end
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1179
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1180
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1181
-- module api ------------------------------------------------------ module api
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1182
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1183
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1184
function dns.resolver ()    -- - - - - - - - - - - - - - - - - - - - - resolver
6310
d232bb1bbe1e net.dns: Remove unused obsolete code
Matthew Wild <mwild1@gmail.com>
parents: 6309
diff changeset
  1185
	local r = { active = {}, cache = {}, unsorted = {}, wanted = {}, best_server = 1 };
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
  1186
	setmetatable (r, resolver);
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
  1187
	setmetatable (r.cache, cache_metatable);
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
  1188
	setmetatable (r.unsorted, { __mode = 'kv' });
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
  1189
	return r;
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
  1190
end
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1191
2573
60493186fef6 net.dns: Removed some useless indirection to improve readability.
Waqas Hussain <waqas20@gmail.com>
parents: 2425
diff changeset
  1192
local _resolver = dns.resolver();
60493186fef6 net.dns: Removed some useless indirection to improve readability.
Waqas Hussain <waqas20@gmail.com>
parents: 2425
diff changeset
  1193
dns._resolver = _resolver;
10980
540f1bc5f082 net.dns: Disable jitter for default resolver (used by blocking dns.lookup() calls)
Matthew Wild <mwild1@gmail.com>
parents: 10963
diff changeset
  1194
_resolver.jitter, _resolver.retry_jitter = false, false;
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1195
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
  1196
function dns.lookup(...)    -- - - - - - - - - - - - - - - - - - - - -  lookup
2573
60493186fef6 net.dns: Removed some useless indirection to improve readability.
Waqas Hussain <waqas20@gmail.com>
parents: 2425
diff changeset
  1197
	return _resolver:lookup(...);
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
  1198
end
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1199
3746
9719316c854e net.dns: Add resolver:tohostname() and dns.tohostname()
Matthew Wild <mwild1@gmail.com>
parents: 3719
diff changeset
  1200
function dns.tohostname(...)
9719316c854e net.dns: Add resolver:tohostname() and dns.tohostname()
Matthew Wild <mwild1@gmail.com>
parents: 3719
diff changeset
  1201
	return _resolver:tohostname(...);
9719316c854e net.dns: Add resolver:tohostname() and dns.tohostname()
Matthew Wild <mwild1@gmail.com>
parents: 3719
diff changeset
  1202
end
9719316c854e net.dns: Add resolver:tohostname() and dns.tohostname()
Matthew Wild <mwild1@gmail.com>
parents: 3719
diff changeset
  1203
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
  1204
function dns.purge(...)    -- - - - - - - - - - - - - - - - - - - - - -  purge
2573
60493186fef6 net.dns: Removed some useless indirection to improve readability.
Waqas Hussain <waqas20@gmail.com>
parents: 2425
diff changeset
  1205
	return _resolver:purge(...);
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
  1206
end
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1207
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
  1208
function dns.peek(...)    -- - - - - - - - - - - - - - - - - - - - - - -  peek
2573
60493186fef6 net.dns: Removed some useless indirection to improve readability.
Waqas Hussain <waqas20@gmail.com>
parents: 2425
diff changeset
  1209
	return _resolver:peek(...);
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
  1210
end
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1211
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
  1212
function dns.query(...)    -- - - - - - - - - - - - - - - - - - - - - -  query
2573
60493186fef6 net.dns: Removed some useless indirection to improve readability.
Waqas Hussain <waqas20@gmail.com>
parents: 2425
diff changeset
  1213
	return _resolver:query(...);
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
  1214
end
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1215
2575
8f4d69940132 net.dns: Fixed whitespace/indentation.
Waqas Hussain <waqas20@gmail.com>
parents: 2574
diff changeset
  1216
function dns.feed(...)    -- - - - - - - - - - - - - - - - - - - - - - -  feed
2573
60493186fef6 net.dns: Removed some useless indirection to improve readability.
Waqas Hussain <waqas20@gmail.com>
parents: 2425
diff changeset
  1217
	return _resolver:feed(...);
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
  1218
end
869
09019c452709 net.dns: Add methods necessary for allowing non-blocking DNS lookups
Matthew Wild <mwild1@gmail.com>
parents: 759
diff changeset
  1219
2575
8f4d69940132 net.dns: Fixed whitespace/indentation.
Waqas Hussain <waqas20@gmail.com>
parents: 2574
diff changeset
  1220
function dns.cancel(...)  -- - - - - - - - - - - - - - - - - - - - - -  cancel
2573
60493186fef6 net.dns: Removed some useless indirection to improve readability.
Waqas Hussain <waqas20@gmail.com>
parents: 2425
diff changeset
  1221
	return _resolver:cancel(...);
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
  1222
end
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1223
3328
5ac4fbbfb74d net.dns: Add dns.settimeout() to set the timeout for the default resolver
Matthew Wild <mwild1@gmail.com>
parents: 3327
diff changeset
  1224
function dns.settimeout(...)
5ac4fbbfb74d net.dns: Add dns.settimeout() to set the timeout for the default resolver
Matthew Wild <mwild1@gmail.com>
parents: 3327
diff changeset
  1225
	return _resolver:settimeout(...);
5ac4fbbfb74d net.dns: Add dns.settimeout() to set the timeout for the default resolver
Matthew Wild <mwild1@gmail.com>
parents: 3327
diff changeset
  1226
end
5ac4fbbfb74d net.dns: Add dns.settimeout() to set the timeout for the default resolver
Matthew Wild <mwild1@gmail.com>
parents: 3327
diff changeset
  1227
5566
74ae3e7e8779 net.dns: Add nicer API to cached records
Kim Alvefur <zash@zash.se>
parents: 5340
diff changeset
  1228
function dns.cache()
74ae3e7e8779 net.dns: Add nicer API to cached records
Kim Alvefur <zash@zash.se>
parents: 5340
diff changeset
  1229
	return _resolver.cache;
74ae3e7e8779 net.dns: Add nicer API to cached records
Kim Alvefur <zash@zash.se>
parents: 5340
diff changeset
  1230
end
74ae3e7e8779 net.dns: Add nicer API to cached records
Kim Alvefur <zash@zash.se>
parents: 5340
diff changeset
  1231
2578
61e5eff54415 net.dns, net.adns: Changed dns:socket_wrapper_set to dns.socket_wrapper_set for consistency.
Waqas Hussain <waqas20@gmail.com>
parents: 2575
diff changeset
  1232
function dns.socket_wrapper_set(...)    -- - - - - - - - -  socket_wrapper_set
2573
60493186fef6 net.dns: Removed some useless indirection to improve readability.
Waqas Hussain <waqas20@gmail.com>
parents: 2425
diff changeset
  1233
	return _resolver:socket_wrapper_set(...);
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
  1234
end
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1235
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
  1236
return dns;