end
end
-local function parse_target(target)
+local function addr_split_port(target)
local addr, port = target:match '([^@]*)@?(.*)'
port = port and tonumber(port) or 53
- addr = kres.str2ip(addr)
- if addr == nil then
- error("target '"..target..'" is not a valid IP address')
- end
return addr, port
end
-local function parse_sock(target)
- local addr, port = target:match '([^@]*)@?(.*)'
- port = port and tonumber(port) or 53
+-- String address@port -> sockaddr.
+local function addr2sock(target)
+ local addr, port = addr_split_port(target)
sock = ffi.gc(ffi.C.kr_straddr_socket(addr, port), ffi.C.free);
-
if sock == nil then
error("target '"..target..'" is not a valid IP address')
end
-- Mirror request elsewhere, and continue solving
local function mirror(target)
- local addr, port = parse_target(target)
+ local addr, port = addr_split_port(target)
local sink, err = socket_client(addr, port)
if not sink then panic('MIRROR target %s is not a valid: %s', target, err) end
return function(state, req)
local list = {}
if type(target) == 'table' then
for _, v in pairs(target) do
- table.insert(list, parse_sock(v))
+ table.insert(list, addr2sock(v))
assert(#list <= 4, 'at most 4 FORWARD targets are supported')
end
else
- table.insert(list, parse_sock(target))
+ table.insert(list, addr2sock(target))
end
return function(state, req)
req = kres.request_t(req)