summaryrefslogtreecommitdiff
blob: 2fb464123a057741c9a98987a3edfc4d386eb5a9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
diff -NurpP --minimal linux-2.6.19.2-vs2.2.0-rc8/kernel/vserver/signal.c linux-2.6.19.2-vs2.2.0-rc8.1/kernel/vserver/signal.c
--- linux-2.6.19.2-vs2.2.0-rc8/kernel/vserver/signal.c	2006-11-08 04:57:45 +0100
+++ linux-2.6.19.2-vs2.2.0-rc8.1/kernel/vserver/signal.c	2007-01-18 20:31:22 +0100
@@ -3,10 +3,11 @@
  *
  *  Virtual Server: Signal Support
  *
- *  Copyright (C) 2003-2006  Herbert P�tzl
+ *  Copyright (C) 2003-2007  Herbert P�tzl
  *
  *  V0.01  broken out from vcontext V0.05
  *  V0.02  changed vcmds to vxi arg
+ *  V0.03  adjusted siginfo for kill
  *
  */
 
@@ -23,7 +24,7 @@ int vx_info_kill(struct vx_info *vxi, in
 {
 	int retval, count=0;
 	struct task_struct *p;
-	unsigned long priv = 0;
+	struct siginfo *sip = SEND_SIG_PRIV;
 
 	retval = -ESRCH;
 	vxdprintk(VXD_CBIT(misc, 4),
@@ -32,7 +33,7 @@ int vx_info_kill(struct vx_info *vxi, in
 	read_lock(&tasklist_lock);
 	switch (pid) {
 	case  0:
-		priv = 1;
+		sip = SEND_SIG_FORCED;
 	case -1:
 		for_each_process(p) {
 			int err = 0;
@@ -41,7 +42,7 @@ int vx_info_kill(struct vx_info *vxi, in
 				(pid && vxi->vx_initpid == p->pid))
 				continue;
 
-			err = group_send_sig_info(sig, (void*)priv, p);
+			err = group_send_sig_info(sig, sip, p);
 			++count;
 			if (err != -EPERM)
 				retval = err;
@@ -56,22 +57,22 @@ int vx_info_kill(struct vx_info *vxi, in
 				/* ... as long as there are tasks left */
 				(atomic_read(&vxi->vx_tasks) > 1))
 				sig = SIGINT;
-			priv = 1;
+			else
+				sip = SEND_SIG_FORCED;
 		}
 		/* fallthrough */
 	default:
 		p = find_task_by_real_pid(pid);
 		if (p) {
 			if (vx_task_xid(p) == vxi->vx_id)
-				retval = group_send_sig_info(sig,
-					(void*)priv, p);
+				retval = group_send_sig_info(sig, sip, p);
 		}
 		break;
 	}
 	read_unlock(&tasklist_lock);
 	vxdprintk(VXD_CBIT(misc, 4),
-		"vx_info_kill(%p[#%d],%d,%d) = %d",
-		vxi, vxi->vx_id, pid, sig, retval);
+		"vx_info_kill(%p[#%d],%d,%d,%d) = %d",
+		vxi, vxi->vx_id, pid, sig, (int)sip, retval);
 	return retval;
 }