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