| 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 | } |