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