use alloc::sync::Arc;
use core::any::Any;
use axfs_ng_vfs::{DeviceId, NodeType, VfsResult};
use crate::{
StarryResult,
pseudofs::{Device, DeviceOps, SimpleFs, dev::tty::pts::PtsInstance},
};
pub struct Ptmx {
fs: Arc<SimpleFs>,
instance: Arc<PtsInstance>,
}
impl Ptmx {
pub(crate) fn new(fs: Arc<SimpleFs>, instance: Arc<PtsInstance>) -> Self {
Self { fs, instance }
}
pub fn create_pty(&self) -> StarryResult<(Arc<Device>, u32)> {
let (master, slave) = super::pty::create_pty_pair();
self.instance.add_slave(self.fs.clone(), slave)?;
let pty_number = master.pty_number();
let device = Device::new(
self.fs.clone(),
NodeType::CharacterDevice,
DeviceId::new(128, pty_number),
master,
);
Ok((device, pty_number))
}
}
impl DeviceOps for Ptmx {
fn read_at(&self, _buf: &mut [u8], _offset: u64) -> VfsResult<usize> {
unreachable!()
}
fn write_at(&self, _buf: &[u8], _offset: u64) -> VfsResult<usize> {
unreachable!()
}
fn ioctl(
&self,
_current: &crate::task::UserTaskRef,
_cmd: u32,
_arg: usize,
) -> VfsResult<usize> {
unreachable!()
}
fn as_any(&self) -> &dyn Any {
self
}
}