|
|
1.1 root 1: #ifndef lint
2: static char sccsid[] = "@(#)rwho.c 4.7 (Berkeley) 83/07/01";
3: #endif
4:
5: #include <sys/param.h>
6: #include <stdio.h>
7: #include <sys/dir.h>
8: #include "../etc/rwhod/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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.