1242960Skib/*- 2242960Skib * Copyright (c) 2012 Jukka A. Ukkonen 3242960Skib * All rights reserved. 4242960Skib * 5242960Skib * This software was developed by Jukka Ukkonen for FreeBSD. 6242960Skib * 7242960Skib * Redistribution and use in source and binary forms, with or without 8242960Skib * modification, are permitted provided that the following conditions 9242960Skib * are met: 10242960Skib * 1. Redistributions of source code must retain the above copyright 11242960Skib * notice, this list of conditions and the following disclaimer. 12242960Skib * 2. Redistributions in binary form must reproduce the above copyright 13242960Skib * notice, this list of conditions and the following disclaimer in the 14242960Skib * documentation and/or other materials provided with the distribution. 15242960Skib * 16242960Skib * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 17242960Skib * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18242960Skib * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 19242960Skib * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 20242960Skib * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 21242960Skib * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 22242960Skib * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 23242960Skib * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 24242960Skib * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 25242960Skib * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 26242960Skib * SUCH DAMAGE. 27242960Skib */ 28242960Skib 29242960Skib#include <sys/cdefs.h> 30242960Skib__FBSDID("$FreeBSD$"); 31242960Skib 32242960Skib#include "namespace.h" 33242960Skib#include <sys/types.h> 34242960Skib#include <sys/wait.h> 35242960Skib#include <stddef.h> 36242960Skib#include <string.h> 37242960Skib#include <signal.h> 38242960Skib#include <errno.h> 39242960Skib#include "un-namespace.h" 40242960Skib 41242960Skibint 42242960Skib__waitid(idtype_t idtype, id_t id, siginfo_t *info, int flags) 43242960Skib{ 44242960Skib int status; 45242960Skib pid_t ret; 46242960Skib 47242960Skib ret = _wait6(idtype, id, &status, flags, NULL, info); 48242960Skib 49242960Skib /* 50242960Skib * According to SUSv4, waitid() shall not return a PID when a 51242960Skib * process is found, but only 0. If a process was actually 52242960Skib * found, siginfo_t fields si_signo and si_pid will be 53242960Skib * non-zero. In case WNOHANG was set in the flags and no 54242960Skib * process was found those fields are set to zero using 55242960Skib * memset() below. 56242960Skib */ 57242960Skib if (ret == 0 && info != NULL) 58242960Skib memset(info, 0, sizeof(*info)); 59242960Skib else if (ret > 0) 60242960Skib ret = 0; 61242960Skib return (ret); 62242960Skib} 63242960Skib 64242960Skib__weak_reference(__waitid, waitid); 65242960Skib__weak_reference(__waitid, _waitid); 66