/* * sess - determines clock time used so far this session by this user * or for tty or user supplied as an argument * * Author: Howard Katseff * * Note that 'sess ~' gives time since system last started. */ struct {long l1;}; struct {char c1, c2, c3, c4;}; char buf[32]; main(argc, argv) char **argv; { int f, i; char t[2], *p; long lx; int intrp(); t[1] = 0; f = open("/usr/adm/wtmp", 0); if (f < 0) { printf("Can't open /usr/adm/wtmp\n"); exit(); } fstat(f, buf); lx.c2 = 0; lx.c1 = buf[9]; lx.c3 = buf[10] & 0360; lx.c4 = buf[11]; blseek(f, lx, 0); if (argc <= 1) { t[0] = ttyn(2); p = t; } else p = argv[1]; if ((signal(2,1) && 01) == 0) signal(2, &intrp); for (;;) { if (bread(f, buf+16, -16) < 16) exit(); lx =- 16; if (equal(p, buf)) { if (*(p+1) != '\0') { t[0] = buf[8]; p = t; blseek(f, lx+16, 0); while(bread(f, buf, 16) > 0) if (equal(p, buf)) goto l1; blseek(f, lx, 0); bread(f, buf, 16); l1:; } time(&lx); lx =+ 231231630 - (buf+10)->l1; printf("Elapsed time:"); if (lx < 231318030) printf(" %5.5s", 11+ctime(&lx)); else printf(" %ld + %5.5s",(lx-231231630)/86400, 11+ctime(&lx)); if (buf[0] == '\0' && *p != '~') printf(" since logout\n"); else putchar('\n'); exit(); } } } equal(c1, c2) char *c1, *c2; { int i; if (*(c1+1) == '\0') { if (*c1 == *(c2+8)) return(1); else return(0); } for (i=0; i<8; i++) { if (*c1 == '\0') return(*c2 == ' '); if (*c1++ != *c2++) return(0); } return(1); } intrp() { register char *q; signal(2,1); q = ctime(buf+10); printf("interrupted at %10.10s %5.5s \n", q, 11+q); exit(); } /* * NAME: bread(), brseek(), blseek() * * DESCRIPTION: * This is a buffered read package which simulates read(), seek() and * lseek(). * Bread may be called with a negative nbytes which causes it to * read backwards . In this case, buffer should point to the first * byte following the buffer. If only a partial read is possible * (due to beginning of file), only the last bytes of the buffer * will be filled. */ int i, j, k; int nl, nr; char *next; char b[512]; bread(file, buff, nbytes) char *buff; { register nb; if (nbytes > 0) { for (nb=nbytes; nb>0; nb--) { if (nr == 0) { nr = read(file, next=b, 512); nl = 0; if (nr < 0) return(-1); if (nr == 0) return(nbytes-nb); } *buff++ = *next++; nr--; nl++; } } else { nbytes = -nbytes; for (nb=nbytes; nb>0; nb--) { if (nl == 0) { seek(file, -(512 + nr), 1); nl = read(file, b, 512); if (nl < 0) { for (k=511; k>0; k--) { seek(file, 1, 1); nl = read(file, b, k); if (nl >= 0) break; } if (nl < 0) return(nbytes-nb); } if (nl == 0) return(nbytes-nb); next = b + nl; nr = 0; } *--buff = *--next; nr++; nl--; } } return(nbytes); } brseek(file, offset, flag) { nl = 0; nr = 0; return(seek(file,offset,flag)); } blseek(file, offset, flag) long offset; { nl = 0; nr = 0; return(lseek(file,offset,flag)); }