Add dir_rpc support

This commit is contained in:
pjht 2024-09-26 11:30:46 -05:00
parent 4be8388cf9
commit c3fe557045
Signed by: pjht
GPG Key ID: CA239FC6934E6F3A
5 changed files with 49 additions and 3 deletions

13
Cargo.lock generated
View File

@ -44,6 +44,9 @@ name = "bitflags"
version = "2.6.0" version = "2.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de"
dependencies = [
"serde",
]
[[package]] [[package]]
name = "byteorder" name = "byteorder"
@ -69,6 +72,14 @@ version = "1.1.3"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f64009896348fc5af4222e9cf7d7d82a95a256c634ebcf61c53e4ea461422242" checksum = "f64009896348fc5af4222e9cf7d7d82a95a256c634ebcf61c53e4ea461422242"
[[package]]
name = "dir_rpc"
version = "0.1.0"
dependencies = [
"parking_lot",
"postcard",
]
[[package]] [[package]]
name = "either" name = "either"
version = "1.13.0" version = "1.13.0"
@ -92,6 +103,7 @@ name = "ext2"
version = "0.1.0" version = "0.1.0"
dependencies = [ dependencies = [
"binread", "binread",
"dir_rpc",
"file_rpc", "file_rpc",
"fs_rpc", "fs_rpc",
"itertools", "itertools",
@ -104,6 +116,7 @@ dependencies = [
name = "file_rpc" name = "file_rpc"
version = "0.1.0" version = "0.1.0"
dependencies = [ dependencies = [
"bitflags",
"parking_lot", "parking_lot",
"postcard", "postcard",
"serde", "serde",

View File

@ -5,6 +5,7 @@ edition = "2021"
[dependencies] [dependencies]
binread = "2.2.0" binread = "2.2.0"
dir_rpc = { version = "0.1.0", path = "../dir_rpc" }
file_rpc = { version = "0.1.0", path = "../file_rpc" } file_rpc = { version = "0.1.0", path = "../file_rpc" }
fs_rpc = { version = "0.1.0", path = "../fs_rpc" } fs_rpc = { version = "0.1.0", path = "../fs_rpc" }
itertools = "0.13.0" itertools = "0.13.0"

View File

@ -40,7 +40,7 @@ impl Ext2 {
}) })
} }
fn path_inode<P: AsRef<Path>>(&self, path: P) -> io::Result<u32> { pub fn path_inode<P: AsRef<Path>>(&self, path: P) -> io::Result<u32> {
let path = path.as_ref(); let path = path.as_ref();
let dentry = { self.dentry_cache.read().get(path).cloned() }; let dentry = { self.dentry_cache.read().get(path).cloned() };
if let Some(dentry) = dentry { if let Some(dentry) = dentry {

View File

@ -160,7 +160,8 @@ impl Inode {
if let Some(block) = fs.ind_block_cache.read().get(&block_no) { if let Some(block) = fs.ind_block_cache.read().get(&block_no) {
return Ok(block.clone()); return Ok(block.clone());
} }
let block = fs.reader let block = fs
.reader
.read_block(block_no)? .read_block(block_no)?
.into_inner() .into_inner()
.iter() .iter()

View File

@ -8,12 +8,14 @@ use std::{
}; };
use ext2::Ext2; use ext2::Ext2;
use itertools::Itertools;
use parking_lot::RwLock; use parking_lot::RwLock;
#[derive(Clone)] #[derive(Clone)]
struct Serv { struct Serv {
mounts: Arc<RwLock<Vec<Ext2>>>, mounts: Arc<RwLock<Vec<Ext2>>>,
files: Arc<RwLock<Vec<(ext2::File, usize)>>>, files: Arc<RwLock<Vec<(ext2::File, usize)>>>,
dirs: Arc<RwLock<Vec<(Vec<String>, usize)>>>,
} }
impl fs_rpc::Server for Serv { impl fs_rpc::Server for Serv {
@ -33,6 +35,17 @@ impl fs_rpc::Server for Serv {
let res = Ok((None, (self.files.read().len() - 1) as u64)); let res = Ok((None, (self.files.read().len() - 1) as u64));
res res
} }
fn open_dir(&self, path: &std::path::Path, mount_id: u64) -> Result<(Option<u64>, u64), ()> {
let mounts = self.mounts.read();
let mount = &mounts[mount_id as usize];
let entries = mount.read_dir(path).map_err(|_| ())?.map_ok(|x| x.file_name()).collect::<Result<Vec<_>, _>>().map_err(|_| ())?;
self.dirs
.write()
.push((entries, 0));
let res = Ok((None, (self.dirs.read().len() - 1) as u64));
res
}
} }
impl file_rpc::Server for Serv { impl file_rpc::Server for Serv {
@ -64,13 +77,31 @@ impl file_rpc::Server for Serv {
} }
} }
impl dir_rpc::Server for Serv {
fn next_entry(&self, fd: u64) -> Result<Option<String>, ()> {
let dirs = self.dirs.write();
let &(ref entries, entry_no) = &dirs[fd as usize];
if entry_no == entries.len() {
return Ok(None);
}
let entry = entries[entry_no].clone();
std::mem::drop(dirs);
self.dirs.write()[fd as usize].1 += 1;
Ok(Some(entry))
}
fn close(&self, _fd: u64) {}
}
fn main() { fn main() {
let serv = Serv { let serv = Serv {
mounts: Arc::new(RwLock::new(Vec::new())), mounts: Arc::new(RwLock::new(Vec::new())),
files: Arc::new(RwLock::new(Vec::new())), files: Arc::new(RwLock::new(Vec::new())),
dirs: Arc::new(RwLock::new(Vec::new())),
}; };
fs_rpc::register_server(Box::new(serv.clone())); fs_rpc::register_server(Box::new(serv.clone()));
file_rpc::register_server(Box::new(serv)); file_rpc::register_server(Box::new(serv.clone()));
dir_rpc::register_server(Box::new(serv));
let vfs_pid; let vfs_pid;
loop { loop {
if let Some(pid) = syscalls::try_get_registered(0) { if let Some(pid) = syscalls::try_get_registered(0) {