in src/linux.rs [168:197]
fn read_msg_with_seq(fd: &mut RouteSocket, seq: u32, kind: u16) -> Result<(nlmsghdr, Vec<u8>)> {
loop {
let buf = &mut [0u8; NETLINK_BUFFER_SIZE];
let len = fd.read(buf.as_mut_slice())?;
let mut next = &buf[..len];
while size_of::<nlmsghdr>() <= next.len() {
let (hdr, mut msg) = next.split_at(size_of::<nlmsghdr>());
let hdr: nlmsghdr = hdr.try_into()?;
// `msg` has the remainder of this message plus any following messages.
// Strip those it off and assign them to `next`.
debug_assert!(size_of::<nlmsghdr>() <= hdr.nlmsg_len as usize);
(msg, next) = msg.split_at(hdr.nlmsg_len as usize - size_of::<nlmsghdr>());
if hdr.nlmsg_seq != seq {
continue;
}
if hdr.nlmsg_type == NLMSG_ERROR {
// Extract the error code and return it.
let err = parse_c_int(msg)?;
if err != 0 {
return Err(Error::from_raw_os_error(-err));
}
} else if hdr.nlmsg_type == kind {
// Return the header and the message.
return Ok((hdr, msg.to_vec()));
}
}
}
}