]> git.ipfire.org Git - thirdparty/knot-resolver.git/commitdiff
policy.MIRROR: support IPv6 link-local addresses
authorVladimír Čunát <vladimir.cunat@nic.cz>
Fri, 27 Jan 2017 16:48:34 +0000 (17:48 +0100)
committerVladimír Čunát <vladimir.cunat@nic.cz>
Fri, 27 Jan 2017 17:01:30 +0000 (18:01 +0100)
modules/policy/policy.lua

index 6c31954e134f3aa489317cc0025223984c4dc7fc..344e2298cf18c45796e027a57bf581f17e0c4e34 100644 (file)
@@ -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)