Harald Welte | 9a5dd54 | 2018-10-28 10:33:23 +0100 | [diff] [blame] | 1 | module DNS_Helpers { |
| 2 | |
| 3 | private 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 | |
| 13 | private 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 | |
| 20 | function 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 | |
| 44 | function 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 | } |