aboutsummaryrefslogtreecommitdiff
path: root/testcases/kernel/containers/pidns/pidns20.c
diff options
context:
space:
mode:
Diffstat (limited to 'testcases/kernel/containers/pidns/pidns20.c')
-rw-r--r--testcases/kernel/containers/pidns/pidns20.c35
1 files changed, 22 insertions, 13 deletions
diff --git a/testcases/kernel/containers/pidns/pidns20.c b/testcases/kernel/containers/pidns/pidns20.c
index 9f369699a..914820865 100644
--- a/testcases/kernel/containers/pidns/pidns20.c
+++ b/testcases/kernel/containers/pidns/pidns20.c
@@ -26,18 +26,18 @@ static void child_signal_handler(LTP_ATTRIBUTE_UNUSED int sig, siginfo_t *si, LT
signals++;
}
-static int child_func(LTP_ATTRIBUTE_UNUSED void *arg)
+static void child_func(void)
{
struct sigaction sa;
sigset_t newset;
pid_t cpid, ppid;
- cpid = getpid();
+ cpid = tst_getpid();
ppid = getppid();
if (cpid != 1 || ppid != 0) {
tst_res(TFAIL, "Got unexpected result of cpid=%d ppid=%d", cpid, ppid);
- return 0;
+ return;
}
SAFE_SIGEMPTYSET(&newset);
@@ -56,30 +56,34 @@ static int child_func(LTP_ATTRIBUTE_UNUSED void *arg)
if (signals != 1) {
tst_res(TFAIL, "Received %d signals", signals);
- return 0;
+ return;
}
if (last_signo != SIGUSR1) {
tst_res(TFAIL, "Received %s signal", tst_strsig(last_signo));
- return 0;
+ return;
}
tst_res(TPASS, "Received SIGUSR1 signal after unblock");
-
- return 0;
}
static void run(void)
{
- int ret;
-
- ret = ltp_clone_quick(CLONE_NEWPID | SIGCHLD, child_func, NULL);
- if (ret < 0)
- tst_brk(TBROK | TERRNO, "clone failed");
+ const struct tst_clone_args args = {
+ .flags = CLONE_NEWPID,
+ .exit_signal = SIGCHLD,
+ };
+ int pid;
+
+ pid = SAFE_CLONE(&args);
+ if (!pid) {
+ child_func();
+ return;
+ }
TST_CHECKPOINT_WAIT(0);
- SAFE_KILL(ret, SIGUSR1);
+ SAFE_KILL(pid, SIGUSR1);
TST_CHECKPOINT_WAKE(0);
}
@@ -87,5 +91,10 @@ static void run(void)
static struct tst_test test = {
.test_all = run,
.needs_root = 1,
+ .forks_child = 1,
.needs_checkpoints = 1,
+ .needs_kconfigs = (const char *[]) {
+ "CONFIG_PID_NS",
+ NULL,
+ },
};