34 lines
998 B
Rust
34 lines
998 B
Rust
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}");
|
|
}
|