extern crate structview; use structview::{u32_be, View}; #[derive(Clone, Copy, View)] #[repr(C)] pub struct MlHeader { magic: [u8; 8], /* '\0', 'm', 'l', 'o', 'c', 'a', 't', 'e' */ conf_size: u32_be, version: u8, check_visibility: u8, pad: [u8; 2], } #[cfg(test)] mod tests { use super::*; use std::fs::File; use std::io::{BufRead, BufReader}; #[test] fn can_read_header() -> Result<(), String> { let db = File::open("/var/lib/mlocate/mlocate.db").expect("Unable to open file"); let mut reader = BufReader::new(db); match reader.fill_buf() { Ok(buffer) => match MlHeader::view(&buffer[0..32]) { Ok(header) => { let text = &header.magic[1..8]; assert_eq!(text, *b"mlocate"); assert_eq!(header.version, 0); let magic = std::str::from_utf8(text).unwrap_or("ERROR"); println!( "magic: {}\nversion: {}\nconf_size: {}\nvisibility: {}", magic, header.version, header.conf_size, header.check_visibility ); Ok(()) } Err(_) => Err("The header did not unpack.".to_owned()), }, Err(_) => Err("The header could not be read".to_owned()), } } }