diff --git a/virtweb_backend/src/constants.rs b/virtweb_backend/src/constants.rs index d06d5fc..55e22f2 100644 --- a/virtweb_backend/src/constants.rs +++ b/virtweb_backend/src/constants.rs @@ -129,3 +129,9 @@ pub const COPY_PROGRAM: &str = "/bin/cp"; /// Gzip program path pub const GZIP_PROGRAM: &str = "/usr/bin/gzip"; + +/// Bash program +pub const BASH_PROGRAM: &str = "/usr/bin/bash"; + +/// DD program +pub const DD_PROGRAM: &str = "/usr/bin/dd"; diff --git a/virtweb_backend/src/utils/file_disks_utils.rs b/virtweb_backend/src/utils/file_disks_utils.rs index 068f46f..3fffd8a 100644 --- a/virtweb_backend/src/utils/file_disks_utils.rs +++ b/virtweb_backend/src/utils/file_disks_utils.rs @@ -251,6 +251,20 @@ impl DiskFileInfo { cmd } + // Decompress Raw to sparse file + // https://benou.fr/www/ben/decompressing-sparse-files.html + (DiskFileFormat::CompressedRaw, DiskFileFormat::Raw { is_sparse: true }) => { + let mut cmd = Command::new(constants::BASH_PROGRAM); + cmd.arg("-c").arg(format!( + "{} -d -c {} | {} conv=sparse of={}", + constants::GZIP_PROGRAM, + self.file_path.display(), + constants::DD_PROGRAM, + temp_file.display() + )); + cmd + } + // Dumb copy of file (a, b) if a == b => { let mut cmd = Command::new(constants::COPY_PROGRAM);