mirror of
https://github.com/EFForg/rayhunter.git
synced 2026-07-31 19:23:06 -07:00
yet more read loop fixes
This commit is contained in:
+21
-20
@@ -70,7 +70,7 @@ const DIAG_IOCTL_SWITCH_LOGGING: u32 = 7;
|
|||||||
|
|
||||||
pub struct DiagDevice<'a> {
|
pub struct DiagDevice<'a> {
|
||||||
file: &'a File,
|
file: &'a File,
|
||||||
accumulator: Vec<u8>,
|
read_buf: Vec<u8>,
|
||||||
use_mdm: i32,
|
use_mdm: i32,
|
||||||
crc: Crc<u16>,
|
crc: Crc<u16>,
|
||||||
}
|
}
|
||||||
@@ -83,7 +83,7 @@ impl<'a> DiagDevice<'a> {
|
|||||||
let use_mdm = determine_use_mdm(fd)?;
|
let use_mdm = determine_use_mdm(fd)?;
|
||||||
|
|
||||||
Ok(DiagDevice {
|
Ok(DiagDevice {
|
||||||
accumulator: vec![],
|
read_buf: vec![0; BUFFER_LEN],
|
||||||
file,
|
file,
|
||||||
crc: Crc::<u16>::new(&CRC_CCITT_ALG),
|
crc: Crc::<u16>::new(&CRC_CCITT_ALG),
|
||||||
use_mdm,
|
use_mdm,
|
||||||
@@ -93,22 +93,24 @@ impl<'a> DiagDevice<'a> {
|
|||||||
fn parse_response_container(&self, container: MessagesContainer) -> DiagResult<Vec<Message>> {
|
fn parse_response_container(&self, container: MessagesContainer) -> DiagResult<Vec<Message>> {
|
||||||
let mut result = Vec::new();
|
let mut result = Vec::new();
|
||||||
for msg in container.messages {
|
for msg in container.messages {
|
||||||
match hdlc_decapsulate(&msg.data, &self.crc) {
|
for sub_msg in msg.data.split_inclusive(|&b| b == 0x7e) {
|
||||||
Ok(data) => match Message::from_bytes((&data, 0)) {
|
match hdlc_decapsulate(&sub_msg, &self.crc) {
|
||||||
Ok(((leftover_bytes, _), res)) => {
|
Ok(data) => match Message::from_bytes((&data, 0)) {
|
||||||
if leftover_bytes.len() > 0 {
|
Ok(((leftover_bytes, _), res)) => {
|
||||||
println!("warning: {} leftover bytes when parsing Message", leftover_bytes.len());
|
if leftover_bytes.len() > 0 {
|
||||||
}
|
println!("warning: {} leftover bytes when parsing Message", leftover_bytes.len());
|
||||||
result.push(res);
|
}
|
||||||
|
result.push(res);
|
||||||
|
},
|
||||||
|
Err(e) => {
|
||||||
|
println!("error parsing response: {:?}", e);
|
||||||
|
println!("{:?}", data);
|
||||||
|
},
|
||||||
},
|
},
|
||||||
Err(e) => {
|
Err(err) => {
|
||||||
println!("error parsing response: {:?}", e);
|
println!("error decapsulating response: {:?}", err);
|
||||||
println!("{:?}", data);
|
println!("{:?}", &sub_msg);
|
||||||
},
|
}
|
||||||
},
|
|
||||||
Err(err) => {
|
|
||||||
println!("error decapsulating response: {:?}", err);
|
|
||||||
println!("{:?}", &msg.data);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -116,10 +118,9 @@ impl<'a> DiagDevice<'a> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub fn read_response(&mut self) -> DiagResult<Vec<Message>> {
|
pub fn read_response(&mut self) -> DiagResult<Vec<Message>> {
|
||||||
let mut read_buf = vec![0; BUFFER_LEN];
|
|
||||||
loop {
|
loop {
|
||||||
let bytes_read = self.file.read(&mut read_buf).unwrap();
|
let bytes_read = self.file.read(&mut self.read_buf).unwrap();
|
||||||
let ((leftover_bytes, _), res_container) = MessagesContainer::from_bytes((&read_buf[0..bytes_read], 0))?;
|
let ((leftover_bytes, _), res_container) = MessagesContainer::from_bytes((&self.read_buf[0..bytes_read], 0))?;
|
||||||
if leftover_bytes.len() > 0 {
|
if leftover_bytes.len() > 0 {
|
||||||
println!("warning: {} leftover bytes when parsing MessagesContainer", leftover_bytes.len());
|
println!("warning: {} leftover bytes when parsing MessagesContainer", leftover_bytes.len());
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user