mod constants; pub mod permissions; use crate::block_device::BLOCK_SIZE; use crate::disk::inode::{Inode, INODE_SIZE}; use crate::{AyaFS, INODE_PER_BLOCK}; use fuser::{FileAttr, FileType}; use std::time::{Duration, SystemTime, UNIX_EPOCH}; pub(crate) fn time_now() -> u32 { SystemTime::now() .duration_since(UNIX_EPOCH) .expect("How can current time be earlier than UNIX_EPOCH?") .as_secs() as u32 } pub(crate) fn from_systime(system_time: SystemTime) -> u32 { system_time .duration_since(UNIX_EPOCH) .expect("How can current time be earlier than UNIX_EPOCH?") .as_secs() as u32 } pub(crate) fn to_systime(time: u32) -> SystemTime { UNIX_EPOCH + Duration::from_secs(time as u64) } // File type code, one of: // 0x0 Unknown. // 0x1 Regular file. // 0x2 Directory. // 0x3 Character device file. // 0x4 Block device file. // 0x5 FIFO. // 0x6 Socket. // 0x7 Symbolic link. pub(crate) fn from_filetype(file_type: FileType) -> u8 { match file_type { FileType::NamedPipe => 0x5, FileType::CharDevice => 0x3, FileType::BlockDevice => 0x4, FileType::Directory => 0x2, FileType::RegularFile => 0x1, FileType::Symlink => 0x7, FileType::Socket => 0x6, } } pub(crate) fn to_filetype(file_type: u8) -> Option { match file_type { 0x0 => None, 0x1 => Some(FileType::RegularFile), 0x2 => Some(FileType::Directory), 0x3 => Some(FileType::CharDevice), 0x4 => Some(FileType::BlockDevice), 0x5 => Some(FileType::NamedPipe), 0x6 => Some(FileType::Socket), 0x7 => Some(FileType::Symlink), _ => panic!("bad filetype"), } } pub(crate) fn to_fileattr(inode_index: usize, inode: &Inode) -> FileAttr { FileAttr { ino: inode_index as u64, size: inode.size as u64, blocks: inode.n_blocks as u64, atime: to_systime(inode.atime), mtime: to_systime(inode.mtime), ctime: to_systime(inode.ctime), crtime: to_systime(inode.crtime), kind: inode.mode.into(), perm: inode.mode.perm(), nlink: inode.n_links as u32, uid: inode.uid, gid: inode.gid, rdev: 0, blksize: BLOCK_SIZE as u32, flags: inode.flags, } } impl AyaFS { /// 输入 inode 编号, 返回它对应的 block number 和 block 内 offset pub(crate) fn locate_inode(&self, inode_index: usize) -> (usize, usize) { let block_number = inode_index / INODE_PER_BLOCK + 1 + self.inode_bitmap.length + self.data_bitmap.length; let block_offset = inode_index % INODE_PER_BLOCK * INODE_SIZE; (block_number, block_offset) } }