aboutsummaryrefslogtreecommitdiff
path: root/procps/uptime.c
diff options
context:
space:
mode:
Diffstat (limited to 'procps/uptime.c')
-rw-r--r--procps/uptime.c63
1 files changed, 47 insertions, 16 deletions
diff --git a/procps/uptime.c b/procps/uptime.c
index 1a7da46a3..778812a6f 100644
--- a/procps/uptime.c
+++ b/procps/uptime.c
@@ -7,14 +7,29 @@
7 * Licensed under GPLv2, see file LICENSE in this source tree. 7 * Licensed under GPLv2, see file LICENSE in this source tree.
8 */ 8 */
9 9
10/* This version of uptime doesn't display the number of users on the system, 10/* 2011 Pere Orga <gotrunks@gmail.com>
11 * since busybox init doesn't mess with utmp. For folks using utmp that are 11 *
12 * just dying to have # of users reported, feel free to write it as some type 12 * Added FEATURE_UPTIME_UTMP_SUPPORT flag.
13 * of CONFIG_FEATURE_UTMP_SUPPORT #define
14 */ 13 */
15 14
16/* getopt not needed */ 15/* getopt not needed */
17 16
17//config:config UPTIME
18//config: bool "uptime"
19//config: default y
20//config: select PLATFORM_LINUX #sysinfo()
21//config: help
22//config: uptime gives a one line display of the current time, how long
23//config: the system has been running, how many users are currently logged
24//config: on, and the system load averages for the past 1, 5, and 15 minutes.
25//config:
26//config:config FEATURE_UPTIME_UTMP_SUPPORT
27//config: bool "Support for showing the number of users"
28//config: default y
29//config: depends on UPTIME && FEATURE_UTMP
30//config: help
31//config: Makes uptime display the number of users currently logged on.
32
18//usage:#define uptime_trivial_usage 33//usage:#define uptime_trivial_usage
19//usage: "" 34//usage: ""
20//usage:#define uptime_full_usage "\n\n" 35//usage:#define uptime_full_usage "\n\n"
@@ -25,19 +40,23 @@
25//usage: " 1:55pm up 2:30, load average: 0.09, 0.04, 0.00\n" 40//usage: " 1:55pm up 2:30, load average: 0.09, 0.04, 0.00\n"
26 41
27#include "libbb.h" 42#include "libbb.h"
43#ifdef __linux__
44# include <sys/sysinfo.h>
45#endif
46
28 47
29#ifndef FSHIFT 48#ifndef FSHIFT
30# define FSHIFT 16 /* nr of bits of precision */ 49# define FSHIFT 16 /* nr of bits of precision */
31#endif 50#endif
32#define FIXED_1 (1<<FSHIFT) /* 1.0 as fixed-point */ 51#define FIXED_1 (1 << FSHIFT) /* 1.0 as fixed-point */
33#define LOAD_INT(x) ((x) >> FSHIFT) 52#define LOAD_INT(x) (unsigned)((x) >> FSHIFT)
34#define LOAD_FRAC(x) LOAD_INT(((x) & (FIXED_1-1)) * 100) 53#define LOAD_FRAC(x) LOAD_INT(((x) & (FIXED_1 - 1)) * 100)
35 54
36 55
37int uptime_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; 56int uptime_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
38int uptime_main(int argc UNUSED_PARAM, char **argv UNUSED_PARAM) 57int uptime_main(int argc UNUSED_PARAM, char **argv UNUSED_PARAM)
39{ 58{
40 int updays, uphours, upminutes; 59 unsigned updays, uphours, upminutes;
41 struct sysinfo info; 60 struct sysinfo info;
42 struct tm *current_time; 61 struct tm *current_time;
43 time_t current_secs; 62 time_t current_secs;
@@ -47,20 +66,32 @@ int uptime_main(int argc UNUSED_PARAM, char **argv UNUSED_PARAM)
47 66
48 sysinfo(&info); 67 sysinfo(&info);
49 68
50 printf(" %02d:%02d:%02d up ", 69 printf(" %02u:%02u:%02u up ",
51 current_time->tm_hour, current_time->tm_min, current_time->tm_sec); 70 current_time->tm_hour, current_time->tm_min, current_time->tm_sec);
52 updays = (int) info.uptime / (60*60*24); 71 updays = (unsigned) info.uptime / (unsigned)(60*60*24);
53 if (updays) 72 if (updays)
54 printf("%d day%s, ", updays, (updays != 1) ? "s" : ""); 73 printf("%u day%s, ", updays, (updays != 1) ? "s" : "");
55 upminutes = (int) info.uptime / 60; 74 upminutes = (unsigned) info.uptime / (unsigned)60;
56 uphours = (upminutes / 60) % 24; 75 uphours = (upminutes / (unsigned)60) % (unsigned)24;
57 upminutes %= 60; 76 upminutes %= 60;
58 if (uphours) 77 if (uphours)
59 printf("%2d:%02d, ", uphours, upminutes); 78 printf("%2u:%02u", uphours, upminutes);
60 else 79 else
61 printf("%d min, ", upminutes); 80 printf("%u min", upminutes);
81
82#if ENABLE_FEATURE_UPTIME_UTMP_SUPPORT
83 {
84 struct utmp *ut;
85 unsigned users = 0;
86 while ((ut = getutent()) != NULL) {
87 if ((ut->ut_type == USER_PROCESS) && (ut->ut_name[0] != '\0'))
88 users++;
89 }
90 printf(", %u users", users);
91 }
92#endif
62 93
63 printf("load average: %ld.%02ld, %ld.%02ld, %ld.%02ld\n", 94 printf(", load average: %u.%02u, %u.%02u, %u.%02u\n",
64 LOAD_INT(info.loads[0]), LOAD_FRAC(info.loads[0]), 95 LOAD_INT(info.loads[0]), LOAD_FRAC(info.loads[0]),
65 LOAD_INT(info.loads[1]), LOAD_FRAC(info.loads[1]), 96 LOAD_INT(info.loads[1]), LOAD_FRAC(info.loads[1]),
66 LOAD_INT(info.loads[2]), LOAD_FRAC(info.loads[2])); 97 LOAD_INT(info.loads[2]), LOAD_FRAC(info.loads[2]));