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)16void 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)32void FAST_FUNC sleep1(void) 33 { 34 sleep(1); 35 } 36 msleep(unsigned ms)37void 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