1 /*
2 * Copyright (c) 2001-2011, NLnet Labs. All rights reserved.
3 *
4 * Like select(2) but set the signals to block while waiting in
5 * select. This version is not entirely race condition safe. Only
6 * operating system support can make it so.
7 */
8
9 #include <config.h>
10
11 #include <sys/time.h>
12 #include <sys/types.h>
13 #ifdef HAVE_SYS_SELECT_H
14 #include <sys/select.h>
15 #endif
16 #include <unistd.h>
17 #include <signal.h>
18
19 int
pselect(int n,fd_set * readfds,fd_set * writefds,fd_set * exceptfds,const struct timespec * timeout,const sigset_t * sigmask)20 pselect (int n,
21 fd_set *readfds,
22 fd_set *writefds,
23 fd_set *exceptfds,
24 const struct timespec *timeout,
25 const sigset_t *sigmask)
26 {
27 int result;
28 sigset_t saved_sigmask;
29 struct timeval saved_timeout;
30
31 if (sigmask && sigprocmask(SIG_SETMASK, sigmask, &saved_sigmask) == -1)
32 return -1;
33
34 if (timeout) {
35 saved_timeout.tv_sec = timeout->tv_sec;
36 saved_timeout.tv_usec = timeout->tv_nsec / 1000;
37 result = select(n, readfds, writefds, exceptfds, &saved_timeout);
38 } else {
39 result = select(n, readfds, writefds, exceptfds, NULL);
40 }
41
42 if (sigmask && sigprocmask(SIG_SETMASK, &saved_sigmask, NULL) == -1)
43 return -1;
44
45 return result;
46 }
47