xref: /original-bsd/usr.bin/ruptime/ruptime.c (revision fbed46ce)
1 #ifndef lint
2 static char sccsid[] = "@(#)ruptime.c	4.3 82/04/03";
3 #endif
4 
5 #include <sys/types.h>		/* botch in ndir.h */
6 #include <stdio.h>
7 #include <ndir.h>
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;
39 	int maxloadav = 0;
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;
75 				for (i = 0; i < 2; i++)
76 					if (wd->wd_loadav[i] > maxloadav)
77 						maxloadav = wd->wd_loadav[i];
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 		}
100 		printf("%-8.8s%s,  %4d user%s  load %*.2f, %*.2f, %*.2f\n",
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,",
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);
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 }
147