update to new fs
[unix-history] / usr / src / usr.bin / ruptime / ruptime.c
CommitLineData
be0e2d23 1#ifndef lint
ed0072ae 2static char sccsid[] = "@(#)ruptime.c 4.4 82/05/09";
be0e2d23
BJ
3#endif
4
ed0072ae 5#include <sys/param.h>
be0e2d23 6#include <stdio.h>
ed0072ae 7#include <dir.h>
be0e2d23
BJ
8#include <utmp.h>
9#include "rwhod.h"
10
11DIR *etc;
12
13#define NHOSTS 100
14int nhosts;
15struct hs {
16 struct whod *hs_wd;
17 int hs_nusers;
18} hs[NHOSTS];
19struct whod awhod;
20int hscmp();
21
22#define WHDRSIZE (sizeof (awhod) - sizeof (awhod.wd_we))
23
24char *interval();
25int now;
26char *malloc(), *sprintf();
27int aflg;
28
29main(argc, argv)
30 int argc;
31 char **argv;
32{
33 struct direct *dp;
34 int f, i, t;
35 char buf[BUFSIZ]; int cc;
36 register struct hs *hsp = hs;
37 register struct whod *wd;
38 register struct whoent *we;
acf8f1b2 39 int maxloadav = 0;
be0e2d23
BJ
40
41 time(&t);
42 argc--, argv++;
43again:
44 if (!strcmp(*argv, "-a")) {
45 aflg++;
46 argc--, argv++;
47 goto again;
48 }
49 if (chdir("/etc") < 0) {
50 perror("/etc");
51 exit(1);
52 }
53 etc = opendir(".");
54 if (etc == NULL) {
55 perror("/etc");
56 exit(1);
57 }
58 while (dp = readdir(etc)) {
59 if (dp->d_ino == 0)
60 continue;
61 if (strncmp(dp->d_name, "whod.", 5))
62 continue;
63 if (nhosts == NHOSTS) {
64 fprintf(stderr, "too many hosts\n");
65 exit(1);
66 }
67 f = open(dp->d_name, 0);
68 if (f > 0) {
69 cc = read(f, buf, BUFSIZ);
70 if (cc >= WHDRSIZE) {
71 hsp->hs_wd = (struct whod *)malloc(WHDRSIZE);
72 wd = (struct whod *)buf;
73 bcopy(buf, hsp->hs_wd, WHDRSIZE);
74 hsp->hs_nusers = 0;
acf8f1b2
BJ
75 for (i = 0; i < 2; i++)
76 if (wd->wd_loadav[i] > maxloadav)
77 maxloadav = wd->wd_loadav[i];
be0e2d23
BJ
78 we = (struct whoent *)(buf+cc);
79 while (--we >= wd->wd_we)
80 if (aflg || we->we_idle < 3600)
81 hsp->hs_nusers++;
82 nhosts++; hsp++;
83 }
84 }
85 (void) close(f);
86 }
87 qsort((char *)hs, nhosts, sizeof (hs[0]), hscmp);
88 (void) time(&now);
89 if (nhosts == 0) {
90 printf("no hosts!?!\n");
91 exit(1);
92 }
93 for (i = 0; i < nhosts; i++) {
94 hsp = &hs[i];
95 if (now - hsp->hs_wd->wd_recvtime > 5 * 60) {
96 printf("%-8.8s%s\n", hsp->hs_wd->wd_hostname,
97 interval(now - hsp->hs_wd->wd_recvtime, "down"));
98 continue;
99 }
acf8f1b2 100 printf("%-8.8s%s, %4d user%s load %*.2f, %*.2f, %*.2f\n",
be0e2d23
BJ
101 hsp->hs_wd->wd_hostname,
102 interval(hsp->hs_wd->wd_sendtime -
103 hsp->hs_wd->wd_bootime, " up"),
104 hsp->hs_nusers,
105 hsp->hs_nusers == 1 ? ", " : "s,",
acf8f1b2
BJ
106 maxloadav >= 1000 ? 5 : 4,
107 hsp->hs_wd->wd_loadav[0] / 100.0,
108 maxloadav >= 1000 ? 5 : 4,
109 hsp->hs_wd->wd_loadav[1] / 100.0,
110 maxloadav >= 1000 ? 5 : 4,
111 hsp->hs_wd->wd_loadav[2] / 100.0);
be0e2d23
BJ
112 cfree(hsp->hs_wd);
113 }
114 exit(0);
115}
116
117char *
118interval(time, updown)
119 int time;
120 char *updown;
121{
122 static char resbuf[32];
123 int days, hours, minutes;
124
125 if (time < 0 || time > 3*30*24*60*60) {
126 (void) sprintf(resbuf, " %s ??:??", updown);
127 return (resbuf);
128 }
129 minutes = (time + 59) / 60; /* round to minutes */
130 hours = minutes / 60; minutes %= 60;
131 days = hours / 24; hours %= 24;
132 if (days)
133 (void) sprintf(resbuf, "%s %2d+%02d:%02d",
134 updown, days, hours, minutes);
135 else
136 (void) sprintf(resbuf, " %s %2d:%02d",
137 updown, hours, minutes);
138 return (resbuf);
139}
140
141hscmp(h1, h2)
142 struct hs *h1, *h2;
143{
144
145 return (strcmp(h1->hs_wd->wd_hostname, h2->hs_wd->wd_hostname));
146}