]> git.saurik.com Git - apple/launchd.git/blob - launchd/testing/our_kill_is_busted.c
launchd-329.3.tar.gz
[apple/launchd.git] / launchd / testing / our_kill_is_busted.c
1 #include <sys/types.h>
2 #include <sys/wait.h>
3 #include <unistd.h>
4 #include <assert.h>
5 #include <errno.h>
6 #include <string.h>
7 #include <stdio.h>
8 #include <stdlib.h>
9 #include <signal.h>
10
11 int
12 main(void)
13 {
14 int wstatus;
15 pid_t p, wr;
16 int kill_r, killpg_r, r;
17 int kill_e, killpg_e;
18
19 p = fork();
20 assert(p != -1);
21
22 if (p == 0) {
23 r = setsid();
24 assert(r != -1);
25 _exit(EXIT_SUCCESS);
26 }
27
28 sleep(1);
29
30 errno = 0;
31 kill_r = kill(p, SIGTERM);
32 kill_e = errno;
33
34 errno = 0;
35 killpg_r = kill(-(p), SIGTERM);
36 killpg_e = errno;
37
38 if (kill_r != killpg_r) {
39 fprintf(stderr, "Bug. kill() is inconsistent.\n");
40 fprintf(stderr, "kill( p, SIGTERM) returned %d and errno == %d\n", kill_r, kill_e);
41 fprintf(stderr, "kill(-(p), SIGTERM) returned %d and errno == %d\n", killpg_r, killpg_e);
42 if (kill_e == EPERM || killpg_e == EPERM) {
43 fprintf(stderr, "The kernel lied. We should have the right to kill 'p' and it returned EPERM.\n");
44 }
45 if (kill_e == ESRCH || killpg_e == ESRCH) {
46 fprintf(stderr, "The kernel is confused. PID 'p' exists, but the kernel couldn't find it.\n");
47 }
48
49 exit(EXIT_FAILURE);
50 }
51
52 wr = waitpid(p, &wstatus, 0);
53 assert(wr == p);
54
55 exit(EXIT_SUCCESS);
56 }