From 6cdf6a8e52c992da171483f82da753a3e7ac416c Mon Sep 17 00:00:00 2001 From: beerpsi Date: Wed, 16 Jul 2025 15:47:53 +0000 Subject: [PATCH] use more idiomatic rust --- src/main.rs | 63 ++++++++++++++++++++++++++--------------------------- 1 file changed, 31 insertions(+), 32 deletions(-) diff --git a/src/main.rs b/src/main.rs index 4becbe1..62381a9 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,10 +1,10 @@ use std::{ - fs::{File, create_dir_all}, + fs::{create_dir_all, File}, io::{BufReader, BufWriter, Read, Seek, SeekFrom, Write}, path::Path, }; -use exfat_fs::dir::{Root, entry::fs::FsElement}; +use exfat_fs::dir::{entry::fs::FsElement, Root}; use aes::{ cipher::{block_padding::NoPadding, BlockDecryptMut, InnerIvInit, KeyInit, KeyIvInit}, @@ -25,39 +25,38 @@ const PAGE_SIZE: u64 = 4096; fn extract_exfat_contents(exfat_path: &Path) -> Result<()> { println!("Extracting contents of {}", exfat_path.display()); - + let file = File::open(exfat_path)?; let mut root = Root::open(file)?; - + // Create output directory with same name as exfat file (without extension) let output_dir = exfat_path.with_extension(""); + create_dir_all(&output_dir)?; - extract_fs_elements(root.items(), &output_dir)?; + Ok(()) } fn extract_fs_elements(elements: &mut [FsElement], output_dir: &Path) -> Result<()> { - let item_count = elements.len(); + for element in elements { + match element { + FsElement::F(ref mut file) => { + let dest_path = output_dir.join(file.name()); + let mut dest = File::create(dest_path)?; - for i in 0..item_count { - if let Some(FsElement::F(ref mut file_ref)) = elements.get_mut(i) { - // Extract file - let filename = file_ref.name().to_owned(); - let file_path = output_dir.join(&filename); - let mut buffer = Vec::new(); - file_ref.read_to_end(&mut buffer)?; - std::fs::write(file_path, buffer)?; - } else if let Some(FsElement::D(ref dir_ref)) = elements.get(i) { - // Handle directory - let dirname = dir_ref.name(); - let dir_path = output_dir.join(dirname); - create_dir_all(&dir_path)?; - let mut children = dir_ref.open()?; - // Extract children recursively - extract_fs_elements(&mut children, &dir_path)?; + std::io::copy(file, &mut dest)?; + } + FsElement::D(directory) => { + let dest_path = output_dir.join(directory.name()); + create_dir_all(&dest_path)?; + + let mut children = directory.open()?; + extract_fs_elements(&mut children, &dest_path)?; + } } } + Ok(()) } @@ -123,11 +122,7 @@ fn main() -> Result<()> { let data_offset = bootid.header_block_count * bootid.block_size; let key = keys.key; - let iv = if bootid.use_custom_iv { - None - } else { - keys.iv - }; + let iv = if bootid.use_custom_iv { None } else { keys.iv }; let iv = match iv { Some(iv) => iv, None => { @@ -225,13 +220,17 @@ fn main() -> Result<()> { pb.finish(); // Extract exfat contents if this is an exfat file - if bootid.container_type == ContainerType::OPTION && output_path.extension().unwrap_or_default() == "exfat" { + if bootid.container_type == ContainerType::OPTION + && output_path.extension().unwrap_or_default() == "exfat" + { if let Err(e) = extract_exfat_contents(&output_path) { - println!("WARNING: Failed to extract exfat contents: {e}"); + println!("WARNING: Failed to extract exfat contents: {e:#?}"); + } else { + println!("Extracted exfat contents: {:?}", output_path); + println!("Deleting exfat file: {:?}", output_path); + + std::fs::remove_file(output_path)?; } - println!("Extracted exfat contents: {}", output_path.display()); - println!("Deleting exfat file: {}", output_path.display()); - std::fs::remove_file(output_path)?; } page.clear();