Refactor: Extract ZipFileData::unix_mode
Signed-off-by: Jiahao XU <Jiahao_XU@outlook.com>
This commit is contained in:
parent
a614d1f226
commit
16753209af
2 changed files with 32 additions and 26 deletions
27
src/read.rs
27
src/read.rs
|
@ -29,11 +29,6 @@ use bzip2::read::BzDecoder;
|
||||||
#[cfg(feature = "zstd")]
|
#[cfg(feature = "zstd")]
|
||||||
use zstd::stream::read::Decoder as ZstdDecoder;
|
use zstd::stream::read::Decoder as ZstdDecoder;
|
||||||
|
|
||||||
mod ffi {
|
|
||||||
pub const S_IFDIR: u32 = 0o0040000;
|
|
||||||
pub const S_IFREG: u32 = 0o0100000;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Put the struct declaration in a private module to convince rustdoc to display ZipArchive nicely
|
// Put the struct declaration in a private module to convince rustdoc to display ZipArchive nicely
|
||||||
pub(crate) mod zip_archive {
|
pub(crate) mod zip_archive {
|
||||||
/// Extract immutable data from `ZipArchive` to make it cheap to clone
|
/// Extract immutable data from `ZipArchive` to make it cheap to clone
|
||||||
|
@ -949,27 +944,7 @@ impl<'a> ZipFile<'a> {
|
||||||
|
|
||||||
/// Get unix mode for the file
|
/// Get unix mode for the file
|
||||||
pub fn unix_mode(&self) -> Option<u32> {
|
pub fn unix_mode(&self) -> Option<u32> {
|
||||||
if self.data.external_attributes == 0 {
|
self.data.unix_mode()
|
||||||
return None;
|
|
||||||
}
|
|
||||||
|
|
||||||
match self.data.system {
|
|
||||||
System::Unix => Some(self.data.external_attributes >> 16),
|
|
||||||
System::Dos => {
|
|
||||||
// Interpret MS-DOS directory bit
|
|
||||||
let mut mode = if 0x10 == (self.data.external_attributes & 0x10) {
|
|
||||||
ffi::S_IFDIR | 0o0775
|
|
||||||
} else {
|
|
||||||
ffi::S_IFREG | 0o0664
|
|
||||||
};
|
|
||||||
if 0x01 == (self.data.external_attributes & 0x01) {
|
|
||||||
// Read-only bit; strip write permissions
|
|
||||||
mode &= 0o0555;
|
|
||||||
}
|
|
||||||
Some(mode)
|
|
||||||
}
|
|
||||||
_ => None,
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Get the CRC32 hash of the original file
|
/// Get the CRC32 hash of the original file
|
||||||
|
|
31
src/types.rs
31
src/types.rs
|
@ -1,5 +1,6 @@
|
||||||
//! Types that specify what is contained in a ZIP.
|
//! Types that specify what is contained in a ZIP.
|
||||||
use std::path;
|
use std::path;
|
||||||
|
|
||||||
#[cfg(not(any(
|
#[cfg(not(any(
|
||||||
all(target_arch = "arm", target_pointer_width = "32"),
|
all(target_arch = "arm", target_pointer_width = "32"),
|
||||||
target_arch = "mips",
|
target_arch = "mips",
|
||||||
|
@ -11,6 +12,11 @@ use std::time::SystemTime;
|
||||||
#[cfg(doc)]
|
#[cfg(doc)]
|
||||||
use {crate::read::ZipFile, crate::write::FileOptions};
|
use {crate::read::ZipFile, crate::write::FileOptions};
|
||||||
|
|
||||||
|
mod ffi {
|
||||||
|
pub const S_IFDIR: u32 = 0o0040000;
|
||||||
|
pub const S_IFREG: u32 = 0o0100000;
|
||||||
|
}
|
||||||
|
|
||||||
#[cfg(any(
|
#[cfg(any(
|
||||||
all(target_arch = "arm", target_pointer_width = "32"),
|
all(target_arch = "arm", target_pointer_width = "32"),
|
||||||
target_arch = "mips",
|
target_arch = "mips",
|
||||||
|
@ -391,6 +397,31 @@ impl ZipFileData {
|
||||||
Some(path)
|
Some(path)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Get unix mode for the file
|
||||||
|
pub fn unix_mode(&self) -> Option<u32> {
|
||||||
|
if self.external_attributes == 0 {
|
||||||
|
return None;
|
||||||
|
}
|
||||||
|
|
||||||
|
match self.system {
|
||||||
|
System::Unix => Some(self.external_attributes >> 16),
|
||||||
|
System::Dos => {
|
||||||
|
// Interpret MS-DOS directory bit
|
||||||
|
let mut mode = if 0x10 == (self.external_attributes & 0x10) {
|
||||||
|
ffi::S_IFDIR | 0o0775
|
||||||
|
} else {
|
||||||
|
ffi::S_IFREG | 0o0664
|
||||||
|
};
|
||||||
|
if 0x01 == (self.external_attributes & 0x01) {
|
||||||
|
// Read-only bit; strip write permissions
|
||||||
|
mode &= 0o0555;
|
||||||
|
}
|
||||||
|
Some(mode)
|
||||||
|
}
|
||||||
|
_ => None,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pub fn zip64_extension(&self) -> bool {
|
pub fn zip64_extension(&self) -> bool {
|
||||||
self.uncompressed_size > 0xFFFFFFFF
|
self.uncompressed_size > 0xFFFFFFFF
|
||||||
|| self.compressed_size > 0xFFFFFFFF
|
|| self.compressed_size > 0xFFFFFFFF
|
||||||
|
|
Loading…
Add table
Reference in a new issue