|
|
1.1 ! root 1: static char *sccsid = "@(#)dmesg.c 4.3 (Berkeley) 2/28/81"; ! 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: #include <sys/vm.h> ! 15: #include <sys/msgbuf.h> ! 16: ! 17: struct msgbuf msgbuf; ! 18: char *msgbufp; ! 19: int sflg; ! 20: int wflg; ! 21: ! 22: struct msgbuf omesg; ! 23: struct nlist nl[2] = { ! 24: { "_msgbuf" }, ! 25: { 0 } ! 26: }; ! 27: ! 28: #define BUFFER "/usr/adm/msgbuf" ! 29: ! 30: main(argc, argv) ! 31: char **argv; ! 32: { ! 33: int mem; ! 34: register char *mp, *omp, *mstart; ! 35: int timeout(); ! 36: int samef; ! 37: ! 38: signal(SIGALRM, timeout); ! 39: alarm(60); ! 40: if (argc>1 && argv[1][0] == '-') { ! 41: sflg++; ! 42: switch (argv[1][1]) { ! 43: default: /* ugh */ ! 44: wflg++; ! 45: break; ! 46: ! 47: case 'i': ! 48: break; ! 49: } ! 50: argc--; ! 51: argv++; ! 52: } ! 53: if (sflg) ! 54: openbuf(); ! 55: sflg = 0; ! 56: timeout("can't read namelist\n"); ! 57: nlist(argc>2? argv[2]:"/unix", nl); ! 58: if (nl[0].n_type==0) ! 59: done("No namelist\n"); ! 60: if ((mem = open((argc>1? argv[1]: "/dev/kmem"), 0)) < 0) ! 61: done("No /dev/kmem\n"); ! 62: lseek(mem, (long)nl[0].n_value, 0); ! 63: read(mem, &msgbuf, sizeof (msgbuf)); ! 64: if (msgbuf.msg_magic != MSG_MAGIC) ! 65: done("Magic number wrong (namelist mismatch?)\n"); ! 66: mstart = &msgbuf.msg_bufc[omesg.msg_bufx]; ! 67: omp = &omesg.msg_bufc[msgbuf.msg_bufx]; ! 68: mp = msgbufp = &msgbuf.msg_bufc[msgbuf.msg_bufx]; ! 69: samef = 1; ! 70: do { ! 71: if (*mp++ != *omp++) { ! 72: mstart = msgbufp; ! 73: samef = 0; ! 74: pdate(); ! 75: printf("...\n"); ! 76: break; ! 77: } ! 78: if (mp == &msgbuf.msg_bufc[MSG_BSIZE]) ! 79: mp = msgbuf.msg_bufc; ! 80: if (omp == &omesg.msg_bufc[MSG_BSIZE]) ! 81: omp = omesg.msg_bufc; ! 82: } while (mp != mstart); ! 83: if (samef && omesg.msg_bufx == msgbuf.msg_bufx) ! 84: exit(0); ! 85: mp = mstart; ! 86: do { ! 87: pdate(); ! 88: if (*mp && (*mp & 0200) == 0) ! 89: putchar(*mp); ! 90: mp++; ! 91: if (mp == &msgbuf.msg_bufc[MSG_BSIZE]) ! 92: mp = msgbuf.msg_bufc; ! 93: } while (mp != msgbufp); ! 94: done((char *)NULL); ! 95: } ! 96: ! 97: done(s) ! 98: char *s; ! 99: { ! 100: register char *p, *q; ! 101: ! 102: if (s && s!=(char *)omesg.msg_magic && sflg==0) { ! 103: pdate(); ! 104: printf(s); ! 105: } ! 106: if (wflg) ! 107: writebuf(); ! 108: exit(s!=NULL); ! 109: } ! 110: ! 111: openbuf() ! 112: { ! 113: int f; ! 114: ! 115: timeout("can't read buffer file\n"); ! 116: if ((f = open(BUFFER, 0)) < 0) ! 117: return; ! 118: if (read(f, (char *)&omesg, sizeof(omesg)) != sizeof(omesg) ! 119: || omesg.msg_magic != MSG_MAGIC) ! 120: zero((char *)&omesg, sizeof(omesg)); ! 121: close(f); ! 122: } ! 123: ! 124: writebuf() ! 125: { ! 126: int f; ! 127: ! 128: timeout("can't write buffer file\n"); ! 129: if ((f = open(BUFFER, 1)) < 0) ! 130: done("can't open buffer\n"); ! 131: if (write(f, (char *)&msgbuf, sizeof(msgbuf)) != sizeof(msgbuf)) ! 132: done("error writing buffer\n"); ! 133: close(f); ! 134: } ! 135: ! 136: pdate() ! 137: { ! 138: extern char *ctime(); ! 139: static firstime; ! 140: time_t tbuf; ! 141: ! 142: if (firstime==0) { ! 143: firstime++; ! 144: time(&tbuf); ! 145: printf("\n%.12s\n", ctime(&tbuf)+4); ! 146: } ! 147: } ! 148: ! 149: zero(b, n) ! 150: register char *b; ! 151: register int n; ! 152: { ! 153: ! 154: while (--n >= 0) ! 155: *b++ = 0; ! 156: } ! 157: ! 158: char *terr; ! 159: ! 160: timeout(s) ! 161: char *s; ! 162: { ! 163: extern ttrap(); ! 164: ! 165: terr = s; ! 166: signal(SIGALRM, ttrap); ! 167: alarm(60); ! 168: } ! 169: ! 170: ttrap() ! 171: { ! 172: char buf[100]; ! 173: ! 174: sprintf(buf, "timeout: %s", terr); ! 175: done(buf); ! 176: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.