113582Ssam #ifndef lint 2*14954Skarels static char sccsid[] = "@(#)sleep.c 4.6 (Berkeley) 09/11/83"; 313582Ssam #endif 412977Ssam 513582Ssam #include <sys/time.h> 61979Swnj #include <signal.h> 71979Swnj 812977Ssam #define mask(s) (1<<((s)-1)) 912977Ssam #define setvec(vec, a) \ 1012977Ssam vec.sv_handler = a; vec.sv_mask = vec.sv_onstack = 0 1112977Ssam 1214618Skarels static int ringring; 1314618Skarels 141979Swnj sleep(n) 1512977Ssam unsigned n; 161979Swnj { 1712977Ssam int sleepx(), omask; 1812977Ssam struct itimerval itv, oitv; 1912977Ssam register struct itimerval *itp = &itv; 2012977Ssam struct sigvec vec, ovec; 211979Swnj 2212977Ssam if (n == 0) 231979Swnj return; 2412977Ssam timerclear(&itp->it_interval); 2512977Ssam timerclear(&itp->it_value); 2612977Ssam if (setitimer(ITIMER_REAL, itp, &oitv) < 0) 2712977Ssam return; 2812977Ssam setvec(ovec, SIG_DFL); 2912977Ssam omask = sigblock(0); 3012977Ssam itp->it_value.tv_sec = n; 3112977Ssam if (timerisset(&oitv.it_value)) { 3212977Ssam if (timercmp(&oitv.it_value, &itp->it_value, >)) 3312977Ssam oitv.it_value.tv_sec -= itp->it_value.tv_sec; 341979Swnj else { 3512977Ssam itp->it_value = oitv.it_value; 3612977Ssam /* 3713019Ssam * This is a hack, but we must have time to 3814618Skarels * return from the setitimer after the alarm 3913019Ssam * or else it'll be restarted. And, anyway, 4013019Ssam * sleep never did anything more than this before. 4112977Ssam */ 4213019Ssam oitv.it_value.tv_sec = 1; 4313019Ssam oitv.it_value.tv_usec = 0; 441979Swnj } 451979Swnj } 4612977Ssam setvec(vec, sleepx); 4712977Ssam (void) sigvec(SIGALRM, &vec, &ovec); 48*14954Skarels ringring = 0; 4914618Skarels (void) setitimer(ITIMER_REAL, itp, (struct itimerval *)0); 5014618Skarels while (!ringring) 5113019Ssam sigpause(omask &~ mask(SIGALRM)); 5214618Skarels (void) sigvec(SIGALRM, &ovec, (struct sigvec *)0); 5314618Skarels (void) setitimer(ITIMER_REAL, &oitv, (struct itimerval *)0); 541979Swnj } 551979Swnj 561979Swnj static 571979Swnj sleepx() 581979Swnj { 5912977Ssam 6014618Skarels ringring = 1; 611979Swnj } 62