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 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