mirror of
https://gitlab.alpinelinux.org/alpine/aports.git
synced 2025-08-27 01:11:33 +02:00
91 lines
2.6 KiB
Diff
91 lines
2.6 KiB
Diff
From 5dcc817d96352b05f7468d058c39be3e6616d037 Mon Sep 17 00:00:00 2001
|
|
From: Sergey Lukin <sergey.lukin@inbox.lv>
|
|
Date: Fri, 5 Aug 2016 12:09:11 +0300
|
|
Subject: [PATCH] add NAPTR record support
|
|
|
|
---
|
|
lib/resty/dns/resolver.lua | 49 ++++++++++++++++++++++++++++++++++++++++++++++
|
|
1 file changed, 49 insertions(+)
|
|
|
|
diff --git a/lib/resty/dns/resolver.lua b/lib/resty/dns/resolver.lua
|
|
index 7612b52..989d225 100644
|
|
--- a/lib/resty/dns/resolver.lua
|
|
+++ b/lib/resty/dns/resolver.lua
|
|
@@ -48,6 +48,7 @@ local TYPE_MX = 15
|
|
local TYPE_TXT = 16
|
|
local TYPE_AAAA = 28
|
|
local TYPE_SRV = 33
|
|
+local TYPE_NAPTR = 35
|
|
local TYPE_SPF = 99
|
|
|
|
local CLASS_IN = 1
|
|
@@ -67,6 +68,7 @@ local _M = {
|
|
TYPE_TXT = TYPE_TXT,
|
|
TYPE_AAAA = TYPE_AAAA,
|
|
TYPE_SRV = TYPE_SRV,
|
|
+ TYPE_NAPTR = TYPE_NAPTR,
|
|
TYPE_SPF = TYPE_SPF,
|
|
CLASS_IN = CLASS_IN,
|
|
SECTION_AN = SECTION_AN,
|
|
@@ -209,6 +211,16 @@ local function _encode_name(s)
|
|
return char(#s) .. s
|
|
end
|
|
|
|
+local function _decode_string(buf, pos)
|
|
+ local slen = byte(buf, pos)
|
|
+ if slen == 0 then
|
|
+ return "", pos + 1
|
|
+ end
|
|
+ if pos + 1 + slen >= #buf then
|
|
+ return nil, 'truncated'
|
|
+ end
|
|
+ return sub(buf, pos + 1, pos + slen), pos + slen + 1
|
|
+end
|
|
|
|
local function _decode_name(buf, pos)
|
|
local labels = {}
|
|
@@ -484,6 +496,43 @@ local function parse_section(answers, section, buf, start_pos, size,
|
|
|
|
pos = p
|
|
|
|
+ elseif typ == TYPE_NAPTR then
|
|
+ if len < 7 then
|
|
+ return nil, "bad NAPTR record value length: " .. len
|
|
+ end
|
|
+
|
|
+ local hi = byte(buf, pos)
|
|
+ local lo = byte(buf, pos + 1)
|
|
+ ans.order = lshift(hi, 8) + lo
|
|
+
|
|
+ hi = byte(buf, pos + 2)
|
|
+ lo = byte(buf, pos + 3)
|
|
+ ans.preference = lshift(hi, 8) + lo
|
|
+
|
|
+ local str, p = _decode_string(buf, pos + 4)
|
|
+ if not str then return nil, pos end
|
|
+ ans.flags = str
|
|
+
|
|
+ str, p = _decode_string(buf, p)
|
|
+ if not str then return nil, pos end
|
|
+ ans.services = str
|
|
+
|
|
+ str, p = _decode_string(buf, p)
|
|
+ if not str then return nil, pos end
|
|
+ ans.regexp = str
|
|
+
|
|
+ if p - pos < len then
|
|
+ str,p = _decode_name(buf, p)
|
|
+ if not str then return nil, pos end
|
|
+ ans.replacements = str
|
|
+ end
|
|
+
|
|
+ if p - pos ~= len then
|
|
+ return nil, format("bad NAPTR record length: %d ~= %d", p - pos, len)
|
|
+ end
|
|
+
|
|
+ pos = p
|
|
+
|
|
elseif typ == TYPE_NS then
|
|
|
|
local name, p = _decode_name(buf, pos)
|