43 lines
1.3 KiB
Rust
43 lines
1.3 KiB
Rust
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()),
|
|
}
|
|
}
|
|
}
|