#include #include #include #include #include syscallret_t syscall_kill(context_t *context, int pid, int signal) { syscallret_t ret = { .ret = -1 }; int effectivepid = -1; if (pid > 0) // specific process effectivepid = pid; else if (pid == 0) // own process group effectivepid = 0; else if (pid == -1) // every process, unsupported atm effectivepid = -1; else if (pid < -1) effectivepid = -pid; // target specific process group proc_t *target = proc_get_from_pid(effectivepid); if (target == NULL && pid != 0 && pid != -1) { ret.errno = ESRCH; return ret; } if (pid >= 1) { if (signal != SIGCONT || jobctl_getpgid(target) != jobctl_getpgid(current_thread()->proc)) { ret.errno = auth_process_check(¤t_thread()->proc->cred, AUTH_ACTIONS_PROCESS_SIGNAL, target); if (ret.errno) goto leave; } signal_signalproc(target, signal); } else if (pid == -1) { ret.errno = proc_signal_all(signal, current_thread()->proc); } else { ret.errno = jobctl_signal(target, signal, current_thread()->proc); } leave: if (target) { PROC_RELEASE(target); } ret.ret = ret.errno ? -1 : 0; return ret; }