1f08c3bdfSopenharmony_ci// SPDX-License-Identifier: GPL-2.0-or-later 2f08c3bdfSopenharmony_ci/* 3f08c3bdfSopenharmony_ci * Copyright (c) Crackerjack Project., 2007 4f08c3bdfSopenharmony_ci * Copyright (c) Manas Kumar Nayak maknayak@in.ibm.com> 5f08c3bdfSopenharmony_ci * Copyright (C) 2021 SUSE LLC Andrea Cervesato <andrea.cervesato@suse.com> 6f08c3bdfSopenharmony_ci */ 7f08c3bdfSopenharmony_ci 8f08c3bdfSopenharmony_ci/*\ 9f08c3bdfSopenharmony_ci * [Description] 10f08c3bdfSopenharmony_ci * 11f08c3bdfSopenharmony_ci * This test if waitid() syscall leaves the si_pid set to 0 with WNOHANG flag 12f08c3bdfSopenharmony_ci * when no child was waited for. 13f08c3bdfSopenharmony_ci */ 14f08c3bdfSopenharmony_ci 15f08c3bdfSopenharmony_ci#include <sys/wait.h> 16f08c3bdfSopenharmony_ci#include "tst_test.h" 17f08c3bdfSopenharmony_ci 18f08c3bdfSopenharmony_cistatic siginfo_t *infop; 19f08c3bdfSopenharmony_ci 20f08c3bdfSopenharmony_cistatic void run(void) 21f08c3bdfSopenharmony_ci{ 22f08c3bdfSopenharmony_ci pid_t pid_child; 23f08c3bdfSopenharmony_ci 24f08c3bdfSopenharmony_ci pid_child = SAFE_FORK(); 25f08c3bdfSopenharmony_ci if (!pid_child) { 26f08c3bdfSopenharmony_ci TST_CHECKPOINT_WAIT(0); 27f08c3bdfSopenharmony_ci return; 28f08c3bdfSopenharmony_ci } 29f08c3bdfSopenharmony_ci 30f08c3bdfSopenharmony_ci memset(infop, 0, sizeof(*infop)); 31f08c3bdfSopenharmony_ci TST_EXP_PASS(waitid(P_ALL, pid_child, infop, WNOHANG | WEXITED)); 32f08c3bdfSopenharmony_ci 33f08c3bdfSopenharmony_ci TST_EXP_EQ_LI(infop->si_pid, 0); 34f08c3bdfSopenharmony_ci 35f08c3bdfSopenharmony_ci TST_CHECKPOINT_WAKE(0); 36f08c3bdfSopenharmony_ci} 37f08c3bdfSopenharmony_ci 38f08c3bdfSopenharmony_cistatic struct tst_test test = { 39f08c3bdfSopenharmony_ci .test_all = run, 40f08c3bdfSopenharmony_ci .forks_child = 1, 41f08c3bdfSopenharmony_ci .needs_checkpoints = 1, 42f08c3bdfSopenharmony_ci .bufs = (struct tst_buffers[]) { 43f08c3bdfSopenharmony_ci {&infop, .size = sizeof(*infop)}, 44f08c3bdfSopenharmony_ci {} 45f08c3bdfSopenharmony_ci } 46f08c3bdfSopenharmony_ci}; 47