From c1ebfcd9d6ae75f999d33f14b41be3c39fe18339 Mon Sep 17 00:00:00 2001 From: Jack Holt Date: Tue, 15 Apr 2025 17:46:07 -0500 Subject: [PATCH 1/2] Adds permission accessors to Inode implementation. --- kernel/src/filesys/ext2/structures.rs | 66 +++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) diff --git a/kernel/src/filesys/ext2/structures.rs b/kernel/src/filesys/ext2/structures.rs index 86d39fd3..38455f46 100644 --- a/kernel/src/filesys/ext2/structures.rs +++ b/kernel/src/filesys/ext2/structures.rs @@ -229,6 +229,72 @@ impl Inode { pub fn size(&self) -> u64 { self.size_low as u64 } + + /// Getters to determine permissions for the specified user on this file + pub fn user_execute(&self) -> bool { + FileMode::from_bits_truncate(self.mode & 0x40) == FileMode::UEXEC + } + pub fn user_write(&self) -> bool { + FileMode::from_bits_truncate(self.mode & 0x80) == FileMode::UWRITE + } + pub fn user_read(&self) -> bool { + FileMode::from_bits_truncate(self.mode & 0x100) == FileMode::UREAD + } + + /// Setters to alter permissions for the specified user on this file + pub fn set_user_exectute(&mut self, new_value: bool) { + self.mode = (self.mode & !0x40) | ((new_value as u16) << 6); + } + pub fn set_user_write(&mut self, new_value: bool) { + self.mode = (self.mode & !0x80) | ((new_value as u16) << 7); + } + pub fn set_user_read(&mut self, new_value: bool) { + self.mode = (self.mode & !0x100) | ((new_value as u16) << 8); + } + + /// Getters to determine permissions for the specified user group on this file + pub fn group_execute(&self) -> bool { + FileMode::from_bits_truncate(self.mode & 0x8) == FileMode::GEXEC + } + pub fn group_write(&self) -> bool { + FileMode::from_bits_truncate(self.mode & 0x10) == FileMode::GWRITE + } + pub fn group_read(&self) -> bool { + FileMode::from_bits_truncate(self.mode & 0x20) == FileMode::GREAD + } + + /// Setters to alter permissions for the specified user group on this file + pub fn set_group_exectute(&mut self, new_value: bool) { + self.mode = (self.mode & !0x8) | ((new_value as u16) << 3); + } + pub fn set_group_write(&mut self, new_value: bool) { + self.mode = (self.mode & !0x10) | ((new_value as u16) << 4); + } + pub fn set_group_read(&mut self, new_value: bool) { + self.mode = (self.mode & !0x20) | ((new_value as u16) << 5); + } + + /// Getters to determine permissions for the unspecified users on this file + pub fn other_exectute(&self) -> bool { + FileMode::from_bits_truncate(self.mode & 0x1) == FileMode::OEXEC + } + pub fn other_write(&self) -> bool { + FileMode::from_bits_truncate(self.mode & 0x2) == FileMode::OWRITE + } + pub fn other_read(&self) -> bool { + FileMode::from_bits_truncate(self.mode & 0x4) == FileMode::OREAD + } + + /// Setters to alter permissions for unspecified users on this file + pub fn set_other_exectute(&mut self, new_value: bool) { + self.mode = (self.mode & !0x1) | new_value as u16; + } + pub fn set_other_write(&mut self, new_value: bool) { + self.mode = (self.mode & !0x2) | ((new_value as u16) << 1); + } + pub fn set_other_read(&mut self, new_value: bool) { + self.mode = (self.mode & !0x4) | ((new_value as u16) << 2); + } } /// Directory entry structure - variable length on disk From 1f1705d73d901e3f327585da8cb850fc2d8c0cae Mon Sep 17 00:00:00 2001 From: Jack Holt Date: Wed, 16 Apr 2025 15:11:45 -0500 Subject: [PATCH 2/2] Reformats pedantically. Makes getters for permissions more rustacian. --- kernel/src/filesys/ext2/structures.rs | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/kernel/src/filesys/ext2/structures.rs b/kernel/src/filesys/ext2/structures.rs index 38455f46..668ff949 100644 --- a/kernel/src/filesys/ext2/structures.rs +++ b/kernel/src/filesys/ext2/structures.rs @@ -232,13 +232,13 @@ impl Inode { /// Getters to determine permissions for the specified user on this file pub fn user_execute(&self) -> bool { - FileMode::from_bits_truncate(self.mode & 0x40) == FileMode::UEXEC + FileMode::from_bits_retain(self.mode).contains(FileMode::UEXEC) } pub fn user_write(&self) -> bool { - FileMode::from_bits_truncate(self.mode & 0x80) == FileMode::UWRITE + FileMode::from_bits_retain(self.mode).contains(FileMode::UWRITE) } pub fn user_read(&self) -> bool { - FileMode::from_bits_truncate(self.mode & 0x100) == FileMode::UREAD + FileMode::from_bits_retain(self.mode).contains(FileMode::UREAD) } /// Setters to alter permissions for the specified user on this file @@ -254,13 +254,13 @@ impl Inode { /// Getters to determine permissions for the specified user group on this file pub fn group_execute(&self) -> bool { - FileMode::from_bits_truncate(self.mode & 0x8) == FileMode::GEXEC + FileMode::from_bits_retain(self.mode).contains(FileMode::GEXEC) } pub fn group_write(&self) -> bool { - FileMode::from_bits_truncate(self.mode & 0x10) == FileMode::GWRITE + FileMode::from_bits_retain(self.mode).contains(FileMode::GWRITE) } pub fn group_read(&self) -> bool { - FileMode::from_bits_truncate(self.mode & 0x20) == FileMode::GREAD + FileMode::from_bits_retain(self.mode).contains(FileMode::GREAD) } /// Setters to alter permissions for the specified user group on this file @@ -276,13 +276,13 @@ impl Inode { /// Getters to determine permissions for the unspecified users on this file pub fn other_exectute(&self) -> bool { - FileMode::from_bits_truncate(self.mode & 0x1) == FileMode::OEXEC + FileMode::from_bits_retain(self.mode).contains(FileMode::OEXEC) } pub fn other_write(&self) -> bool { - FileMode::from_bits_truncate(self.mode & 0x2) == FileMode::OWRITE + FileMode::from_bits_retain(self.mode).contains(FileMode::OWRITE) } pub fn other_read(&self) -> bool { - FileMode::from_bits_truncate(self.mode & 0x4) == FileMode::OREAD + FileMode::from_bits_retain(self.mode).contains(FileMode::OREAD) } /// Setters to alter permissions for unspecified users on this file