pub(crate) const CREATOR_UNIX: u16 = 3;
pub(crate) const CREATOR_MACOS: u16 = 19;
pub(crate) const CREATOR_NTFS: u16 = 11;
pub(crate) const CREATOR_VFAT: u16 = 14;
pub(crate) const CREATOR_FAT: u16 = 0;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct EntryMode(u32);
impl EntryMode {
#[must_use]
pub(crate) const fn new(value: u32) -> Self {
Self(value)
}
#[must_use]
pub const fn value(&self) -> u32 {
self.0
}
#[must_use]
pub const fn is_symlink(&self) -> bool {
self.0 & S_IFMT == S_IFLNK
}
#[must_use]
pub const fn permissions(&self) -> u32 {
self.0 & 0o777
}
}
const S_IFMT: u32 = 0o170000; const S_IFSOCK: u32 = 0o140000; const S_IFLNK: u32 = 0o120000; const S_IFREG: u32 = 0o100000; const S_IFBLK: u32 = 0o060000; const S_IFDIR: u32 = 0o040000; const S_IFCHR: u32 = 0o020000; const S_IFIFO: u32 = 0o010000; const S_ISUID: u32 = 0o004000; const S_ISGID: u32 = 0o002000; const S_ISVTX: u32 = 0o001000;
const MSDOS_DIR: u32 = 0x10;
const MSDOS_READONLY: u32 = 0x01;
pub(crate) fn unix_mode_to_file_mode(m: u32) -> u32 {
let mut mode = m & 0o777;
match m & S_IFMT {
S_IFBLK => mode |= S_IFBLK,
S_IFCHR => mode |= S_IFCHR,
S_IFDIR => mode |= S_IFDIR,
S_IFIFO => mode |= S_IFIFO,
S_IFLNK => mode |= S_IFLNK,
S_IFSOCK => mode |= S_IFSOCK,
_ => mode |= S_IFREG, }
if m & S_ISGID != 0 {
mode |= S_ISGID;
}
if m & S_ISUID != 0 {
mode |= S_ISUID;
}
if m & S_ISVTX != 0 {
mode |= S_ISVTX;
}
mode
}
pub(crate) fn msdos_mode_to_file_mode(m: u32) -> u32 {
if m & MSDOS_DIR != 0 {
S_IFDIR | 0o777
} else if m & MSDOS_READONLY != 0 {
S_IFREG | 0o444
} else {
S_IFREG | 0o666
}
}