net/dns.lua
author Matthew Wild <mwild1@gmail.com>
Thu, 03 Dec 2009 01:13:06 +0000
changeset 2301 8a01b0898679
parent 2300 e182b5029ef2
child 2387 92264ee3a0e4
permissions -rw-r--r--
net.dns: Fix for blocking dns lookups to find waiting coroutines correctly (not that we use this in Prosody...)
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
-- public domain 20080404 lua@ztact.com
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     6
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     7
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     8
-- todo: quick (default) header generation
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     9
-- todo: nxdomain, error handling
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    10
-- todo: cache results of encodeName
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    11
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    12
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    13
-- reference: http://tools.ietf.org/html/rfc1035
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    14
-- reference: http://tools.ietf.org/html/rfc1876 (LOC)
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    15
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    16
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
    17
local socket = require "socket";
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
    18
local ztact = require "util.ztact";
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
    19
local _, windows = pcall(require, "util.windows");
0ed6369605bf net.dns: Updated to use util.windows.get_nameservers for enumerating nameservers on Windows.
Waqas Hussain <waqas20@gmail.com>
parents: 2027
diff changeset
    20
local is_windows = (_ and windows) or os.getenv("WINDIR");
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    21
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
    22
local coroutine, io, math, string, table =
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
    23
      coroutine, io, math, string, table;
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    24
1202
e69fafc14491 net.dns: Add support for cancelling a coroutine-based request
Matthew Wild <mwild1@gmail.com>
parents: 896
diff changeset
    25
local ipairs, next, pairs, print, setmetatable, tostring, assert, error, unpack =
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
    26
      ipairs, next, pairs, print, setmetatable, tostring, assert, error, unpack;
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    27
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
    28
local get, set = ztact.get, ztact.set;
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    29
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    30
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    31
-------------------------------------------------- module dns
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
    32
module('dns')
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    33
local dns = _M;
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    34
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    35
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    36
-- dns type & class codes ------------------------------ dns type & class codes
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    37
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    38
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    39
local append = table.insert
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    40
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    41
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
    42
local function highbyte(i)    -- - - - - - - - - - - - - - - - - - -  highbyte
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
    43
	return (i-(i%0x100))/0x100;
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
    44
end
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    45
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    46
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    47
local function augment (t)    -- - - - - - - - - - - - - - - - - - - -  augment
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
    48
	local a = {};
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
    49
	for i,s in pairs(t) do
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
    50
		a[i] = s;
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
    51
		a[s] = s;
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
    52
		a[string.lower(s)] = s;
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
    53
	end
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
    54
	return a;
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
    55
end
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    56
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    57
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    58
local function encode (t)    -- - - - - - - - - - - - - - - - - - - - -  encode
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
    59
	local code = {};
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
    60
	for i,s in pairs(t) do
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
    61
		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
    62
		code[i] = word;
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
    63
		code[s] = word;
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
    64
		code[string.lower(s)] = word;
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
    65
	end
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
    66
	return code;
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
    67
end
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    68
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    69
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    70
dns.types = {
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
    71
	'A', 'NS', 'MD', 'MF', 'CNAME', 'SOA', 'MB', 'MG', 'MR', 'NULL', 'WKS',
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
    72
	'PTR', 'HINFO', 'MINFO', 'MX', 'TXT',
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
    73
	[ 28] = 'AAAA', [ 29] = 'LOC',   [ 33] = 'SRV',
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
    74
	[252] = 'AXFR', [253] = 'MAILB', [254] = 'MAILA', [255] = '*' };
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    75
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    76
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
    77
dns.classes = { 'IN', 'CS', 'CH', 'HS', [255] = '*' };
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    78
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    79
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
    80
dns.type      = augment (dns.types);
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
    81
dns.class     = augment (dns.classes);
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
    82
dns.typecode  = encode  (dns.types);
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
    83
dns.classcode = encode  (dns.classes);
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    84
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
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
    87
local function standardize(qname, qtype, qclass)    -- - - - - - - standardize
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
    88
	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
    89
	qname = string.lower(qname);
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
    90
	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
    91
end
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    92
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    93
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
    94
local function prune(rrs, time, soft)    -- - - - - - - - - - - - - - -  prune
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
    95
	time = time or socket.gettime();
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
    96
	for i,rr in pairs(rrs) do
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
    97
		if rr.tod then
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
    98
			-- rr.tod = rr.tod - 50    -- accelerated decripitude
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
    99
			rr.ttl = math.floor(rr.tod - time);
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   100
			if rr.ttl <= 0 then
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   101
				table.remove(rrs, i);
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   102
				return prune(rrs, time, soft); -- Re-iterate
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   103
			end
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   104
		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
   105
			assert(rr.ttl == 0);
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   106
			rrs[i] = nil;
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   107
		end
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   108
	end
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   109
end
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   110
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   111
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   112
-- metatables & co. ------------------------------------------ metatables & co.
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
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   115
local resolver = {};
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   116
resolver.__index = resolver;
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   117
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   118
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   119
local SRV_tostring;
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   120
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   121
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   122
local rr_metatable = {};   -- - - - - - - - - - - - - - - - - - -  rr_metatable
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   123
function rr_metatable.__tostring(rr)
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   124
	local s0 = string.format('%2s %-5s %6i %-28s', rr.class, rr.type, rr.ttl, rr.name);
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   125
	local s1 = '';
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   126
	if rr.type == 'A' then
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   127
		s1 = ' '..rr.a;
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   128
	elseif rr.type == 'MX' then
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   129
		s1 = string.format(' %2i %s', rr.pref, rr.mx);
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   130
	elseif rr.type == 'CNAME' then
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   131
		s1 = ' '..rr.cname;
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   132
	elseif rr.type == 'LOC' then
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   133
		s1 = ' '..resolver.LOC_tostring(rr);
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   134
	elseif rr.type == 'NS' then
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   135
		s1 = ' '..rr.ns;
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   136
	elseif rr.type == 'SRV' then
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   137
		s1 = ' '..SRV_tostring(rr);
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   138
	elseif rr.type == 'TXT' then
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   139
		s1 = ' '..rr.txt;
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   140
	else
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   141
		s1 = ' <UNKNOWN RDATA TYPE>';
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   142
	end
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   143
	return s0..s1;
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   144
end
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   145
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   146
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   147
local rrs_metatable = {};    -- - - - - - - - - - - - - - - - - -  rrs_metatable
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   148
function rrs_metatable.__tostring(rrs)
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   149
	local t = {};
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   150
	for i,rr in pairs(rrs) do
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   151
		append(t, tostring(rr)..'\n');
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   152
	end
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   153
	return table.concat(t);
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   154
end
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   155
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   156
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   157
local cache_metatable = {};    -- - - - - - - - - - - - - - - -  cache_metatable
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   158
function cache_metatable.__tostring(cache)
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   159
	local time = socket.gettime();
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   160
	local t = {};
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   161
	for class,types in pairs(cache) do
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   162
		for type,names in pairs(types) do
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   163
			for name,rrs in pairs(names) do
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   164
				prune(rrs, time);
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   165
				append(t, tostring(rrs));
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   166
			end
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   167
		end
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   168
	end
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   169
	return table.concat(t);
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   170
end
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   171
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   172
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   173
function resolver:new()    -- - - - - - - - - - - - - - - - - - - - - resolver
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   174
	local r = { active = {}, cache = {}, unsorted = {} };
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   175
	setmetatable(r, resolver);
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   176
	setmetatable(r.cache, cache_metatable);
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   177
	setmetatable(r.unsorted, { __mode = 'kv' });
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   178
	return r;
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   179
end
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   180
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   181
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   182
-- packet layer -------------------------------------------------- packet layer
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   183
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   184
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   185
function dns.random(...)    -- - - - - - - - - - - - - - - - - - -  dns.random
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   186
	math.randomseed(10000*socket.gettime());
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   187
	dns.random = math.random;
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   188
	return dns.random(...);
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   189
end
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   190
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   191
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   192
local function encodeHeader(o)    -- - - - - - - - - - - - - - -  encodeHeader
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   193
	o = o or {};
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   194
	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
   195
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   196
	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
   197
	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
   198
	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
   199
	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
   200
				--  1 inverse query
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   201
				--	2 server status request
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   202
				--	3-15 reserved
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   203
	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
   204
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   205
	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
   206
				--	1 format error
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   207
				--	2 server failure
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   208
				--	3 name error
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   209
				--	4 not implemented
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   210
				--	5 refused
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   211
				--	6-15 reserved
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   212
	o.z = o.z  or 0;		--  3b  0 resvered
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   213
	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
   214
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   215
	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
   216
	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
   217
	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
   218
	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
   219
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   220
	-- 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
   221
	local header = string.char(
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   222
		highbyte(o.id), o.id %0x100,
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   223
		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
   224
		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
   225
		highbyte(o.qdcount),  o.qdcount %0x100,
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   226
		highbyte(o.ancount),  o.ancount %0x100,
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   227
		highbyte(o.nscount),  o.nscount %0x100,
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   228
		highbyte(o.arcount),  o.arcount %0x100
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   229
	);
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   230
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   231
	return header, o.id;
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   232
end
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   233
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   234
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   235
local function encodeName(name)    -- - - - - - - - - - - - - - - - encodeName
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   236
	local t = {};
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   237
	for part in string.gmatch(name, '[^.]+') do
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   238
		append(t, string.char(string.len(part)));
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   239
		append(t, part);
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   240
	end
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   241
	append(t, string.char(0));
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   242
	return table.concat(t);
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   243
end
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   244
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   245
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   246
local function encodeQuestion(qname, qtype, qclass)    -- - - - encodeQuestion
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   247
	qname  = encodeName(qname);
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   248
	qtype  = dns.typecode[qtype or 'a'];
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   249
	qclass = dns.classcode[qclass or 'in'];
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   250
	return qname..qtype..qclass;
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   251
end
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   252
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   253
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   254
function resolver:byte(len)    -- - - - - - - - - - - - - - - - - - - - - byte
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   255
	len = len or 1;
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   256
	local offset = self.offset;
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   257
	local last = offset + len - 1;
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   258
	if last > #self.packet then
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   259
		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
   260
	end
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   261
	self.offset = offset + len;
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   262
	return string.byte(self.packet, offset, last);
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   263
end
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   264
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   265
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   266
function resolver:word()    -- - - - - - - - - - - - - - - - - - - - - -  word
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   267
	local b1, b2 = self:byte(2);
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   268
	return 0x100*b1 + b2;
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   269
end
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   270
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   271
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   272
function resolver:dword ()    -- - - - - - - - - - - - - - - - - - - - -  dword
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   273
	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
   274
	--print('dword', b1, b2, b3, b4);
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   275
	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
   276
end
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   277
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   278
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   279
function resolver:sub(len)    -- - - - - - - - - - - - - - - - - - - - - - sub
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   280
	len = len or 1;
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   281
	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
   282
	self.offset = self.offset + len;
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   283
	return s;
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   284
end
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   285
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   286
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   287
function resolver:header(force)    -- - - - - - - - - - - - - - - - - - header
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   288
	local id = self:word();
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   289
	--print(string.format(':header  id  %x', id));
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   290
	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
   291
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   292
	local h = { id = id };
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   293
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   294
	local b1, b2 = self:byte(2);
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   295
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   296
	h.rd      = b1 %2;
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   297
	h.tc      = b1 /2%2;
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   298
	h.aa      = b1 /4%2;
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   299
	h.opcode  = b1 /8%16;
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   300
	h.qr      = b1 /128;
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   301
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   302
	h.rcode   = b2 %16;
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   303
	h.z       = b2 /16%8;
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   304
	h.ra      = b2 /128;
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   305
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   306
	h.qdcount = self:word();
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   307
	h.ancount = self:word();
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   308
	h.nscount = self:word();
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   309
	h.arcount = self:word();
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   310
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   311
	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
   312
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   313
	return h;
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
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   317
function resolver:name()    -- - - - - - - - - - - - - - - - - - - - - -  name
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   318
	local remember, pointers = nil, 0;
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   319
	local len = self:byte();
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   320
	local n = {};
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   321
	while len > 0 do
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   322
		if len >= 0xc0 then    -- name is "compressed"
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   323
			pointers = pointers + 1;
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   324
			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
   325
			local offset = ((len-0xc0)*0x100) + self:byte();
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   326
			remember = remember or self.offset;
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   327
			self.offset = offset + 1;    -- +1 for lua
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   328
		else    -- name is not compressed
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   329
			append(n, self:sub(len)..'.');
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   330
		end
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   331
		len = self:byte();
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   332
	end
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   333
	self.offset = remember or self.offset;
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   334
	return table.concat(n);
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   335
end
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   336
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   337
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   338
function resolver:question()    -- - - - - - - - - - - - - - - - - -  question
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   339
	local q = {};
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   340
	q.name  = self:name();
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   341
	q.type  = dns.type[self:word()];
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   342
	q.class = dns.class[self:word()];
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   343
	return q;
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   344
end
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   345
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   346
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   347
function resolver:A(rr)    -- - - - - - - - - - - - - - - - - - - - - - - -  A
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   348
	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
   349
	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
   350
end
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   351
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   352
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   353
function resolver:CNAME(rr)    -- - - - - - - - - - - - - - - - - - - -  CNAME
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   354
	rr.cname = self:name();
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   355
end
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   356
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   357
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   358
function resolver:MX(rr)    -- - - - - - - - - - - - - - - - - - - - - - -  MX
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   359
	rr.pref = self:word();
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   360
	rr.mx   = self:name();
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   361
end
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   362
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   363
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   364
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
   365
	local b = self:byte();
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   366
	--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
   367
	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
   368
end
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   369
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   370
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   371
function resolver:LOC(rr)    -- - - - - - - - - - - - - - - - - - - - - -  LOC
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   372
	rr.version = self:byte();
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   373
	if rr.version == 0 then
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   374
		rr.loc           = rr.loc or {};
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   375
		rr.loc.size      = self:LOC_nibble_power();
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   376
		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
   377
		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
   378
		rr.loc.latitude  = self:dword();
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   379
		rr.loc.longitude = self:dword();
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   380
		rr.loc.altitude  = self:dword();
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   381
	end
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   382
end
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   383
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   384
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   385
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
   386
	f = f - 0x80000000;
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   387
	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
   388
	local deg, min, msec;
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   389
	msec = f%60000;
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   390
	f    = (f-msec)/60000;
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   391
	min  = f%60;
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   392
	deg = (f-min)/60;
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   393
	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
   394
end
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   395
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   396
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   397
function resolver.LOC_tostring(rr)    -- - - - - - - - - - - - -  LOC_tostring
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   398
	local t = {};
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   399
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   400
	--[[
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   401
	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
   402
		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
   403
	end
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   404
	--]]
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   405
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   406
	append(t, string.format(
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   407
		'%s    %s    %.2fm %.2fm %.2fm %.2fm',
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   408
		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
   409
		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
   410
		(rr.loc.altitude - 10000000) / 100,
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   411
		rr.loc.size / 100,
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   412
		rr.loc.horiz_pre / 100,
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   413
		rr.loc.vert_pre / 100
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   414
	));
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   415
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   416
	return table.concat(t);
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   417
end
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   418
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   419
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   420
function resolver:NS(rr)    -- - - - - - - - - - - - - - - - - - - - - - -  NS
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   421
	rr.ns = self:name();
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   422
end
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   423
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   424
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   425
function resolver:SOA(rr)    -- - - - - - - - - - - - - - - - - - - - - -  SOA
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   426
end
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   427
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
function resolver:SRV(rr)    -- - - - - - - - - - - - - - - - - - - - - -  SRV
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   430
	  rr.srv = {};
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   431
	  rr.srv.priority = self:word();
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   432
	  rr.srv.weight   = self:word();
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   433
	  rr.srv.port     = self:word();
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   434
	  rr.srv.target   = self:name();
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   435
end
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   436
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   437
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   438
function SRV_tostring(rr)    -- - - - - - - - - - - - - - - - - - SRV_tostring
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   439
	local s = rr.srv;
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   440
	return string.format( '%5d %5d %5d %s', s.priority, s.weight, s.port, s.target );
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   441
end
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   442
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   443
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   444
function resolver:TXT(rr)    -- - - - - - - - - - - - - - - - - - - - - -  TXT
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   445
	rr.txt = self:sub (rr.rdlength);
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   446
end
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   447
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   448
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   449
function resolver:rr()    -- - - - - - - - - - - - - - - - - - - - - - - -  rr
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   450
	local rr = {};
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   451
	setmetatable(rr, rr_metatable);
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   452
	rr.name     = self:name(self);
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   453
	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
   454
	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
   455
	rr.ttl      = 0x10000*self:word() + self:word();
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   456
	rr.rdlength = self:word();
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   457
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   458
	if rr.ttl <= 0 then
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   459
		rr.tod = self.time + 30;
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   460
	else
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   461
		rr.tod = self.time + rr.ttl;
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   462
	end
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   463
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   464
	local remember = self.offset;
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   465
	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
   466
	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
   467
	self.offset = remember;
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   468
	rr.rdata = self:sub(rr.rdlength);
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   469
	return rr;
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   470
end
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   471
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
function resolver:rrs (count)    -- - - - - - - - - - - - - - - - - - - - - rrs
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   474
	local rrs = {};
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   475
	for i = 1,count do append(rrs, self:rr()); end
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   476
	return rrs;
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   477
end
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   478
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   479
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   480
function resolver:decode(packet, force)    -- - - - - - - - - - - - - - decode
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   481
	self.packet, self.offset = packet, 1;
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   482
	local header = self:header(force);
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   483
	if not header then return nil; end
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   484
	local response = { header = header };
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   485
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   486
	response.question = {};
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   487
	local offset = self.offset;
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   488
	for i = 1,response.header.qdcount do
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   489
		append(response.question, self:question());
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   490
	end
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   491
	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
   492
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   493
	if not force then
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   494
		if not self.active[response.header.id] or not self.active[response.header.id][response.question.raw] then
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   495
			return nil;
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   496
		end
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   497
	end
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   498
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   499
	response.answer     = self:rrs(response.header.ancount);
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   500
	response.authority  = self:rrs(response.header.nscount);
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   501
	response.additional = self:rrs(response.header.arcount);
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   502
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   503
	return response;
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   504
end
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   505
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   506
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   507
-- socket layer -------------------------------------------------- socket layer
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   508
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   509
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   510
resolver.delays = { 1, 3 };
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   511
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   512
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   513
function resolver:addnameserver(address)    -- - - - - - - - - - addnameserver
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   514
	self.server = self.server or {};
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   515
	append(self.server, address);
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   516
end
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   517
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   518
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   519
function resolver:setnameserver(address)    -- - - - - - - - - - setnameserver
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   520
	self.server = {};
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   521
	self:addnameserver(address);
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:adddefaultnameservers()    -- - - - -  adddefaultnameservers
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   526
	if is_windows then
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   527
		if windows then
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   528
			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
   529
				self:addnameserver(server);
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   530
			end
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   531
		end
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   532
		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
   533
			-- 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
   534
			self:addnameserver("208.67.222.222");
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   535
			self:addnameserver("208.67.220.220") ; 	
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   536
		end
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   537
	else -- posix
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   538
		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
   539
		if resolv_conf then
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   540
			for line in resolv_conf:lines() do
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   541
				local address = line:gsub("#.*$", ""):match('^%s*nameserver%s+(%d+%.%d+%.%d+%.%d+)%s*$');
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   542
				if address then self:addnameserver(address) end
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   543
			end
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   544
		end
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   545
		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
   546
			-- 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
   547
			self:addnameserver("127.0.0.1");
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
399
93b6587d9afb Added temporary fix for srv on windows: using opendns nameservers
Waqas Hussain <waqas20@gmail.com>
parents: 379
diff changeset
   550
end
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   551
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   552
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   553
function resolver:getsocket(servernum)    -- - - - - - - - - - - - - getsocket
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   554
	self.socket = self.socket or {};
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   555
	self.socketset = self.socketset or {};
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   556
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   557
	local sock = self.socket[servernum];
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   558
	if sock then return sock; end
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   559
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   560
	sock = socket.udp();
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   561
	if self.socket_wrapper then sock = self.socket_wrapper(sock, self); end
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   562
	sock:settimeout(0);
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   563
	-- 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
   564
	sock:setsockname('*', 0);
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   565
	sock:setpeername(self.server[servernum], 53);
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   566
	self.socket[servernum] = sock;
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   567
	self.socketset[sock] = servernum;
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   568
	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
   569
end
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   570
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   571
function resolver:voidsocket(sock)
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   572
	if self.socket[sock] then
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   573
		self.socketset[self.socket[sock]] = nil;
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   574
		self.socket[sock] = nil;
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   575
	elseif self.socketset[sock] then
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   576
		self.socket[self.socketset[sock]] = nil;
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   577
		self.socketset[sock] = nil;
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   578
	end
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   579
end
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   580
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   581
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
   582
	self.socket_wrapper = func;
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   583
end
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   584
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
function resolver:closeall ()    -- - - - - - - - - - - - - - - - - -  closeall
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   587
	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
   588
		self.socket[i] = nil;
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   589
		self.socketset[sock] = nil;
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   590
		sock:close();
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   591
	end
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   592
end
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   593
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   594
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   595
function resolver:remember(rr, type)    -- - - - - - - - - - - - - -  remember
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   596
	--print ('remember', type, rr.class, rr.type, rr.name)
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   597
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   598
	if type ~= '*' then
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   599
		type = rr.type;
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   600
		local all = get(self.cache, rr.class, '*', rr.name);
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   601
		--print('remember all', all);
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   602
		if all then append(all, rr); end
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   603
	end
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   604
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   605
	self.cache = self.cache or setmetatable({}, cache_metatable);
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   606
	local rrs = get(self.cache, rr.class, type, rr.name) or
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   607
		set(self.cache, rr.class, type, rr.name, setmetatable({}, rrs_metatable));
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   608
	append(rrs, rr);
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   609
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   610
	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
   611
end
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   612
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   613
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   614
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
   615
	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
   616
end
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   617
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   618
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   619
function resolver:peek (qname, qtype, qclass)    -- - - - - - - - - - - -  peek
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   620
	qname, qtype, qclass = standardize(qname, qtype, qclass);
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   621
	local rrs = get(self.cache, qclass, qtype, qname);
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   622
	if not rrs then return nil; end
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   623
	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
   624
		set(self.cache, qclass, qtype, qname, nil);
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   625
		return nil;
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   626
	end
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   627
	if self.unsorted[rrs] then table.sort (rrs, comp_mx); end
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   628
	return rrs;
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   629
end
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   630
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   631
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   632
function resolver:purge(soft)    -- - - - - - - - - - - - - - - - - - -  purge
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   633
	if soft == 'soft' then
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   634
		self.time = socket.gettime();
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   635
		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
   636
			for type,names in pairs(types) do
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   637
				for name,rrs in pairs(names) do
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   638
					prune(rrs, self.time, 'soft')
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   639
				end
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   640
			end
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   641
		end
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   642
	else self.cache = {}; end
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   643
end
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   644
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
function resolver:query(qname, qtype, qclass)    -- - - - - - - - - - -- query
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   647
	qname, qtype, qclass = standardize(qname, qtype, qclass)
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   648
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   649
	if not self.server then self:adddefaultnameservers(); end
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   650
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   651
	local question = encodeQuestion(qname, qtype, qclass);
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   652
	local peek = self:peek (qname, qtype, qclass);
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   653
	if peek then return peek; end
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   654
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   655
	local header, id = encodeHeader();
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   656
	--print ('query  id', id, qclass, qtype, qname)
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   657
	local o = {
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   658
		packet = header..question,
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   659
		server = self.best_server,
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   660
		delay  = 1,
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   661
		retry  = socket.gettime() + self.delays[1]
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   662
	};
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   663
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   664
  -- remember the query
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   665
	self.active[id] = self.active[id] or {};
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   666
	self.active[id][question] = o;
337
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
  -- remember which coroutine wants the answer
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   669
	local co = coroutine.running();
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   670
	if co then
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   671
		set(self.wanted, qclass, qtype, qname, co, true);
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   672
		--set(self.yielded, co, qclass, qtype, qname, true);
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   673
	end
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
   674
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   675
	self:getsocket (o.server):send (o.packet)
869
09019c452709 net.dns: Add methods necessary for allowing non-blocking DNS lookups
Matthew Wild <mwild1@gmail.com>
parents: 759
diff changeset
   676
end
09019c452709 net.dns: Add methods necessary for allowing non-blocking DNS lookups
Matthew Wild <mwild1@gmail.com>
parents: 759
diff changeset
   677
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
   678
function resolver:servfail(sock)
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   679
	-- Resend all queries for this server
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   680
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   681
	local num = self.socketset[sock]
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   682
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   683
	-- Socket is dead now
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   684
	self:voidsocket(sock);
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   685
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   686
	-- 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
   687
	self.time = socket.gettime();
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   688
	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
   689
		for question,o in pairs(queries) do
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   690
			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
   691
				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
   692
				if o.server > #self.server then
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   693
					o.server = 1;
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   694
				end
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   695
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   696
				o.retries = (o.retries or 0) + 1;
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   697
				if o.retries >= #self.server then
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   698
					--print('timeout');
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   699
					queries[question] = nil;
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   700
				else
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   701
					local _a = self:getsocket(o.server);
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   702
					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
   703
				end
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   704
			end
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   705
		end
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   706
	end
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
   707
   
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   708
	if num == self.best_server then
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   709
		self.best_server = self.best_server + 1;
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   710
		if self.best_server > #self.server then
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   711
			-- Exhausted all servers, try first again
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   712
			self.best_server = 1;
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   713
		end
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   714
	end
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
   715
end
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   716
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   717
function resolver:receive(rset)    -- - - - - - - - - - - - - - - - -  receive
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   718
	--print('receive');  print(self.socket);
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   719
	self.time = socket.gettime();
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   720
	rset = rset or self.socket;
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   721
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   722
	local response;
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   723
	for i,sock in pairs(rset) do
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   724
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   725
		if self.socketset[sock] then
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   726
			local packet = sock:receive();
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   727
			if packet then
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   728
				response = self:decode(packet);
2278
8c10f13c0c20 modulemanager, net.dns: Remove trailing whitespace
Matthew Wild <mwild1@gmail.com>
parents: 2082
diff changeset
   729
				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
   730
					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
   731
					--print('received response');
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   732
					--self.print(response);
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   733
2082
1381b2071c2e net.dns: Be more strict about the records we cache
Matthew Wild <mwild1@gmail.com>
parents: 2081
diff changeset
   734
					for j,rr in pairs(response.answer) do
1381b2071c2e net.dns: Be more strict about the records we cache
Matthew Wild <mwild1@gmail.com>
parents: 2081
diff changeset
   735
						if rr.name:sub(-#response.question[1].name, -1) == response.question[1].name then
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   736
							self:remember(rr, response.question[1].type)
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   737
						end
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   738
					end
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   739
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   740
					-- retire the query
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   741
					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
   742
					queries[response.question.raw] = nil;
1381b2071c2e net.dns: Be more strict about the records we cache
Matthew Wild <mwild1@gmail.com>
parents: 2081
diff changeset
   743
					
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   744
					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
   745
					if not next(self.active) then self:closeall(); end
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   746
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   747
					-- 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
   748
					local q = response.question[1];
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   749
					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
   750
					if cos then
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   751
						for co in pairs(cos) do
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   752
							set(self.yielded, co, q.class, q.type, q.name, nil);
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   753
							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
   754
						end
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   755
						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
   756
					end
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   757
				end
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   758
			end
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   759
		end
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   760
	end
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   761
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   762
	return response;
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   763
end
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   764
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   765
869
09019c452709 net.dns: Add methods necessary for allowing non-blocking DNS lookups
Matthew Wild <mwild1@gmail.com>
parents: 759
diff changeset
   766
function resolver:feed(sock, packet)
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   767
	--print('receive'); print(self.socket);
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   768
	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
   769
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   770
	local response = self:decode(packet);
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
   771
	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
   772
		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
   773
		--print('received response');
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   774
		--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
   775
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
   776
		for j,rr in pairs(response.answer) do
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
   777
			self:remember(rr, response.question[1].type);
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   778
		end
869
09019c452709 net.dns: Add methods necessary for allowing non-blocking DNS lookups
Matthew Wild <mwild1@gmail.com>
parents: 759
diff changeset
   779
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   780
		-- retire the query
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   781
		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
   782
		queries[response.question.raw] = nil;
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   783
		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
   784
		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
   785
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   786
		-- was the query on the wanted list?
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   787
		local q = response.question[1];
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   788
		if q then
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   789
			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
   790
			if cos then
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   791
				for co in pairs(cos) do
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   792
					set(self.yielded, co, q.class, q.type, q.name, nil);
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   793
					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
   794
				end
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   795
				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
   796
			end
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   797
		end
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   798
	end 
869
09019c452709 net.dns: Add methods necessary for allowing non-blocking DNS lookups
Matthew Wild <mwild1@gmail.com>
parents: 759
diff changeset
   799
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   800
	return response;
869
09019c452709 net.dns: Add methods necessary for allowing non-blocking DNS lookups
Matthew Wild <mwild1@gmail.com>
parents: 759
diff changeset
   801
end
09019c452709 net.dns: Add methods necessary for allowing non-blocking DNS lookups
Matthew Wild <mwild1@gmail.com>
parents: 759
diff changeset
   802
1202
e69fafc14491 net.dns: Add support for cancelling a coroutine-based request
Matthew Wild <mwild1@gmail.com>
parents: 896
diff changeset
   803
function resolver:cancel(data)
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   804
	local cos = get(self.wanted, unpack(data, 1, 3));
1202
e69fafc14491 net.dns: Add support for cancelling a coroutine-based request
Matthew Wild <mwild1@gmail.com>
parents: 896
diff changeset
   805
	if cos then
e69fafc14491 net.dns: Add support for cancelling a coroutine-based request
Matthew Wild <mwild1@gmail.com>
parents: 896
diff changeset
   806
		cos[data[4]] = nil;
e69fafc14491 net.dns: Add support for cancelling a coroutine-based request
Matthew Wild <mwild1@gmail.com>
parents: 896
diff changeset
   807
	end
e69fafc14491 net.dns: Add support for cancelling a coroutine-based request
Matthew Wild <mwild1@gmail.com>
parents: 896
diff changeset
   808
end
869
09019c452709 net.dns: Add methods necessary for allowing non-blocking DNS lookups
Matthew Wild <mwild1@gmail.com>
parents: 759
diff changeset
   809
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   810
function resolver:pulse()    -- - - - - - - - - - - - - - - - - - - - -  pulse
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   811
	--print(':pulse');
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   812
	while self:receive() do end
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   813
	if not next(self.active) then return nil; end
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   814
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   815
	self.time = socket.gettime();
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   816
	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
   817
		for question,o in pairs(queries) do
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   818
			if self.time >= o.retry then
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   819
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   820
				o.server = o.server + 1;
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   821
				if o.server > #self.server then
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   822
					o.server = 1;
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   823
					o.delay = o.delay + 1;
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   824
				end
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   825
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   826
				if o.delay > #self.delays then
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   827
					--print('timeout');
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   828
					queries[question] = nil;
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   829
					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
   830
					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
   831
				else
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   832
					--print('retry', o.server, o.delay);
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   833
					local _a = self.socket[o.server];
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   834
					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
   835
					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
   836
				end
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   837
			end
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   838
		end
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   839
	end
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   840
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   841
	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
   842
	return nil;
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   843
end
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   844
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   845
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   846
function resolver:lookup(qname, qtype, qclass)    -- - - - - - - - - -  lookup
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   847
	self:query (qname, qtype, qclass)
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   848
	while self:pulse() do socket.select(self.socket, nil, 4); end
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   849
	--print(self.cache);
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   850
	return self:peek(qname, qtype, qclass);
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   851
end
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   852
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   853
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
   854
	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
   855
end
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   856
869
09019c452709 net.dns: Add methods necessary for allowing non-blocking DNS lookups
Matthew Wild <mwild1@gmail.com>
parents: 759
diff changeset
   857
09019c452709 net.dns: Add methods necessary for allowing non-blocking DNS lookups
Matthew Wild <mwild1@gmail.com>
parents: 759
diff changeset
   858
--print ---------------------------------------------------------------- print
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   859
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   860
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   861
local hints = {    -- - - - - - - - - - - - - - - - - - - - - - - - - - - hints
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   862
	qr = { [0]='query', 'response' },
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   863
	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
   864
	aa = { [0]='non-authoritative', 'authoritative' },
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   865
	tc = { [0]='complete', 'truncated' },
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   866
	rd = { [0]='recursion not desired', 'recursion desired' },
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   867
	ra = { [0]='recursion not available', 'recursion available' },
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   868
	z  = { [0]='(reserved)' },
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   869
	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
   870
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   871
	type = dns.type,
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   872
	class = dns.class
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   873
};
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   874
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   875
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   876
local function hint(p, s)    -- - - - - - - - - - - - - - - - - - - - - - hint
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   877
	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
   878
end
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   879
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   880
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   881
function resolver.print(response)    -- - - - - - - - - - - - - resolver.print
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   882
	for s,s in pairs { 'id', 'qr', 'opcode', 'aa', 'tc', 'rd', 'ra', 'z',
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   883
						'rcode', 'qdcount', 'ancount', 'nscount', 'arcount' } do
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   884
		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
   885
	end
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   886
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   887
	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
   888
		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
   889
		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
   890
		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
   891
	end
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   892
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   893
	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
   894
	local tmp;
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   895
	for s,s in pairs({'answer', 'authority', 'additional'}) do
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   896
		for i,rr in pairs(response[s]) do
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   897
			for j,t in pairs({ 'name', 'type', 'class', 'ttl', 'rdlength' }) do
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   898
				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
   899
				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
   900
			end
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   901
			for j,t in pairs(rr) do
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   902
				if not common[j] then
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   903
					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
   904
					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
   905
				end
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   906
			end
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   907
		end
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   908
	end
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   909
end
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   910
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   911
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   912
-- module api ------------------------------------------------------ module api
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   913
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   914
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   915
local function resolve(func, ...)    -- - - - - - - - - - - - - - resolver_get
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   916
	return func(dns._resolver, ...);
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   917
end
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   918
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   919
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   920
function dns.resolver ()    -- - - - - - - - - - - - - - - - - - - - - resolver
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   921
	-- this function seems to be redundant with resolver.new ()
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   922
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   923
	local r = { active = {}, cache = {}, unsorted = {}, wanted = {}, yielded = {}, best_server = 1 };
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   924
	setmetatable (r, resolver);
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   925
	setmetatable (r.cache, cache_metatable);
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   926
	setmetatable (r.unsorted, { __mode = 'kv' });
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   927
	return r;
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   928
end
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   929
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   930
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   931
function dns.lookup(...)    -- - - - - - - - - - - - - - - - - - - - -  lookup
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   932
	return resolve(resolver.lookup, ...);
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   933
end
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   934
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   935
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   936
function dns.purge(...)    -- - - - - - - - - - - - - - - - - - - - - -  purge
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   937
	return resolve(resolver.purge, ...);
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   938
end
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   939
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   940
function dns.peek(...)    -- - - - - - - - - - - - - - - - - - - - - - -  peek
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   941
	return resolve(resolver.peek, ...);
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   942
end
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   943
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   944
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   945
function dns.query(...)    -- - - - - - - - - - - - - - - - - - - - - -  query
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   946
	return resolve(resolver.query, ...);
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   947
end
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   948
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   949
function dns.feed(...)    -- - - - - - - - - - - - - - - - - - - - - -  feed
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   950
	return resolve(resolver.feed, ...);
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   951
end
869
09019c452709 net.dns: Add methods necessary for allowing non-blocking DNS lookups
Matthew Wild <mwild1@gmail.com>
parents: 759
diff changeset
   952
1202
e69fafc14491 net.dns: Add support for cancelling a coroutine-based request
Matthew Wild <mwild1@gmail.com>
parents: 896
diff changeset
   953
function dns.cancel(...)   -- - - - - - - - - - - - - - - - - - - - - -  cancel
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   954
	return resolve(resolver.cancel, ...);
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   955
end
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   956
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   957
function dns:socket_wrapper_set(...)    -- - - - - - - - -  socket_wrapper_set
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   958
	return resolve(resolver.socket_wrapper_set, ...);
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   959
end
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   960
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   961
dns._resolver = dns.resolver();
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   962
2069
72357b1c6d88 net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents: 2068
diff changeset
   963
return dns;