diff --git a/kernel/libk/src/vfs/file/mod.rs b/kernel/libk/src/vfs/file/mod.rs index 75d02667..7a912c07 100644 --- a/kernel/libk/src/vfs/file/mod.rs +++ b/kernel/libk/src/vfs/file/mod.rs @@ -172,6 +172,22 @@ impl File { )) } + pub fn open_pty_master(pty: Arc, node: Arc) -> Arc { + Arc::new(Self::PtyMaster(TerminalHalfWrapper { + blocking: AtomicBool::new(true), + half: pty, + node, + })) + } + + pub fn open_pty_slave(pty: Arc, node: Arc) -> Arc { + Arc::new(Self::PtySlave(TerminalHalfWrapper { + blocking: AtomicBool::new(true), + half: pty, + node, + })) + } + /// Creates a new [TimerFile]-backed File pub fn new_timer(options: TimerOptions) -> FileRef { let repeat = options.contains(TimerOptions::REPEAT); diff --git a/kernel/libk/src/vfs/node/ops.rs b/kernel/libk/src/vfs/node/ops.rs index 6a9d8af3..13f9a9d3 100644 --- a/kernel/libk/src/vfs/node/ops.rs +++ b/kernel/libk/src/vfs/node/ops.rs @@ -40,7 +40,14 @@ impl Node { // TODO: maybe merge open_directory and open? NodeImpl::Directory(_) => Err(Error::IsADirectory), NodeImpl::Symlink(_) => todo!(), - NodeImpl::PseudoTerminalSlave(_) | NodeImpl::PseudoTerminalMaster(_) => todo!(), + NodeImpl::PseudoTerminalSlave(pty) => { + let pty = pty.upgrade().ok_or(Error::DoesNotExist)?; + Ok(File::open_pty_slave(pty, self.clone())) + } + NodeImpl::PseudoTerminalMaster(pty) => { + let pty = pty.upgrade().ok_or(Error::DoesNotExist)?; + Ok(File::open_pty_master(pty, self.clone())) + } } }