1 /* vi: set sw=4 ts=4: */
2 /*
3  * Busybox utility routines.
4  *
5  * Copyright (C) 2005 by Tito Ragusa <tito-wolit@tiscali.it>
6  *
7  * Licensed under GPLv2, see file LICENSE in this source tree.
8  */
9 #include "libbb.h"
10 
11 /* void FAST_FUNC bb_do_delay(unsigned seconds) { ... } - no users yet */
12 
13 #ifndef LOGIN_FAIL_DELAY
14 #define LOGIN_FAIL_DELAY 3
15 #endif
pause_after_failed_login(void)16 void FAST_FUNC pause_after_failed_login(void)
17 {
18 #if 0 /* over-engineered madness */
19 	time_t end, diff;
20 
21 	end = time(NULL) + LOGIN_FAIL_DELAY;
22 	diff = LOGIN_FAIL_DELAY;
23 	do {
24 		sleep(diff);
25 		diff = end - time(NULL);
26 	} while (diff > 0);
27 #else
28 	sleep(LOGIN_FAIL_DELAY);
29 #endif
30 }
31 
sleep1(void)32 void FAST_FUNC sleep1(void)
33 {
34 	sleep(1);
35 }
36 
msleep(unsigned ms)37 void FAST_FUNC msleep(unsigned ms)
38 {
39 #if 0
40 	/* 1. usleep(n) is not guaranteed by standards to accept n >= 1000000
41 	 * 2. multiplication in usleep(ms * 1000) can overflow if ms > 4294967
42 	 *    (sleep of ~71.5 minutes)
43 	 * Let's play safe and loop:
44 	 */
45 	while (ms > 500) {
46 		usleep(500000);
47 		ms -= 500;
48 	}
49 	usleep(ms * 1000);
50 #else
51 //usleep is often implemented as a call to nanosleep.
52 //Simply do the same to implement msleep.
53 //it's marginally larger, but wakes your CPU less often:
54 //function    old     new   delta
55 //msleep       45      52      +7
56 	struct timespec ts;
57 	ts.tv_sec = ms / 1000;
58 	ts.tv_nsec = (ms % 1000) * 1000000;
59 	/*
60 	 * If a signal has non-default handler, nanosleep returns early.
61 	 * Our version of msleep doesn't return early
62 	 * if interrupted by such signals:
63 	 */
64 	while (nanosleep(&ts, &ts) != 0)
65 		continue;
66 #endif
67 }
68