Compare commits

..

2 commits

Author SHA1 Message Date
d20fe4cf2d added fat-mount 2025-07-30 21:59:34 +02:00
833fb71108 implemented FUSE lookup function 2025-07-30 21:59:34 +02:00
4 changed files with 45 additions and 8 deletions

4
Cargo.lock generated
View file

@ -150,10 +150,6 @@ dependencies = [
"thiserror",
]
[[package]]
name = "fat-mount"
version = "0.1.0"
[[package]]
name = "fuser"
version = "0.15.1"

View file

@ -65,6 +65,7 @@ pub struct DirEntry {
file_size: u32,
checksum: u8,
long_name: Option<CompactString>,
}
@ -90,7 +91,7 @@ impl Display for DirEntry {
}
impl DirEntry {
fn load_name(bytes: [u8; 13], attr: &Attr) -> [u8; 13] {
fn load_name(bytes: [u8; 11], attr: &Attr) -> [u8; 13] {
let mut name = [0; 13];
let mut iter = name.iter_mut();
@ -194,6 +195,7 @@ impl DirEntry {
write_date,
file_size,
long_name: None,
checksum: Self::checksum(&bytes[..11]),
})
}
@ -334,10 +336,10 @@ impl DirEntry {
self.file_size
}
pub fn checksum(&self) -> u8 {
pub fn checksum(name: &[u8]) -> u8 {
let mut checksum: u8 = 0;
for &x in self.name() {
for &x in name {
checksum = checksum.rotate_right(1).wrapping_add(x);
}
@ -577,7 +579,7 @@ impl<R: Read> DirIter<R> {
if let Some(iter) = self
.long_filename_buf
.get_buf(dir_entry.checksum())
.get_buf(dir_entry.checksum)
.map_err(|e| {
anyhow::anyhow!(
"failed to get long filename for {}: {}",

10
fat-mount/Cargo.toml Normal file
View file

@ -0,0 +1,10 @@
[package]
name = "fat-mount"
version = "0.1.0"
edition = "2024"
[dependencies]
anyhow = "1.0.98"
env_logger = "0.11.8"
fat-fuse = { version = "0.1.0", path = "../fat-fuse" }
fuser = "0.15.1"

29
fat-mount/src/main.rs Normal file
View file

@ -0,0 +1,29 @@
use std::cell::RefCell;
use std::fs::File;
use std::rc::Rc;
use fat_fuse::FatFuse;
use fuser::MountOption;
fn main() -> anyhow::Result<()> {
env_logger::init();
let mut args = std::env::args();
let path = args.next().ok_or(anyhow::anyhow!("missing fs path"))?;
let mountpoint = args.next().ok_or(anyhow::anyhow!("missing mount point"))?;
let file = File::open(path)?;
let fat_fuse = FatFuse::new(Rc::new(RefCell::new(file)))?;
let options = vec![
MountOption::RO,
MountOption::FSName("fat-fuse".to_owned()),
MountOption::AutoUnmount,
];
fuser::mount2(fat_fuse, mountpoint, &options).unwrap();
Ok(())
}