diff options
Diffstat (limited to 'testcases/kernel/containers/pidns/pidns20.c')
-rw-r--r-- | testcases/kernel/containers/pidns/pidns20.c | 35 |
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, + }, }; |