diff --git a/rust/lib/victoriafalls/src/file.rs b/rust/lib/victoriafalls/src/file.rs index 619c4c7..2c09f53 100644 --- a/rust/lib/victoriafalls/src/file.rs +++ b/rust/lib/victoriafalls/src/file.rs @@ -4,6 +4,7 @@ use mammoth::{cap::Capability, zion::ZError}; pub struct File { memory: mammoth::mem::MemoryRegion, + len: usize, } impl File { @@ -15,10 +16,11 @@ impl File { Ok(Self { memory: mammoth::mem::MemoryRegion::from_cap(Capability::take(resp.memory))?, + len: resp.size as usize, }) } pub fn slice(&self) -> &[u8] { - self.memory.slice() + &self.memory.slice()[..self.len] } } diff --git a/rust/lib/victoriafalls/src/lib.rs b/rust/lib/victoriafalls/src/lib.rs index f6887c4..a397f36 100644 --- a/rust/lib/victoriafalls/src/lib.rs +++ b/rust/lib/victoriafalls/src/lib.rs @@ -23,3 +23,7 @@ fn get_client() -> &'static mut VFSClient { VFS_CLIENT.as_mut().unwrap() } } + +pub fn set_client(client: VFSClient) { + unsafe { VFS_CLIENT = Some(client) }; +} diff --git a/rust/sys/yellowstone/src/main.rs b/rust/sys/yellowstone/src/main.rs index d3c84d1..46a6c49 100644 --- a/rust/sys/yellowstone/src/main.rs +++ b/rust/sys/yellowstone/src/main.rs @@ -3,6 +3,7 @@ extern crate alloc; +use alloc::vec::Vec; use mammoth::{ cap::Capability, define_entry, elf, @@ -58,6 +59,20 @@ extern "C" fn main() -> z_err_t { context.wait_victoria_falls().unwrap(); mammoth::debug!("VFS Registered"); + let file = victoriafalls::file::File::open("/init.txt").unwrap(); + + let init_files: Vec<_> = core::str::from_utf8(file.slice()) + .unwrap() + .trim() + .split('\n') + .collect(); + + mammoth::debug!("Init files: {:?}", init_files); + + for bin_name in init_files { + let path = "/bin/" + bin_name; + } + server_thread.join().expect("Failed to join thread"); 0 } diff --git a/rust/sys/yellowstone/src/server.rs b/rust/sys/yellowstone/src/server.rs index 63a9d23..ef33146 100644 --- a/rust/sys/yellowstone/src/server.rs +++ b/rust/sys/yellowstone/src/server.rs @@ -1,6 +1,7 @@ use alloc::rc::Rc; use alloc::{collections::BTreeMap, string::String}; use mammoth::{cap::Capability, mem::MemoryRegion, zion::ZError}; +use victoriafalls::VFSClient; use yellowstone_yunq::{ AhciInfo, DenaliInfo, Endpoint, FramebufferInfo, GetEndpointRequest, RegisterEndpointRequest, XhciInfo, YellowstoneServerHandler, @@ -51,14 +52,17 @@ impl YellowstoneServerHandler for YellowstoneServerImpl { let signal_denali = req.endpoint_name == "denali"; let signal_vfs = req.endpoint_name == "victoriafalls"; + let raw_cap = req.endpoint_capability; + self.service_map .insert(req.endpoint_name, Capability::take(req.endpoint_capability)); if signal_denali { - self.context.denali_semaphore.signal()? + self.context.denali_semaphore.signal()?; } if signal_vfs { - self.context.victoria_falls_semaphore.signal()? + self.context.victoria_falls_semaphore.signal()?; + victoriafalls::set_client(VFSClient::new(Capability::take_copy(raw_cap).unwrap())); } Ok(()) }