use alloc::{boxed::Box, format}; use io::{Read, Seek, Write}; use crate::{ scheduler::ACTIVE_PID, virtual_fs::{FILE_SYSTEM, VirtualFileSystem, VirtualNode}, }; #[derive(Debug)] pub struct VirtualStdin {} #[derive(Debug)] pub struct VirtualStdinNode {} impl VirtualStdin { pub fn new() -> Self { Self {} } } impl VirtualFileSystem for VirtualStdin { fn open( &mut self, path: &bffs::path::Path, ) -> Result, io::Error> { if !path.is_empty() { Err(io::Error::from(io::ErrorKind::NotADirectory)) } else { Ok(Box::new(VirtualStdinNode {})) } } } impl Read for VirtualStdinNode { fn read(&mut self, buf: &mut [u8]) -> Result { let pid = ACTIVE_PID.load(core::sync::atomic::Ordering::Relaxed); unsafe { FILE_SYSTEM .open(format!("/proc/{pid}/0").as_ref()) .unwrap() .read(buf) } } } impl Seek for VirtualStdinNode { fn seek(&mut self, pos: io::SeekFrom) -> Result { let pid = ACTIVE_PID.load(core::sync::atomic::Ordering::Relaxed); unsafe { FILE_SYSTEM .open(format!("/proc/{pid}/0").as_ref()) .unwrap() .seek(pos) } } } impl Write for VirtualStdinNode { fn write(&mut self, buf: &[u8]) -> Result { let pid = ACTIVE_PID.load(core::sync::atomic::Ordering::Relaxed); unsafe { FILE_SYSTEM .open(format!("/proc/{pid}/0").as_ref()) .unwrap() .write(buf) } } fn flush(&mut self) -> Result<(), io::Error> { let pid = ACTIVE_PID.load(core::sync::atomic::Ordering::Relaxed); unsafe { FILE_SYSTEM .open(format!("/proc/{pid}/0").as_ref()) .unwrap() .flush() } } } impl VirtualNode for VirtualStdinNode {}