1/* vi: set sw=4 ts=4: */ 2/* 3 * sleep implementation for busybox 4 * 5 * Copyright (C) 2003 Manuel Novoa III <mjn3@codepoet.org> 6 * 7 * Licensed under GPLv2 or later, see file LICENSE in this tarball for details. 8 */ 9 10/* BB_AUDIT SUSv3 compliant */ 11/* BB_AUDIT GNU issues -- fancy version matches except args must be ints. */ 12/* http://www.opengroup.org/onlinepubs/007904975/utilities/sleep.html */ 13 14/* Mar 16, 2003 Manuel Novoa III (mjn3@codepoet.org) 15 * 16 * Rewritten to do proper arg and error checking. 17 * Also, added a 'fancy' configuration to accept multiple args with 18 * time suffixes for seconds, minutes, hours, and days. 19 */ 20 21#include "libbb.h" 22 23/* Do not make this applet NOFORK. It breaks ^C-ing of pauses in shells */ 24 25 26#if ENABLE_FEATURE_FANCY_SLEEP || ENABLE_FEATURE_FLOAT_SLEEP 27static const struct suffix_mult sfx[] = { 28 { "s", 1 }, 29 { "m", 60 }, 30 { "h", 60*60 }, 31 { "d", 24*60*60 }, 32 { "", 0 } 33}; 34#endif 35 36int sleep_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; 37int sleep_main(int argc UNUSED_PARAM, char **argv) 38{ 39#if ENABLE_FEATURE_FLOAT_SLEEP 40 double duration; 41 struct timespec ts; 42#else 43 unsigned duration; 44#endif 45 46 ++argv; 47 if (!*argv) 48 bb_show_usage(); 49 50#if ENABLE_FEATURE_FLOAT_SLEEP 51 52# if ENABLE_LOCALE_SUPPORT 53 /* undo busybox.c setlocale */ 54 setlocale(LC_NUMERIC, "C"); 55# endif 56 duration = 0; 57 do { 58 char *arg = *argv; 59 if (strchr(arg, '.')) { 60 double d; 61 char *pp; 62 int len = strspn(arg, "0123456789."); 63 char sv = arg[len]; 64 arg[len] = '\0'; 65 errno = 0; 66 d = strtod(arg, &pp); 67 if (errno || *pp) 68 bb_show_usage(); 69 arg += len; 70 *arg-- = sv; 71 sv = *arg; 72 *arg = '1'; 73 duration += d * xatoul_sfx(arg, sfx); 74 *arg = sv; 75 } else { 76 duration += xatoul_sfx(arg, sfx); 77 } 78 } while (*++argv); 79 80 ts.tv_sec = MAXINT(typeof(ts.tv_sec)); 81 ts.tv_nsec = 0; 82 if (duration >= 0 && duration < ts.tv_sec) { 83 ts.tv_sec = duration; 84 ts.tv_nsec = (duration - ts.tv_sec) * 1000000000; 85 } 86 do { 87 errno = 0; 88 nanosleep(&ts, &ts); 89 } while (errno == EINTR); 90 91#elif ENABLE_FEATURE_FANCY_SLEEP 92 93 duration = 0; 94 do { 95 duration += xatou_range_sfx(*argv, 0, UINT_MAX - duration, sfx); 96 } while (*++argv); 97 sleep(duration); 98 99#else /* simple */ 100 101 duration = xatou(*argv); 102 sleep(duration); 103 // Off. If it's really needed, provide example why 104 //if (sleep(duration)) { 105 // bb_perror_nomsg_and_die(); 106 //} 107 108#endif 109 110 return EXIT_SUCCESS; 111} 112