|
|
1.1 root 1: /*
2: * Copyright (c) 1980 Regents of the University of California.
3: * All rights reserved. The Berkeley software License Agreement
4: * specifies the terms and conditions for redistribution.
5: */
6:
7: #if defined(LIBC_SCCS) && !defined(lint)
8: static char sccsid[] = "@(#)sleep.c 5.3 (Berkeley) 9/30/87";
9: #endif LIBC_SCCS and not lint
10:
11: #include <sys/time.h>
12: #include <signal.h>
13:
14: #define setvec(vec, a) \
15: vec.sv_handler = a; vec.sv_mask = vec.sv_onstack = 0
16:
17: static int ringring;
18:
19: sleep(n)
20: unsigned n;
21: {
22: int sleepx();
23: long omask;
24: struct itimerval itv, oitv;
25: register struct itimerval *itp = &itv;
26: struct sigvec vec, ovec;
27:
28: if (n == 0)
29: return;
30: timerclear(&itp->it_interval);
31: timerclear(&itp->it_value);
32: if (setitimer(ITIMER_REAL, itp, &oitv) < 0)
33: return;
34: itp->it_value.tv_sec = n;
35: if (timerisset(&oitv.it_value)) {
36: if (timercmp(&oitv.it_value, &itp->it_value, >))
37: oitv.it_value.tv_sec -= itp->it_value.tv_sec;
38: else {
39: itp->it_value = oitv.it_value;
40: /*
41: * This is a hack, but we must have time to
42: * return from the setitimer after the alarm
43: * or else it'll be restarted. And, anyway,
44: * sleep never did anything more than this before.
45: */
46: oitv.it_value.tv_sec = 1;
47: oitv.it_value.tv_usec = 0;
48: }
49: }
50: setvec(vec, sleepx);
51: (void) sigvec(SIGALRM, &vec, &ovec);
52: omask = sigblock(sigmask(SIGALRM));
53: ringring = 0;
54: (void) setitimer(ITIMER_REAL, itp, (struct itimerval *)0);
55: while (!ringring)
56: sigpause(omask &~ sigmask(SIGALRM));
57: (void) sigvec(SIGALRM, &ovec, (struct sigvec *)0);
58: (void) sigsetmask(omask);
59: (void) setitimer(ITIMER_REAL, &oitv, (struct itimerval *)0);
60: }
61:
62: static
63: sleepx()
64: {
65:
66: ringring = 1;
67: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.