From 95d8d84eef645b52d92fd3fb8fdea7aed1f6d474 Mon Sep 17 00:00:00 2001 From: Chuyan Zhang Date: Fri, 17 Nov 2023 11:40:33 -0800 Subject: Layer 1 incomplete --- src/disk/inode.rs | 184 +++++++++++++++++++++++++++++------------------------- 1 file changed, 99 insertions(+), 85 deletions(-) (limited to 'src/disk/inode.rs') diff --git a/src/disk/inode.rs b/src/disk/inode.rs index f38508a..6adc75d 100644 --- a/src/disk/inode.rs +++ b/src/disk/inode.rs @@ -42,111 +42,125 @@ pub struct Inode { mode: InodeMode, uid: u32, size: u32, - atime: u32, // time in seconds - ctime: u32, - mtime: u32, - dtime: u32, + atime: u32, // access time, in seconds + ctime: u32, // change time, in seconds + mtime: u32, // modify time, in seconds + crtime: u32, // create time, in seconds gid: u32, - n_links: u16, - n_blocks: u32, + pub n_links: u16, + pub n_blocks: u32, flags: u32, // TODO: do we actually need this? maybe just return 0 - direct: [u32; DIRECT_NUMBER], - single_indirect: u32, - double_indirect: u32, - triple_indirect: u32, + pub direct: [u32; DIRECT_NUMBER], + pub single_indirect: u32, + pub double_indirect: u32, + pub triple_indirect: u32, generation: u32, file_acl: u32, dir_acl: u32, // TODO do we have to implement ACL......? } impl Inode { - pub fn directory() -> Self { + fn new( + mode: InodeMode, + uid: u32, + gid: u32, + time: u32, + flags: u32, + generation: u32, + file_acl: u32, + dir_acl: u32, + ) -> Self { Self { - mode: InodeMode::IFDIR - | InodeMode::IRUSR - | InodeMode::IWUSR - | InodeMode::IXUSR - | InodeMode::IRGRP - | InodeMode::IXGRP - | InodeMode::IROTH - | InodeMode::IXOTH, - // Directory, 755 permissions - uid: 0, + mode, + uid, size: 0, - atime: 0, - ctime: 0, - mtime: 0, - dtime: 0, - gid: 0, + atime: time, + ctime: time, + mtime: time, + crtime: time, + gid, n_links: 0, n_blocks: 0, - flags: 0, + flags, direct: [0; DIRECT_NUMBER], single_indirect: 0, double_indirect: 0, triple_indirect: 0, - generation: 0, - file_acl: 0, - dir_acl: 0, + generation, + file_acl, + dir_acl, } } - pub fn file() -> Self { - Self { - mode: InodeMode::IFREG - | InodeMode::IRUSR - | InodeMode::IWUSR - | InodeMode::IXUSR - | InodeMode::IRGRP - | InodeMode::IXGRP - | InodeMode::IROTH - | InodeMode::IXOTH, - // RegularFile, 755 permissions - uid: 0, - size: 0, - atime: 0, - ctime: 0, - mtime: 0, - dtime: 0, - gid: 0, - n_links: 0, - n_blocks: 0, - flags: 0, - direct: [0; DIRECT_NUMBER], - single_indirect: 0, - double_indirect: 0, - triple_indirect: 0, - generation: 0, - file_acl: 0, - dir_acl: 0, - } + pub fn make_inode( + permissions: u16, + mode: InodeMode, + uid: u32, + gid: u32, + time: u32, + flags: u32, + generation: u32, + file_acl: u32, + dir_acl: u32, + ) -> Self { + Self::new( + InodeMode(permissions) | mode, + uid, + gid, + time, + flags, + generation, + file_acl, + dir_acl, + ) } -} -// -// #[repr(C)] -// #[derive(Debug, Default)] -// pub struct FileInode { -// file_size: u32, -// direct_blocks: [u32; DIRECT_NUMBER], -// indirect_block: u32, -// doubly_indirect_block: u32, -// } // sizeof(FileInode) == 124 bytes -// -// #[repr(C)] -// #[derive(Debug, Default)] -// pub struct DirectoryInode { -// child_number: u32, -// direct_blocks: [u32; DIRECT_NUMBER], -// indirect_block: u32, -// doubly_indirect_block: u32, -// } // sizeof(FileInode) == 124 bytes -// -// #[repr(C)] -// #[derive(Debug)] -// pub enum Inode { -// File(FileInode), -// Directory(DirectoryInode), -// } // sizeof(Inode) == 128 bytes + pub fn directory( + permissions: u16, + uid: u32, + gid: u32, + time: u32, + flags: u32, + generation: u32, + file_acl: u32, + dir_acl: u32, + ) -> Self { + Self::new( + InodeMode(permissions) | InodeMode::IFDIR, + uid, + gid, + time, + flags, + generation, + file_acl, + dir_acl, + ) + } + pub fn file( + permissions: u16, + uid: u32, + gid: u32, + time: u32, + flags: u32, + generation: u32, + file_acl: u32, + dir_acl: u32, + ) -> Self { + Self::new( + InodeMode(permissions) | InodeMode::IFREG, + uid, + gid, + time, + flags, + generation, + file_acl, + dir_acl, + ) + } + + pub fn empty() -> Self { + Self::new(InodeMode(0), 0, 0, 0, 0, 0, 0, 0) + } +} pub const INODE_SIZE: usize = std::mem::size_of::(); -- cgit v1.2.3-70-g09d2