82 lines
2.0 KiB
Rust
82 lines
2.0 KiB
Rust
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<alloc::boxed::Box<dyn crate::virtual_fs::VirtualNode + '_>, 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<usize, io::Error> {
|
|
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<u64, io::Error> {
|
|
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<usize, io::Error> {
|
|
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 {}
|