Contents of /tags/mkinitrd-6_1_3/busybox/coreutils/sleep.c
Parent Directory | Revision Log
Revision 846 -
(show annotations)
(download)
Mon May 4 18:51:23 2009 UTC (15 years, 4 months ago) by niro
File MIME type: text/plain
File size: 2237 byte(s)
Mon May 4 18:51:23 2009 UTC (15 years, 4 months ago) by niro
File MIME type: text/plain
File size: 2237 byte(s)
tagged 'mkinitrd-6_1_3'
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 | /* This is a NOFORK applet. Be very careful! */ |
24 | |
25 | |
26 | #if ENABLE_FEATURE_FANCY_SLEEP || ENABLE_FEATURE_FLOAT_SLEEP |
27 | static const struct suffix_mult sfx[] = { |
28 | { "s", 1 }, |
29 | { "m", 60 }, |
30 | { "h", 60*60 }, |
31 | { "d", 24*60*60 }, |
32 | { } |
33 | }; |
34 | #endif |
35 | |
36 | int sleep_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; |
37 | int 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 | duration = 0; |
53 | do { |
54 | char *arg = *argv; |
55 | if (strchr(arg, '.')) { |
56 | double d; |
57 | int len = strspn(arg, "0123456789."); |
58 | char sv = arg[len]; |
59 | arg[len] = '\0'; |
60 | d = bb_strtod(arg, NULL); |
61 | if (errno) |
62 | bb_show_usage(); |
63 | arg[len] = sv; |
64 | len--; |
65 | sv = arg[len]; |
66 | arg[len] = '1'; |
67 | duration += d * xatoul_sfx(&arg[len], sfx); |
68 | arg[len] = sv; |
69 | } else |
70 | duration += xatoul_sfx(arg, sfx); |
71 | } while (*++argv); |
72 | |
73 | ts.tv_sec = MAXINT(typeof(ts.tv_sec)); |
74 | ts.tv_nsec = 0; |
75 | if (duration >= 0 && duration < ts.tv_sec) { |
76 | ts.tv_sec = duration; |
77 | ts.tv_nsec = (duration - ts.tv_sec) * 1000000000; |
78 | } |
79 | do { |
80 | errno = 0; |
81 | nanosleep(&ts, &ts); |
82 | } while (errno == EINTR); |
83 | |
84 | #elif ENABLE_FEATURE_FANCY_SLEEP |
85 | |
86 | duration = 0; |
87 | do { |
88 | duration += xatou_range_sfx(*argv, 0, UINT_MAX - duration, sfx); |
89 | } while (*++argv); |
90 | sleep(duration); |
91 | |
92 | #else /* simple */ |
93 | |
94 | duration = xatou(*argv); |
95 | sleep(duration); |
96 | // Off. If it's really needed, provide example why |
97 | //if (sleep(duration)) { |
98 | // bb_perror_nomsg_and_die(); |
99 | //} |
100 | |
101 | #endif |
102 | |
103 | return EXIT_SUCCESS; |
104 | } |