1305676Sjilles/*- 2305676Sjilles * Copyright (c) 2016 Jilles Tjoelker 3305676Sjilles * All rights reserved. 4305676Sjilles * 5305676Sjilles * Redistribution and use in source and binary forms, with or without 6305676Sjilles * modification, are permitted provided that the following conditions 7305676Sjilles * are met: 8305676Sjilles * 1. Redistributions of source code must retain the above copyright 9305676Sjilles * notice, this list of conditions and the following disclaimer. 10305676Sjilles * 2. Redistributions in binary form must reproduce the above copyright 11305676Sjilles * notice, this list of conditions and the following disclaimer in the 12305676Sjilles * documentation and/or other materials provided with the distribution. 13305676Sjilles * 14305676Sjilles * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 15305676Sjilles * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16305676Sjilles * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17305676Sjilles * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 18305676Sjilles * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19305676Sjilles * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20305676Sjilles * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21305676Sjilles * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22305676Sjilles * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23305676Sjilles * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24305676Sjilles * SUCH DAMAGE. 25305676Sjilles */ 26305676Sjilles 27305676Sjilles#include <sys/cdefs.h> 28305676Sjilles__FBSDID("$FreeBSD: stable/11/tests/sys/kern/waitpid_nohang.c 307004 2016-10-10 20:24:32Z jilles $"); 29305676Sjilles 30305676Sjilles#include <sys/wait.h> 31305676Sjilles 32305676Sjilles#include <atf-c.h> 33305676Sjilles#include <signal.h> 34305676Sjilles#include <unistd.h> 35305676Sjilles 36305676SjillesATF_TC_WITHOUT_HEAD(waitpid_nohang); 37305676SjillesATF_TC_BODY(waitpid_nohang, tc) 38305676Sjilles{ 39305676Sjilles pid_t child, pid; 40305676Sjilles int status, r; 41305676Sjilles 42305676Sjilles child = fork(); 43305676Sjilles ATF_REQUIRE(child != -1); 44305676Sjilles if (child == 0) { 45305676Sjilles sleep(10); 46305676Sjilles _exit(1); 47305676Sjilles } 48305676Sjilles 49305676Sjilles status = 42; 50305676Sjilles pid = waitpid(child, &status, WNOHANG); 51305676Sjilles ATF_REQUIRE(pid == 0); 52305676Sjilles ATF_CHECK(status == 42); 53305676Sjilles 54305676Sjilles r = kill(child, SIGTERM); 55305676Sjilles ATF_REQUIRE(r == 0); 56305676Sjilles r = waitid(P_PID, child, NULL, WEXITED | WNOWAIT); 57305676Sjilles ATF_REQUIRE(r == 0); 58305676Sjilles 59305676Sjilles status = -1; 60305676Sjilles pid = waitpid(child, &status, WNOHANG); 61305676Sjilles ATF_REQUIRE(pid == child); 62305676Sjilles ATF_CHECK(WIFSIGNALED(status) && WTERMSIG(status) == SIGTERM); 63305676Sjilles} 64305676Sjilles 65305676SjillesATF_TP_ADD_TCS(tp) 66305676Sjilles{ 67305676Sjilles 68305676Sjilles ATF_TP_ADD_TC(tp, waitpid_nohang); 69305676Sjilles return (atf_no_error()); 70305676Sjilles} 71