define new library function getgrouplist
[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)
c5980113 9static char sccsid[] = "@(#)sleep.c 5.6 (Berkeley) %G%";
dc51c380 10#endif /* LIBC_SCCS and not lint */
fa95c6ae 11
455b164d 12#include <sys/time.h>
dc51c380 13#include <sys/signal.h>
c5980113 14#include <unistd.h>
cc749e07 15
fa95c6ae
SL
16#define setvec(vec, a) \
17 vec.sv_handler = a; vec.sv_mask = vec.sv_onstack = 0
18
e15ec383
MK
19static int ringring;
20
c5980113 21unsigned int
dc51c380
KB
22sleep(seconds)
23 unsigned int seconds;
cc749e07 24{
dc51c380 25 register struct itimerval *itp;
fa95c6ae 26 struct itimerval itv, oitv;
fa95c6ae 27 struct sigvec vec, ovec;
dc51c380 28 long omask;
c5980113 29 static void sleephandler();
cc749e07 30
dc51c380
KB
31 itp = &itv;
32 if (!seconds)
c5980113 33 return 0;
fa95c6ae
SL
34 timerclear(&itp->it_interval);
35 timerclear(&itp->it_value);
36 if (setitimer(ITIMER_REAL, itp, &oitv) < 0)
c5980113 37 return seconds;
dc51c380 38 itp->it_value.tv_sec = seconds;
fa95c6ae
SL
39 if (timerisset(&oitv.it_value)) {
40 if (timercmp(&oitv.it_value, &itp->it_value, >))
41 oitv.it_value.tv_sec -= itp->it_value.tv_sec;
cc749e07 42 else {
fa95c6ae
SL
43 itp->it_value = oitv.it_value;
44 /*
dc51c380
KB
45 * This is a hack, but we must have time to return
46 * from the setitimer after the alarm or else it'll
47 * be restarted. And, anyway, sleep never did
48 * anything more than this before.
fa95c6ae 49 */
a883f51a
SL
50 oitv.it_value.tv_sec = 1;
51 oitv.it_value.tv_usec = 0;
cc749e07
BJ
52 }
53 }
dc51c380 54 setvec(vec, sleephandler);
fa95c6ae 55 (void) sigvec(SIGALRM, &vec, &ovec);
1c9de88b 56 omask = sigblock(sigmask(SIGALRM));
e15ec383 57 ringring = 0;
b34945c3 58 (void) setitimer(ITIMER_REAL, itp, (struct itimerval *)0);
e15ec383 59 while (!ringring)
1c9de88b 60 sigpause(omask &~ sigmask(SIGALRM));
e15ec383 61 (void) sigvec(SIGALRM, &ovec, (struct sigvec *)0);
1c9de88b 62 (void) sigsetmask(omask);
e15ec383 63 (void) setitimer(ITIMER_REAL, &oitv, (struct itimerval *)0);
c5980113 64 return 0;
cc749e07
BJ
65}
66
dc51c380
KB
67static void
68sleephandler()
cc749e07 69{
e15ec383 70 ringring = 1;
cc749e07 71}