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