386 peculiar files touchup
[unix-history] / usr / src / lib / libc / gen / sleep.c
CommitLineData
bb0cfa24 1/*
dc51c380
KB
2 * Copyright (c) 1989 The Regents of the University of California.
3 * All rights reserved.
4 *
269a7923 5 * %sccs.include.redist.c%
bb0cfa24
DF
6 */
7
2ce81398 8#if defined(LIBC_SCCS) && !defined(lint)
269a7923 9static char sccsid[] = "@(#)sleep.c 5.5 (Berkeley) %G%";
dc51c380 10#endif /* LIBC_SCCS and not lint */
fa95c6ae 11
455b164d 12#include <sys/time.h>
dc51c380 13#include <sys/signal.h>
cc749e07 14
fa95c6ae
SL
15#define setvec(vec, a) \
16 vec.sv_handler = a; vec.sv_mask = vec.sv_onstack = 0
17
e15ec383
MK
18static int ringring;
19
dc51c380
KB
20sleep(seconds)
21 unsigned int seconds;
cc749e07 22{
dc51c380 23 register struct itimerval *itp;
fa95c6ae 24 struct itimerval itv, oitv;
fa95c6ae 25 struct sigvec vec, ovec;
dc51c380
KB
26 long omask;
27 void sleephandler();
cc749e07 28
dc51c380
KB
29 itp = &itv;
30 if (!seconds)
cc749e07 31 return;
fa95c6ae
SL
32 timerclear(&itp->it_interval);
33 timerclear(&itp->it_value);
34 if (setitimer(ITIMER_REAL, itp, &oitv) < 0)
35 return;
dc51c380 36 itp->it_value.tv_sec = seconds;
fa95c6ae
SL
37 if (timerisset(&oitv.it_value)) {
38 if (timercmp(&oitv.it_value, &itp->it_value, >))
39 oitv.it_value.tv_sec -= itp->it_value.tv_sec;
cc749e07 40 else {
fa95c6ae
SL
41 itp->it_value = oitv.it_value;
42 /*
dc51c380
KB
43 * This is a hack, but we must have time to return
44 * from the setitimer after the alarm or else it'll
45 * be restarted. And, anyway, sleep never did
46 * anything more than this before.
fa95c6ae 47 */
a883f51a
SL
48 oitv.it_value.tv_sec = 1;
49 oitv.it_value.tv_usec = 0;
cc749e07
BJ
50 }
51 }
dc51c380 52 setvec(vec, sleephandler);
fa95c6ae 53 (void) sigvec(SIGALRM, &vec, &ovec);
1c9de88b 54 omask = sigblock(sigmask(SIGALRM));
e15ec383 55 ringring = 0;
b34945c3 56 (void) setitimer(ITIMER_REAL, itp, (struct itimerval *)0);
e15ec383 57 while (!ringring)
1c9de88b 58 sigpause(omask &~ sigmask(SIGALRM));
e15ec383 59 (void) sigvec(SIGALRM, &ovec, (struct sigvec *)0);
1c9de88b 60 (void) sigsetmask(omask);
e15ec383 61 (void) setitimer(ITIMER_REAL, &oitv, (struct itimerval *)0);
cc749e07
BJ
62}
63
dc51c380
KB
64static void
65sleephandler()
cc749e07 66{
e15ec383 67 ringring = 1;
cc749e07 68}