]> git.ipfire.org Git - thirdparty/knot-resolver.git/commitdiff
modules/policy: support '#' for separating port numbers
authorVladimír Čunát <vladimir.cunat@nic.cz>
Mon, 25 Feb 2019 10:49:32 +0000 (11:49 +0100)
committerVladimír Čunát <vladimir.cunat@nic.cz>
Mon, 25 Feb 2019 12:10:46 +0000 (13:10 +0100)
and deduplicate the parsing logic.

NEWS
daemon/lua/kres-gen.lua
daemon/lua/kres-gen.sh
daemon/lua/kres.lua
modules/policy/policy.lua

diff --git a/NEWS b/NEWS
index d5e194d990c43e73b70fcf7b61c3f4bda12a1105..1fa781ea9982d6a9088d0460b23ea853a5dcde2d 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -11,6 +11,7 @@ Bugfixes
 - trust_anchors: don't do 5011-style updates on anchors from files
   that were loaded as unmanaged trust anchors (!753)
 - trust_anchors.add(): include these TAs in .summary() (!753)
+- policy module: support '#' for separating port numbers, for consistency
 
 Improvements
 ------------
index eeb8ff7cad122f2255e101ebf6110ad449f53fea..5e40a610283f60456763859cac45139cfd29f74f 100644 (file)
@@ -308,6 +308,7 @@ int kr_straddr_subnet(void *, const char *);
 int kr_bitcmp(const char *, const char *, int);
 int kr_family_len(int);
 struct sockaddr *kr_straddr_socket(const char *, int);
+int kr_straddr_split(const char *, char * restrict, uint16_t *);
 int kr_ranked_rrarray_add(ranked_rr_array_t *, const knot_rrset_t *, uint8_t, _Bool, uint32_t, knot_mm_t *);
 void kr_qflags_set(struct kr_qflags *, struct kr_qflags);
 void kr_qflags_clear(struct kr_qflags *, struct kr_qflags);
index 538fe239e16d46c91b37966e066de877fc774060..ea0f7af636b581272d3287e8bfdcd2f036fe2cd8 100755 (executable)
@@ -162,6 +162,7 @@ EOF
        kr_bitcmp
        kr_family_len
        kr_straddr_socket
+       kr_straddr_split
        kr_ranked_rrarray_add
        kr_qflags_set
        kr_qflags_clear
index 8cb00461daa953a0eeab0a430768e238d798cee0..6e48026c6db54ba2d560eefe965fa8fb37235a1a 100644 (file)
@@ -239,7 +239,7 @@ local timeval_t = ffi.typeof('struct timeval')
 
 -- Metatype for sockaddr
 local addr_buf = ffi.new('char[16]')
-local str_addr_buf = ffi.new('char[46 + 1 + 6 + 1]') -- IPv6 + #port + \0
+local str_addr_buf = ffi.new('char[46 + 1 + 6 + 1]') -- INET6_ADDRSTRLEN + #port + \0
 local str_addr_buf_len = ffi.sizeof(str_addr_buf)
 local sockaddr_t = ffi.typeof('struct sockaddr')
 ffi.metatype( sockaddr_t, {
index 3ec51a4045532e8cac3413ddc46e7e2349080c0a..fb8929868bd48479a5236140b3aa9e88b9ba8289 100644 (file)
@@ -33,18 +33,16 @@ if has_socket then
        end
 end
 
+-- Split address and port from a combined string.
 local function addr_split_port(target, default_port)
-       assert(default_port)
-       assert(type(default_port) == 'number')
-       local addr, port = target:match '([^@]*)@?(.*)'
-       local nport
-       if port ~= "" then
-               nport = tonumber(port)
-               if not nport or nport < 1 or nport > 65535 then
-                       error('port "'.. port  ..'" is not valid')
-               end
-       end
-       return addr, nport or default_port
+       assert(default_port and type(default_port) == 'number')
+       local port = ffi.new('uint16_t[1]', default_port)
+       local addr = ffi.new('char[47]') -- INET6_ADDRSTRLEN + 1
+       local ret = ffi.C.kr_straddr_split(target, addr, port)
+       if ret ~= 0 then
+               error('failed to parse address ' .. target)
+       end
+       return addr, tonumber(port[0])
 end
 
 -- String address@port -> sockaddr.