]> rtime.felk.cvut.cz Git - l4.git/blob - l4/pkg/uclibc/lib/contrib/uclibc/libc/sysdeps/linux/common/pselect.c
update
[l4.git] / l4 / pkg / uclibc / lib / contrib / uclibc / libc / sysdeps / linux / common / pselect.c
1 /* Copyright (C) 1996-1998,2001,2002,2003,2006 Free Software Foundation, Inc.
2    This file is part of the GNU C Library.
3    Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
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 <features.h>
20
21 #ifdef __USE_XOPEN2K
22
23 #include <sys/syscall.h>
24 #include <sys/select.h>
25 #include <sys/time.h>
26 #include <signal.h>
27 #include <cancel.h>
28
29 static int __NC(pselect)(int nfds, fd_set *readfds, fd_set *writefds,
30                          fd_set *exceptfds, const struct timespec *timeout,
31                          const sigset_t *sigmask)
32 {
33         struct timeval tval;
34         int retval;
35         sigset_t savemask;
36
37         /* Change nanosecond number to microseconds.  This might mean losing
38            precision and therefore the `pselect` should be available.  But
39            for now it is hardly found.  */
40         if (timeout != NULL)
41                 TIMESPEC_TO_TIMEVAL (&tval, timeout);
42
43         /* The setting and restoring of the signal mask and the select call
44            should be an atomic operation.  This can't be done without kernel
45            help.  */
46         if (sigmask != NULL)
47                 sigprocmask (SIG_SETMASK, sigmask, &savemask);
48
49         /* The comment below does not apply on uClibc, since we use __select_nocancel */
50         /* Note the pselect() is a cancellation point.  But since we call
51            select() which itself is a cancellation point we do not have
52            to do anything here.  */
53         retval = __NC(select)(nfds, readfds, writefds, exceptfds,
54                         timeout != NULL ? &tval : NULL);
55
56         if (sigmask != NULL)
57                 sigprocmask (SIG_SETMASK, &savemask, NULL);
58
59         return retval;
60 }
61 CANCELLABLE_SYSCALL(int, pselect, (int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds,
62                                    const struct timespec *timeout, const sigset_t *sigmask),
63                     (nfds, readfds, writefds, exceptfds, timeout, sigmask))
64
65 #endif