2 * linux/kernel/vserver/signal.c
4 * Virtual Server: Signal Support
6 * Copyright (C) 2003-2005 Herbert Pƶtzl
8 * V0.01 broken out from vcontext V0.05
12 #include <linux/config.h>
13 #include <linux/sched.h>
15 #include <asm/errno.h>
16 #include <asm/uaccess.h>
18 #include <linux/vs_context.h>
19 #include <linux/vserver/signal_cmd.h>
22 int vc_ctx_kill(uint32_t id, void __user *data)
25 struct vcmd_ctx_kill_v0 vc_data;
27 struct task_struct *p;
30 if (!vx_check(0, VX_ADMIN))
32 if (copy_from_user (&vc_data, data, sizeof(vc_data)))
35 info.si_signo = vc_data.sig;
37 info.si_code = SI_USER;
38 info.si_pid = current->pid;
39 info.si_uid = current->uid;
41 vxi = locate_vx_info(id);
46 read_lock(&tasklist_lock);
47 switch (vc_data.pid) {
49 info.si_code = SI_KERNEL;
54 if (vx_task_xid(p) != id || p->pid <= 1 ||
55 (vc_data.pid && vxi->vx_initpid == p->pid) ||
56 !thread_group_leader(p))
59 err = send_sig_info(vc_data.sig, &info, p);
67 if (vxi->vx_initpid) {
68 vc_data.pid = vxi->vx_initpid;
69 info.si_code = SI_KERNEL;
73 p = find_task_by_real_pid(vc_data.pid);
75 if (!thread_group_leader(p)) {
76 struct task_struct *tg;
78 tg = find_task_by_real_pid(p->tgid);
82 if ((id == -1) || (vx_task_xid(p) == id))
83 retval = send_sig_info(vc_data.sig, &info, p);
87 read_unlock(&tasklist_lock);
93 static int __wait_exit(struct vx_info *vxi)
95 DECLARE_WAITQUEUE(wait, current);
98 add_wait_queue(&vxi->vx_wait, &wait);
99 set_current_state(TASK_INTERRUPTIBLE);
102 if (vx_info_state(vxi, VXS_SHUTDOWN|VXS_HASHED) == VXS_SHUTDOWN)
104 if (signal_pending(current)) {
112 set_current_state(TASK_RUNNING);
113 remove_wait_queue(&vxi->vx_wait, &wait);
119 int vc_wait_exit(uint32_t id, void __user *data)
121 // struct vcmd_wait_exit_v0 vc_data;
125 vxi = locate_vx_info(id);
129 ret = __wait_exit(vxi);