1946Sbill /* 2946Sbill * acct [ -w wtmp ] [ -d ] [ -p ] [ people ] 3946Sbill */ 4*3922Sbugs static char *sccsid = "@(#)ac.c 4.2 (Berkeley) 07/02/81"; 5946Sbill 6946Sbill #include <stdio.h> 7946Sbill #include <ctype.h> 8946Sbill #include <time.h> 9946Sbill #include <utmp.h> 10946Sbill #include <sys/types.h> 11946Sbill #include <sys/timeb.h> 12946Sbill 13946Sbill #define NMAX sizeof(ibuf.ut_name) 14946Sbill #define LMAX sizeof(ibuf.ut_line) 15946Sbill 16946Sbill #define TSIZE 1000 17946Sbill #define USIZE 500 18946Sbill struct utmp ibuf; 19946Sbill 20946Sbill struct ubuf { 21946Sbill char uname[NMAX]; 22946Sbill long utime; 23946Sbill } ubuf[USIZE]; 24946Sbill 25946Sbill struct tbuf { 26946Sbill struct ubuf *userp; 27946Sbill long ttime; 28946Sbill } tbuf[TSIZE]; 29946Sbill 30946Sbill char *wtmp; 31946Sbill int pflag, byday; 32946Sbill long dtime; 33946Sbill long midnight; 34946Sbill long lastime; 35946Sbill long day = 86400L; 36946Sbill int pcount; 37946Sbill char **pptr; 38946Sbill 39946Sbill main(argc, argv) 40946Sbill char **argv; 41946Sbill { 42946Sbill int c, fl; 43946Sbill register i; 44946Sbill FILE *wf; 45946Sbill 46946Sbill wtmp = "/usr/adm/wtmp"; 47946Sbill while (--argc > 0 && **++argv == '-') 48946Sbill switch(*++*argv) { 49946Sbill case 'd': 50946Sbill byday++; 51946Sbill continue; 52946Sbill 53946Sbill case 'w': 54946Sbill if (--argc>0) 55946Sbill wtmp = *++argv; 56946Sbill continue; 57946Sbill 58946Sbill case 'p': 59946Sbill pflag++; 60946Sbill continue; 61946Sbill } 62946Sbill pcount = argc; 63946Sbill pptr = argv; 64946Sbill if ((wf = fopen(wtmp, "r")) == NULL) { 65946Sbill printf("No %s\n", wtmp); 66946Sbill exit(1); 67946Sbill } 68946Sbill for(;;) { 69946Sbill if (fread((char *)&ibuf, sizeof(ibuf), 1, wf) != 1) 70946Sbill break; 71946Sbill fl = 0; 72946Sbill for (i=0; i<NMAX; i++) { 73946Sbill c = ibuf.ut_name[i]; 74*3922Sbugs if (isprint(c) && c != ' ') { 75946Sbill if (fl) 76946Sbill goto skip; 77946Sbill continue; 78946Sbill } 79946Sbill if (c==' ' || c=='\0') { 80946Sbill fl++; 81946Sbill ibuf.ut_name[i] = '\0'; 82946Sbill } else 83946Sbill goto skip; 84946Sbill } 85946Sbill loop(); 86946Sbill skip:; 87946Sbill } 88946Sbill ibuf.ut_name[0] = '\0'; 89946Sbill ibuf.ut_line[0] = '~'; 90946Sbill time(&ibuf.ut_time); 91946Sbill loop(); 92946Sbill print(); 93946Sbill exit(0); 94946Sbill } 95946Sbill 96946Sbill loop() 97946Sbill { 98946Sbill register i; 99946Sbill register struct tbuf *tp; 100946Sbill register struct ubuf *up; 101946Sbill 102946Sbill if(ibuf.ut_line[0] == '|') { 103946Sbill dtime = ibuf.ut_time; 104946Sbill return; 105946Sbill } 106946Sbill if(ibuf.ut_line[0] == '}') { 107946Sbill if(dtime == 0) 108946Sbill return; 109946Sbill for(tp = tbuf; tp < &tbuf[TSIZE]; tp++) 110946Sbill tp->ttime += ibuf.ut_time-dtime; 111946Sbill dtime = 0; 112946Sbill return; 113946Sbill } 114946Sbill if (lastime>ibuf.ut_time || lastime+(1.5*day)<ibuf.ut_time) 115946Sbill midnight = 0; 116946Sbill if (midnight==0) 117946Sbill newday(); 118946Sbill lastime = ibuf.ut_time; 119946Sbill if (byday && ibuf.ut_time > midnight) { 120946Sbill upall(1); 121946Sbill print(); 122946Sbill newday(); 123946Sbill for (up=ubuf; up < &ubuf[USIZE]; up++) 124946Sbill up->utime = 0; 125946Sbill } 126946Sbill if (ibuf.ut_line[0] == '~') { 127946Sbill ibuf.ut_name[0] = '\0'; 128946Sbill upall(0); 129946Sbill return; 130946Sbill } 131946Sbill if (ibuf.ut_line[0]=='t') 132946Sbill i = (ibuf.ut_line[3]-'0')*10 + (ibuf.ut_line[4]-'0'); 133946Sbill else 134946Sbill i = TSIZE-1; 135946Sbill if (i<0 || i>=TSIZE) 136946Sbill i = TSIZE-1; 137946Sbill tp = &tbuf[i]; 138946Sbill update(tp, 0); 139946Sbill } 140946Sbill 141946Sbill print() 142946Sbill { 143946Sbill int i; 144946Sbill long ttime, t; 145946Sbill 146946Sbill ttime = 0; 147946Sbill for (i=0; i<USIZE; i++) { 148946Sbill if(!among(i)) 149946Sbill continue; 150946Sbill t = ubuf[i].utime; 151946Sbill if (t>0) 152946Sbill ttime += t; 153946Sbill if (pflag && ubuf[i].utime > 0) { 154946Sbill printf("\t%-*.*s%6.2f\n", NMAX, NMAX, 155946Sbill ubuf[i].uname, ubuf[i].utime/3600.); 156946Sbill } 157946Sbill } 158946Sbill if (ttime > 0) { 159946Sbill pdate(); 160946Sbill printf("\ttotal%9.2f\n", ttime/3600.); 161946Sbill } 162946Sbill } 163946Sbill 164946Sbill upall(f) 165946Sbill { 166946Sbill register struct tbuf *tp; 167946Sbill 168946Sbill for (tp=tbuf; tp < &tbuf[TSIZE]; tp++) 169946Sbill update(tp, f); 170946Sbill } 171946Sbill 172946Sbill update(tp, f) 173946Sbill struct tbuf *tp; 174946Sbill { 175946Sbill int j; 176946Sbill struct ubuf *up; 177946Sbill long t, t1; 178946Sbill 179946Sbill if (f) 180946Sbill t = midnight; 181946Sbill else 182946Sbill t = ibuf.ut_time; 183946Sbill if (tp->userp) { 184946Sbill t1 = t - tp->ttime; 185946Sbill if (t1>0 && t1 < 1.5*day) 186946Sbill tp->userp->utime += t1; 187946Sbill } 188946Sbill tp->ttime = t; 189946Sbill if (f) 190946Sbill return; 191946Sbill if (ibuf.ut_name[0]=='\0') { 192946Sbill tp->userp = 0; 193946Sbill return; 194946Sbill } 195946Sbill for (up=ubuf; up < &ubuf[USIZE]; up++) { 196946Sbill if (up->uname[0] == '\0') 197946Sbill break; 198946Sbill for (j=0; j<NMAX && up->uname[j]==ibuf.ut_name[j]; j++); 199946Sbill if (j>=NMAX) 200946Sbill break; 201946Sbill } 202946Sbill for (j=0; j<NMAX; j++) 203946Sbill up->uname[j] = ibuf.ut_name[j]; 204946Sbill tp->userp = up; 205946Sbill } 206946Sbill 207946Sbill among(i) 208946Sbill { 209946Sbill register j, k; 210946Sbill register char *p; 211946Sbill 212946Sbill if (pcount==0) 213946Sbill return(1); 214946Sbill for (j=0; j<pcount; j++) { 215946Sbill p = pptr[j]; 216946Sbill for (k=0; k<NMAX; k++) { 217946Sbill if (*p == ubuf[i].uname[k]) { 218*3922Sbugs if (*p++ == '\0' || k == NMAX-1) 219946Sbill return(1); 220946Sbill } else 221946Sbill break; 222946Sbill } 223946Sbill } 224946Sbill return(0); 225946Sbill } 226946Sbill 227946Sbill newday() 228946Sbill { 229946Sbill long ttime; 230946Sbill struct timeb tb; 231946Sbill struct tm *localtime(); 232946Sbill 233946Sbill time(&ttime); 234946Sbill if (midnight == 0) { 235946Sbill ftime(&tb); 236946Sbill midnight = 60*(long)tb.timezone; 237946Sbill if (localtime(&ttime)->tm_isdst) 238946Sbill midnight -= 3600; 239946Sbill } 240946Sbill while (midnight <= ibuf.ut_time) 241946Sbill midnight += day; 242946Sbill } 243946Sbill 244946Sbill pdate() 245946Sbill { 246946Sbill long x; 247946Sbill char *ctime(); 248946Sbill 249946Sbill if (byday==0) 250946Sbill return; 251946Sbill x = midnight-1; 252946Sbill printf("%.6s", ctime(&x)+4); 253946Sbill } 254