113582Ssam #ifndef lint 2*17491Skarels static char sccsid[] = "@(#)sleep.c 4.7 (Berkeley) 12/08/84"; 313582Ssam #endif 412977Ssam 513582Ssam #include <sys/time.h> 61979Swnj #include <signal.h> 71979Swnj 812977Ssam #define setvec(vec, a) \ 912977Ssam vec.sv_handler = a; vec.sv_mask = vec.sv_onstack = 0 1012977Ssam 1114618Skarels static int ringring; 1214618Skarels 131979Swnj sleep(n) 1412977Ssam unsigned n; 151979Swnj { 1612977Ssam int sleepx(), omask; 1712977Ssam struct itimerval itv, oitv; 1812977Ssam register struct itimerval *itp = &itv; 1912977Ssam struct sigvec vec, ovec; 201979Swnj 2112977Ssam if (n == 0) 221979Swnj return; 2312977Ssam timerclear(&itp->it_interval); 2412977Ssam timerclear(&itp->it_value); 2512977Ssam if (setitimer(ITIMER_REAL, itp, &oitv) < 0) 2612977Ssam return; 2712977Ssam itp->it_value.tv_sec = n; 2812977Ssam if (timerisset(&oitv.it_value)) { 2912977Ssam if (timercmp(&oitv.it_value, &itp->it_value, >)) 3012977Ssam oitv.it_value.tv_sec -= itp->it_value.tv_sec; 311979Swnj else { 3212977Ssam itp->it_value = oitv.it_value; 3312977Ssam /* 3413019Ssam * This is a hack, but we must have time to 3514618Skarels * return from the setitimer after the alarm 3613019Ssam * or else it'll be restarted. And, anyway, 3713019Ssam * sleep never did anything more than this before. 3812977Ssam */ 3913019Ssam oitv.it_value.tv_sec = 1; 4013019Ssam oitv.it_value.tv_usec = 0; 411979Swnj } 421979Swnj } 4312977Ssam setvec(vec, sleepx); 4412977Ssam (void) sigvec(SIGALRM, &vec, &ovec); 45*17491Skarels omask = sigblock(sigmask(SIGALRM)); 4614954Skarels ringring = 0; 4714618Skarels (void) setitimer(ITIMER_REAL, itp, (struct itimerval *)0); 4814618Skarels while (!ringring) 49*17491Skarels sigpause(omask &~ sigmask(SIGALRM)); 5014618Skarels (void) sigvec(SIGALRM, &ovec, (struct sigvec *)0); 51*17491Skarels (void) sigsetmask(omask); 5214618Skarels (void) setitimer(ITIMER_REAL, &oitv, (struct itimerval *)0); 531979Swnj } 541979Swnj 551979Swnj static 561979Swnj sleepx() 571979Swnj { 5812977Ssam 5914618Skarels ringring = 1; 601979Swnj } 61