1 static char *sccsid = "@(#)dmesg.c 4.3 (Berkeley) 85/03/05"; 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 of = -1; 21 22 struct msgbuf omesg; 23 struct nlist nl[2] = { 24 { "_msgbuf" }, 25 { "" } 26 }; 27 28 main(argc, argv) 29 char **argv; 30 { 31 int mem; 32 register char *mp, *omp, *mstart; 33 int timeout(); 34 int samef; 35 36 signal(SIGALRM, timeout); 37 alarm(30); 38 if (argc>1 && argv[1][0] == '-') { 39 sflg++; 40 argc--; 41 argv++; 42 } 43 if (sflg) { 44 of = open("/usr/adm/msgbuf", 2); 45 if (of < 0) 46 done("Can't open /usr/adm/msgbuf\n"); 47 read(of, (char *)&omesg, sizeof(omesg)); 48 lseek(of, 0L, 0); 49 } 50 sflg = 0; 51 nlist(argc>2? argv[2]:"/vmunix", nl); 52 if (nl[0].n_type==0) 53 done("Can't get kernel namelist\n"); 54 if ((mem = open((argc>1? argv[1]: "/dev/kmem"), 0)) < 0) 55 done("Can't read kernel memory\n"); 56 lseek(mem, (long)nl[0].n_value, 0); 57 read(mem, &msgbuf, sizeof (msgbuf)); 58 if (msgbuf.msg_magic != MSG_MAGIC) 59 done("Magic number wrong (namelist mismatch?)\n"); 60 mstart = &msgbuf.msg_bufc[omesg.msg_bufx]; 61 omp = &omesg.msg_bufc[msgbuf.msg_bufx]; 62 mp = msgbufp = &msgbuf.msg_bufc[msgbuf.msg_bufx]; 63 samef = 1; 64 do { 65 if (*mp++ != *omp++) { 66 mstart = msgbufp; 67 samef = 0; 68 pdate(); 69 printf("...\n"); 70 break; 71 } 72 if (mp == &msgbuf.msg_bufc[MSG_BSIZE]) 73 mp = msgbuf.msg_bufc; 74 if (omp == &omesg.msg_bufc[MSG_BSIZE]) 75 omp = omesg.msg_bufc; 76 } while (mp != mstart); 77 if (samef && omesg.msg_bufx == msgbuf.msg_bufx) 78 exit(0); 79 mp = mstart; 80 do { 81 pdate(); 82 if (*mp && (*mp & 0200) == 0) 83 putchar(*mp); 84 mp++; 85 if (mp == &msgbuf.msg_bufc[MSG_BSIZE]) 86 mp = msgbuf.msg_bufc; 87 } while (mp != msgbufp); 88 done((char *)NULL); 89 } 90 91 done(s) 92 char *s; 93 { 94 register char *p, *q; 95 96 if (s && s!=(char *)omesg.msg_magic && sflg==0) { 97 pdate(); 98 printf(s); 99 } 100 write(of, (char *)&msgbuf, sizeof(msgbuf)); 101 exit(s!=NULL); 102 } 103 104 pdate() 105 { 106 extern char *ctime(); 107 static firstime; 108 time_t tbuf; 109 110 if (firstime==0) { 111 firstime++; 112 time(&tbuf); 113 printf("\n%.12s\n", ctime(&tbuf)+4); 114 } 115 } 116 117 timeout() 118 { 119 done("Buffer file screwed up\n"); 120 } 121