use std::io::Write; use std::path::PathBuf; use anyhow::{bail, Result}; use crate::archive::ArchiveReader; pub fn run(archive: PathBuf, path: String) -> Result<()> { let reader = ArchiveReader::new_auto()?; reader.open_filename(&archive, 10240)?; let needle = path.trim_end_matches('/'); while let Some(entry) = reader.next_header()? { if let Some(pathname) = entry.pathname() { let entry_name = pathname.trim_end_matches('/'); if entry_name == needle || pathname == path { let mut stdout = std::io::stdout().lock(); let mut buf = [0u8; 16384]; loop { let n = reader.read_data(&mut buf)?; if n == 0 { break; } stdout.write_all(&buf[..n])?; } stdout.flush()?; return Ok(()); } } } bail!("entry not found: {path}"); }