summaryrefslogtreecommitdiff
path: root/src/disk/inode.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/disk/inode.rs')
-rw-r--r--src/disk/inode.rs184
1 files changed, 99 insertions, 85 deletions
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::<Inode>();