Commit | Line | Data |
---|---|---|
be0e2d23 | 1 | #ifndef lint |
ed0072ae | 2 | static 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 | ||
11 | DIR *etc; | |
12 | ||
13 | #define NHOSTS 100 | |
14 | int nhosts; | |
15 | struct hs { | |
16 | struct whod *hs_wd; | |
17 | int hs_nusers; | |
18 | } hs[NHOSTS]; | |
19 | struct whod awhod; | |
20 | int hscmp(); | |
21 | ||
22 | #define WHDRSIZE (sizeof (awhod) - sizeof (awhod.wd_we)) | |
23 | ||
24 | char *interval(); | |
25 | int now; | |
26 | char *malloc(), *sprintf(); | |
27 | int aflg; | |
28 | ||
29 | main(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++; | |
43 | again: | |
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 | ||
117 | char * | |
118 | interval(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 | ||
141 | hscmp(h1, h2) | |
142 | struct hs *h1, *h2; | |
143 | { | |
144 | ||
145 | return (strcmp(h1->hs_wd->wd_hostname, h2->hs_wd->wd_hostname)); | |
146 | } |