let mut input = slice;
for _ in 0..count {
- match closure!(&'a [u8], do_parse!(
- name: apply!(dns_parse_name, message) >>
+ match do_parse!(
+ input,
+ name: call!(dns_parse_name, message) >>
rrtype: be_u16 >>
rrclass: be_u16 >>
ttl: be_u32 >>
ttl,
data
)
- ))(input) {
+ ) {
Ok((rem, val)) => {
let name = val.0;
let rrtype = val.1;
}
};
let result: IResult<&'a [u8], Vec<Vec<u8>>> =
- closure!(&'a [u8], do_parse!(
+ do_parse!(
+ data,
rdata: many_m_n!(1, n,
- complete!(apply!(dns_parse_rdata, message, rrtype)))
+ complete!(call!(dns_parse_rdata, message, rrtype)))
>> (rdata)
- ))(data);
+ );
match result {
Ok((_, rdatas)) => {
for rdata in rdatas {
/// Parse a DNS response.
pub fn dns_parse_response<'a>(slice: &'a [u8])
-> IResult<&[u8], DNSResponse> {
- let response = closure!(&'a [u8], do_parse!(
+ do_parse!(
+ slice,
header: dns_parse_header
>> queries: count!(
- apply!(dns_parse_query, slice), header.questions as usize)
- >> answers: apply!(
+ call!(dns_parse_query, slice), header.questions as usize)
+ >> answers: call!(
dns_parse_answer, slice, header.answer_rr as usize)
- >> authorities: apply!(
+ >> authorities: call!(
dns_parse_answer, slice, header.authority_rr as usize)
>> (
DNSResponse{
authorities: authorities,
}
)
- ))(slice);
-
- return response;
+ )
}
/// Parse a single DNS query.
///
-/// Arguments are suitable for using with apply!:
+/// Arguments are suitable for using with call!:
///
-/// apply!(complete_dns_message_buffer)
+/// call!(complete_dns_message_buffer)
pub fn dns_parse_query<'a>(input: &'a [u8],
message: &'a [u8])
-> IResult<&'a [u8], DNSQueryEntry> {
- return closure!(&'a [u8], do_parse!(
- name: apply!(dns_parse_name, message) >>
+ do_parse!(
+ input,
+ name: call!(dns_parse_name, message) >>
rrtype: be_u16 >>
rrclass: be_u16 >>
(
rrclass: rrclass,
}
)
- ))(input);
+ )
}
pub fn dns_parse_rdata<'a>(input: &'a [u8], message: &'a [u8], rrtype: u16)
DNS_RECORD_TYPE_MX => {
// For MX we we skip over the preference field before
// parsing out the name.
- closure!(&'a [u8], do_parse!(
+ do_parse!(
+ input,
be_u16 >>
- name: apply!(dns_parse_name, message) >>
+ name: call!(dns_parse_name, message) >>
(name)
- ))(input)
+ )
},
DNS_RECORD_TYPE_TXT => {
- closure!(&'a [u8], do_parse!(
+ do_parse!(
+ input,
len: be_u8 >>
txt: take!(len) >>
(txt.to_vec())
- ))(input)
+ )
},
_ => {
- closure!(&'a [u8], do_parse!(
+ do_parse!(
+ input,
data: take!(input.len()) >>
(data.to_vec())
- ))(input)
+ )
}
}
}
/// Parse a DNS request.
pub fn dns_parse_request<'a>(input: &'a [u8]) -> IResult<&[u8], DNSRequest> {
- return closure!(&'a [u8], do_parse!(
+ do_parse!(
+ input,
header: dns_parse_header >>
- queries: count!(apply!(dns_parse_query, input),
+ queries: count!(call!(dns_parse_query, input),
header.questions as usize) >>
(
DNSRequest{
queries: queries,
}
)
- ))(input);
+ )
}
#[cfg(test)]