|
|
1.1 ! root 1: #include <stdio.h> ! 2: #include <sys/types.h> ! 3: #include <sys/acct.h> ! 4: #include <signal.h> ! 5: ! 6: /* interpret command time accounting */ ! 7: ! 8: #define size 2500 ! 9: #define NC sizeof(acctbuf.ac_comm) ! 10: struct acct acctbuf; ! 11: int lflg; ! 12: int cflg; ! 13: int iflg; ! 14: int jflg; ! 15: int nflg; ! 16: int aflg; ! 17: int rflg; ! 18: int oflg; ! 19: int tflg; ! 20: int vflg; ! 21: int uflg; ! 22: int thres = 1; ! 23: int sflg; ! 24: int bflg; ! 25: int mflg; ! 26: ! 27: struct user { ! 28: int ncomm; ! 29: int fill; ! 30: float fctime; ! 31: } user[1000]; ! 32: ! 33: struct tab { ! 34: char name[NC]; ! 35: int count; ! 36: float realt; ! 37: float cput; ! 38: float syst; ! 39: } tab[size]; ! 40: ! 41: float treal; ! 42: float tcpu; ! 43: float tsys; ! 44: int junkp = -1; ! 45: char *sname; ! 46: float ncom; ! 47: time_t expand(); ! 48: ! 49: main(argc, argv) ! 50: char **argv; ! 51: { ! 52: FILE *ff; ! 53: int i, j, k; ! 54: extern tcmp(), ncmp(), bcmp(); ! 55: extern float sum(); ! 56: float ft; ! 57: ! 58: if (argc>1) ! 59: if (argv[1][0]=='-') { ! 60: argv++; ! 61: argc--; ! 62: for(i=1; argv[0][i]; i++) ! 63: switch(argv[0][i]) { ! 64: ! 65: case 'o': ! 66: oflg++; ! 67: break; ! 68: ! 69: case 'i': ! 70: iflg++; ! 71: break; ! 72: ! 73: case 'b': ! 74: bflg++; ! 75: break; ! 76: ! 77: case 'l': ! 78: lflg++; ! 79: break; ! 80: ! 81: case 'c': ! 82: cflg++; ! 83: break; ! 84: ! 85: case 'j': ! 86: jflg++; ! 87: break; ! 88: ! 89: case 'n': ! 90: nflg++; ! 91: break; ! 92: ! 93: case 'a': ! 94: aflg++; ! 95: break; ! 96: ! 97: case 'r': ! 98: rflg++; ! 99: break; ! 100: ! 101: case 't': ! 102: tflg++; ! 103: break; ! 104: ! 105: case 's': ! 106: sflg++; ! 107: aflg++; ! 108: break; ! 109: ! 110: case '0': ! 111: case '1': ! 112: case '2': ! 113: case '3': ! 114: case '4': ! 115: case '5': ! 116: case '6': ! 117: case '7': ! 118: case '8': ! 119: case '9': ! 120: thres = argv[0][i]-'0'; ! 121: break; ! 122: ! 123: case 'v': ! 124: vflg++; ! 125: break; ! 126: ! 127: case 'u': ! 128: uflg++; ! 129: break; ! 130: ! 131: case 'm': ! 132: mflg++; ! 133: break; ! 134: } ! 135: } ! 136: if (iflg==0) ! 137: init(); ! 138: if (argc<2) ! 139: doacct("/usr/adm/acct"); ! 140: else while (--argc) ! 141: doacct(*++argv); ! 142: if (uflg) { ! 143: return; ! 144: } ! 145: ! 146: /* ! 147: * cleanup pass ! 148: * put junk together ! 149: */ ! 150: ! 151: if (vflg) ! 152: strip(); ! 153: if(!aflg) ! 154: for (i=0; i<size; i++) ! 155: if (tab[i].name[0]) { ! 156: for(j=0; j<NC; j++) ! 157: if(tab[i].name[j] == '?') ! 158: goto yes; ! 159: if(tab[i].count != 1) ! 160: continue; ! 161: yes: ! 162: if(junkp == -1) ! 163: junkp = enter("***other"); ! 164: tab[junkp].count += tab[i].count; ! 165: tab[junkp].realt += tab[i].realt; ! 166: tab[junkp].cput += tab[i].cput; ! 167: tab[junkp].syst += tab[i].syst; ! 168: tab[i].name[0] = 0; ! 169: } ! 170: for(i=k=0; i<size; i++) ! 171: if(tab[i].name[0]) { ! 172: for(j=0; j<NC; j++) ! 173: tab[k].name[j] = tab[i].name[j]; ! 174: tab[k].count = tab[i].count; ! 175: tab[k].realt = tab[i].realt; ! 176: tab[k].cput = tab[i].cput; ! 177: tab[k].syst = tab[i].syst; ! 178: k++; ! 179: } ! 180: if (sflg) { ! 181: signal(SIGINT, SIG_IGN); ! 182: if ((ff = fopen("/usr/adm/usracct", "w")) != NULL) { ! 183: fwrite((char *)user, sizeof(user), 1, ff); ! 184: fclose(ff); ! 185: } ! 186: if ((ff = fopen("/usr/adm/savacct", "w")) == NULL) { ! 187: printf("Can't save\n"); ! 188: exit(0); ! 189: } ! 190: fwrite((char *)tab, sizeof(tab[0]), k, ff); ! 191: fclose(ff); ! 192: creat("/usr/adm/acct", 0644); ! 193: signal(SIGINT, SIG_DFL); ! 194: } ! 195: /* ! 196: * sort and print ! 197: */ ! 198: ! 199: if (mflg) { ! 200: printmoney(); ! 201: exit(0); ! 202: } ! 203: qsort(tab, k, sizeof(tab[0]), nflg? ncmp: (bflg?bcmp:tcmp)); ! 204: column(ncom, treal, tcpu, tsys); ! 205: printf("\n"); ! 206: for (i=0; i<k; i++) ! 207: if (tab[i].name[0]) { ! 208: ft = tab[i].count; ! 209: column(ft, tab[i].realt, tab[i].cput, tab[i].syst); ! 210: printf(" %.14s\n", tab[i].name); ! 211: } ! 212: } ! 213: ! 214: printmoney() ! 215: { ! 216: register i; ! 217: char buf[128]; ! 218: register char *cp; ! 219: ! 220: for (i=0; i<256; i++) { ! 221: if (user[i].ncomm) { ! 222: if (getpw(i, buf)!=0) ! 223: printf("%-8d", i); ! 224: else { ! 225: cp = buf; ! 226: while (*cp!=':' &&*cp!='\n' && *cp) ! 227: cp++; ! 228: *cp = 0; ! 229: printf("%-8s", buf); ! 230: } ! 231: printf("%7u %9.2f\n", ! 232: user[i].ncomm, user[i].fctime/60); ! 233: } ! 234: } ! 235: } ! 236: ! 237: column(n, a, b, c) ! 238: double n, a, b, c; ! 239: { ! 240: ! 241: printf("%8.0f", n); ! 242: if(cflg) { ! 243: if(n == ncom) ! 244: printf("%9s", ""); else ! 245: printf("%8.2f%%", 100.*n/ncom); ! 246: } ! 247: col(n, a, treal); ! 248: if (oflg) ! 249: col(n, 3600*(b/(b+c)), tcpu+tsys); ! 250: else if(lflg) { ! 251: col(n, b, tcpu); ! 252: col(n, c, tsys); ! 253: } else ! 254: col(n, b+c, tcpu+tsys); ! 255: if(tflg) ! 256: printf("%8.1f", a/(b+c)); ! 257: } ! 258: ! 259: col(n, a, m) ! 260: double n, a, m; ! 261: { ! 262: ! 263: if(jflg) ! 264: printf("%11.2f", a/(n*60.)); else ! 265: printf("%11.2f", a/3600.); ! 266: if(cflg) { ! 267: if(a == m) ! 268: printf("%9s", ""); else ! 269: printf("%8.2f%%", 100.*a/m); ! 270: } ! 271: } ! 272: ! 273: doacct(f) ! 274: char *f; ! 275: { ! 276: int i; ! 277: FILE *ff; ! 278: long x; ! 279: struct acct fbuf; ! 280: register char *cp; ! 281: register int c; ! 282: ! 283: if (sflg && sname) { ! 284: printf("Only 1 file with -s\n"); ! 285: exit(0); ! 286: } ! 287: if (sflg) ! 288: sname = f; ! 289: if ((ff = fopen(f, "r"))==NULL) { ! 290: printf("Can't open %s\n", f); ! 291: return; ! 292: } ! 293: while (fread((char *)&fbuf, sizeof(fbuf), 1, ff) == 1) { ! 294: if (fbuf.ac_comm[0]==0) { ! 295: fbuf.ac_comm[0] = '?'; ! 296: } ! 297: for (cp = fbuf.ac_comm; cp < &fbuf.ac_comm[NC]; cp++) { ! 298: c = *cp & 0377; ! 299: if (c && (c < ' ' || c >= 0200)) { ! 300: *cp = '?'; ! 301: } ! 302: } ! 303: if (fbuf.ac_flag&AFORK) { ! 304: for (cp=fbuf.ac_comm; cp < &fbuf.ac_comm[NC]; cp++) ! 305: if (*cp==0) { ! 306: *cp = '*'; ! 307: break; ! 308: } ! 309: } ! 310: x = expand(fbuf.ac_utime) + expand(fbuf.ac_stime); ! 311: if (uflg) { ! 312: printf("%3d%6.1f %.14s\n", fbuf.ac_uid&0377, x/60.0, ! 313: fbuf.ac_comm); ! 314: continue; ! 315: } ! 316: c = fbuf.ac_uid&0377; ! 317: user[c].ncomm++; ! 318: user[c].fctime += x/60.; ! 319: ncom += 1.0; ! 320: i = enter(fbuf.ac_comm); ! 321: tab[i].count++; ! 322: x = expand(fbuf.ac_etime)*60; ! 323: tab[i].realt += x; ! 324: treal += x; ! 325: x = expand(fbuf.ac_utime); ! 326: tab[i].cput += x; ! 327: tcpu += x; ! 328: x = expand(fbuf.ac_stime); ! 329: tab[i].syst += x; ! 330: tsys += x; ! 331: } ! 332: fclose(ff); ! 333: } ! 334: ! 335: ncmp(p1, p2) ! 336: struct tab *p1, *p2; ! 337: { ! 338: ! 339: if(p1->count == p2->count) ! 340: return(tcmp(p1, p2)); ! 341: if(rflg) ! 342: return(p1->count - p2->count); ! 343: return(p2->count - p1->count); ! 344: } ! 345: ! 346: bcmp(p1, p2) ! 347: struct tab *p1, *p2; ! 348: { ! 349: float f1, f2; ! 350: float sum(); ! 351: ! 352: f1 = sum(p1)/p1->count; ! 353: f2 = sum(p2)/p2->count; ! 354: if(f1 < f2) { ! 355: if(rflg) ! 356: return(-1); ! 357: return(1); ! 358: } ! 359: if(f1 > f2) { ! 360: if(rflg) ! 361: return(1); ! 362: return(-1); ! 363: } ! 364: return(0); ! 365: } ! 366: tcmp(p1, p2) ! 367: struct tab *p1, *p2; ! 368: { ! 369: extern float sum(); ! 370: float f1, f2; ! 371: ! 372: f1 = sum(p1); ! 373: f2 = sum(p2); ! 374: if(f1 < f2) { ! 375: if(rflg) ! 376: return(-1); ! 377: return(1); ! 378: } ! 379: if(f1 > f2) { ! 380: if(rflg) ! 381: return(1); ! 382: return(-1); ! 383: } ! 384: return(0); ! 385: } ! 386: ! 387: float sum(p) ! 388: struct tab *p; ! 389: { ! 390: ! 391: if(p->name[0] == 0) ! 392: return(0.0); ! 393: return( ! 394: p->cput+ ! 395: p->syst); ! 396: } ! 397: ! 398: init() ! 399: { ! 400: struct tab tbuf; ! 401: int i; ! 402: FILE *f; ! 403: ! 404: if ((f = fopen("/usr/adm/savacct", "r")) == NULL) ! 405: goto gshm; ! 406: while (fread((char *)&tbuf, sizeof(tbuf), 1, f) == 1) { ! 407: i = enter(tbuf.name); ! 408: ncom += tbuf.count; ! 409: tab[i].count = tbuf.count; ! 410: treal += tbuf.realt; ! 411: tab[i].realt = tbuf.realt; ! 412: tcpu += tbuf.cput; ! 413: tab[i].cput = tbuf.cput; ! 414: tsys += tbuf.syst; ! 415: tab[i].syst = tbuf.syst; ! 416: } ! 417: fclose(f); ! 418: gshm: ! 419: if ((f = fopen("/usr/adm/usracct", "r")) == NULL) ! 420: return; ! 421: fread((char *)user, sizeof(user), 1, f); ! 422: fclose(f); ! 423: } ! 424: ! 425: enter(np) ! 426: char *np; ! 427: { ! 428: int i, j; ! 429: ! 430: for (i=j=0; i<NC; i++) { ! 431: if (np[i]==0) ! 432: j = i; ! 433: if (j) ! 434: np[i] = 0; ! 435: } ! 436: for (i=j=0; j<NC; j++) { ! 437: i = i*7 + np[j]; ! 438: } ! 439: if (i < 0) ! 440: i = -i; ! 441: for (i%=size; tab[i].name[0]; i = (i+1)%size) { ! 442: for (j=0; j<NC; j++) ! 443: if (tab[i].name[j]!=np[j]) ! 444: goto no; ! 445: goto yes; ! 446: no:; ! 447: } ! 448: for (j=0; j<NC; j++) ! 449: tab[i].name[j] = np[j]; ! 450: yes: ! 451: return(i); ! 452: } ! 453: ! 454: strip() ! 455: { ! 456: int i, j, c; ! 457: ! 458: j = enter("**junk**"); ! 459: for (i = 0; i<size; i++) { ! 460: if (tab[i].name[0] && tab[i].count<=thres) { ! 461: printf("%.14s--", tab[i].name); ! 462: if ((c=getchar())=='y') { ! 463: tab[i].name[0] = '\0'; ! 464: tab[j].count += tab[i].count; ! 465: tab[j].realt += tab[i].realt; ! 466: tab[j].cput += tab[i].cput; ! 467: tab[j].syst += tab[i].syst; ! 468: } ! 469: while (c && c!='\n') ! 470: c = getchar(); ! 471: } ! 472: } ! 473: } ! 474: ! 475: time_t ! 476: expand(t) ! 477: unsigned t; ! 478: { ! 479: register time_t nt; ! 480: ! 481: nt = t&017777; ! 482: t >>= 13; ! 483: while (t!=0) { ! 484: t--; ! 485: nt <<= 3; ! 486: } ! 487: return(nt); ! 488: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.