xref: /original-bsd/usr.bin/rwho/rwho.c (revision 23a40993)
1 #ifndef lint
2 static char sccsid[] = "@(#)rwho.c	4.6 83/05/25";
3 #endif
4 
5 #include <sys/param.h>
6 #include <stdio.h>
7 #include <dir.h>
8 #include <rwhod.h>
9 
10 DIR	*etc;
11 
12 struct	whod wd;
13 int	utmpcmp();
14 #define	NUSERS	1000
15 struct	myutmp {
16 	char	myhost[32];
17 	int	myidle;
18 	struct	outmp myutmp;
19 } myutmp[NUSERS];
20 int	nusers;
21 
22 #define	WHDRSIZE	(sizeof (wd) - sizeof (wd.wd_we))
23 #define	RWHODIR		"/usr/spool/rwho"
24 
25 char	*ctime(), *strcpy();
26 int	now;
27 int	aflg;
28 
29 main(argc, argv)
30 	int argc;
31 	char **argv;
32 {
33 	struct direct *dp;
34 	int cc, width;
35 	register struct whod *w = &wd;
36 	register struct whoent *we;
37 	register struct myutmp *mp;
38 	int f, n, i;
39 
40 	argc--, argv++;
41 again:
42 	if (argc > 0 && !strcmp(argv[0], "-a")) {
43 		argc--, argv++;
44 		aflg++;
45 		goto again;
46 	}
47 	(void) time(&now);
48 	if (chdir(RWHODIR) < 0) {
49 		perror(RWHODIR);
50 		exit(1);
51 	}
52 	etc = opendir(".");
53 	if (etc == NULL) {
54 		perror("/etc");
55 		exit(1);
56 	}
57 	mp = myutmp;
58 	while (dp = readdir(etc)) {
59 		if (dp->d_ino == 0)
60 			continue;
61 		if (strncmp(dp->d_name, "whod.", 5))
62 			continue;
63 		f = open(dp->d_name, 0);
64 		if (f < 0)
65 			continue;
66 		cc = read(f, (char *)&wd, sizeof (struct whod));
67 		if (cc < WHDRSIZE) {
68 			(void) close(f);
69 			continue;
70 		}
71 		if (now - w->wd_recvtime > 5 * 60) {
72 			(void) close(f);
73 			continue;
74 		}
75 		cc -= WHDRSIZE;
76 		we = w->wd_we;
77 		for (n = cc / sizeof (struct whoent); n > 0; n--) {
78 			if (aflg == 0 && we->we_idle >= 60*60) {
79 				we++;
80 				continue;
81 			}
82 			if (nusers >= NUSERS) {
83 				printf("too many users\n");
84 				exit(1);
85 			}
86 			mp->myutmp = we->we_utmp; mp->myidle = we->we_idle;
87 			(void) strcpy(mp->myhost, w->wd_hostname);
88 			nusers++; we++; mp++;
89 		}
90 		(void) close(f);
91 	}
92 	qsort((char *)myutmp, nusers, sizeof (struct myutmp), utmpcmp);
93 	mp = myutmp;
94 	width = 0;
95 	for (i = 0; i < nusers; i++) {
96 		int j = strlen(mp->myhost) + 1 + strlen(mp->myutmp.out_line);
97 		if (j > width)
98 			width = j;
99 		mp++;
100 	}
101 	mp = myutmp;
102 	for (i = 0; i < nusers; i++) {
103 		char buf[22];
104 		sprintf(buf, "%s:%s", mp->myhost, mp->myutmp.out_line);
105 		printf("%-8.8s %-*s %.12s",
106 		   mp->myutmp.out_name,
107 		   width,
108 		   buf,
109 		   ctime((time_t *)&mp->myutmp.out_time)+4);
110 		mp->myidle /= 60;
111 		if (mp->myidle) {
112 			if (aflg) {
113 				if (mp->myidle >= 100*60)
114 					mp->myidle = 100*60 - 1;
115 				if (mp->myidle >= 60)
116 					printf(" %2d", mp->myidle / 60);
117 				else
118 					printf("   ");
119 			} else
120 				printf(" ");
121 			printf(":%02d", mp->myidle % 60);
122 		}
123 		printf("\n");
124 		mp++;
125 	}
126 	exit(0);
127 }
128 
129 utmpcmp(u1, u2)
130 	struct myutmp *u1, *u2;
131 {
132 	int rc;
133 
134 	rc = strncmp(u1->myutmp.out_name, u2->myutmp.out_name, 8);
135 	if (rc)
136 		return (rc);
137 	rc = strncmp(u1->myhost, u2->myhost, 8);
138 	if (rc)
139 		return (rc);
140 	return (strncmp(u1->myutmp.out_line, u2->myutmp.out_line, 8));
141 }
142