13 -- reference: http://tools.ietf.org/html/rfc1035 |
11 -- reference: http://tools.ietf.org/html/rfc1035 |
14 -- reference: http://tools.ietf.org/html/rfc1876 (LOC) |
12 -- reference: http://tools.ietf.org/html/rfc1876 (LOC) |
15 |
13 |
16 |
14 |
17 local socket = require "socket"; |
15 local socket = require "socket"; |
18 local ztact = require "util.ztact"; |
|
19 local timer = require "util.timer"; |
16 local timer = require "util.timer"; |
20 |
17 |
21 local _, windows = pcall(require, "util.windows"); |
18 local _, windows = pcall(require, "util.windows"); |
22 local is_windows = (_ and windows) or os.getenv("WINDIR"); |
19 local is_windows = (_ and windows) or os.getenv("WINDIR"); |
23 |
20 |
24 local coroutine, io, math, string, table = |
21 local coroutine, io, math, string, table = |
25 coroutine, io, math, string, table; |
22 coroutine, io, math, string, table; |
26 |
23 |
27 local ipairs, next, pairs, print, setmetatable, tostring, assert, error, unpack = |
24 local ipairs, next, pairs, print, setmetatable, tostring, assert, error, unpack, select = |
28 ipairs, next, pairs, print, setmetatable, tostring, assert, error, unpack; |
25 ipairs, next, pairs, print, setmetatable, tostring, assert, error, unpack, select; |
29 |
26 |
|
27 local ztact = { -- public domain 20080404 lua@ztact.com |
|
28 get = function(parent, ...) |
|
29 local len = select('#', ...); |
|
30 for i=1,len do |
|
31 parent = parent[select(i, ...)]; |
|
32 if parent == nil then break; end |
|
33 end |
|
34 return parent; |
|
35 end; |
|
36 set = function(parent, ...) |
|
37 local len = select('#', ...); |
|
38 local key, value = select(len-1, ...); |
|
39 local cutpoint, cutkey; |
|
40 |
|
41 for i=1,len-2 do |
|
42 local key = select (i, ...) |
|
43 local child = parent[key] |
|
44 |
|
45 if value == nil then |
|
46 if child == nil then |
|
47 return; |
|
48 elseif next(child, next(child)) then |
|
49 cutpoint = nil; cutkey = nil; |
|
50 elseif cutpoint == nil then |
|
51 cutpoint = parent; cutkey = key; |
|
52 end |
|
53 elseif child == nil then |
|
54 child = {}; |
|
55 parent[key] = child; |
|
56 end |
|
57 parent = child |
|
58 end |
|
59 |
|
60 if value == nil and cutpoint then |
|
61 cutpoint[cutkey] = nil; |
|
62 else |
|
63 parent[key] = value; |
|
64 return value; |
|
65 end |
|
66 end; |
|
67 }; |
30 local get, set = ztact.get, ztact.set; |
68 local get, set = ztact.get, ztact.set; |
31 |
69 |
32 local default_timeout = 15; |
70 local default_timeout = 15; |
33 |
71 |
34 -------------------------------------------------- module dns |
72 -------------------------------------------------- module dns |