xref: /DragonOS/kernel/src/driver/tty/pty/unix98pty.rs (revision dfe53cf087ef4c7b6db63d992906b062dc63e93f)
1*dfe53cf0SGnoCiYeH use alloc::{string::ToString, sync::Arc};
2*dfe53cf0SGnoCiYeH use system_error::SystemError;
3*dfe53cf0SGnoCiYeH 
4*dfe53cf0SGnoCiYeH use crate::{
5*dfe53cf0SGnoCiYeH     driver::tty::{
6*dfe53cf0SGnoCiYeH         termios::Termios,
7*dfe53cf0SGnoCiYeH         tty_core::{TtyCore, TtyCoreData, TtyFlag, TtyIoctlCmd, TtyPacketStatus},
8*dfe53cf0SGnoCiYeH         tty_device::TtyFilePrivateData,
9*dfe53cf0SGnoCiYeH         tty_driver::{TtyDriver, TtyDriverPrivateData, TtyDriverSubType, TtyOperation},
10*dfe53cf0SGnoCiYeH     },
11*dfe53cf0SGnoCiYeH     filesystem::{
12*dfe53cf0SGnoCiYeH         devpts::DevPtsFs,
13*dfe53cf0SGnoCiYeH         vfs::{
14*dfe53cf0SGnoCiYeH             file::FileMode, syscall::ModeType, FilePrivateData, FileType, MountFS, ROOT_INODE,
15*dfe53cf0SGnoCiYeH             VFS_MAX_FOLLOW_SYMLINK_TIMES,
16*dfe53cf0SGnoCiYeH         },
17*dfe53cf0SGnoCiYeH     },
18*dfe53cf0SGnoCiYeH     libs::spinlock::SpinLockGuard,
19*dfe53cf0SGnoCiYeH     mm::VirtAddr,
20*dfe53cf0SGnoCiYeH     net::event_poll::EPollEventType,
21*dfe53cf0SGnoCiYeH     syscall::user_access::UserBufferWriter,
22*dfe53cf0SGnoCiYeH };
23*dfe53cf0SGnoCiYeH 
24*dfe53cf0SGnoCiYeH use super::{ptm_driver, pts_driver, PtyCommon};
25*dfe53cf0SGnoCiYeH 
26*dfe53cf0SGnoCiYeH pub const NR_UNIX98_PTY_MAX: u32 = 128;
27*dfe53cf0SGnoCiYeH 
28*dfe53cf0SGnoCiYeH #[derive(Debug)]
29*dfe53cf0SGnoCiYeH pub struct Unix98PtyDriverInner;
30*dfe53cf0SGnoCiYeH 
31*dfe53cf0SGnoCiYeH impl Unix98PtyDriverInner {
32*dfe53cf0SGnoCiYeH     pub fn new() -> Self {
33*dfe53cf0SGnoCiYeH         Self
34*dfe53cf0SGnoCiYeH     }
35*dfe53cf0SGnoCiYeH }
36*dfe53cf0SGnoCiYeH 
37*dfe53cf0SGnoCiYeH impl TtyOperation for Unix98PtyDriverInner {
38*dfe53cf0SGnoCiYeH     fn install(&self, driver: Arc<TtyDriver>, tty: Arc<TtyCore>) -> Result<(), SystemError> {
39*dfe53cf0SGnoCiYeH         PtyCommon::pty_common_install(driver, tty, false)
40*dfe53cf0SGnoCiYeH     }
41*dfe53cf0SGnoCiYeH 
42*dfe53cf0SGnoCiYeH     fn open(&self, tty: &TtyCoreData) -> Result<(), SystemError> {
43*dfe53cf0SGnoCiYeH         PtyCommon::pty_common_open(tty)
44*dfe53cf0SGnoCiYeH     }
45*dfe53cf0SGnoCiYeH 
46*dfe53cf0SGnoCiYeH     fn write(&self, tty: &TtyCoreData, buf: &[u8], nr: usize) -> Result<usize, SystemError> {
47*dfe53cf0SGnoCiYeH         let to = tty.checked_link()?;
48*dfe53cf0SGnoCiYeH 
49*dfe53cf0SGnoCiYeH         if nr == 0 || tty.flow_irqsave().stopped {
50*dfe53cf0SGnoCiYeH             return Ok(0);
51*dfe53cf0SGnoCiYeH         }
52*dfe53cf0SGnoCiYeH 
53*dfe53cf0SGnoCiYeH         to.core().port().unwrap().receive_buf(buf, &[], nr)
54*dfe53cf0SGnoCiYeH     }
55*dfe53cf0SGnoCiYeH 
56*dfe53cf0SGnoCiYeH     fn write_room(&self, tty: &TtyCoreData) -> usize {
57*dfe53cf0SGnoCiYeH         // TODO 暂时
58*dfe53cf0SGnoCiYeH         if tty.flow_irqsave().stopped {
59*dfe53cf0SGnoCiYeH             return 0;
60*dfe53cf0SGnoCiYeH         }
61*dfe53cf0SGnoCiYeH 
62*dfe53cf0SGnoCiYeH         8192
63*dfe53cf0SGnoCiYeH     }
64*dfe53cf0SGnoCiYeH 
65*dfe53cf0SGnoCiYeH     fn flush_buffer(&self, tty: &TtyCoreData) -> Result<(), SystemError> {
66*dfe53cf0SGnoCiYeH         let to = tty.checked_link()?;
67*dfe53cf0SGnoCiYeH 
68*dfe53cf0SGnoCiYeH         let mut ctrl = to.core().contorl_info_irqsave();
69*dfe53cf0SGnoCiYeH         ctrl.pktstatus.insert(TtyPacketStatus::TIOCPKT_FLUSHWRITE);
70*dfe53cf0SGnoCiYeH 
71*dfe53cf0SGnoCiYeH         to.core().read_wq().wakeup_all();
72*dfe53cf0SGnoCiYeH 
73*dfe53cf0SGnoCiYeH         Ok(())
74*dfe53cf0SGnoCiYeH     }
75*dfe53cf0SGnoCiYeH 
76*dfe53cf0SGnoCiYeH     fn ioctl(&self, tty: Arc<TtyCore>, cmd: u32, arg: usize) -> Result<(), SystemError> {
77*dfe53cf0SGnoCiYeH         let core = tty.core();
78*dfe53cf0SGnoCiYeH         if core.driver().tty_driver_sub_type() != TtyDriverSubType::PtyMaster {
79*dfe53cf0SGnoCiYeH             return Err(SystemError::ENOSYS);
80*dfe53cf0SGnoCiYeH         }
81*dfe53cf0SGnoCiYeH 
82*dfe53cf0SGnoCiYeH         match cmd {
83*dfe53cf0SGnoCiYeH             TtyIoctlCmd::TIOCSPTLCK => {
84*dfe53cf0SGnoCiYeH                 return PtyCommon::pty_set_lock(core, VirtAddr::new(arg));
85*dfe53cf0SGnoCiYeH             }
86*dfe53cf0SGnoCiYeH             TtyIoctlCmd::TIOCGPTLCK => {
87*dfe53cf0SGnoCiYeH                 return PtyCommon::pty_get_lock(core, VirtAddr::new(arg));
88*dfe53cf0SGnoCiYeH             }
89*dfe53cf0SGnoCiYeH             TtyIoctlCmd::TIOCPKT => {
90*dfe53cf0SGnoCiYeH                 return PtyCommon::pty_set_packet_mode(core, VirtAddr::new(arg));
91*dfe53cf0SGnoCiYeH             }
92*dfe53cf0SGnoCiYeH             TtyIoctlCmd::TIOCGPKT => {
93*dfe53cf0SGnoCiYeH                 return PtyCommon::pty_get_packet_mode(core, VirtAddr::new(arg));
94*dfe53cf0SGnoCiYeH             }
95*dfe53cf0SGnoCiYeH             TtyIoctlCmd::TIOCGPTN => {
96*dfe53cf0SGnoCiYeH                 let mut user_writer =
97*dfe53cf0SGnoCiYeH                     UserBufferWriter::new(arg as *mut u32, core::mem::size_of::<u32>(), true)?;
98*dfe53cf0SGnoCiYeH 
99*dfe53cf0SGnoCiYeH                 return user_writer.copy_one_to_user(&(core.index() as u32), 0);
100*dfe53cf0SGnoCiYeH             }
101*dfe53cf0SGnoCiYeH             _ => {
102*dfe53cf0SGnoCiYeH                 return Err(SystemError::ENOIOCTLCMD);
103*dfe53cf0SGnoCiYeH             }
104*dfe53cf0SGnoCiYeH         }
105*dfe53cf0SGnoCiYeH     }
106*dfe53cf0SGnoCiYeH 
107*dfe53cf0SGnoCiYeH     fn set_termios(&self, tty: Arc<TtyCore>, _old_termios: Termios) -> Result<(), SystemError> {
108*dfe53cf0SGnoCiYeH         let core = tty.core();
109*dfe53cf0SGnoCiYeH         if core.driver().tty_driver_sub_type() != TtyDriverSubType::PtySlave {
110*dfe53cf0SGnoCiYeH             return Err(SystemError::ENOSYS);
111*dfe53cf0SGnoCiYeH         }
112*dfe53cf0SGnoCiYeH         todo!()
113*dfe53cf0SGnoCiYeH     }
114*dfe53cf0SGnoCiYeH 
115*dfe53cf0SGnoCiYeH     fn start(&self, core: &TtyCoreData) -> Result<(), SystemError> {
116*dfe53cf0SGnoCiYeH         if core.driver().tty_driver_sub_type() != TtyDriverSubType::PtySlave {
117*dfe53cf0SGnoCiYeH             return Err(SystemError::ENOSYS);
118*dfe53cf0SGnoCiYeH         }
119*dfe53cf0SGnoCiYeH 
120*dfe53cf0SGnoCiYeH         let link = core.checked_link()?;
121*dfe53cf0SGnoCiYeH 
122*dfe53cf0SGnoCiYeH         let mut ctrl = core.contorl_info_irqsave();
123*dfe53cf0SGnoCiYeH         ctrl.pktstatus.remove(TtyPacketStatus::TIOCPKT_STOP);
124*dfe53cf0SGnoCiYeH         ctrl.pktstatus.insert(TtyPacketStatus::TIOCPKT_START);
125*dfe53cf0SGnoCiYeH 
126*dfe53cf0SGnoCiYeH         link.core()
127*dfe53cf0SGnoCiYeH             .read_wq()
128*dfe53cf0SGnoCiYeH             .wakeup_any(EPollEventType::EPOLLIN.bits() as u64);
129*dfe53cf0SGnoCiYeH 
130*dfe53cf0SGnoCiYeH         Ok(())
131*dfe53cf0SGnoCiYeH     }
132*dfe53cf0SGnoCiYeH 
133*dfe53cf0SGnoCiYeH     fn stop(&self, core: &TtyCoreData) -> Result<(), SystemError> {
134*dfe53cf0SGnoCiYeH         if core.driver().tty_driver_sub_type() != TtyDriverSubType::PtySlave {
135*dfe53cf0SGnoCiYeH             return Err(SystemError::ENOSYS);
136*dfe53cf0SGnoCiYeH         }
137*dfe53cf0SGnoCiYeH 
138*dfe53cf0SGnoCiYeH         let link = core.checked_link()?;
139*dfe53cf0SGnoCiYeH 
140*dfe53cf0SGnoCiYeH         let mut ctrl = core.contorl_info_irqsave();
141*dfe53cf0SGnoCiYeH         ctrl.pktstatus.remove(TtyPacketStatus::TIOCPKT_START);
142*dfe53cf0SGnoCiYeH         ctrl.pktstatus.insert(TtyPacketStatus::TIOCPKT_STOP);
143*dfe53cf0SGnoCiYeH 
144*dfe53cf0SGnoCiYeH         link.core()
145*dfe53cf0SGnoCiYeH             .read_wq()
146*dfe53cf0SGnoCiYeH             .wakeup_any(EPollEventType::EPOLLIN.bits() as u64);
147*dfe53cf0SGnoCiYeH 
148*dfe53cf0SGnoCiYeH         Ok(())
149*dfe53cf0SGnoCiYeH     }
150*dfe53cf0SGnoCiYeH 
151*dfe53cf0SGnoCiYeH     fn flush_chars(&self, _tty: &TtyCoreData) {
152*dfe53cf0SGnoCiYeH         // 不做处理
153*dfe53cf0SGnoCiYeH     }
154*dfe53cf0SGnoCiYeH 
155*dfe53cf0SGnoCiYeH     fn lookup(
156*dfe53cf0SGnoCiYeH         &self,
157*dfe53cf0SGnoCiYeH         index: usize,
158*dfe53cf0SGnoCiYeH         priv_data: TtyDriverPrivateData,
159*dfe53cf0SGnoCiYeH     ) -> Result<Arc<TtyCore>, SystemError> {
160*dfe53cf0SGnoCiYeH         if let TtyDriverPrivateData::Pty(false) = priv_data {
161*dfe53cf0SGnoCiYeH             return pts_driver()
162*dfe53cf0SGnoCiYeH                 .ttys()
163*dfe53cf0SGnoCiYeH                 .get(&index)
164*dfe53cf0SGnoCiYeH                 .cloned()
165*dfe53cf0SGnoCiYeH                 .ok_or(SystemError::ENODEV);
166*dfe53cf0SGnoCiYeH         }
167*dfe53cf0SGnoCiYeH 
168*dfe53cf0SGnoCiYeH         return Err(SystemError::ENOSYS);
169*dfe53cf0SGnoCiYeH     }
170*dfe53cf0SGnoCiYeH 
171*dfe53cf0SGnoCiYeH     fn close(&self, tty: Arc<TtyCore>) -> Result<(), SystemError> {
172*dfe53cf0SGnoCiYeH         let driver = tty.core().driver();
173*dfe53cf0SGnoCiYeH 
174*dfe53cf0SGnoCiYeH         driver.ttys().remove(&tty.core().index());
175*dfe53cf0SGnoCiYeH         if tty.core().driver().tty_driver_sub_type() == TtyDriverSubType::PtySlave {
176*dfe53cf0SGnoCiYeH             let pts_root_inode =
177*dfe53cf0SGnoCiYeH                 ROOT_INODE().lookup_follow_symlink("/dev/pts", VFS_MAX_FOLLOW_SYMLINK_TIMES)?;
178*dfe53cf0SGnoCiYeH             let _ = pts_root_inode.unlink(&tty.core().index().to_string());
179*dfe53cf0SGnoCiYeH         }
180*dfe53cf0SGnoCiYeH 
181*dfe53cf0SGnoCiYeH         Ok(())
182*dfe53cf0SGnoCiYeH     }
183*dfe53cf0SGnoCiYeH }
184*dfe53cf0SGnoCiYeH 
185*dfe53cf0SGnoCiYeH pub fn ptmx_open(
186*dfe53cf0SGnoCiYeH     mut data: SpinLockGuard<FilePrivateData>,
187*dfe53cf0SGnoCiYeH     mode: &FileMode,
188*dfe53cf0SGnoCiYeH ) -> Result<(), SystemError> {
189*dfe53cf0SGnoCiYeH     let pts_root_inode =
190*dfe53cf0SGnoCiYeH         ROOT_INODE().lookup_follow_symlink("/dev/pts", VFS_MAX_FOLLOW_SYMLINK_TIMES)?;
191*dfe53cf0SGnoCiYeH 
192*dfe53cf0SGnoCiYeH     let fs = pts_root_inode
193*dfe53cf0SGnoCiYeH         .fs()
194*dfe53cf0SGnoCiYeH         .as_any_ref()
195*dfe53cf0SGnoCiYeH         .downcast_ref::<MountFS>()
196*dfe53cf0SGnoCiYeH         .unwrap()
197*dfe53cf0SGnoCiYeH         .inner_filesystem();
198*dfe53cf0SGnoCiYeH     let fsinfo = fs.as_any_ref().downcast_ref::<DevPtsFs>().unwrap();
199*dfe53cf0SGnoCiYeH 
200*dfe53cf0SGnoCiYeH     let index = fsinfo.alloc_index()?;
201*dfe53cf0SGnoCiYeH 
202*dfe53cf0SGnoCiYeH     let tty = TtyDriver::init_tty_device(ptm_driver(), index)?;
203*dfe53cf0SGnoCiYeH 
204*dfe53cf0SGnoCiYeH     // 设置privdata
205*dfe53cf0SGnoCiYeH     *data = FilePrivateData::Tty(TtyFilePrivateData {
206*dfe53cf0SGnoCiYeH         tty: tty.clone(),
207*dfe53cf0SGnoCiYeH         mode: *mode,
208*dfe53cf0SGnoCiYeH     });
209*dfe53cf0SGnoCiYeH 
210*dfe53cf0SGnoCiYeH     let core = tty.core();
211*dfe53cf0SGnoCiYeH     core.flags_write().insert(TtyFlag::PTY_LOCK);
212*dfe53cf0SGnoCiYeH 
213*dfe53cf0SGnoCiYeH     let _ = pts_root_inode.create(
214*dfe53cf0SGnoCiYeH         &index.to_string(),
215*dfe53cf0SGnoCiYeH         FileType::CharDevice,
216*dfe53cf0SGnoCiYeH         ModeType::from_bits_truncate(0x666),
217*dfe53cf0SGnoCiYeH     )?;
218*dfe53cf0SGnoCiYeH 
219*dfe53cf0SGnoCiYeH     ptm_driver().driver_funcs().open(core)?;
220*dfe53cf0SGnoCiYeH 
221*dfe53cf0SGnoCiYeH     Ok(())
222*dfe53cf0SGnoCiYeH }
223