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

Defined functions

acct defined in line 268; used 2 times
bcmp defined in line 332; used 2 times
col defined in line 254; used 4 times
column defined in line 233; used 2 times
enter defined in line 410; used 4 times
init defined in line 384; used 1 times
  • in line 56
main defined in line 48; never used
ncmp defined in line 321; used 2 times
pair defined in line 467; used 3 times
  • in line 464(3)
printdate defined in line 456; used 1 times
printmoney defined in line 210; used 1 times
strip defined in line 434; used 1 times
sum defined in line 373; used 7 times
tcmp defined in line 352; used 3 times

Defined variables

aflg defined in line 8; used 3 times
bflg defined in line 15; used 2 times
cflg defined in line 5; used 3 times
fout defined in line 17; used 4 times
jflg defined in line 6; used 2 times
junkp defined in line 44; used 6 times
lflg defined in line 4; used 2 times
mflg defined in line 16; used 2 times
ncom defined in line 46; used 5 times
nflg defined in line 7; used 2 times
rflg defined in line 9; used 6 times
sflg defined in line 14; used 4 times
sname defined in line 45; used 4 times
tab defined in line 30; used 55 times
tcpu defined in line 42; used 5 times
tflg defined in line 10; used 2 times
thres defined in line 13; used 2 times
treal defined in line 41; used 4 times
tsys defined in line 43; used 5 times
uflg defined in line 12; used 3 times
user defined in line 23; used 9 times
vflg defined in line 11; used 2 times

Defined struct's

ftab defined in line 32; used 4 times
tab defined in line 24; used 10 times
user defined in line 19; never used

Defined macros

size defined in line 1; used 6 times
Last modified: 1975-05-14
Generated: 2016-12-26
Generated by src2html V0.67
page hit count: 1553
Valid CSS Valid XHTML 1.0 Strict