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 source tree. 8 */ 9/* Mar 16, 2003 Manuel Novoa III (mjn3@codepoet.org) 10 * 11 * Rewritten to do proper arg and error checking. 12 * Also, added a 'fancy' configuration to accept multiple args with 13 * time suffixes for seconds, minutes, hours, and days. 14 */ 15//config:config SLEEP 16//config: bool "sleep (2 kb)" 17//config: default y 18//config: help 19//config: sleep is used to pause for a specified number of seconds. 20//config: It comes in 3 versions: 21//config: - small: takes one integer parameter 22//config: - fancy: takes multiple integer arguments with suffixes: 23//config: sleep 1d 2h 3m 15s 24//config: - fancy with fractional numbers: 25//config: sleep 2.3s 4.5h sleeps for 16202.3 seconds 26//config: Last one is "the most compatible" with coreutils sleep, 27//config: but it adds around 1k of code. 28//config: 29//config:config FEATURE_FANCY_SLEEP 30//config: bool "Enable multiple arguments and s/m/h/d suffixes" 31//config: default y 32//config: depends on SLEEP 33//config: help 34//config: Allow sleep to pause for specified minutes, hours, and days. 35 36/* Do not make this applet NOFORK. It breaks ^C-ing of pauses in shells */ 37//applet:IF_SLEEP(APPLET(sleep, BB_DIR_BIN, BB_SUID_DROP)) 38 39//kbuild:lib-$(CONFIG_SLEEP) += sleep.o 40 41/* BB_AUDIT SUSv3 compliant */ 42/* BB_AUDIT GNU issues -- fancy version matches except args must be ints. */ 43/* http://www.opengroup.org/onlinepubs/007904975/utilities/sleep.html */ 44 45//usage:#define sleep_trivial_usage 46//usage: IF_FEATURE_FANCY_SLEEP("[") "N" IF_FEATURE_FANCY_SLEEP("]...") 47//usage:#define sleep_full_usage "\n\n" 48//usage: IF_NOT_FEATURE_FANCY_SLEEP("Pause for N seconds") 49//usage: IF_FEATURE_FANCY_SLEEP( 50//usage: "Pause for a time equal to the total of the args given, where each arg can\n" 51//usage: "have an optional suffix of (s)econds, (m)inutes, (h)ours, or (d)ays") 52//usage: 53//usage:#define sleep_example_usage 54//usage: "$ sleep 2\n" 55//usage: "[2 second delay results]\n" 56//usage: IF_FEATURE_FANCY_SLEEP( 57//usage: "$ sleep 1d 3h 22m 8s\n" 58//usage: "[98528 second delay results]\n") 59 60#include "libbb.h" 61 62int sleep_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; 63int sleep_main(int argc UNUSED_PARAM, char **argv) 64{ 65 duration_t duration; 66 67 ++argv; 68 if (!*argv) 69 bb_show_usage(); 70 71 /* GNU sleep accepts "inf", "INF", "infinity" and "INFINITY" */ 72 if (strncasecmp(argv[0], "inf", 3) == 0) 73 for (;;) 74 sleep(INT_MAX); 75 76#if ENABLE_FEATURE_FANCY_SLEEP 77# if ENABLE_FLOAT_DURATION 78 /* undo busybox.c setlocale */ 79 setlocale(LC_NUMERIC, "C"); 80# endif 81 duration = 0; 82 do { 83 duration += parse_duration_str(*argv); 84 } while (*++argv); 85 sleep_for_duration(duration); 86#else /* simple */ 87 duration = xatou(*argv); 88 sleep(duration); 89#endif 90 return EXIT_SUCCESS; 91} 92