xref: /DragonOS/kernel/src/driver/tty/tty_job_control.rs (revision 52bcb59e9286def2b66d766f6bf6f46745795ec8)
152da9a59SGnoCiYeH use alloc::sync::Arc;
252da9a59SGnoCiYeH use system_error::SystemError;
352da9a59SGnoCiYeH 
452da9a59SGnoCiYeH use crate::{
552da9a59SGnoCiYeH     arch::ipc::signal::{SigSet, Signal},
652da9a59SGnoCiYeH     mm::VirtAddr,
752da9a59SGnoCiYeH     process::{Pid, ProcessManager},
852da9a59SGnoCiYeH     syscall::{user_access::UserBufferWriter, Syscall},
952da9a59SGnoCiYeH };
1052da9a59SGnoCiYeH 
1152da9a59SGnoCiYeH use super::tty_core::{TtyCore, TtyIoctlCmd};
1252da9a59SGnoCiYeH 
1352da9a59SGnoCiYeH pub struct TtyJobCtrlManager;
1452da9a59SGnoCiYeH 
1552da9a59SGnoCiYeH impl TtyJobCtrlManager {
1652da9a59SGnoCiYeH     /// ### 设置当前进程的tty
1752da9a59SGnoCiYeH     pub fn proc_set_tty(tty: Arc<TtyCore>) {
1852da9a59SGnoCiYeH         let core = tty.core();
1952da9a59SGnoCiYeH         let mut ctrl = core.contorl_info_irqsave();
2052da9a59SGnoCiYeH         let pcb = ProcessManager::current_pcb();
2152da9a59SGnoCiYeH 
2252da9a59SGnoCiYeH         // todo 目前将pgid设置为pid
2352da9a59SGnoCiYeH         ctrl.pgid = Some(pcb.pid());
2452da9a59SGnoCiYeH         ctrl.session = Some(pcb.pid());
2552da9a59SGnoCiYeH 
2652da9a59SGnoCiYeH         assert!(pcb.sig_info_irqsave().tty().is_none());
2752da9a59SGnoCiYeH 
2852da9a59SGnoCiYeH         let mut singal = pcb.sig_info_mut();
2952da9a59SGnoCiYeH         drop(ctrl);
3052da9a59SGnoCiYeH         singal.set_tty(tty);
3152da9a59SGnoCiYeH     }
3252da9a59SGnoCiYeH 
3352da9a59SGnoCiYeH     /// ### 检查tty
3452da9a59SGnoCiYeH     pub fn tty_check_change(tty: Arc<TtyCore>, sig: Signal) -> Result<(), SystemError> {
3552da9a59SGnoCiYeH         let pcb = ProcessManager::current_pcb();
3652da9a59SGnoCiYeH 
37*52bcb59eSGnoCiYeH         if pcb.sig_info_irqsave().tty().is_none()
38*52bcb59eSGnoCiYeH             || !Arc::ptr_eq(&pcb.sig_info_irqsave().tty().unwrap(), &tty)
39*52bcb59eSGnoCiYeH         {
4052da9a59SGnoCiYeH             return Ok(());
4152da9a59SGnoCiYeH         }
4252da9a59SGnoCiYeH 
4352da9a59SGnoCiYeH         let core = tty.core();
4452da9a59SGnoCiYeH         let ctrl = core.contorl_info_irqsave();
4552da9a59SGnoCiYeH 
4652da9a59SGnoCiYeH         // todo pgid
4752da9a59SGnoCiYeH         let pgid = pcb.pid();
4852da9a59SGnoCiYeH         let tty_pgid = ctrl.pgid;
4952da9a59SGnoCiYeH 
5052da9a59SGnoCiYeH         if tty_pgid.is_some() && tty_pgid.unwrap() != pgid {
5152da9a59SGnoCiYeH             if pcb
5252da9a59SGnoCiYeH                 .sig_info_irqsave()
5352da9a59SGnoCiYeH                 .sig_block()
5452da9a59SGnoCiYeH                 .contains(SigSet::from_bits_truncate(1 << sig as u64))
5552da9a59SGnoCiYeH                 || pcb.sig_struct_irqsave().handlers[sig as usize].is_ignore()
5652da9a59SGnoCiYeH             {
5752da9a59SGnoCiYeH                 // 忽略该信号
5852da9a59SGnoCiYeH                 if sig == Signal::SIGTTIN {
5952da9a59SGnoCiYeH                     return Err(SystemError::EIO);
6052da9a59SGnoCiYeH                 }
6152da9a59SGnoCiYeH             } else {
6252da9a59SGnoCiYeH                 // 暂时使用kill而不是killpg
6352da9a59SGnoCiYeH                 Syscall::kill(pgid, sig as i32)?;
6452da9a59SGnoCiYeH                 return Err(SystemError::ERESTART);
6552da9a59SGnoCiYeH             }
6652da9a59SGnoCiYeH         }
6752da9a59SGnoCiYeH 
6852da9a59SGnoCiYeH         Ok(())
6952da9a59SGnoCiYeH     }
7052da9a59SGnoCiYeH 
7152da9a59SGnoCiYeH     pub fn job_ctrl_ioctl(tty: Arc<TtyCore>, cmd: u32, arg: usize) -> Result<usize, SystemError> {
7252da9a59SGnoCiYeH         match cmd {
7352da9a59SGnoCiYeH             TtyIoctlCmd::TIOCSPGRP => {
7452da9a59SGnoCiYeH                 match Self::tty_check_change(tty.clone(), Signal::SIGTTOU) {
7552da9a59SGnoCiYeH                     Ok(_) => {}
7652da9a59SGnoCiYeH                     Err(e) => {
7752da9a59SGnoCiYeH                         if e == SystemError::EIO {
7852da9a59SGnoCiYeH                             return Err(SystemError::ENOTTY);
7952da9a59SGnoCiYeH                         }
8052da9a59SGnoCiYeH                         return Err(e);
8152da9a59SGnoCiYeH                     }
8252da9a59SGnoCiYeH                 };
8352da9a59SGnoCiYeH 
8452da9a59SGnoCiYeH                 // let user_reader = UserBufferReader::new(
8552da9a59SGnoCiYeH                 //     VirtAddr::new(arg).as_ptr::<usize>(),
8652da9a59SGnoCiYeH                 //     core::mem::size_of::<usize>(),
8752da9a59SGnoCiYeH                 //     true,
8852da9a59SGnoCiYeH                 // )?;
8952da9a59SGnoCiYeH 
9052da9a59SGnoCiYeH                 // let pgrp = user_reader.read_one_from_user::<usize>(0)?;
9152da9a59SGnoCiYeH 
9252da9a59SGnoCiYeH                 let current = ProcessManager::current_pcb();
9352da9a59SGnoCiYeH 
9452da9a59SGnoCiYeH                 let mut ctrl = tty.core().contorl_info_irqsave();
9552da9a59SGnoCiYeH 
96*52bcb59eSGnoCiYeH                 if current.sig_info_irqsave().tty().is_none()
97*52bcb59eSGnoCiYeH                     || !Arc::ptr_eq(&current.sig_info_irqsave().tty().clone().unwrap(), &tty)
9852da9a59SGnoCiYeH                     || ctrl.session.is_none()
9952da9a59SGnoCiYeH                     || ctrl.session.unwrap() != current.pid()
10052da9a59SGnoCiYeH                 {
10152da9a59SGnoCiYeH                     return Err(SystemError::ENOTTY);
10252da9a59SGnoCiYeH                 }
10352da9a59SGnoCiYeH 
10452da9a59SGnoCiYeH                 ctrl.pgid = Some(Pid::new(arg));
10552da9a59SGnoCiYeH 
10652da9a59SGnoCiYeH                 return Ok(0);
10752da9a59SGnoCiYeH             }
10852da9a59SGnoCiYeH 
10952da9a59SGnoCiYeH             TtyIoctlCmd::TIOCGPGRP => {
11052da9a59SGnoCiYeH                 let current = ProcessManager::current_pcb();
111*52bcb59eSGnoCiYeH                 if current.sig_info_irqsave().tty().is_some()
112*52bcb59eSGnoCiYeH                     && !Arc::ptr_eq(&current.sig_info_irqsave().tty().unwrap(), &tty)
11352da9a59SGnoCiYeH                 {
11452da9a59SGnoCiYeH                     return Err(SystemError::ENOTTY);
11552da9a59SGnoCiYeH                 }
11652da9a59SGnoCiYeH 
11752da9a59SGnoCiYeH                 let mut user_writer = UserBufferWriter::new(
11852da9a59SGnoCiYeH                     VirtAddr::new(arg).as_ptr::<i32>(),
11952da9a59SGnoCiYeH                     core::mem::size_of::<i32>(),
12052da9a59SGnoCiYeH                     true,
12152da9a59SGnoCiYeH                 )?;
12252da9a59SGnoCiYeH 
12352da9a59SGnoCiYeH                 user_writer.copy_one_to_user(
12452da9a59SGnoCiYeH                     &(tty
12552da9a59SGnoCiYeH                         .core()
12652da9a59SGnoCiYeH                         .contorl_info_irqsave()
12752da9a59SGnoCiYeH                         .pgid
12852da9a59SGnoCiYeH                         .unwrap_or(Pid::new(0))
12952da9a59SGnoCiYeH                         .data() as i32),
13052da9a59SGnoCiYeH                     0,
13152da9a59SGnoCiYeH                 )?;
13252da9a59SGnoCiYeH 
13352da9a59SGnoCiYeH                 return Ok(0);
13452da9a59SGnoCiYeH             }
13552da9a59SGnoCiYeH 
13652da9a59SGnoCiYeH             _ => {
13752da9a59SGnoCiYeH                 return Err(SystemError::ENOIOCTLCMD);
13852da9a59SGnoCiYeH             }
13952da9a59SGnoCiYeH         }
14052da9a59SGnoCiYeH     }
14152da9a59SGnoCiYeH }
142