From 7af0771f9a3031acc36a6990d07bdb92a61c0c75 Mon Sep 17 00:00:00 2001 From: Chuyan Zhang Date: Wed, 29 Nov 2023 03:29:34 -0800 Subject: symlink, probably not working --- src/disk/inode.rs | 42 +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 41 insertions(+), 1 deletion(-) (limited to 'src/disk/inode.rs') diff --git a/src/disk/inode.rs b/src/disk/inode.rs index 6f9d338..1f5e54e 100644 --- a/src/disk/inode.rs +++ b/src/disk/inode.rs @@ -1,6 +1,6 @@ use crate::utils; use bitflags::bitflags; -use fuser::{FileAttr, FileType}; +use fuser::FileType; pub const DIRECT_NUMBER: usize = 15; @@ -33,30 +33,39 @@ bitflags! { } impl InodeMode { + #[allow(unused)] pub(crate) fn exec_other(&self) -> bool { self.0 & Self::IXOTH.0 != 0 } + #[allow(unused)] pub(crate) fn write_other(&self) -> bool { self.0 & Self::IWOTH.0 != 0 } + #[allow(unused)] pub(crate) fn read_other(&self) -> bool { self.0 & Self::IROTH.0 != 0 } + #[allow(unused)] pub(crate) fn exec_group(&self) -> bool { self.0 & Self::IXGRP.0 != 0 } + #[allow(unused)] pub(crate) fn write_group(&self) -> bool { self.0 & Self::IWGRP.0 != 0 } + #[allow(unused)] pub(crate) fn read_group(&self) -> bool { self.0 & Self::IRGRP.0 != 0 } + #[allow(unused)] pub(crate) fn exec_user(&self) -> bool { self.0 & Self::IXUSR.0 != 0 } + #[allow(unused)] pub(crate) fn write_user(&self) -> bool { self.0 & Self::IWUSR.0 != 0 } + #[allow(unused)] pub(crate) fn read_user(&self) -> bool { self.0 & Self::IRUSR.0 != 0 } @@ -73,6 +82,8 @@ impl InodeMode { (self.0 & 0xF000) == Self::IFDIR.0 } + pub(crate) fn is_symlink(&self) -> bool { self.0 & 0xF000 == Self::IFLNK.0 } + pub(crate) fn validate(mode_value: u16) -> Option { let valid_flags: [u16; 7] = [0x1000, 0x2000, 0x4000, 0x6000, 0x8000, 0xA000, 0xC000]; valid_flags @@ -165,6 +176,7 @@ impl Inode { } } + #[allow(unused)] pub fn make_inode( permissions: u16, mode: InodeMode, @@ -232,6 +244,28 @@ impl Inode { ) } + pub fn symlink( + permissions: u16, + uid: u32, + gid: u32, + time: u32, + flags: u32, + generation: u32, + file_acl: u32, + dir_acl: u32, + ) -> Self { + Self::new( + InodeMode(permissions) | InodeMode::IFLNK, + uid, + gid, + time, + flags, + generation, + file_acl, + dir_acl, + ) + } + pub(crate) fn is_file(&self) -> bool { self.mode.is_file() } @@ -240,6 +274,12 @@ impl Inode { self.mode.is_dir() } + pub(crate) fn is_symlink(&self) -> bool { self.mode.is_symlink() } + + pub(crate) fn file_type(&self) -> FileType { + self.mode.into() + } + pub fn empty() -> Self { Self { mode: InodeMode(0), -- cgit v1.2.3-70-g09d2