16019Swnj /* 222058Sdist * Copyright (c) 1980 Regents of the University of California. 322058Sdist * All rights reserved. The Berkeley software License Agreement 422058Sdist * specifies the terms and conditions for redistribution. 522058Sdist */ 622058Sdist 722058Sdist #ifndef lint 8*26261Skarels static char sccsid[] = "@(#)dmesg.c 5.4 (Berkeley) 02/20/86"; 922058Sdist #endif not lint 1022058Sdist 1122058Sdist /* 126019Swnj * Suck up system messages 136019Swnj * dmesg 146019Swnj * print current buffer 156019Swnj * dmesg - 166019Swnj * print and update incremental history 176019Swnj */ 186019Swnj 196019Swnj #include <stdio.h> 206019Swnj #include <sys/param.h> 216019Swnj #include <nlist.h> 226019Swnj #include <signal.h> 2326141Skarels #include <sys/file.h> 246019Swnj #include <sys/vm.h> 256019Swnj #include <sys/msgbuf.h> 266019Swnj 276019Swnj struct msgbuf msgbuf; 286019Swnj char *msgbufp; 296019Swnj int sflg; 306019Swnj int of = -1; 316019Swnj 326019Swnj struct msgbuf omesg; 336019Swnj struct nlist nl[2] = { 346019Swnj { "_msgbuf" }, 3510075Ssam { "" } 366019Swnj }; 376019Swnj 386019Swnj main(argc, argv) 396019Swnj char **argv; 406019Swnj { 416019Swnj int mem; 426019Swnj register char *mp, *omp, *mstart; 4326141Skarels int samef, sawnl, ignore; 446019Swnj 456019Swnj if (argc>1 && argv[1][0] == '-') { 466019Swnj sflg++; 476019Swnj argc--; 486019Swnj argv++; 496019Swnj } 506019Swnj if (sflg) { 5126141Skarels of = open("/usr/adm/msgbuf", O_RDWR | O_CREAT, 0644); 5218257Sserge if (of < 0) 5318257Sserge done("Can't open /usr/adm/msgbuf\n"); 546019Swnj read(of, (char *)&omesg, sizeof(omesg)); 556019Swnj lseek(of, 0L, 0); 566019Swnj } 576019Swnj sflg = 0; 586019Swnj nlist(argc>2? argv[2]:"/vmunix", nl); 596019Swnj if (nl[0].n_type==0) 6018257Sserge done("Can't get kernel namelist\n"); 616019Swnj if ((mem = open((argc>1? argv[1]: "/dev/kmem"), 0)) < 0) 6218257Sserge done("Can't read kernel memory\n"); 636019Swnj lseek(mem, (long)nl[0].n_value, 0); 646019Swnj read(mem, &msgbuf, sizeof (msgbuf)); 656019Swnj if (msgbuf.msg_magic != MSG_MAGIC) 666019Swnj done("Magic number wrong (namelist mismatch?)\n"); 6726166Skarels if (msgbuf.msg_bufx >= MSG_BSIZE) 6826166Skarels msgbuf.msg_bufx = 0; 69*26261Skarels if (omesg.msg_bufx >= MSG_BSIZE) 70*26261Skarels omesg.msg_bufx = 0; 716019Swnj mstart = &msgbuf.msg_bufc[omesg.msg_bufx]; 726019Swnj omp = &omesg.msg_bufc[msgbuf.msg_bufx]; 736019Swnj mp = msgbufp = &msgbuf.msg_bufc[msgbuf.msg_bufx]; 746019Swnj samef = 1; 756019Swnj do { 766019Swnj if (*mp++ != *omp++) { 776019Swnj mstart = msgbufp; 786019Swnj samef = 0; 796019Swnj pdate(); 806019Swnj printf("...\n"); 816019Swnj break; 826019Swnj } 8326166Skarels if (mp >= &msgbuf.msg_bufc[MSG_BSIZE]) 846019Swnj mp = msgbuf.msg_bufc; 8526166Skarels if (omp >= &omesg.msg_bufc[MSG_BSIZE]) 866019Swnj omp = omesg.msg_bufc; 876019Swnj } while (mp != mstart); 886019Swnj if (samef && omesg.msg_bufx == msgbuf.msg_bufx) 896019Swnj exit(0); 906019Swnj mp = mstart; 9126141Skarels pdate(); 9226141Skarels sawnl = 1; 936019Swnj do { 9426141Skarels if (sawnl && *mp == '<') 9526141Skarels ignore = 1; 9626141Skarels if (*mp && (*mp & 0200) == 0 && !ignore) 976019Swnj putchar(*mp); 9826141Skarels if (ignore && *mp == '>') 9926141Skarels ignore = 0; 10026141Skarels sawnl = (*mp == '\n'); 1016019Swnj mp++; 10226166Skarels if (mp >= &msgbuf.msg_bufc[MSG_BSIZE]) 1036019Swnj mp = msgbuf.msg_bufc; 1046019Swnj } while (mp != msgbufp); 1056019Swnj done((char *)NULL); 1066019Swnj } 1076019Swnj 1086019Swnj done(s) 1096019Swnj char *s; 1106019Swnj { 1116019Swnj register char *p, *q; 1126019Swnj 11326141Skarels if (s) { 1146019Swnj pdate(); 1156019Swnj printf(s); 11626141Skarels } else if (of != -1) 11726141Skarels write(of, (char *)&msgbuf, sizeof(msgbuf)); 1186019Swnj exit(s!=NULL); 1196019Swnj } 1206019Swnj 1216019Swnj pdate() 1226019Swnj { 1236019Swnj extern char *ctime(); 1246019Swnj static firstime; 1256019Swnj time_t tbuf; 1266019Swnj 1276019Swnj if (firstime==0) { 1286019Swnj firstime++; 1296019Swnj time(&tbuf); 1306019Swnj printf("\n%.12s\n", ctime(&tbuf)+4); 1316019Swnj } 1326019Swnj } 133