ableos/ableos/src/filesystem/ext2.rs

98 lines
2.5 KiB
Rust

/*
* Copyright (c) 2022, Umut İnan Erdoğan <umutinanerdogan@pm.me>
*
* SPDX-License-Identifier: MPL-2.0
*/
use ext2::fs::{sync::Synced, Ext2};
use ext2::sector::SectorSize;
use ext2::volume::Volume;
use super::errors::FsError;
use super::{FsResult as Result, StorageDevice, DirectoryEntry, FsNode, FileDescriptor};
pub struct Ext2StorageDevice<S, V>
where
S: SectorSize,
V: Volume<u8, S>,
{
fs: Synced<Ext2<S, V>>,
}
impl<S, V> Ext2StorageDevice<S, V>
where
S: SectorSize,
V: Volume<u8, S>,
{
pub fn new(volume: V) -> Result<Self> {
Ok(Self {
fs: Synced::new(volume).map_err(|e| e.into())?,
})
}
}
impl<S, V> StorageDevice for Ext2StorageDevice<S, V>
where
S: SectorSize + Send,
V: Volume<u8, S> + Send,
{
fn open(&self, node: &super::FsNode /* TODO: flags */) -> Result<FileDescriptor> {
let inode = self
.fs
.inode_nth(node.inode as usize)
.ok_or_else(|| FsError::InodeNotFound)?;
Ok(FileDescriptor::new(node.flags, inode.size(), node.inode))
}
fn close(&self, node: &super::FsNode) -> Result<()> {
todo!()
}
fn read(&self, node: &super::FsNode, offset: usize, size: usize) -> Result<Box<[u8]>> {
todo!()
}
fn write(&self, node: &super::FsNode, offset: usize, buffer: Box<[u8]>) -> Result<()> {
todo!()
}
fn read_dir(&self, node: &super::FsNode, index: usize) -> Result<DirectoryEntry> {
todo!()
}
fn find_dir(&self, node: &super::FsNode, name: &str) -> Result<FsNode> {
todo!()
}
}
// fn load_fs() -> Arc<Mutex<Ext2<Size1024, Vec<u8>>>> {
// let mut volume = Vec::new();
// volume.extend_from_slice(include_bytes!("../../../userland/root_fs/ext2.img"));
// Arc::<Ext2<Size1024, _>>::new(volume).unwrap()
// }
// pub fn walk<S: SectorSize, V: Volume<u8, S>>(
// fs: &Synced<Ext2<S, V>>,
// inode: Inode<S, V>,
// name: String,
// ) {
// if let Some(dir) = inode.directory() {
// for entry in dir {
// assert!(entry.is_ok());
// let entry = entry.unwrap();
// let entry_name = String::from_utf8_lossy(&entry.name);
// println!("{}/{} => {}", name, entry_name, entry.inode,);
// if entry_name != "." && entry_name != ".." {
// walk(
// fs,
// fs.inode_nth(entry.inode).unwrap(),
// format!("{}/{}", name, entry_name),
// );
// }
// }
// }
// }