|
|
1.1 ! root 1: /* ! 2: * acct [ -w wtmp ] [ -d ] [ -p ] [ people ] ! 3: */ ! 4: static char *sccsid = "@(#)ac.c 4.1 (Berkeley) 10/1/80"; ! 5: ! 6: #include <stdio.h> ! 7: #include <ctype.h> ! 8: #include <time.h> ! 9: #include <utmp.h> ! 10: #include <sys/types.h> ! 11: #include <sys/timeb.h> ! 12: ! 13: #define NMAX sizeof(ibuf.ut_name) ! 14: #define LMAX sizeof(ibuf.ut_line) ! 15: ! 16: #define TSIZE 1000 ! 17: #define USIZE 500 ! 18: struct utmp ibuf; ! 19: ! 20: struct ubuf { ! 21: char uname[NMAX]; ! 22: long utime; ! 23: } ubuf[USIZE]; ! 24: ! 25: struct tbuf { ! 26: struct ubuf *userp; ! 27: long ttime; ! 28: } tbuf[TSIZE]; ! 29: ! 30: char *wtmp; ! 31: int pflag, byday; ! 32: long dtime; ! 33: long midnight; ! 34: long lastime; ! 35: long day = 86400L; ! 36: int pcount; ! 37: char **pptr; ! 38: ! 39: main(argc, argv) ! 40: char **argv; ! 41: { ! 42: int c, fl; ! 43: register i; ! 44: FILE *wf; ! 45: ! 46: wtmp = "/usr/adm/wtmp"; ! 47: while (--argc > 0 && **++argv == '-') ! 48: switch(*++*argv) { ! 49: case 'd': ! 50: byday++; ! 51: continue; ! 52: ! 53: case 'w': ! 54: if (--argc>0) ! 55: wtmp = *++argv; ! 56: continue; ! 57: ! 58: case 'p': ! 59: pflag++; ! 60: continue; ! 61: } ! 62: pcount = argc; ! 63: pptr = argv; ! 64: if ((wf = fopen(wtmp, "r")) == NULL) { ! 65: printf("No %s\n", wtmp); ! 66: exit(1); ! 67: } ! 68: for(;;) { ! 69: if (fread((char *)&ibuf, sizeof(ibuf), 1, wf) != 1) ! 70: break; ! 71: fl = 0; ! 72: for (i=0; i<NMAX; i++) { ! 73: c = ibuf.ut_name[i]; ! 74: if(isdigit(c) || isalpha(c)) { ! 75: if (fl) ! 76: goto skip; ! 77: continue; ! 78: } ! 79: if (c==' ' || c=='\0') { ! 80: fl++; ! 81: ibuf.ut_name[i] = '\0'; ! 82: } else ! 83: goto skip; ! 84: } ! 85: loop(); ! 86: skip:; ! 87: } ! 88: ibuf.ut_name[0] = '\0'; ! 89: ibuf.ut_line[0] = '~'; ! 90: time(&ibuf.ut_time); ! 91: loop(); ! 92: print(); ! 93: exit(0); ! 94: } ! 95: ! 96: loop() ! 97: { ! 98: register i; ! 99: register struct tbuf *tp; ! 100: register struct ubuf *up; ! 101: ! 102: if(ibuf.ut_line[0] == '|') { ! 103: dtime = ibuf.ut_time; ! 104: return; ! 105: } ! 106: if(ibuf.ut_line[0] == '}') { ! 107: if(dtime == 0) ! 108: return; ! 109: for(tp = tbuf; tp < &tbuf[TSIZE]; tp++) ! 110: tp->ttime += ibuf.ut_time-dtime; ! 111: dtime = 0; ! 112: return; ! 113: } ! 114: if (lastime>ibuf.ut_time || lastime+(1.5*day)<ibuf.ut_time) ! 115: midnight = 0; ! 116: if (midnight==0) ! 117: newday(); ! 118: lastime = ibuf.ut_time; ! 119: if (byday && ibuf.ut_time > midnight) { ! 120: upall(1); ! 121: print(); ! 122: newday(); ! 123: for (up=ubuf; up < &ubuf[USIZE]; up++) ! 124: up->utime = 0; ! 125: } ! 126: if (ibuf.ut_line[0] == '~') { ! 127: ibuf.ut_name[0] = '\0'; ! 128: upall(0); ! 129: return; ! 130: } ! 131: if (ibuf.ut_line[0]=='t') ! 132: i = (ibuf.ut_line[3]-'0')*10 + (ibuf.ut_line[4]-'0'); ! 133: else ! 134: i = TSIZE-1; ! 135: if (i<0 || i>=TSIZE) ! 136: i = TSIZE-1; ! 137: tp = &tbuf[i]; ! 138: update(tp, 0); ! 139: } ! 140: ! 141: print() ! 142: { ! 143: int i; ! 144: long ttime, t; ! 145: ! 146: ttime = 0; ! 147: for (i=0; i<USIZE; i++) { ! 148: if(!among(i)) ! 149: continue; ! 150: t = ubuf[i].utime; ! 151: if (t>0) ! 152: ttime += t; ! 153: if (pflag && ubuf[i].utime > 0) { ! 154: printf("\t%-*.*s%6.2f\n", NMAX, NMAX, ! 155: ubuf[i].uname, ubuf[i].utime/3600.); ! 156: } ! 157: } ! 158: if (ttime > 0) { ! 159: pdate(); ! 160: printf("\ttotal%9.2f\n", ttime/3600.); ! 161: } ! 162: } ! 163: ! 164: upall(f) ! 165: { ! 166: register struct tbuf *tp; ! 167: ! 168: for (tp=tbuf; tp < &tbuf[TSIZE]; tp++) ! 169: update(tp, f); ! 170: } ! 171: ! 172: update(tp, f) ! 173: struct tbuf *tp; ! 174: { ! 175: int j; ! 176: struct ubuf *up; ! 177: long t, t1; ! 178: ! 179: if (f) ! 180: t = midnight; ! 181: else ! 182: t = ibuf.ut_time; ! 183: if (tp->userp) { ! 184: t1 = t - tp->ttime; ! 185: if (t1>0 && t1 < 1.5*day) ! 186: tp->userp->utime += t1; ! 187: } ! 188: tp->ttime = t; ! 189: if (f) ! 190: return; ! 191: if (ibuf.ut_name[0]=='\0') { ! 192: tp->userp = 0; ! 193: return; ! 194: } ! 195: for (up=ubuf; up < &ubuf[USIZE]; up++) { ! 196: if (up->uname[0] == '\0') ! 197: break; ! 198: for (j=0; j<NMAX && up->uname[j]==ibuf.ut_name[j]; j++); ! 199: if (j>=NMAX) ! 200: break; ! 201: } ! 202: for (j=0; j<NMAX; j++) ! 203: up->uname[j] = ibuf.ut_name[j]; ! 204: tp->userp = up; ! 205: } ! 206: ! 207: among(i) ! 208: { ! 209: register j, k; ! 210: register char *p; ! 211: ! 212: if (pcount==0) ! 213: return(1); ! 214: for (j=0; j<pcount; j++) { ! 215: p = pptr[j]; ! 216: for (k=0; k<NMAX; k++) { ! 217: if (*p == ubuf[i].uname[k]) { ! 218: if (*p++ == '\0') ! 219: return(1); ! 220: } else ! 221: break; ! 222: } ! 223: } ! 224: return(0); ! 225: } ! 226: ! 227: newday() ! 228: { ! 229: long ttime; ! 230: struct timeb tb; ! 231: struct tm *localtime(); ! 232: ! 233: time(&ttime); ! 234: if (midnight == 0) { ! 235: ftime(&tb); ! 236: midnight = 60*(long)tb.timezone; ! 237: if (localtime(&ttime)->tm_isdst) ! 238: midnight -= 3600; ! 239: } ! 240: while (midnight <= ibuf.ut_time) ! 241: midnight += day; ! 242: } ! 243: ! 244: pdate() ! 245: { ! 246: long x; ! 247: char *ctime(); ! 248: ! 249: if (byday==0) ! 250: return; ! 251: x = midnight-1; ! 252: printf("%.6s", ctime(&x)+4); ! 253: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.