/* * Suck up system messages */ #include #include #include char msgbuf[MSGBUFS]; char *msgbufp; int sflg; int of = -1; struct { char *omsgflg; int omindex; char omsgbuf[MSGBUFS]; } omesg; struct nlist nl[3] = { {"_msgbuf"}, {"_msgbufp"} }; main(argc, argv) char **argv; { int mem; register char *mp, *omp, *mstart; int samef; if (argc>1 && argv[1][0] == '-') { sflg++; argc--; argv++; } if (sflg) of = open("/usr/adm/msgbuf", 2); read(of, (char *)&omesg, sizeof(omesg)); lseek(of, 0L, 0); sflg = 0; nlist(argc>2? argv[2]:"/unix", nl); if (nl[0].n_type==0) done("No namelist\n"); if ((mem = open((argc>1? argv[1]: "/dev/mem"), 0)) < 0) done("No mem\n"); lseek(mem, (long)nl[0].n_value, 0); read(mem, msgbuf, MSGBUFS); lseek(mem, (long)nl[1].n_value, 0); read(mem, (char *)&msgbufp, sizeof(msgbufp)); if (msgbufp < (char *)nl[0].n_value || msgbufp >= (char *)nl[0].n_value+MSGBUFS) done("Namelist mismatch\n"); msgbufp += msgbuf - (char *)nl[0].n_value; mstart = &msgbuf[omesg.omindex]; omp = &omesg.omsgbuf[msgbufp-msgbuf]; mp = msgbufp; samef = 1; do { if (*mp++ != *omp++) { mstart = msgbufp; samef = 0; pdate(); printf("...\n"); break; } if (mp == &msgbuf[MSGBUFS]) mp = msgbuf; if (omp == &omesg.omsgbuf[MSGBUFS]) omp = omesg.omsgbuf; } while (mp != mstart); if (samef && mstart == msgbufp) exit(0); mp = mstart; do { pdate(); if (*mp) putchar(*mp); mp++; if (mp == &msgbuf[MSGBUFS]) mp = msgbuf; } while (mp != msgbufp); done((char *)NULL); } done(s) char *s; { register char *p, *q; if (s && s!=omesg.omsgflg && sflg==0) { pdate(); printf(s); } omesg.omsgflg = s; q = omesg.omsgbuf; for (p = msgbuf; p < &msgbuf[MSGBUFS]; ) *q++ = *p++; omesg.omindex = msgbufp - msgbuf; write(of, (char *)&omesg, sizeof(omesg)); exit(s!=NULL); } pdate() { extern char *ctime(); static firstime; time_t tbuf; if (firstime==0) { firstime++; time(&tbuf); printf("\n%.12s\n", ctime(&tbuf)+4); } }