Contents of /tags/mkinitrd-6_5_0/busybox/coreutils/sleep.c
Parent Directory | Revision Log
Revision 1345 -
(show annotations)
(download)
Fri Jun 3 21:22:00 2011 UTC (13 years, 3 months ago) by niro
File MIME type: text/plain
File size: 2273 byte(s)
Fri Jun 3 21:22:00 2011 UTC (13 years, 3 months ago) by niro
File MIME type: text/plain
File size: 2273 byte(s)
tagged 'mkinitrd-6_5_0'
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 | { "", 0 } |
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 | char *pp; |
58 | int len = strspn(arg, "0123456789."); |
59 | char sv = arg[len]; |
60 | arg[len] = '\0'; |
61 | errno = 0; |
62 | d = strtod(arg, &pp); |
63 | if (errno || *pp) |
64 | bb_show_usage(); |
65 | arg[len] = sv; |
66 | len--; |
67 | sv = arg[len]; |
68 | arg[len] = '1'; |
69 | duration += d * xatoul_sfx(&arg[len], sfx); |
70 | arg[len] = sv; |
71 | } else |
72 | duration += xatoul_sfx(arg, sfx); |
73 | } while (*++argv); |
74 | |
75 | ts.tv_sec = MAXINT(typeof(ts.tv_sec)); |
76 | ts.tv_nsec = 0; |
77 | if (duration >= 0 && duration < ts.tv_sec) { |
78 | ts.tv_sec = duration; |
79 | ts.tv_nsec = (duration - ts.tv_sec) * 1000000000; |
80 | } |
81 | do { |
82 | errno = 0; |
83 | nanosleep(&ts, &ts); |
84 | } while (errno == EINTR); |
85 | |
86 | #elif ENABLE_FEATURE_FANCY_SLEEP |
87 | |
88 | duration = 0; |
89 | do { |
90 | duration += xatou_range_sfx(*argv, 0, UINT_MAX - duration, sfx); |
91 | } while (*++argv); |
92 | sleep(duration); |
93 | |
94 | #else /* simple */ |
95 | |
96 | duration = xatou(*argv); |
97 | sleep(duration); |
98 | // Off. If it's really needed, provide example why |
99 | //if (sleep(duration)) { |
100 | // bb_perror_nomsg_and_die(); |
101 | //} |
102 | |
103 | #endif |
104 | |
105 | return EXIT_SUCCESS; |
106 | } |