summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatthias Schiffer <mschiffer@universe-factory.net>2021-07-17 20:29:32 +0200
committerMatthias Schiffer <mschiffer@universe-factory.net>2021-07-17 20:29:32 +0200
commit923217e7e00749335877efd57173a63305dab133 (patch)
tree471192b09cc01a22508a339fa8b5e7dcd4a0b981
parentca47ad0e19e5edd98a9720d076360ba6b1bdf283 (diff)
downloadrebel-923217e7e00749335877efd57173a63305dab133.tar
rebel-923217e7e00749335877efd57173a63305dab133.zip
tar: add support for filtering unpacked files
-rw-r--r--src/util/tar.rs12
1 files changed, 11 insertions, 1 deletions
diff --git a/src/util/tar.rs b/src/util/tar.rs
index 41df63e..5e64bb2 100644
--- a/src/util/tar.rs
+++ b/src/util/tar.rs
@@ -34,7 +34,10 @@ pub fn pack<W: Write, P: AsRef<Path>, E: AsRef<Path>, I: Iterator<Item = E>>(
ar.into_inner()
}
-pub fn unpack<R: Read, P: AsRef<Path>>(archive: R, dest: P) -> Result<()> {
+pub fn unpack_filter<R: Read, P: AsRef<Path>, F>(archive: R, dest: P, filter: F) -> Result<()>
+where
+ for<'a> F: Fn(&tar::Entry<'a, R>) -> bool,
+{
let dest_path = dest.as_ref();
DirBuilder::new().recursive(true).create(dest_path)?;
@@ -46,6 +49,9 @@ pub fn unpack<R: Read, P: AsRef<Path>>(archive: R, dest: P) -> Result<()> {
for entry_r in ar.entries()? {
let mut entry = entry_r?;
+ if !filter(&entry) {
+ continue;
+ }
if entry.unpack_in(dest_path)? {
let header = entry.header();
let uid = header.uid()? as libc::uid_t;
@@ -61,3 +67,7 @@ pub fn unpack<R: Read, P: AsRef<Path>>(archive: R, dest: P) -> Result<()> {
Ok(())
}
+
+pub fn unpack<R: Read, P: AsRef<Path>>(archive: R, dest: P) -> Result<()> {
+ unpack_filter(archive, dest, |_| true)
+}