1/*++
2/* NAME
3/*	doze 3
4/* SUMMARY
5/*	take a nap
6/* SYNOPSIS
7/*	#include <iostuff.h>
8/*
9/*	void	doze(microseconds)
10/*	unsigned microseconds;
11/* DESCRIPTION
12/*	doze() sleeps for the specified number of microseconds. It is
13/*	a simple alternative for systems that lack usleep().
14/* DIAGNOSTICS
15/*	All errors are fatal.
16/* LICENSE
17/* .ad
18/* .fi
19/*	The Secure Mailer license must be distributed with this software.
20/* AUTHOR(S)
21/*	Wietse Venema
22/*	IBM T.J. Watson Research
23/*	P.O. Box 704
24/*	Yorktown Heights, NY 10598, USA
25/*--*/
26
27/* System library. */
28
29#include "sys_defs.h"
30#include <sys/time.h>
31#include <unistd.h>
32#include <errno.h>
33#ifdef USE_SYS_SELECT_H
34#include <sys/select.h>
35#endif
36
37/* Utility library. */
38
39#include <msg.h>
40#include <iostuff.h>
41
42/* doze - sleep a while */
43
44void    doze(unsigned delay)
45{
46    struct timeval tv;
47
48#define MILLION	1000000
49
50    tv.tv_sec = delay / MILLION;
51    tv.tv_usec = delay % MILLION;
52    while (select(0, (fd_set *) 0, (fd_set *) 0, (fd_set *) 0, &tv) < 0)
53	if (errno != EINTR)
54	    msg_fatal("doze: select: %m");
55}
56
57#ifdef TEST
58
59#include <stdlib.h>
60
61int     main(int argc, char **argv)
62{
63    unsigned delay;
64
65    if (argc != 2 || (delay = atol(argv[1])) == 0)
66	msg_fatal("usage: %s microseconds", argv[0]);
67    doze(delay);
68    exit(0);
69}
70
71#endif
72