diff --git a/src/pkg/package.rs b/src/pkg/package.rs index bda9d2d..cf8fb7a 100644 --- a/src/pkg/package.rs +++ b/src/pkg/package.rs @@ -1,7 +1,8 @@ use std::{ fs::File, - io::{BufReader, Cursor, Read}, + io::{BufReader, Cursor, Read, Write}, path::{Path, PathBuf}, + process::{Command, Stdio}, }; use based::get_pg; @@ -525,50 +526,63 @@ pub fn repo_add(db_file: &str, pkg_file: &str) { } pub fn read_file_tar(tar: &Path, file_path: &str) -> Option { - let file = File::open(tar).ok()?; - let decoder = Decoder::new(BufReader::new(file)).ok()?; - let mut archive = Archive::new(decoder); + let output = Command::new("tar") + .arg("-xO") // Extract to stdout (-O) + .arg("-f") + .arg(tar) + .arg(file_path) + .output() + .ok()?; - for entry in archive.entries().ok()? { - let mut entry = entry.ok()?; - if entry.path().ok()?.to_str()? == file_path { - let mut file_content = String::new(); - entry.read_to_string(&mut file_content).ok()?; - return Some(file_content); - } + if output.status.success() { + Some(String::from_utf8(output.stdout).ok()?.to_string()) + } else { + None } - - None } pub fn read_file_tar_raw(tar_data: &[u8], file_path: &str) -> Option { - let decoder = Decoder::new(Cursor::new(tar_data)).ok()?; - let mut archive = Archive::new(decoder); + let mut output = Command::new("tar") + .arg("-xO") // Extract to stdout (-O) + .arg("-f") + .arg("-") // Indicate that the file input comes from stdin + .arg(file_path) + .stdin(Stdio::piped()) // Open a pipe to provide the tar data + .spawn() + .ok()?; - for entry in archive.entries().ok()? { - let mut entry = entry.ok()?; - if entry.path().ok()?.to_str()? == file_path { - let mut file_content = String::new(); - entry.read_to_string(&mut file_content).ok()?; - return Some(file_content); - } + if let Some(stdin) = output.stdin.as_mut() { + stdin.write_all(tar_data).ok()?; + stdin.flush().ok()?; } - None + let output = output.wait_with_output().ok()?; + + if output.status.success() { + Some(String::from_utf8(output.stdout).ok()?.to_string()) + } else { + None + } } pub fn list_tar_file(tar: &Path) -> Option> { - let file = File::open(tar).ok()?; - let decoder = Decoder::new(BufReader::new(file)).ok()?; - let mut archive = Archive::new(decoder); - let mut paths = Vec::new(); + let output = Command::new("tar") + .arg("-tf") // List the contents of the tar file + .arg(tar) + .output() + .ok()?; - for entry in archive.entries().ok()? { - let entry = entry.ok()?; - paths.push(entry.path().ok()?.to_string_lossy().into_owned()); + if output.status.success() { + let output_str = String::from_utf8(output.stdout).ok()?; + let paths = output_str + .lines() + .map(|line| line.to_string()) + .collect::>(); + + Some(paths) + } else { + None } - - Some(paths) } #[derive(Debug, Clone, FromRow)]