diff options
| author | Denys Vlasenko <vda.linux@googlemail.com> | 2018-08-03 19:53:49 +0200 |
|---|---|---|
| committer | Denys Vlasenko <vda.linux@googlemail.com> | 2018-08-03 19:53:49 +0200 |
| commit | 3f2e963768cd9ceb52988db2848ecf0b930f3f44 (patch) | |
| tree | 506f302c8ee22d261e69f2c449cc9c5d7f6b7362 | |
| parent | 277e00ed12264f7ae1d17f2cbc8be40d3dc0655d (diff) | |
| download | busybox-w32-3f2e963768cd9ceb52988db2848ecf0b930f3f44.tar.gz busybox-w32-3f2e963768cd9ceb52988db2848ecf0b930f3f44.tar.bz2 busybox-w32-3f2e963768cd9ceb52988db2848ecf0b930f3f44.zip | |
uptime: add -s support
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
| -rw-r--r-- | procps/uptime.c | 30 |
1 files changed, 24 insertions, 6 deletions
diff --git a/procps/uptime.c b/procps/uptime.c index b0ee8391b..3262f41b4 100644 --- a/procps/uptime.c +++ b/procps/uptime.c | |||
| @@ -45,7 +45,6 @@ | |||
| 45 | # include <sys/sysinfo.h> | 45 | # include <sys/sysinfo.h> |
| 46 | #endif | 46 | #endif |
| 47 | 47 | ||
| 48 | |||
| 49 | #ifndef FSHIFT | 48 | #ifndef FSHIFT |
| 50 | # define FSHIFT 16 /* nr of bits of precision */ | 49 | # define FSHIFT 16 /* nr of bits of precision */ |
| 51 | #endif | 50 | #endif |
| @@ -53,29 +52,48 @@ | |||
| 53 | #define LOAD_INT(x) (unsigned)((x) >> FSHIFT) | 52 | #define LOAD_INT(x) (unsigned)((x) >> FSHIFT) |
| 54 | #define LOAD_FRAC(x) LOAD_INT(((x) & (FIXED_1 - 1)) * 100) | 53 | #define LOAD_FRAC(x) LOAD_INT(((x) & (FIXED_1 - 1)) * 100) |
| 55 | 54 | ||
| 56 | |||
| 57 | int uptime_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; | 55 | int uptime_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; |
| 58 | int uptime_main(int argc UNUSED_PARAM, char **argv UNUSED_PARAM) | 56 | int uptime_main(int argc UNUSED_PARAM, char **argv UNUSED_PARAM) |
| 59 | { | 57 | { |
| 60 | unsigned updays, uphours, upminutes; | 58 | unsigned updays, uphours, upminutes; |
| 59 | unsigned opts; | ||
| 61 | struct sysinfo info; | 60 | struct sysinfo info; |
| 62 | struct tm *current_time; | 61 | struct tm *current_time; |
| 63 | time_t current_secs; | 62 | time_t current_secs; |
| 64 | 63 | ||
| 64 | opts = getopt32(argv, "s"); | ||
| 65 | |||
| 65 | time(¤t_secs); | 66 | time(¤t_secs); |
| 67 | sysinfo(&info); | ||
| 68 | |||
| 69 | if (opts) // -s | ||
| 70 | current_secs -= info.uptime; | ||
| 71 | |||
| 66 | current_time = localtime(¤t_secs); | 72 | current_time = localtime(¤t_secs); |
| 67 | 73 | ||
| 68 | sysinfo(&info); | 74 | if (opts) { // -s |
| 75 | printf("%04u-%02u-%02u %02u:%02u:%02u\n", | ||
| 76 | current_time->tm_year + 1900, current_time->tm_mon + 1, current_time->tm_mday, | ||
| 77 | current_time->tm_hour, current_time->tm_min, current_time->tm_sec | ||
| 78 | ); | ||
| 79 | /* The above way of calculating boot time is wobbly, | ||
| 80 | * info.uptime has only 1 second precision, which makes | ||
| 81 | * "uptime -s" wander +- one second. | ||
| 82 | * /proc/uptime may be better, it has 0.01s precision. | ||
| 83 | */ | ||
| 84 | return EXIT_SUCCESS; | ||
| 85 | } | ||
| 69 | 86 | ||
| 70 | printf(" %02u:%02u:%02u up ", | 87 | printf(" %02u:%02u:%02u up ", |
| 71 | current_time->tm_hour, current_time->tm_min, current_time->tm_sec); | 88 | current_time->tm_hour, current_time->tm_min, current_time->tm_sec |
| 89 | ); | ||
| 72 | updays = (unsigned) info.uptime / (unsigned)(60*60*24); | 90 | updays = (unsigned) info.uptime / (unsigned)(60*60*24); |
| 73 | if (updays) | 91 | if (updays != 0) |
| 74 | printf("%u day%s, ", updays, (updays != 1) ? "s" : ""); | 92 | printf("%u day%s, ", updays, (updays != 1) ? "s" : ""); |
| 75 | upminutes = (unsigned) info.uptime / (unsigned)60; | 93 | upminutes = (unsigned) info.uptime / (unsigned)60; |
| 76 | uphours = (upminutes / (unsigned)60) % (unsigned)24; | 94 | uphours = (upminutes / (unsigned)60) % (unsigned)24; |
| 77 | upminutes %= 60; | 95 | upminutes %= 60; |
| 78 | if (uphours) | 96 | if (uphours != 0) |
| 79 | printf("%2u:%02u", uphours, upminutes); | 97 | printf("%2u:%02u", uphours, upminutes); |
| 80 | else | 98 | else |
| 81 | printf("%u min", upminutes); | 99 | printf("%u min", upminutes); |
