use crate::{helpers::MachoWriter, types::MachoProgram};
use gaia_binary::{BinaryWriter, Fixed, LittleEndian};
use gaia_types::GaiaError;
use std::io::{Seek, Write};
#[derive(Debug)]
pub struct DylibWriter<W: Write + Seek> {
writer: BinaryWriter<W, Fixed<LittleEndian>>,
}
impl<W: Write + Seek> DylibWriter<W> {
pub fn new(writer: W) -> Self {
Self { writer: BinaryWriter::new(writer) }
}
}
impl<W: Write + Seek> MachoWriter<W> for DylibWriter<W> {
fn write_program(&mut self, program: &MachoProgram) -> Result<(), GaiaError> {
self.writer.write_u32(program.header.magic)?;
self.writer.write_u32(program.header.cpu_type)?;
self.writer.write_u32(program.header.cpu_subtype)?;
self.writer.write_u32(program.header.file_type)?;
self.writer.write_u32(program.header.ncmds)?;
self.writer.write_u32(program.header.sizeofcmds)?;
self.writer.write_u32(program.header.flags)?;
if let Some(reserved) = program.header.reserved {
self.writer.write_u32(reserved)?;
}
for load_cmd in &program.load_commands {
self.writer.write_u32(load_cmd.cmd)?;
self.writer.write_u32(load_cmd.cmdsize)?;
self.writer.write_bytes(&load_cmd.data)?;
}
Ok(())
}
fn writer(&mut self) -> &mut BinaryWriter<W, Fixed<LittleEndian>> {
&mut self.writer
}
}