1*99451b44SJordan Rupprecht #include <stdio.h>
2*99451b44SJordan Rupprecht #include <unistd.h>
3*99451b44SJordan Rupprecht #include <sys/wait.h>
4*99451b44SJordan Rupprecht
5*99451b44SJordan Rupprecht volatile int release_child_flag = 0;
6*99451b44SJordan Rupprecht
main(int argc,char const * argv[])7*99451b44SJordan Rupprecht int main(int argc, char const *argv[])
8*99451b44SJordan Rupprecht {
9*99451b44SJordan Rupprecht pid_t child = fork();
10*99451b44SJordan Rupprecht if (child == -1)
11*99451b44SJordan Rupprecht {
12*99451b44SJordan Rupprecht perror("fork");
13*99451b44SJordan Rupprecht return 1;
14*99451b44SJordan Rupprecht }
15*99451b44SJordan Rupprecht
16*99451b44SJordan Rupprecht if (child > 0)
17*99451b44SJordan Rupprecht { // parent
18*99451b44SJordan Rupprecht if (argc < 2)
19*99451b44SJordan Rupprecht {
20*99451b44SJordan Rupprecht fprintf(stderr, "Need pid filename.\n");
21*99451b44SJordan Rupprecht return 2;
22*99451b44SJordan Rupprecht }
23*99451b44SJordan Rupprecht
24*99451b44SJordan Rupprecht // Let the test suite know the child's pid.
25*99451b44SJordan Rupprecht FILE *pid_file = fopen(argv[1], "w");
26*99451b44SJordan Rupprecht if (pid_file == NULL)
27*99451b44SJordan Rupprecht {
28*99451b44SJordan Rupprecht perror("fopen");
29*99451b44SJordan Rupprecht return 3;
30*99451b44SJordan Rupprecht }
31*99451b44SJordan Rupprecht
32*99451b44SJordan Rupprecht fprintf(pid_file, "%d\n", child);
33*99451b44SJordan Rupprecht if (fclose(pid_file) == EOF)
34*99451b44SJordan Rupprecht {
35*99451b44SJordan Rupprecht perror("fclose");
36*99451b44SJordan Rupprecht return 4;
37*99451b44SJordan Rupprecht }
38*99451b44SJordan Rupprecht
39*99451b44SJordan Rupprecht // And wait for the child to finish it's work.
40*99451b44SJordan Rupprecht int status = 0;
41*99451b44SJordan Rupprecht pid_t wpid = wait(&status);
42*99451b44SJordan Rupprecht if (wpid == -1)
43*99451b44SJordan Rupprecht {
44*99451b44SJordan Rupprecht perror("wait");
45*99451b44SJordan Rupprecht return 5;
46*99451b44SJordan Rupprecht }
47*99451b44SJordan Rupprecht if (wpid != child)
48*99451b44SJordan Rupprecht {
49*99451b44SJordan Rupprecht fprintf(stderr, "wait() waited for wrong child\n");
50*99451b44SJordan Rupprecht return 6;
51*99451b44SJordan Rupprecht }
52*99451b44SJordan Rupprecht if (!WIFEXITED(status) || WEXITSTATUS(status) != 0)
53*99451b44SJordan Rupprecht {
54*99451b44SJordan Rupprecht fprintf(stderr, "child did not exit correctly\n");
55*99451b44SJordan Rupprecht return 7;
56*99451b44SJordan Rupprecht }
57*99451b44SJordan Rupprecht }
58*99451b44SJordan Rupprecht else
59*99451b44SJordan Rupprecht { // child
60*99451b44SJordan Rupprecht lldb_enable_attach();
61*99451b44SJordan Rupprecht
62*99451b44SJordan Rupprecht while (! release_child_flag) // Wait for debugger to attach
63*99451b44SJordan Rupprecht sleep(1);
64*99451b44SJordan Rupprecht
65*99451b44SJordan Rupprecht printf("Child's previous process group is: %d\n", getpgid(0));
66*99451b44SJordan Rupprecht setpgid(0, 0); // Set breakpoint here
67*99451b44SJordan Rupprecht printf("Child's process group set to: %d\n", getpgid(0));
68*99451b44SJordan Rupprecht }
69*99451b44SJordan Rupprecht
70*99451b44SJordan Rupprecht return 0;
71*99451b44SJordan Rupprecht }
72