1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /*
3 * Copyright (c) International Business Machines Corp., 2007
4 * 13/11/08 Gowrishankar M <gowrishankar.m@in.ibm.com>
5 * Copyright (C) 2022 SUSE LLC Andrea Cervesato <andrea.cervesato@suse.com>
6 */
7
8 /*\
9 * [Description]
10 *
11 * Clone a process with CLONE_NEWPID flag and spawn many children inside the
12 * container. Then terminate all children and check if they were signaled.
13 */
14
15 #include <sys/wait.h>
16 #include "tst_test.h"
17 #include "lapi/sched.h"
18
19 #define CHILDREN_NUM 10
20
child_func(void)21 static void child_func(void)
22 {
23 int children[CHILDREN_NUM], status;
24 unsigned int i;
25 pid_t cpid, ppid;
26
27 cpid = tst_getpid();
28 ppid = getppid();
29
30 TST_EXP_EQ_LI(cpid, 1);
31 TST_EXP_EQ_LI(ppid, 0);
32
33 tst_res(TINFO, "Spawning %d children", CHILDREN_NUM);
34
35 for (i = 0; i < CHILDREN_NUM; i++) {
36 children[i] = SAFE_FORK();
37 if (!children[i]) {
38 pause();
39 return;
40 }
41 }
42
43 tst_res(TINFO, "Terminate children with SIGUSR1");
44
45 SAFE_KILL(-1, SIGUSR1);
46
47 for (i = 0; i < CHILDREN_NUM; i++) {
48 SAFE_WAITPID(children[i], &status, 0);
49
50 TST_EXP_EQ_LI(WIFSIGNALED(status), 1);
51 TST_EXP_EQ_LI(WTERMSIG(status), SIGUSR1);
52 }
53 }
54
run(void)55 static void run(void)
56 {
57 const struct tst_clone_args args = {
58 .flags = CLONE_NEWPID,
59 .exit_signal = SIGCHLD,
60 };
61
62 if (!SAFE_CLONE(&args)) {
63 child_func();
64 return;
65 }
66 }
67
68 static struct tst_test test = {
69 .test_all = run,
70 .needs_root = 1,
71 .forks_child = 1,
72 };
73