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" 40281981Skib#include "libc_private.h" 41242960Skib 42242960Skibint 43242960Skib__waitid(idtype_t idtype, id_t id, siginfo_t *info, int flags) 44242960Skib{ 45242960Skib int status; 46242960Skib pid_t ret; 47242960Skib 48281981Skib ret = ((pid_t (*)(idtype_t, id_t, int *, int, struct __wrusage *, 49281981Skib siginfo_t *))__libc_interposing[INTERPOS_wait6])(idtype, id, 50281981Skib &status, flags, NULL, info); 51242960Skib 52242960Skib /* 53242960Skib * According to SUSv4, waitid() shall not return a PID when a 54242960Skib * process is found, but only 0. If a process was actually 55242960Skib * found, siginfo_t fields si_signo and si_pid will be 56242960Skib * non-zero. In case WNOHANG was set in the flags and no 57242960Skib * process was found those fields are set to zero using 58242960Skib * memset() below. 59242960Skib */ 60242960Skib if (ret == 0 && info != NULL) 61242960Skib memset(info, 0, sizeof(*info)); 62242960Skib else if (ret > 0) 63242960Skib ret = 0; 64242960Skib return (ret); 65242960Skib} 66242960Skib 67242960Skib__weak_reference(__waitid, waitid); 68242960Skib__weak_reference(__waitid, _waitid); 69