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(¤t.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(¤t.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