1*cf5a6c84SAndroid Build Coastguard Worker /* uptime.c - Tell how long the system has been running.
2*cf5a6c84SAndroid Build Coastguard Worker *
3*cf5a6c84SAndroid Build Coastguard Worker * Copyright 2012 Elie De Brauwer <[email protected]>
4*cf5a6c84SAndroid Build Coastguard Worker * Copyright 2012 Luis Felipe Strano Moraes <[email protected]>
5*cf5a6c84SAndroid Build Coastguard Worker * Copyright 2013 Jeroen van Rijn <[email protected]>
6*cf5a6c84SAndroid Build Coastguard Worker
7*cf5a6c84SAndroid Build Coastguard Worker USE_UPTIME(NEWTOY(uptime, ">0ps", TOYFLAG_USR|TOYFLAG_BIN))
8*cf5a6c84SAndroid Build Coastguard Worker
9*cf5a6c84SAndroid Build Coastguard Worker config UPTIME
10*cf5a6c84SAndroid Build Coastguard Worker bool "uptime"
11*cf5a6c84SAndroid Build Coastguard Worker default y
12*cf5a6c84SAndroid Build Coastguard Worker help
13*cf5a6c84SAndroid Build Coastguard Worker usage: uptime [-ps]
14*cf5a6c84SAndroid Build Coastguard Worker
15*cf5a6c84SAndroid Build Coastguard Worker Tell the current time, how long the system has been running, the number
16*cf5a6c84SAndroid Build Coastguard Worker of users, and the system load averages for the past 1, 5 and 15 minutes.
17*cf5a6c84SAndroid Build Coastguard Worker
18*cf5a6c84SAndroid Build Coastguard Worker -p Pretty (human readable) uptime
19*cf5a6c84SAndroid Build Coastguard Worker -s Since when has the system been up?
20*cf5a6c84SAndroid Build Coastguard Worker */
21*cf5a6c84SAndroid Build Coastguard Worker
22*cf5a6c84SAndroid Build Coastguard Worker #define FOR_uptime
23*cf5a6c84SAndroid Build Coastguard Worker #include "toys.h"
24*cf5a6c84SAndroid Build Coastguard Worker
uptime_main(void)25*cf5a6c84SAndroid Build Coastguard Worker void uptime_main(void)
26*cf5a6c84SAndroid Build Coastguard Worker {
27*cf5a6c84SAndroid Build Coastguard Worker struct sysinfo info;
28*cf5a6c84SAndroid Build Coastguard Worker time_t t;
29*cf5a6c84SAndroid Build Coastguard Worker struct tm *tm;
30*cf5a6c84SAndroid Build Coastguard Worker unsigned int weeks, days, hours, minutes;
31*cf5a6c84SAndroid Build Coastguard Worker struct utmpx *entry;
32*cf5a6c84SAndroid Build Coastguard Worker int users = 0;
33*cf5a6c84SAndroid Build Coastguard Worker
34*cf5a6c84SAndroid Build Coastguard Worker // Obtain the data we need.
35*cf5a6c84SAndroid Build Coastguard Worker sysinfo(&info);
36*cf5a6c84SAndroid Build Coastguard Worker time(&t);
37*cf5a6c84SAndroid Build Coastguard Worker
38*cf5a6c84SAndroid Build Coastguard Worker // Just show the time of boot?
39*cf5a6c84SAndroid Build Coastguard Worker if (FLAG(s)) {
40*cf5a6c84SAndroid Build Coastguard Worker t -= info.uptime;
41*cf5a6c84SAndroid Build Coastguard Worker tm = localtime(&t);
42*cf5a6c84SAndroid Build Coastguard Worker strftime(toybuf, sizeof(toybuf), "%F %T", tm);
43*cf5a6c84SAndroid Build Coastguard Worker xputs(toybuf);
44*cf5a6c84SAndroid Build Coastguard Worker return;
45*cf5a6c84SAndroid Build Coastguard Worker }
46*cf5a6c84SAndroid Build Coastguard Worker
47*cf5a6c84SAndroid Build Coastguard Worker // Current time
48*cf5a6c84SAndroid Build Coastguard Worker tm = localtime(&t);
49*cf5a6c84SAndroid Build Coastguard Worker // Uptime
50*cf5a6c84SAndroid Build Coastguard Worker info.uptime /= 60;
51*cf5a6c84SAndroid Build Coastguard Worker minutes = info.uptime%60;
52*cf5a6c84SAndroid Build Coastguard Worker info.uptime /= 60;
53*cf5a6c84SAndroid Build Coastguard Worker hours = info.uptime%24;
54*cf5a6c84SAndroid Build Coastguard Worker days = info.uptime/24;
55*cf5a6c84SAndroid Build Coastguard Worker
56*cf5a6c84SAndroid Build Coastguard Worker if (FLAG(p)) {
57*cf5a6c84SAndroid Build Coastguard Worker weeks = days/7;
58*cf5a6c84SAndroid Build Coastguard Worker days %= 7;
59*cf5a6c84SAndroid Build Coastguard Worker xprintf("up %d week%s, %d day%s, %d hour%s, %d minute%s, ",
60*cf5a6c84SAndroid Build Coastguard Worker weeks, (weeks!=1)?"s":"",
61*cf5a6c84SAndroid Build Coastguard Worker days, (days!=1)?"s":"",
62*cf5a6c84SAndroid Build Coastguard Worker hours, (hours!=1)?"s":"",
63*cf5a6c84SAndroid Build Coastguard Worker minutes, (minutes!=1)?"s":"");
64*cf5a6c84SAndroid Build Coastguard Worker } else {
65*cf5a6c84SAndroid Build Coastguard Worker xprintf(" %02d:%02d:%02d up ", tm->tm_hour, tm->tm_min, tm->tm_sec);
66*cf5a6c84SAndroid Build Coastguard Worker if (days) xprintf("%d day%s, ", days, (days!=1)?"s":"");
67*cf5a6c84SAndroid Build Coastguard Worker if (hours) xprintf("%2d:%02d, ", hours, minutes);
68*cf5a6c84SAndroid Build Coastguard Worker else printf("%d min, ", minutes);
69*cf5a6c84SAndroid Build Coastguard Worker
70*cf5a6c84SAndroid Build Coastguard Worker // Obtain info about logged on users
71*cf5a6c84SAndroid Build Coastguard Worker setutxent();
72*cf5a6c84SAndroid Build Coastguard Worker while ((entry = getutxent())) if (entry->ut_type == USER_PROCESS) users++;
73*cf5a6c84SAndroid Build Coastguard Worker endutxent();
74*cf5a6c84SAndroid Build Coastguard Worker printf(" %d user%s, ", users, (users!=1) ? "s" : "");
75*cf5a6c84SAndroid Build Coastguard Worker }
76*cf5a6c84SAndroid Build Coastguard Worker
77*cf5a6c84SAndroid Build Coastguard Worker printf(" load average: %.02f, %.02f, %.02f\n", info.loads[0]/65536.0,
78*cf5a6c84SAndroid Build Coastguard Worker info.loads[1]/65536.0, info.loads[2]/65536.0);
79*cf5a6c84SAndroid Build Coastguard Worker }
80