use std::{
collections::BTreeMap,
sync::{Arc, Mutex, RwLock, atomic::AtomicU64},
time::Duration,
};
pub(crate) const ROOT_INODE: u64 = 1;
pub struct MemFsConfig {
pub capacity: Option<u64>,
pub max_inodes: Option<u64>,
pub entry_timeout: Duration,
pub attr_timeout: Duration,
pub cache_policy: CachePolicy,
pub writeback: bool,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum CachePolicy {
Never,
Auto,
Always,
}
pub(crate) struct MemNode {
pub inode: u64,
pub kind: u32,
pub lookup_refs: AtomicU64,
pub meta: RwLock<InodeMeta>,
pub content: InodeContent,
pub xattrs: RwLock<BTreeMap<Vec<u8>, Vec<u8>>>,
}
pub(crate) struct InodeMeta {
pub uid: u32,
pub gid: u32,
pub mode: u32,
pub rdev: u32,
pub nlink: u64,
pub size: u64,
pub atime: Timespec,
pub mtime: Timespec,
pub ctime: Timespec,
}
pub(crate) enum InodeContent {
RegularFile {
data: RwLock<Vec<u8>>,
},
Directory {
children: RwLock<BTreeMap<Vec<u8>, u64>>,
parent: AtomicU64,
},
Symlink {
target: Vec<u8>,
},
Special,
}
pub(crate) struct FileHandle {
pub node: Arc<MemNode>,
pub flags: u32,
}
pub(crate) struct DirHandle {
pub node: Arc<MemNode>,
pub snapshot: Mutex<Option<DirSnapshot>>,
}
pub(crate) struct DirSnapshot {
pub entries: Vec<MemDirEntry>,
}
pub(crate) struct MemDirEntry {
pub name: Vec<u8>,
pub inode: u64,
pub offset: u64,
pub file_type: u32,
}
#[derive(Debug, Clone, Copy)]
pub(crate) struct Timespec {
pub sec: i64,
pub nsec: i64,
}