1/*++ 2/* NAME 3/* rand_sleep 3 4/* SUMMARY 5/* sleep for randomized interval 6/* SYNOPSIS 7/* #include <iostuff.h> 8/* 9/* void rand_sleep(delay, variation) 10/* unsigned delay; 11/* unsigned variation; 12/* DESCRIPTION 13/* rand_sleep() blocks the current process for an amount of time 14/* pseudo-randomly chosen from the interval (delay +- variation/2). 15/* 16/* Arguments: 17/* .IP delay 18/* Time to sleep in microseconds. 19/* .IP variation 20/* Variation in microseconds; must not be larger than delay. 21/* DIAGNOSTICS 22/* Panic: interface violation. All system call errors are fatal. 23/* LICENSE 24/* .ad 25/* .fi 26/* The Secure Mailer license must be distributed with this software. 27/* AUTHOR(S) 28/* Wietse Venema 29/* IBM T.J. Watson Research 30/* P.O. Box 704 31/* Yorktown Heights, NY 10598, USA 32/*--*/ 33 34/* System library. */ 35 36#include <sys_defs.h> 37#include <stdlib.h> 38#include <unistd.h> 39#include <time.h> 40 41/* Utility library. */ 42 43#include <msg.h> 44#include <myrand.h> 45#include <iostuff.h> 46 47/* rand_sleep - block for random time */ 48 49void rand_sleep(unsigned delay, unsigned variation) 50{ 51 const char *myname = "rand_sleep"; 52 unsigned usec; 53 54 /* 55 * Sanity checks. 56 */ 57 if (delay == 0) 58 msg_panic("%s: bad delay %d", myname, delay); 59 if (variation > delay) 60 msg_panic("%s: bad variation %d", myname, variation); 61 62 /* 63 * Use the semi-crappy random number generator. 64 */ 65 usec = (delay - variation / 2) + variation * (double) myrand() / RAND_MAX; 66 doze(usec); 67} 68 69#ifdef TEST 70 71#include <msg_vstream.h> 72 73int main(int argc, char **argv) 74{ 75 int delay; 76 int variation; 77 78 msg_vstream_init(argv[0], VSTREAM_ERR); 79 if (argc != 3) 80 msg_fatal("usage: %s delay variation", argv[0]); 81 if ((delay = atoi(argv[1])) <= 0) 82 msg_fatal("bad delay: %s", argv[1]); 83 if ((variation = atoi(argv[2])) < 0) 84 msg_fatal("bad variation: %s", argv[2]); 85 rand_sleep(delay * 1000000, variation * 1000000); 86 exit(0); 87} 88 89#endif 90