let mut answers = Vec::new();
let mut input = slice;
+ struct Answer<'a> {
+ name: Vec<u8>,
+ rrtype: u16,
+ rrclass: u16,
+ ttl: u32,
+ data: &'a [u8],
+ }
+
fn subparser<'a>(
i: &'a [u8], message: &'a [u8],
- ) -> IResult<&'a [u8], (Vec<u8>, u16, u16, u32, &'a [u8])> {
+ ) -> IResult<&'a [u8], Answer<'a>> {
let (i, name) = dns_parse_name(i, message)?;
let (i, rrtype) = be_u16(i)?;
let (i, rrclass) = be_u16(i)?;
let (i, ttl) = be_u32(i)?;
let (i, data) = length_data(be_u16)(i)?;
- Ok((i, (name, rrtype, rrclass, ttl, data)))
+ let answer = Answer {
+ name,
+ rrtype,
+ rrclass,
+ ttl,
+ data,
+ };
+ Ok((i, answer))
}
for _ in 0..count {
match subparser(input, message) {
Ok((rem, val)) => {
- let name = val.0;
- let rrtype = val.1;
- let rrclass = val.2;
- let ttl = val.3;
- let data = val.4;
- let n = match rrtype {
+ let n = match val.rrtype {
DNS_RECORD_TYPE_TXT => {
// For TXT records we need to run the parser
// multiple times. Set n high, to the maximum
}
};
let result: IResult<&'a [u8], Vec<DNSRData>> =
- many_m_n(1, n, complete(|b| dns_parse_rdata(b, message, rrtype)))(data);
+ many_m_n(1, n, complete(|b| dns_parse_rdata(b, message, val.rrtype)))(val.data);
match result {
Ok((_, rdatas)) => {
for rdata in rdatas {
answers.push(DNSAnswerEntry {
- name: name.clone(),
- rrtype,
- rrclass,
- ttl,
+ name: val.name.clone(),
+ rrtype: val.rrtype,
+ rrclass: val.rrclass,
+ ttl: val.ttl,
data: rdata,
});
}