PWB1/sys/source/s8/lastcom.c
struct {
char cname[8];
char lname[6];
char shtty;
char tuid;
int datet[2];
int realt[2];
int bcput[2];
int bsyst[2];
} tbuf;
char afname[] "/etc/sha\0xxxxxxxxxxxxxxxxxxxxxxxxxxxx";
int pn;
int f;
int ttyflg, nameflg, allflg, recscan 1000;
char *ap;
char ctty[2];
int *ta;
main(argc, argv) char **argv; {
register i, ct;
if(argc<2) {
BAD:
write(2, "Usage: lastcom [+] [++] [ttyletter | -logname]\n", 47);
exit(1);
}
while(argc>1) {
if(strcmp(argv[1], "+")==0) {
allflg++;
argv++;
argc--;
continue;
} else if(strcmp(argv[1], "++")==0) {
recscan = 32000;
argv++;
argc--;
continue;
} else if(strcmp(argv[1], "-f")==0) {
strcpy(afname, argv[2]);
argv++;argv++; argc=- 2;
continue;
}
if(argv[1][0]=='-') {
ap = &argv[1][1];
nameflg++;
break;
} else if(argc==2) {
ttyflg++;
ap = argv[1];
break;
} else if(!allflg)
goto BAD;
}
f = open(afname, 0);
seek(f, 0, 5);
printf("TTY NAME COMMAND HR:MN:SC (TICS)\n");
for(pn = sizeof tbuf * 2; seek(f, -pn, 1)!=-1;) {
read(f, &tbuf, sizeof tbuf);
ctty[0] = tbuf.shtty;
tbuf.shtty = '\0';
if(allflg && !(ttyflg || nameflg))
eprint();
else if(ttyflg) {
if(!*ap) exit(0);
for(i=0;ap[i];++i)
if(ap[i]==ctty[0]) {
eprint();
if(allflg) break;
for(;ap[i];++i)
ap[i]=ap[i+1];
break;
}
} else if(nameflg && gmatch(tbuf.lname, ap))
eprint();
if(ct++ > recscan) break;
}
if(allflg) exit(0);
printf("No <%s> after %s", argv[1], ctime(tbuf.datet));
exit(1);
}
eprint() {
printf(" %s ", ctty);
printf(" %-6s ", tbuf.lname);
tbuf.lname[0] = 0;
printf("%-8s ", tbuf.cname);
ta = localtime(tbuf.datet);
printf("%2d:%2d:%2d (%l)\n",ta[2],ta[1],ta[0],
tbuf.bcput[1]+tbuf.bsyst[1]);
if(allflg) return;
if(ttyflg && *ap) return;
exit(0);
}