coreboot-fs 0.1.1

Coreboot Filesystem Parser
Documentation
use coreboot_fs::Rom;
use std::{env, fs, io, process};

fn inner(path: &str) -> io::Result<()> {
    let data = fs::read(path)?;
    let rom = Rom::new(&data);

    if let Some(fmap) = rom.fmap() {
        let mut name = String::new();
        for &b in fmap.name.iter() {
            if b == 0 {
                break;
            }
            name.push(b as char);
        }

        eprintln!("  {}", name);

        for i in 0..fmap.nareas {
            let area = fmap.area(i);

            let mut name = String::new();
            for &b in area.name.iter() {
                if b == 0 {
                    break;
                }
                name.push(b as char);
            }

            eprintln!("    {}: {}", i, name);
        }
    }

    if let Some(header) = rom.header() {
        eprintln!("  CBFS");

        let align = u32::from(header.align) as usize;
        let mut offset = u32::from(header.offset) as usize;
        while let Some(file) = rom.file(offset) {
            let name_bytes = file.name();

            let mut name = String::new();
            for &b in name_bytes.iter() {
                if b == 0 {
                    break;
                }
                name.push(b as char);
            }

            eprintln!("    {:#X}: {}", offset, name);

            let file_offset = u32::from(file.offset) as usize;
            let file_len = u32::from(file.len) as usize;
            offset = ((offset + file_offset + file_len + align - 1) / align) * align;
        }
    } else {
        eprintln!("coreboot header not found");
    }

    Ok(())
}

fn main() {
    for path in env::args().skip(1) {
        eprintln!("{}", path);
        if let Err(err) = inner(&path) {
            eprintln!("failed to parse {}: {}", path, err);
            process::exit(1);
        }
    }
}