Files
asterinas/services/libs/jinux-std/src/syscall/kill.rs
2023-09-05 18:42:06 +08:00

53 lines
1.8 KiB
Rust

use crate::{log_syscall_entry, prelude::*};
use crate::process::process_table;
use crate::process::signal::signals::user::{UserSignal, UserSignalKind};
use crate::{
process::{process_filter::ProcessFilter, signal::sig_num::SigNum},
syscall::SYS_KILL,
};
use super::SyscallReturn;
pub fn sys_kill(process_filter: u64, sig_num: u64) -> Result<SyscallReturn> {
log_syscall_entry!(SYS_KILL);
let process_filter = ProcessFilter::from_id(process_filter as _);
let sig_num = SigNum::try_from(sig_num as u8).unwrap();
debug!(
"process_filter = {:?}, sig_num = {:?}",
process_filter, sig_num
);
do_sys_kill(process_filter, sig_num)?;
Ok(SyscallReturn::Return(0))
}
pub fn do_sys_kill(filter: ProcessFilter, sig_num: SigNum) -> Result<()> {
let current = current!();
let pid = current.pid();
// FIXME: use the correct uid
let uid = 0;
let signal = UserSignal::new(sig_num, UserSignalKind::Kill, pid, uid);
match filter {
ProcessFilter::Any => {
for process in process_table::get_all_processes() {
process.enqueue_signal(Box::new(signal));
}
}
ProcessFilter::WithPid(pid) => {
if let Some(process) = process_table::pid_to_process(pid) {
process.enqueue_signal(Box::new(signal));
} else {
return_errno_with_message!(Errno::ESRCH, "No such process in process table");
}
}
ProcessFilter::WithPgid(pgid) => {
if let Some(process_group) = process_table::pgid_to_process_group(pgid) {
process_group.user_signal(signal);
} else {
return_errno_with_message!(Errno::ESRCH, "No such process group in process table");
}
}
}
Ok(())
}