diff --git a/rust/lanzaboote/src/main.rs b/rust/lanzaboote/src/main.rs index afe3104..a4f30da 100644 --- a/rust/lanzaboote/src/main.rs +++ b/rust/lanzaboote/src/main.rs @@ -5,8 +5,8 @@ extern crate alloc; mod pe_section; +mod uefi_helpers; -use alloc::vec::Vec; use log::{debug, info}; use uefi::{ prelude::*, @@ -20,7 +20,7 @@ use uefi::{ Result, }; -use crate::pe_section::pe_section; +use crate::{pe_section::pe_section, uefi_helpers::read_all}; fn print_logo(output: &mut Output) { output.clear().unwrap(); @@ -40,24 +40,6 @@ fn print_logo(output: &mut Output) { .unwrap(); } -fn read_all(image: &mut RegularFile) -> Result> { - let mut buf = Vec::new(); - - // TODO Can we do this nicer? - loop { - let mut chunk = [0; 512]; - let read_bytes = image.read(&mut chunk).map_err(|e| e.status())?; - - if read_bytes == 0 { - break; - } - - buf.extend_from_slice(&chunk[0..read_bytes]); - } - - Ok(buf) -} - fn image_file(boot_services: &BootServices, image: Handle) -> Result { let mut file_system = boot_services.get_image_file_system(image)?; let mut root = file_system.open_volume()?; @@ -103,8 +85,7 @@ fn main(handle: Handle, mut system_table: SystemTable) -> Status { let boot_services = system_table.boot_services(); { - let mut image_file = image_file(boot_services, handle).unwrap(); - let image_data = read_all(&mut image_file).unwrap(); + let image_data = read_all(&mut image_file(boot_services, handle).unwrap()).unwrap(); if let Some(data) = pe_section(&image_data, ".osrel") { info!("osrel = {}", core::str::from_utf8(data).unwrap_or("???")) diff --git a/rust/lanzaboote/src/uefi_helpers.rs b/rust/lanzaboote/src/uefi_helpers.rs new file mode 100644 index 0000000..c00efc6 --- /dev/null +++ b/rust/lanzaboote/src/uefi_helpers.rs @@ -0,0 +1,20 @@ +use alloc::vec::Vec; +use uefi::{proto::media::file::RegularFile, Result}; + +// Read the whole file into a vector. +pub fn read_all(file: &mut RegularFile) -> Result> { + let mut buf = Vec::new(); + + loop { + let mut chunk = [0; 512]; + let read_bytes = file.read(&mut chunk).map_err(|e| e.status())?; + + if read_bytes == 0 { + break; + } + + buf.extend_from_slice(&chunk[0..read_bytes]); + } + + Ok(buf) +}