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