2025-07-29 20:33:36 +02:00
|
|
|
mod fuse;
|
2025-07-27 23:16:56 +02:00
|
|
|
mod inode;
|
|
|
|
|
|
|
|
|
|
use std::cell::RefCell;
|
|
|
|
|
use std::collections::BTreeMap;
|
|
|
|
|
use std::rc::Rc;
|
2025-07-27 14:38:31 +02:00
|
|
|
|
|
|
|
|
use fat_bits::{FatFs, SliceLike};
|
|
|
|
|
|
2025-07-27 23:16:56 +02:00
|
|
|
use crate::inode::Inode;
|
2025-07-27 14:38:31 +02:00
|
|
|
|
|
|
|
|
#[allow(dead_code)]
|
2025-07-27 23:16:56 +02:00
|
|
|
pub struct FatFuse {
|
|
|
|
|
fat_fs: FatFs,
|
2025-07-27 14:38:31 +02:00
|
|
|
|
|
|
|
|
uid: u32,
|
|
|
|
|
gid: u32,
|
2025-07-27 23:16:56 +02:00
|
|
|
|
2025-07-29 20:33:36 +02:00
|
|
|
next_fd: u32,
|
|
|
|
|
|
2025-07-27 23:16:56 +02:00
|
|
|
inode_table: BTreeMap<u64, Inode>,
|
2025-07-27 14:38:31 +02:00
|
|
|
}
|
|
|
|
|
|
2025-07-27 23:16:56 +02:00
|
|
|
impl FatFuse {
|
|
|
|
|
pub fn new(data: Rc<RefCell<dyn SliceLike>>) -> anyhow::Result<FatFuse> {
|
2025-07-27 14:38:31 +02:00
|
|
|
let uid = unsafe { libc::getuid() };
|
|
|
|
|
let gid = unsafe { libc::getgid() };
|
|
|
|
|
|
|
|
|
|
let fat_fs = FatFs::load(data)?;
|
|
|
|
|
|
2025-07-27 23:16:56 +02:00
|
|
|
Ok(FatFuse {
|
|
|
|
|
fat_fs,
|
|
|
|
|
uid,
|
|
|
|
|
gid,
|
2025-07-29 20:33:36 +02:00
|
|
|
next_fd: 0,
|
2025-07-27 23:16:56 +02:00
|
|
|
inode_table: BTreeMap::new(),
|
|
|
|
|
})
|
2025-07-27 14:38:31 +02:00
|
|
|
}
|
|
|
|
|
|
2025-07-29 20:33:36 +02:00
|
|
|
fn get_inode(&self, ino: u64) -> Option<&Inode> {
|
|
|
|
|
self.inode_table.get(&ino)
|
2025-07-27 14:38:31 +02:00
|
|
|
}
|
|
|
|
|
|
2025-07-29 20:33:36 +02:00
|
|
|
fn get_inode_mut(&mut self, ino: u64) -> Option<&mut Inode> {
|
|
|
|
|
self.inode_table.get_mut(&ino)
|
2025-07-27 14:38:31 +02:00
|
|
|
}
|
|
|
|
|
}
|