BSD 3 development
[unix-history] / usr / src / cmd / uptime.c
CommitLineData
c31d941c
BJ
1#include <stdio.h>
2#include <sys/types.h>
3#include <a.out.h>
4#include <time.h>
5
6struct tm *localtime();
7
8#define DIV60(t) ((t+30)/60) /* x/60 rounded */
9
10struct nlist nl[] = {
11#define X_BOOTIME 0
12 { "_bootime" },
13#define X_AVENRUN 1
14 { "_avenrun" },
15 { 0 }
16};
17
18time_t now, bootime;
19double avenrun[3];
20
21int kmem;
22
23main(argc, argv)
24 char **argv;
25{
26 char obuf[BUFSIZ];
27 register int i, days;
28 register time_t uptime;
29 register struct tm *nowt;
30
31 setbuf(stdout, obuf);
32 nlist("/vmunix" , nl);
33 if (nl[0].n_value == 0) {
34 fprintf(stderr, "No namelist\n");
35 exit(1);
36 }
37 kmem = open("/dev/kmem", 0);
38 if (kmem < 0) {
39 fprintf(stderr ,"No kmem\n");
40 exit(1);
41 }
42 time(&now);
43 nowt = localtime(&now);
44 prtat(nowt);
45 lseek(kmem, (long)nl[X_BOOTIME].n_value, 0);
46 read(kmem, &bootime, sizeof (bootime));
47 uptime = now - bootime;
48 printf(" up");
49 days = uptime / (60*60*24);
50 if (days > 0) {
51 printf(" %d day%s, ", days, days>1?"s":"");
52 uptime %= (60*60*24);
53 }
54 prttime(DIV60(uptime), "");
55 printf("\t\t");
56 printf("load average:");
57 lseek(kmem, (long)nl[X_AVENRUN].n_value, 0);
58 read(kmem, avenrun, sizeof(avenrun));
59 for (i = 0; i < 3; i++) {
60 printf(" %.2f", avenrun[i]);
61 if (i < 2)
62 printf(",");
63 }
64 printf("\n");
65}
66
67prttime(tim, tail)
68 time_t tim;
69 char *tail;
70{
71 register int didhrs = 0;
72
73 if (tim >= 60) {
74 printf("%3d:", tim/60);
75 didhrs++;
76 } else {
77 printf(" ");
78 }
79 tim %= 60;
80 if (tim > 0 || didhrs) {
81 printf(didhrs&&tim<10 ? "%02d" : "%2d", tim);
82 } else {
83 printf(" ");
84 }
85 printf("%s", tail);
86}
87
88/* prtat prints a 12 hour time given a pointer to a time of day */
89prtat(p)
90 struct tm *p;
91{
92 register int t, pm;
93
94 t = p -> tm_hour;
95 pm = (t > 11);
96 if (t > 11)
97 t -= 12;
98 if (t == 0)
99 t = 12;
100 prttime(t*60 + p->tm_min, pm ? "pm" : "am");
101}