xref: /aosp_15_r20/external/toybox/toys/other/uptime.c (revision cf5a6c84e2b8763fc1a7db14496fd4742913b199)
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