|
|
1.1 ! root 1: /* ! 2: * Suck up system messages ! 3: * dmesg ! 4: * print current buffer ! 5: * dmesg - ! 6: * print and update incremental history ! 7: */ ! 8: ! 9: #include <stdio.h> ! 10: #include <sys/param.h> ! 11: #include <a.out.h> ! 12: #include <signal.h> ! 13: ! 14: char msgbuf[MSGBUFS]; ! 15: char *msgbufp; ! 16: int sflg; ! 17: int of = -1; ! 18: ! 19: struct { ! 20: char *omsgflg; ! 21: int omindex; ! 22: char omsgbuf[MSGBUFS]; ! 23: } omesg; ! 24: struct nlist nl[3] = { ! 25: {"_msgbuf"}, ! 26: {"_msgbufp"} ! 27: }; ! 28: ! 29: main(argc, argv) ! 30: char **argv; ! 31: { ! 32: int mem; ! 33: register char *mp, *omp, *mstart; ! 34: int timeout(); ! 35: int samef; ! 36: ! 37: signal(SIGALRM, timeout); ! 38: alarm(30); ! 39: if (argc>1 && argv[1][0] == '-') { ! 40: sflg++; ! 41: argc--; ! 42: argv++; ! 43: } ! 44: if (sflg) ! 45: of = open("/usr/adm/msgbuf", 2); ! 46: read(of, (char *)&omesg, sizeof(omesg)); ! 47: lseek(of, 0L, 0); ! 48: sflg = 0; ! 49: nlist(argc>2? argv[2]:"/vmunix", nl); ! 50: if (nl[0].n_type==0) ! 51: done("No namelist\n"); ! 52: if ((mem = open((argc>1? argv[1]: "/dev/kmem"), 0)) < 0) ! 53: done("No mem\n"); ! 54: lseek(mem, (long)nl[0].n_value, 0); ! 55: read(mem, msgbuf, MSGBUFS); ! 56: lseek(mem, (long)nl[1].n_value, 0); ! 57: read(mem, (char *)&msgbufp, sizeof(msgbufp)); ! 58: if (msgbufp < (char *)nl[0].n_value || msgbufp >= (char *)nl[0].n_value+MSGBUFS) ! 59: done("Namelist mismatch\n"); ! 60: msgbufp += msgbuf - (char *)nl[0].n_value; ! 61: mstart = &msgbuf[omesg.omindex]; ! 62: omp = &omesg.omsgbuf[msgbufp-msgbuf]; ! 63: mp = msgbufp; ! 64: samef = 1; ! 65: do { ! 66: if (*mp++ != *omp++) { ! 67: mstart = msgbufp; ! 68: samef = 0; ! 69: pdate(); ! 70: printf("...\n"); ! 71: break; ! 72: } ! 73: if (mp == &msgbuf[MSGBUFS]) ! 74: mp = msgbuf; ! 75: if (omp == &omesg.omsgbuf[MSGBUFS]) ! 76: omp = omesg.omsgbuf; ! 77: } while (mp != mstart); ! 78: if (samef && mstart == msgbufp) ! 79: exit(0); ! 80: mp = mstart; ! 81: do { ! 82: pdate(); ! 83: if (*mp) ! 84: putchar(*mp); ! 85: mp++; ! 86: if (mp == &msgbuf[MSGBUFS]) ! 87: mp = msgbuf; ! 88: } while (mp != msgbufp); ! 89: done((char *)NULL); ! 90: } ! 91: ! 92: done(s) ! 93: char *s; ! 94: { ! 95: register char *p, *q; ! 96: ! 97: if (s && s!=omesg.omsgflg && sflg==0) { ! 98: pdate(); ! 99: printf(s); ! 100: } ! 101: omesg.omsgflg = s; ! 102: q = omesg.omsgbuf; ! 103: for (p = msgbuf; p < &msgbuf[MSGBUFS]; ) ! 104: *q++ = *p++; ! 105: omesg.omindex = msgbufp - msgbuf; ! 106: write(of, (char *)&omesg, sizeof(omesg)); ! 107: exit(s!=NULL); ! 108: } ! 109: ! 110: pdate() ! 111: { ! 112: extern char *ctime(); ! 113: static firstime; ! 114: time_t tbuf; ! 115: ! 116: if (firstime==0) { ! 117: firstime++; ! 118: time(&tbuf); ! 119: printf("\n%.12s\n", ctime(&tbuf)+4); ! 120: } ! 121: } ! 122: ! 123: timeout() ! 124: { ! 125: done("Buffer file screwed up\n"); ! 126: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.