|
| 1 | +-module(esdee_ffi). |
| 2 | + |
| 3 | +-export([encode_question/1, decode_records/1]). |
| 4 | + |
| 5 | +-include_lib("kernel/src/inet_dns.hrl"). |
| 6 | + |
| 7 | +encode_question(Domain) -> |
| 8 | + Header = #dns_header{}, |
| 9 | + Question = |
| 10 | + #dns_query{domain = unicode:characters_to_list(Domain), |
| 11 | + type = ?T_ANY, |
| 12 | + class = ?C_IN}, |
| 13 | + Record = #dns_rec{header = Header, qdlist = [Question]}, |
| 14 | + inet_dns:encode(Record, true). |
| 15 | + |
| 16 | +decode_records(Bits) -> |
| 17 | + case inet_dns:decode(Bits) of |
| 18 | + {ok, Record} -> |
| 19 | + Header = Record#dns_rec.header, |
| 20 | + case Header#dns_header.qr of |
| 21 | + true -> |
| 22 | + Answers = lists:filtermap(fun map_answer/1, Record#dns_rec.anlist), |
| 23 | + Resources = lists:filtermap(fun map_resource/1, Record#dns_rec.arlist), |
| 24 | + {ok, Answers ++ Resources}; |
| 25 | + _ -> |
| 26 | + {ok, []} |
| 27 | + end; |
| 28 | + _ -> |
| 29 | + {error, nil} |
| 30 | + end. |
| 31 | + |
| 32 | +map_answer(Answer) -> |
| 33 | + case Answer#dns_rr.type of |
| 34 | + ?S_PTR -> |
| 35 | + {true, map_ptr(Answer)}; |
| 36 | + _ -> |
| 37 | + false |
| 38 | + end. |
| 39 | + |
| 40 | +map_resource(Resource) -> |
| 41 | + case Resource#dns_rr.type of |
| 42 | + ?S_TXT -> |
| 43 | + {true, map_txt(Resource)}; |
| 44 | + ?S_SRV -> |
| 45 | + {true, map_srv(Resource)}; |
| 46 | + ?S_A -> |
| 47 | + {true, map_a(Resource)}; |
| 48 | + ?S_AAAA -> |
| 49 | + {true, map_aaaa(Resource)}; |
| 50 | + _ -> |
| 51 | + false |
| 52 | + end. |
| 53 | + |
| 54 | +map_ptr(Record) -> |
| 55 | + ServiceType = unicode:characters_to_binary(Record#dns_rr.domain), |
| 56 | + InstanceName = unicode:characters_to_binary(Record#dns_rr.data), |
| 57 | + {ptr_record, ServiceType, InstanceName}. |
| 58 | + |
| 59 | +map_txt(Record) -> |
| 60 | + InstanceName = unicode:characters_to_binary(Record#dns_rr.domain), |
| 61 | + Values = lists:map(fun unicode:characters_to_binary/1, Record#dns_rr.data), |
| 62 | + {txt_record, InstanceName, Values}. |
| 63 | + |
| 64 | +map_srv(Record) -> |
| 65 | + InstanceName = unicode:characters_to_binary(Record#dns_rr.domain), |
| 66 | + {Priority, Weight, Port, TargetName} = Record#dns_rr.data, |
| 67 | + {srv_record, |
| 68 | + InstanceName, |
| 69 | + Priority, |
| 70 | + Weight, |
| 71 | + Port, |
| 72 | + unicode:characters_to_binary(TargetName)}. |
| 73 | + |
| 74 | +map_a(Record) -> |
| 75 | + TargetName = unicode:characters_to_binary(Record#dns_rr.domain), |
| 76 | + Ip = Record#dns_rr.data, |
| 77 | + {a_record, TargetName, Ip}. |
| 78 | + |
| 79 | +map_aaaa(Record) -> |
| 80 | + TargetName = unicode:characters_to_binary(Record#dns_rr.domain), |
| 81 | + Ip = Record#dns_rr.data, |
| 82 | + {aaaa_record, TargetName, Ip}. |
0 commit comments