/* b_accept_() */ int b_accept_(int s, struct sockaddr *addr, socklen_t *addrlen) { sigset_t oldMask; sigset_t newMask; int cc; blockSigs_(0, &newMask, &oldMask); cc = accept(s, addr, addrlen); sigprocmask(SIG_SETMASK, &oldMask, NULL); return (cc); } /* b_accept_() */
int b_connect_ (int s, struct sockaddr *name, int namelen, int timeout) { struct itimerval old_itimer; unsigned int oldTimer; sigset_t newMask, oldMask; struct sigaction action, old_action; if (getitimer (ITIMER_REAL, &old_itimer) < 0) return -1; action.sa_flags = 0; action.sa_handler = (SIGFUNCTYPE) alarmer_; sigfillset (&action.sa_mask); sigaction (SIGALRM, &action, &old_action); unblocksig (SIGALRM); blockSigs_ (SIGALRM, &newMask, &oldMask); oldTimer = alarm (timeout); if (connect (s, name, namelen) < 0) { if (errno == EINTR) errno = ETIMEDOUT; alarm (oldTimer); setitimer (ITIMER_REAL, &old_itimer, NULL); sigaction (SIGALRM, &old_action, NULL); sigprocmask (SIG_SETMASK, &oldMask, NULL); return -1; } alarm (oldTimer); setitimer (ITIMER_REAL, &old_itimer, NULL); sigaction (SIGALRM, &old_action, NULL); sigprocmask (SIG_SETMASK, &oldMask, NULL); return 0; }