4
%% Copyright Ericsson AB 1997-2009. All Rights Reserved.
4
%% Copyright Ericsson AB 1997-2010. All Rights Reserved.
6
6
%% The contents of this file are subject to the Erlang Public License,
7
7
%% Version 1.1, (the "License"); you may not use this file except in
8
8
%% compliance with the License. You should have received a copy of the
9
9
%% Erlang Public License along with this software. If not, it can be
10
10
%% retrieved online at http://www.erlang.org/.
12
12
%% Software distributed under the License is distributed on an "AS IS"
13
13
%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
14
14
%% the License for the specific language governing rights and limitations
15
15
%% under the License.
129
129
RA:1,PR:1,_:2,Rcode:4,
130
130
QdCount:16,AnCount:16,NsCount:16,ArCount:16,
131
131
QdBuf/binary>>=Buffer) ->
132
{AnBuf,QdList} = decode_query_section(QdBuf,QdCount,Buffer),
133
{NsBuf,AnList} = decode_rr_section(AnBuf,AnCount,Buffer),
134
{ArBuf,NsList} = decode_rr_section(NsBuf,NsCount,Buffer),
135
{Rest,ArList} = decode_rr_section(ArBuf,ArCount,Buffer),
132
{AnBuf,QdList,QdTC} = decode_query_section(QdBuf,QdCount,Buffer),
133
{NsBuf,AnList,AnTC} = decode_rr_section(AnBuf,AnCount,Buffer),
134
{ArBuf,NsList,NsTC} = decode_rr_section(NsBuf,NsCount,Buffer),
135
{Rest,ArList,ArTC} = decode_rr_section(ArBuf,ArCount,Buffer),
138
HdrTC = decode_boolean(TC),
139
140
#dns_header{id=Id,
140
141
qr=decode_boolean(QR),
141
142
opcode=decode_opcode(Opcode),
142
143
aa=decode_boolean(AA),
143
tc=decode_boolean(TC),
144
145
rd=decode_boolean(RD),
145
146
ra=decode_boolean(RA),
146
147
pr=decode_boolean(PR),
148
#dns_rec{header=DnsHdr,
149
case QdTC or AnTC or NsTC or ArTC of
150
true when not HdrTC ->
151
throw(?DECODE_ERROR);
153
#dns_rec{header=DnsHdr,
154
160
%% Garbage data after DNS message
155
161
throw(?DECODE_ERROR)
161
167
decode_query_section(Bin, N, Buffer) ->
162
168
decode_query_section(Bin, N, Buffer, []).
170
decode_query_section(<<>>=Rest, N, _Buffer, Qs) ->
171
{Rest,reverse(Qs),N =/= 0};
164
172
decode_query_section(Rest, 0, _Buffer, Qs) ->
173
{Rest,reverse(Qs),false};
166
174
decode_query_section(Bin, N, Buffer, Qs) ->
167
175
case decode_name(Bin, Buffer) of
168
176
{<<Type:16,Class:16,Rest/binary>>,Name} ->
179
187
decode_rr_section(Bin, N, Buffer) ->
180
188
decode_rr_section(Bin, N, Buffer, []).
190
decode_rr_section(<<>>=Rest, N, _Buffer, RRs) ->
191
{Rest,reverse(RRs),N =/= 0};
182
192
decode_rr_section(Rest, 0, _Buffer, RRs) ->
193
{Rest,reverse(RRs),false};
184
194
decode_rr_section(Bin, N, Buffer, RRs) ->
185
195
case decode_name(Bin, Buffer) of
186
196
{<<T:16/unsigned,C:16/unsigned,TTL:4/binary,