Implement the waitid() SUSv4 function using wait6() system call.

PR:	standards/170346
Submitted by:	"Jukka A. Ukkonen" <jau@iki.fi>
MFC after:	1 month
This commit is contained in:
Konstantin Belousov 2012-11-13 12:55:52 +00:00
parent 552e993580
commit eb3d4e1fbd
6 changed files with 72 additions and 1 deletions

View File

@ -34,7 +34,7 @@ SRCS+= __getosreldate.c __xuname.c \
syslog.c telldir.c termios.c time.c times.c timezone.c tls.c \
ttyname.c ttyslot.c ualarm.c ulimit.c uname.c unvis.c \
usleep.c utime.c utxdb.c valloc.c vis.c wait.c wait3.c waitpid.c \
wordexp.c
waitid.c wordexp.c
.PATH: ${.CURDIR}/../../contrib/libc-pwcache
SRCS+= pwcache.c pwcache.h

View File

@ -391,6 +391,7 @@ FBSD_1.3 {
pwcache_userdb;
pwcache_groupdb;
uid_from_user;
waitid;
};
FBSDprivate_1.0 {

65
lib/libc/gen/waitid.c Normal file
View File

@ -0,0 +1,65 @@
/*-
* Copyright (c) 2012 Jukka A. Ukkonen
* All rights reserved.
*
* This software was developed by Jukka Ukkonen for FreeBSD.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*/
#include <sys/cdefs.h>
__FBSDID("$FreeBSD$");
#include "namespace.h"
#include <sys/types.h>
#include <sys/wait.h>
#include <stddef.h>
#include <string.h>
#include <signal.h>
#include <errno.h>
#include "un-namespace.h"
int
__waitid(idtype_t idtype, id_t id, siginfo_t *info, int flags)
{
int status;
pid_t ret;
ret = _wait6(idtype, id, &status, flags, NULL, info);
/*
* According to SUSv4, waitid() shall not return a PID when a
* process is found, but only 0. If a process was actually
* found, siginfo_t fields si_signo and si_pid will be
* non-zero. In case WNOHANG was set in the flags and no
* process was found those fields are set to zero using
* memset() below.
*/
if (ret == 0 && info != NULL)
memset(info, 0, sizeof(*info));
else if (ret > 0)
ret = 0;
return (ret);
}
__weak_reference(__waitid, waitid);
__weak_reference(__waitid, _waitid);

View File

@ -229,6 +229,7 @@
#define socketpair _socketpair
#define usleep _usleep
#define wait4 _wait4
#define wait6 _wait6
#define waitpid _waitpid
#define write _write
#define writev _writev

View File

@ -210,6 +210,7 @@
#undef socketpair
#undef usleep
#undef wait4
#undef wait6
#undef waitpid
#undef write
#undef writev

View File

@ -384,6 +384,7 @@ FBSD_1.3 {
ffclock_getestimate;
ffclock_setestimate;
posix_fadvise;
wait6;
};
FBSDprivate_1.0 {
@ -1019,6 +1020,8 @@ FBSDprivate_1.0 {
__sys_vadvise;
_wait4;
__sys_wait4;
_wait6;
__sys_wait6;
_write;
__sys_write;
_writev;