+/* interruptable select() */
+int select_intr(int n, fd_set *r, fd_set *w, fd_set *e, struct timeval *t)
+{
+ int rv;
+ sigset_t ssn, sso;
+
+ /* unblock SIGCHLD */
+ sigemptyset(&ssn);
+ sigaddset(&ssn, SIGCHLD);
+ sigprocmask(SIG_UNBLOCK, &ssn, &sso);
+
+ rv = select(n, r, w, e, t);
+
+ /* restore signal mask */
+ sigprocmask(SIG_SETMASK, &sso, NULL);
+
+ return rv;
+}
+