From 0a7ddb1b4ee79774fb2c5578792b7f6a88162e02 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Vladim=C3=ADr=20=C4=8Cun=C3=A1t?= Date: Fri, 27 Jan 2017 17:48:34 +0100 Subject: [PATCH] policy.MIRROR: support IPv6 link-local addresses --- modules/policy/policy.lua | 19 +++++++------------ 1 file changed, 7 insertions(+), 12 deletions(-) diff --git a/modules/policy/policy.lua b/modules/policy/policy.lua index 6c31954e1..344e2298c 100644 --- a/modules/policy/policy.lua +++ b/modules/policy/policy.lua @@ -32,21 +32,16 @@ if has_socket then 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 @@ -55,7 +50,7 @@ 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) @@ -74,11 +69,11 @@ local function forward(target) 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) -- 2.47.2