|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 1983 The Regents of the University of California. ! 3: * All rights reserved. ! 4: * ! 5: * Redistribution and use in source and binary forms are permitted ! 6: * provided that: (1) source distributions retain this entire copyright ! 7: * notice and comment, and (2) distributions including binaries display ! 8: * the following acknowledgement: ``This product includes software ! 9: * developed by the University of California, Berkeley and its contributors'' ! 10: * in the documentation or other materials provided with the distribution ! 11: * and in all advertising materials mentioning features or use of this ! 12: * software. Neither the name of the University nor the names of its ! 13: * contributors may be used to endorse or promote products derived ! 14: * from this software without specific prior written permission. ! 15: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR ! 16: * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED ! 17: * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. ! 18: */ ! 19: ! 20: #ifndef lint ! 21: char copyright[] = ! 22: "@(#) Copyright (c) 1983 The Regents of the University of California.\n\ ! 23: All rights reserved.\n"; ! 24: #endif /* not lint */ ! 25: ! 26: #ifndef lint ! 27: static char sccsid[] = "@(#)rwho.c 5.5 (Berkeley) 6/1/90"; ! 28: #endif /* not lint */ ! 29: ! 30: #include <sys/param.h> ! 31: #include <sys/dir.h> ! 32: #include <sys/file.h> ! 33: #include <protocols/rwhod.h> ! 34: #include <stdio.h> ! 35: ! 36: DIR *dirp; ! 37: ! 38: struct whod wd; ! 39: int utmpcmp(); ! 40: #define NUSERS 1000 ! 41: struct myutmp { ! 42: char myhost[MAXHOSTNAMELEN]; ! 43: int myidle; ! 44: struct outmp myutmp; ! 45: } myutmp[NUSERS]; ! 46: int nusers; ! 47: ! 48: #define WHDRSIZE (sizeof (wd) - sizeof (wd.wd_we)) ! 49: /* ! 50: * this macro should be shared with ruptime. ! 51: */ ! 52: #define down(w,now) ((now) - (w)->wd_recvtime > 11 * 60) ! 53: ! 54: char *ctime(), *strcpy(); ! 55: time_t now; ! 56: int aflg; ! 57: ! 58: main(argc, argv) ! 59: int argc; ! 60: char **argv; ! 61: { ! 62: extern char *optarg; ! 63: extern int optind; ! 64: int ch; ! 65: struct direct *dp; ! 66: int cc, width; ! 67: register struct whod *w = &wd; ! 68: register struct whoent *we; ! 69: register struct myutmp *mp; ! 70: int f, n, i; ! 71: time_t time(); ! 72: ! 73: while ((ch = getopt(argc, argv, "a")) != EOF) ! 74: switch((char)ch) { ! 75: case 'a': ! 76: aflg = 1; ! 77: break; ! 78: case '?': ! 79: default: ! 80: fprintf(stderr, "usage: rwho [-a]\n"); ! 81: exit(1); ! 82: } ! 83: if (chdir(_PATH_RWHODIR) || (dirp = opendir(".")) == NULL) { ! 84: perror(_PATH_RWHODIR); ! 85: exit(1); ! 86: } ! 87: mp = myutmp; ! 88: (void)time(&now); ! 89: while (dp = readdir(dirp)) { ! 90: if (dp->d_ino == 0 || strncmp(dp->d_name, "whod.", 5)) ! 91: continue; ! 92: f = open(dp->d_name, O_RDONLY); ! 93: if (f < 0) ! 94: continue; ! 95: cc = read(f, (char *)&wd, sizeof (struct whod)); ! 96: if (cc < WHDRSIZE) { ! 97: (void) close(f); ! 98: continue; ! 99: } ! 100: if (down(w,now)) { ! 101: (void) close(f); ! 102: continue; ! 103: } ! 104: cc -= WHDRSIZE; ! 105: we = w->wd_we; ! 106: for (n = cc / sizeof (struct whoent); n > 0; n--) { ! 107: if (aflg == 0 && we->we_idle >= 60*60) { ! 108: we++; ! 109: continue; ! 110: } ! 111: if (nusers >= NUSERS) { ! 112: printf("too many users\n"); ! 113: exit(1); ! 114: } ! 115: mp->myutmp = we->we_utmp; mp->myidle = we->we_idle; ! 116: (void) strcpy(mp->myhost, w->wd_hostname); ! 117: nusers++; we++; mp++; ! 118: } ! 119: (void) close(f); ! 120: } ! 121: qsort((char *)myutmp, nusers, sizeof (struct myutmp), utmpcmp); ! 122: mp = myutmp; ! 123: width = 0; ! 124: for (i = 0; i < nusers; i++) { ! 125: int j = strlen(mp->myhost) + 1 + strlen(mp->myutmp.out_line); ! 126: if (j > width) ! 127: width = j; ! 128: mp++; ! 129: } ! 130: mp = myutmp; ! 131: for (i = 0; i < nusers; i++) { ! 132: char buf[BUFSIZ]; ! 133: (void)sprintf(buf, "%s:%s", mp->myhost, mp->myutmp.out_line); ! 134: printf("%-8.8s %-*s %.12s", ! 135: mp->myutmp.out_name, ! 136: width, ! 137: buf, ! 138: ctime((time_t *)&mp->myutmp.out_time)+4); ! 139: mp->myidle /= 60; ! 140: if (mp->myidle) { ! 141: if (aflg) { ! 142: if (mp->myidle >= 100*60) ! 143: mp->myidle = 100*60 - 1; ! 144: if (mp->myidle >= 60) ! 145: printf(" %2d", mp->myidle / 60); ! 146: else ! 147: printf(" "); ! 148: } else ! 149: printf(" "); ! 150: printf(":%02d", mp->myidle % 60); ! 151: } ! 152: printf("\n"); ! 153: mp++; ! 154: } ! 155: exit(0); ! 156: } ! 157: ! 158: utmpcmp(u1, u2) ! 159: struct myutmp *u1, *u2; ! 160: { ! 161: int rc; ! 162: ! 163: rc = strncmp(u1->myutmp.out_name, u2->myutmp.out_name, 8); ! 164: if (rc) ! 165: return (rc); ! 166: rc = strncmp(u1->myhost, u2->myhost, 8); ! 167: if (rc) ! 168: return (rc); ! 169: return (strncmp(u1->myutmp.out_line, u2->myutmp.out_line, 8)); ! 170: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.