From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from firstgate.proxmox.com (firstgate.proxmox.com [IPv6:2a01:7e0:0:424::9]) by lore.proxmox.com (Postfix) with ESMTPS id 624531FF15E for ; Mon, 27 Oct 2025 14:25:05 +0100 (CET) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id 169625E09; Mon, 27 Oct 2025 14:25:36 +0100 (CET) From: Filip Schauer To: pbs-devel@lists.proxmox.com Date: Mon, 27 Oct 2025 14:24:43 +0100 Message-ID: <20251027132450.101103-2-f.schauer@proxmox.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20251027132450.101103-1-f.schauer@proxmox.com> References: <20251027132450.101103-1-f.schauer@proxmox.com> MIME-Version: 1.0 X-Bm-Milter-Handled: 55990f41-d878-4baa-be0a-ee34c49e34d2 X-Bm-Transport-Timestamp: 1761571520584 X-SPAM-LEVEL: Spam detection results: 0 AWL -0.006 Adjusted score from AWL reputation of From: address BAYES_00 -1.9 Bayes spam probability is 0 to 1% DMARC_MISSING 0.1 Missing DMARC policy KAM_DMARC_STATUS 0.01 Test Rule for DKIM or SPF Failure with Strict Alignment SPF_HELO_NONE 0.001 SPF: HELO does not publish an SPF Record SPF_PASS -0.001 SPF: sender matches SPF record Subject: [pbs-devel] [PATCH proxmox v5 1/5] compression: zip: add a FileType enum X-BeenThere: pbs-devel@lists.proxmox.com X-Mailman-Version: 2.1.29 Precedence: list List-Id: Proxmox Backup Server development discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: Proxmox Backup Server development discussion Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Errors-To: pbs-devel-bounces@lists.proxmox.com Sender: "pbs-devel" Signed-off-by: Filip Schauer --- proxmox-compression/src/zip.rs | 32 ++++++++++++++++++++++---------- 1 file changed, 22 insertions(+), 10 deletions(-) diff --git a/proxmox-compression/src/zip.rs b/proxmox-compression/src/zip.rs index 11b29de4..e67613e4 100644 --- a/proxmox-compression/src/zip.rs +++ b/proxmox-compression/src/zip.rs @@ -17,6 +17,7 @@ use std::time::SystemTime; use anyhow::{format_err, Error, Result}; use endian_trait::Endian; use futures::ready; +use libc::{S_IFDIR, S_IFREG}; use tokio::io::{AsyncRead, AsyncWrite, AsyncWriteExt, ReadBuf}; use crc32fast::Hasher; @@ -71,6 +72,12 @@ fn epoch_to_dos(epoch: i64) -> (u16, u16) { (date, time) } +#[derive(Clone, Copy, Eq, PartialEq)] +pub enum FileType { + Directory, + Regular, +} + #[derive(Endian)] #[repr(C, packed)] struct Zip64Field { @@ -202,16 +209,15 @@ pub struct ZipEntry { uncompressed_size: u64, compressed_size: u64, offset: u64, - is_file: bool, is_utf8_filename: bool, } impl ZipEntry { /// Creates a new ZipEntry /// - /// if is_file is false the path will contain an trailing separator, + /// if file_type is Directory, the path will contain a trailing separator, /// so that the zip file understands that it is a directory - pub fn new>(path: P, mtime: i64, mode: u16, is_file: bool) -> Self { + pub fn new>(path: P, mtime: i64, mut mode: u16, file_type: FileType) -> Self { let mut relpath = PathBuf::new(); for comp in path.as_ref().components() { @@ -220,13 +226,18 @@ impl ZipEntry { } } - if !is_file { + if file_type == FileType::Directory { relpath.push(""); // adds trailing slash } let filename: OsString = relpath.into(); let is_utf8_filename = filename.to_str().is_some(); + mode |= match file_type { + FileType::Regular => S_IFREG, + FileType::Directory => S_IFDIR, + } as u16; + Self { filename, crc32: 0, @@ -235,7 +246,6 @@ impl ZipEntry { uncompressed_size: 0, compressed_size: 0, offset: 0, - is_file, is_utf8_filename, } } @@ -342,6 +352,8 @@ impl ZipEntry { ) }; + let is_directory = (self.mode & S_IFDIR as u16) != 0; + write_struct( &mut buf, CentralDirectoryFileHeader { @@ -360,7 +372,7 @@ impl ZipEntry { comment_len: 0, start_disk: 0, internal_flags: 0, - external_flags: ((self.mode as u32) << 16) | ((!self.is_file as u32) << 4), + external_flags: ((self.mode as u32) << 16) | ((is_directory as u32) << 4), offset, }, ) @@ -437,7 +449,7 @@ where /// use anyhow::{Error, Result}; /// use tokio::fs::File; /// -/// use proxmox_compression::zip::{ZipEncoder, ZipEntry}; +/// use proxmox_compression::zip::{FileType, ZipEncoder, ZipEntry}; /// /// //#[tokio::main] /// async fn main_() -> Result<(), Error> { @@ -449,7 +461,7 @@ where /// "foo.txt", /// 0, /// 0o100755, -/// true, +/// FileType::Regular, /// ), Some(source)).await?; /// /// zip.finish().await?; @@ -658,10 +670,10 @@ where if entry.file_type().is_file() { let file = tokio::fs::File::open(entry.path()).await?; - let ze = ZipEntry::new(entry_path_no_base, mtime, mode, true); + let ze = ZipEntry::new(entry_path_no_base, mtime, mode, FileType::Regular); Ok(Some((ze, Some(file)))) } else if entry.file_type().is_dir() { - let ze = ZipEntry::new(entry_path_no_base, mtime, mode, false); + let ze = ZipEntry::new(entry_path_no_base, mtime, mode, FileType::Directory); let content: Option = None; Ok(Some((ze, content))) } else { -- 2.47.3 _______________________________________________ pbs-devel mailing list pbs-devel@lists.proxmox.com https://lists.proxmox.com/cgi-bin/mailman/listinfo/pbs-devel