#define size 2000 /* interpret command time accounting */ int lflg; int cflg; int jflg; int nflg; int aflg; int rflg; int tflg; int vflg; int uflg; int thres 1; int sflg; int bflg; int mflg; int fout; struct user { int ncomm; int fill; float fctime; } user[256]; struct tab { char name[8]; int count; float realt; float cput; float syst; } tab[size]; struct ftab { char fname[14]; char shf; char uid; int fdatet[2]; int frealt[2]; int fcput[2]; int fsyst[2]; }; float treal; float tcpu; float tsys; int junkp -1; char *sname; float ncom; main(argc, argv) char **argv; { int i, j, k; extern tcmp(), ncmp(), bcmp(); extern float sum(); float ft; init(); if (argc>1) if (argv[1][0]=='-') { argv++; argc--; for(i=1; argv[0][i]; i++) switch(argv[0][i]) { case 'b': bflg++; break; case 'l': lflg++; break; case 'c': cflg++; break; case 'j': jflg++; break; case 'n': nflg++; break; case 'a': aflg++; break; case 'r': rflg++; break; case 't': tflg++; break; case 's': sflg++; aflg++; break; case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': thres = argv[0][i]-'0'; break; case 'v': vflg++; break; case 'u': uflg++; break; case 'm': mflg++; break; } } fout = dup(1); if (argc<2) acct("/usr/adm/sha"); else while (--argc) acct(*++argv); if (uflg) { flush(); return; } /* * cleanup pass * put junk together */ if (vflg) strip(); if(!aflg) for (i=0; i= 0200)) *cp = '?'; } if (uflg) { printdate(fbuf.fdatet); printf(" %3d %.8s\n", fbuf.uid, fbuf.name); continue; } if (fbuf.shf==0) { c = fbuf.uid&0377; user[c].ncomm++; user[c].fctime =+ (ltod(fbuf.fcput)+ltod(fbuf.fsyst))/60; } ncom =+ 1.0; i = enter(&fbuf); tab[i].count++; x = ltod(fbuf.frealt); x =* 60.; tab[i].realt =+ x; treal =+ x; x = ltod(fbuf.fcput); tab[i].cput =+ x; tcpu =+ x; x = ltod(fbuf.fsyst); tab[i].syst =+ x; tsys =+ x; } close(ff); } ncmp(p1, p2) struct tab *p1, *p2; { if(p1->count == p2->count) return(tcmp(p1, p2)); if(rflg) return(p1->count - p2->count); return(p2->count - p1->count); } bcmp(p1, p2) struct tab *p1, *p2; { float f1, f2; float sum(); f1 = sum(p1)/p1->count; f2 = sum(p2)/p2->count; if(f1 < f2) { if(rflg) return(-1); return(1); } if(f1 > f2) { if(rflg) return(1); return(-1); } return(0); } tcmp(p1, p2) struct tab *p1, *p2; { extern float sum(); float f1, f2; f1 = sum(p1); f2 = sum(p2); if(f1 < f2) { if(rflg) return(-1); return(1); } if(f1 > f2) { if(rflg) return(1); return(-1); } return(0); } float sum(p) struct tab *p; { if(p->name[0] == 0) return(0.0); return( p->cput+ p->syst); } init() { struct tab tbuf; int i, j, f; if ((f=open("/usr/adm/sht", 0))<0) goto gshm; while (read(f, &tbuf, sizeof(tbuf)) == sizeof(tbuf)) { i = enter(&tbuf); ncom =+ tbuf.count; tab[i].count = tbuf.count; treal =+ tbuf.realt; tab[i].realt = tbuf.realt; tcpu =+ tbuf.cput; tab[i].cput = tbuf.cput; tsys =+ tbuf.syst; tab[i].syst = tbuf.syst; } close(f); gshm: if ((f=open("/usr/adm/shm", 0)) < 0) return; read(f, user, sizeof(user)); close(f); } enter(fbuf) struct ftab *fbuf; { int i, j; i = 0; for (j=0; j<8; j++) { i = i*7 + fbuf->fname[j]; } if(i < 0) i = -i; for (i=%size; tab[i].name[0]; i = (i+1)%size) { for (j=0; j<8; j++) if (tab[i].name[j]!=fbuf->fname[j]) goto no; goto yes; no:; } for (j=0; j<8; j++) tab[i].name[j] = fbuf->fname[j]; yes: return(i); } strip() { int i, j, k, c; j = enter("**junk**"); for (i = 0; i