blob: 45c3a09cef974d9f14d9f13eabbba1b8da2150b4 [file] [log] [blame]
Harald Welte9a5dd542018-10-28 10:33:23 +01001module DNS_Helpers {
2
3private function f_strchr(charstring s, char c) return integer {
4 var integer i;
5 for (i := 0; i < lengthof(s); i := i+1) {
6 if (s[i] == c) {
7 return i;
8 }
9 }
10 return -1;
11}
12
13private function f_dns_enc_label(charstring str) return octetstring {
14 var octetstring ret;
15
16 ret[0] := int2oct(lengthof(str), 1);
17 return ret & char2oct(str);
18}
19
20function f_enc_dns_hostname(charstring str) return octetstring {
21 var octetstring ret := ''O;
22 while (lengthof(str) > 0) {
23 var integer dot_idx;
24 var octetstring lbl;
25
26 dot_idx := f_strchr(str, ".");
27 if (dot_idx >= 0) {
28 /* there is another dot */
29 lbl := f_dns_enc_label(substr(str, 0, dot_idx));
30 str := substr(str, dot_idx+1, lengthof(str)-dot_idx-1);
31 } else {
32 /* no more dot */
33 lbl := f_dns_enc_label(str);
34 str := "";
35 }
36 ret := ret & lbl;
37 }
38 return ret;
39}
40
41
42
43
44function f_dec_dns_hostname(octetstring inp) return charstring {
45 var charstring ret := "";
46 while (lengthof(inp) > 0) {
47 var integer label_len;
48 var charstring lbl;
49
50 label_len := oct2int(substr(inp, 0, 1));
51 lbl := oct2char(substr(inp, 1, label_len));
52 inp := substr(inp, 1+label_len, lengthof(inp)-1-label_len);
53
54 ret := ret & lbl;
55 if (lengthof(inp) > 0) {
56 ret := ret & ".";
57 }
58 }
59 return ret;
60}
61
62
63}