started work on inodes
This commit is contained in:
parent
a08a84c3e4
commit
d9bd7c91c9
1 changed files with 107 additions and 0 deletions
107
fat-fuse/src/inode.rs
Normal file
107
fat-fuse/src/inode.rs
Normal file
|
|
@ -0,0 +1,107 @@
|
|||
use std::alloc::System;
|
||||
use std::time::SystemTime;
|
||||
|
||||
use chrono::{NaiveDateTime, NaiveTime};
|
||||
use fat_bits::FatFs;
|
||||
use fat_bits::dir::DirEntry;
|
||||
use fuser::FileAttr;
|
||||
|
||||
#[derive(Debug, Clone, Copy)]
|
||||
pub enum Kind {
|
||||
File,
|
||||
Dir,
|
||||
}
|
||||
|
||||
impl From<Kind> for fuser::FileType {
|
||||
fn from(value: Kind) -> Self {
|
||||
match value {
|
||||
Kind::File => fuser::FileType::RegularFile,
|
||||
Kind::Dir => fuser::FileType::Directory,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Debug)]
|
||||
#[allow(dead_code)]
|
||||
pub struct Inode {
|
||||
ino: u64,
|
||||
|
||||
size: u64,
|
||||
// blocks: u64,
|
||||
block_size: u32,
|
||||
|
||||
kind: Kind,
|
||||
|
||||
read_only: bool,
|
||||
|
||||
atime: SystemTime,
|
||||
mtime: SystemTime,
|
||||
// ctime: SystemTime,
|
||||
crtime: SystemTime,
|
||||
|
||||
uid: u32,
|
||||
gid: u32,
|
||||
|
||||
first_cluster: u32,
|
||||
}
|
||||
|
||||
#[allow(dead_code)]
|
||||
impl Inode {
|
||||
pub fn new(fat_fs: &FatFs, dir_entry: DirEntry, uid: u32, gid: u32) -> Inode {
|
||||
assert!(dir_entry.is_file() || dir_entry.is_dir());
|
||||
|
||||
let kind = if dir_entry.is_dir() {
|
||||
Kind::Dir
|
||||
} else {
|
||||
Kind::File
|
||||
};
|
||||
|
||||
let datetime_to_system = |datetime: NaiveDateTime| -> SystemTime {
|
||||
datetime
|
||||
.and_local_timezone(chrono::Local)
|
||||
.single()
|
||||
.map(|x| -> SystemTime { x.into() })
|
||||
.unwrap_or(SystemTime::UNIX_EPOCH)
|
||||
};
|
||||
|
||||
let atime = datetime_to_system(dir_entry.last_access_date().and_time(NaiveTime::default()));
|
||||
let mtime = datetime_to_system(dir_entry.write_time());
|
||||
let crtime = datetime_to_system(dir_entry.create_time());
|
||||
|
||||
Inode {
|
||||
ino: dir_entry.first_cluster() as u64,
|
||||
size: dir_entry.file_size() as u64,
|
||||
block_size: fat_fs.bpb().bytes_per_sector() as u32,
|
||||
kind,
|
||||
read_only: dir_entry.is_readonly(),
|
||||
atime,
|
||||
mtime,
|
||||
crtime,
|
||||
uid,
|
||||
gid,
|
||||
first_cluster: dir_entry.first_cluster(),
|
||||
}
|
||||
}
|
||||
|
||||
pub fn file_attr(&self) -> FileAttr {
|
||||
let perm = if self.read_only { 0o555 } else { 0o777 };
|
||||
|
||||
FileAttr {
|
||||
ino: self.ino,
|
||||
size: self.size,
|
||||
blocks: self.size / self.block_size as u64,
|
||||
atime: self.atime,
|
||||
mtime: self.mtime,
|
||||
ctime: self.mtime,
|
||||
crtime: self.crtime,
|
||||
kind: self.kind.into(),
|
||||
perm,
|
||||
nlink: 1,
|
||||
uid: self.uid,
|
||||
gid: self.gid,
|
||||
rdev: 0,
|
||||
blksize: self.block_size,
|
||||
flags: 0,
|
||||
}
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue