summaryrefslogtreecommitdiffstats
path: root/nix-rust/src/util/tarfile.rs
diff options
context:
space:
mode:
Diffstat (limited to 'nix-rust/src/util/tarfile.rs')
-rw-r--r--nix-rust/src/util/tarfile.rs56
1 files changed, 0 insertions, 56 deletions
diff --git a/nix-rust/src/util/tarfile.rs b/nix-rust/src/util/tarfile.rs
deleted file mode 100644
index 74d60692c..000000000
--- a/nix-rust/src/util/tarfile.rs
+++ /dev/null
@@ -1,56 +0,0 @@
-use crate::{foreign::Source, Error};
-use std::fs;
-use std::io;
-use std::os::unix::fs::OpenOptionsExt;
-use std::path::{Component, Path};
-use tar::Archive;
-
-pub fn unpack_tarfile(source: Source, dest_dir: &Path) -> Result<(), Error> {
- fs::create_dir_all(dest_dir)?;
-
- let mut tar = Archive::new(source);
-
- for file in tar.entries()? {
- let mut file = file?;
-
- let path = file.path()?;
-
- for i in path.components() {
- if let Component::Prefix(_) | Component::RootDir | Component::ParentDir = i {
- return Err(Error::BadTarFileMemberName(
- file.path()?.to_str().unwrap().to_string(),
- ));
- }
- }
-
- let dest_file = dest_dir.join(path);
-
- fs::create_dir_all(dest_file.parent().unwrap())?;
-
- match file.header().entry_type() {
- tar::EntryType::Directory => {
- fs::create_dir(dest_file)?;
- }
- tar::EntryType::Regular => {
- let mode = if file.header().mode()? & (libc::S_IXUSR as u32) == 0 {
- 0o666
- } else {
- 0o777
- };
- let mut f = fs::OpenOptions::new()
- .create(true)
- .write(true)
- .mode(mode)
- .open(dest_file)?;
- io::copy(&mut file, &mut f)?;
- }
- tar::EntryType::Symlink => {
- std::os::unix::fs::symlink(file.header().link_name()?.unwrap(), dest_file)?;
- }
- tar::EntryType::XGlobalHeader | tar::EntryType::XHeader => {}
- t => return Err(Error::Misc(format!("unsupported tar entry type '{:?}'", t))),
- }
- }
-
- Ok(())
-}