use color_eyre::eyre::Result;
use postform_decoder::{ElfMetadata, POSTFORM_VERSION};
use postform_persist::handle_log;
use std::convert::TryInto;
use std::io::prelude::*;
use std::{fs, path::PathBuf};
use structopt::StructOpt;
fn print_version() {
println!("{} {}", env!("CARGO_PKG_NAME"), env!("CARGO_PKG_VERSION"));
println!("supported Postform version: {}", POSTFORM_VERSION);
}
#[derive(Debug, StructOpt)]
#[structopt()]
struct Opts {
#[structopt(name = "ELF", parse(from_os_str), required_unless_one(&["version"]))]
elf: Option<PathBuf>,
#[structopt(name = "LOG_FILE", parse(from_os_str), required_unless_one(&["version"]))]
log_file: Option<PathBuf>,
#[structopt(long, short = "V")]
version: bool,
}
fn main() -> Result<()> {
color_eyre::install()?;
let opts = Opts::from_args();
if opts.version {
print_version();
return Ok(());
}
let elf_name = opts.elf.unwrap();
let elf_metadata = ElfMetadata::from_elf_file(&elf_name)?;
let mut log_file = fs::File::open(opts.log_file.unwrap())?;
let mut log_data = vec![];
log_file.read_to_end(&mut log_data)?;
let mut log_data = &log_data[..];
loop {
let (size_bits, rest) = log_data.split_at(std::mem::size_of::<u32>());
let size = u32::from_le_bytes(size_bits.try_into().unwrap()) as usize;
handle_log(&elf_metadata, &rest[..size]);
log_data = &log_data[4 + size..];
if log_data.is_empty() {
break;
}
}
Ok(())
}