diff options
author | davidxu <davidxu@FreeBSD.org> | 2007-08-16 05:26:42 +0000 |
---|---|---|
committer | davidxu <davidxu@FreeBSD.org> | 2007-08-16 05:26:42 +0000 |
commit | 0abd045472a2cf18ee61cbff0164e327ffd25c54 (patch) | |
tree | c631700d095836ac5a30fd6eb6fd9a6c4a0467bc /sys | |
parent | 1bcb372970356c4bb20cdd532350ea0df88a6f20 (diff) | |
download | FreeBSD-src-0abd045472a2cf18ee61cbff0164e327ffd25c54.zip FreeBSD-src-0abd045472a2cf18ee61cbff0164e327ffd25c54.tar.gz |
Add thr_kill2 syscall which sends a signal to a thread in another process.
Submitted by: Tijl Coosemans tijl at ulyssis dot org
Approved by: re (kensmith)
Diffstat (limited to 'sys')
-rw-r--r-- | sys/kern/kern_thr.c | 55 | ||||
-rw-r--r-- | sys/kern/syscalls.master | 1 | ||||
-rw-r--r-- | sys/sys/thr.h | 13 |
3 files changed, 69 insertions, 0 deletions
diff --git a/sys/kern/kern_thr.c b/sys/kern/kern_thr.c index bcbe168..de45d0a 100644 --- a/sys/kern/kern_thr.c +++ b/sys/kern/kern_thr.c @@ -53,6 +53,8 @@ __FBSDID("$FreeBSD$"); #include <machine/frame.h> +#include <security/audit/audit.h> + #ifdef COMPAT_IA32 extern struct sysentvec ia32_freebsd_sysvec; @@ -337,6 +339,59 @@ thr_kill(struct thread *td, struct thr_kill_args *uap) } int +thr_kill2(struct thread *td, struct thr_kill2_args *uap) + /* pid_t pid, long id, int sig */ +{ + struct thread *ttd; + struct proc *p; + int error; + + AUDIT_ARG(signum, uap->sig); + + if (uap->pid == td->td_proc->p_pid) { + p = td->td_proc; + PROC_LOCK(p); + } else if ((p = pfind(uap->pid)) == NULL) { + return (ESRCH); + } + AUDIT_ARG(process, p); + + error = p_cansignal(td, p, uap->sig); + if (error == 0) { + if (uap->id == -1) { + if (uap->sig != 0 && !_SIG_VALID(uap->sig)) { + error = EINVAL; + } else { + error = ESRCH; + FOREACH_THREAD_IN_PROC(p, ttd) { + if (ttd != td) { + error = 0; + if (uap->sig == 0) + break; + tdsignal(p, ttd, uap->sig, NULL); + } + } + } + } else { + if (uap->id != td->td_tid) + ttd = thread_find(p, uap->id); + else + ttd = td; + if (ttd == NULL) + error = ESRCH; + else if (uap->sig == 0) + ; + else if (!_SIG_VALID(uap->sig)) + error = EINVAL; + else + tdsignal(p, ttd, uap->sig, NULL); + } + } + PROC_UNLOCK(p); + return (error); +} + +int thr_suspend(struct thread *td, struct thr_suspend_args *uap) /* const struct timespec *timeout */ { diff --git a/sys/kern/syscalls.master b/sys/kern/syscalls.master index f9c7849..1189f2c 100644 --- a/sys/kern/syscalls.master +++ b/sys/kern/syscalls.master @@ -846,5 +846,6 @@ int whence); } 479 AUE_TRUNCATE STD { int truncate(char *path, off_t length); } 480 AUE_FTRUNCATE STD { int ftruncate(int fd, off_t length); } +481 AUE_KILL STD { int thr_kill2(pid_t pid, long id, int sig); } ; Please copy any additions and changes to the following compatability tables: ; sys/compat/freebsd32/syscalls.master diff --git a/sys/sys/thr.h b/sys/sys/thr.h index 6331a7a..ae4a65d 100644 --- a/sys/sys/thr.h +++ b/sys/sys/thr.h @@ -30,8 +30,14 @@ #ifndef _SYS_THR_H_ #define _SYS_THR_H_ +#include <sys/_types.h> #include <sys/sched.h> +#ifndef _SIZE_T_DECLARED +typedef __size_t size_t; +#define _SIZE_T_DECLARED +#endif + /* Create the thread in the suspended state. */ #define THR_SUSPENDED 0x0001 /* Create the system scope thread. */ @@ -55,12 +61,19 @@ struct thr_param { * See pthread_* */ #ifndef _KERNEL +#include <sys/ucontext.h> + +#ifndef _PID_T_DECLARED +typedef __pid_t pid_t; +#define _PID_T_DECLARED +#endif int thr_create(ucontext_t *ctx, long *id, int flags); int thr_new(struct thr_param *param, int param_size); int thr_self(long *id); void thr_exit(long *state); int thr_kill(long id, int sig); +int thr_kill2(pid_t pid, long id, int sig); int thr_suspend(const struct timespec *timeout); int thr_wake(long id); int thr_set_name(long id, const char *name); |