use crate::errors;
use crate::field::{ByteOrder, Field};
#[derive(Debug)]
pub struct MachHeader {
pub magic: Field<u32>,
pub cpu_type: Field<u32>,
pub cpu_subtype: Field<u32>,
pub file_type: Field<u32>,
pub ncmds: Field<u32>,
pub sizeofcmds: Field<u32>,
pub flags: Field<u32>,
pub reserved: Option<Field<u32>>,
}
impl MachHeader {
pub fn parse(
buffer: &[u8],
order: ByteOrder,
is_64bit: bool,
) -> Result<Self, errors::FileParseError> {
let min_len = if is_64bit { 32 } else { 28 };
if buffer.len() < min_len {
return Err(errors::FileParseError::BufferOverflow);
}
let magic = Field::new(order.read_u32(buffer, 0)?, 0, 4);
let cpu_type = Field::new(order.read_u32(buffer, 4)?, 4, 4);
let cpu_subtype = Field::new(order.read_u32(buffer, 8)?, 8, 4);
let file_type = Field::new(order.read_u32(buffer, 12)?, 12, 4);
let ncmds = Field::new(order.read_u32(buffer, 16)?, 16, 4);
let sizeofcmds = Field::new(order.read_u32(buffer, 20)?, 20, 4);
let flags = Field::new(order.read_u32(buffer, 24)?, 24, 4);
let reserved = if is_64bit {
Some(Field::new(order.read_u32(buffer, 28)?, 28, 4))
} else {
None
};
Ok(MachHeader {
magic,
cpu_type,
cpu_subtype,
file_type,
ncmds,
sizeofcmds,
flags,
reserved,
})
}
}