1 /* Copyright (C) 2006 Free Software Foundation, Inc.
2    This file is part of the GNU C Library.
3    Contributed by Ulrich Drepper <drepper@redhat.com>, 2006.
4 
5    The GNU C Library is free software; you can redistribute it and/or
6    modify it under the terms of the GNU Lesser General Public
7    License as published by the Free Software Foundation; either
8    version 2.1 of the License, or (at your option) any later version.
9 
10    The GNU C Library is distributed in the hope that it will be useful,
11    but WITHOUT ANY WARRANTY; without even the implied warranty of
12    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13    Lesser General Public License for more details.
14 
15    You should have received a copy of the GNU Lesser General Public
16    License along with the GNU C Library; if not, see
17    <http://www.gnu.org/licenses/>.  */
18 
19 #include <sys/syscall.h>
20 
21 #if (defined __NR_ppoll || defined(__NR_ppoll_time64)) && defined __UCLIBC_LINUX_SPECIFIC__ && defined __USE_GNU
22 
23 #define __need_NULL
24 #include <stddef.h>
25 #include <signal.h>
26 #include <sys/poll.h>
27 #include <cancel.h>
28 
29 #if defined(__UCLIBC_USE_TIME64__)
30 #include "internal/time64_helpers.h"
31 #endif
32 
33 static int
__NC(ppoll)34 __NC(ppoll)(struct pollfd *fds, nfds_t nfds, const struct timespec *timeout,
35 	    const sigset_t *sigmask)
36 {
37 	/* The Linux kernel can in some situations update the timeout value.
38 	   We do not want that so use a local variable.  */
39 	struct timespec tval;
40 	if (timeout != NULL) {
41 		tval = *timeout;
42 		timeout = &tval;
43 	}
44 #if defined(__UCLIBC_USE_TIME64__) && defined(__NR_ppoll_time64)
45 	return INLINE_SYSCALL(ppoll_time64, 5, fds, nfds, TO_TS64_P(timeout), sigmask, __SYSCALL_SIGSET_T_SIZE);
46 #else
47 	return INLINE_SYSCALL(ppoll, 5, fds, nfds, timeout, sigmask, __SYSCALL_SIGSET_T_SIZE);
48 #endif
49 }
50 
51 CANCELLABLE_SYSCALL(int, ppoll, (struct pollfd *fds, nfds_t nfds, const struct timespec *timeout,
52 				 const sigset_t *sigmask),
53 		    (fds, nfds, timeout, sigmask))
54 #endif
55