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*37263Sbostic static char sccsid[] = "@(#)dmesg.c 5.6 (Berkeley) 04/02/89"; 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 <sys/param.h> 20*37263Sbostic #include <sys/signal.h> 2126141Skarels #include <sys/file.h> 226019Swnj #include <sys/vm.h> 236019Swnj #include <sys/msgbuf.h> 24*37263Sbostic #include <nlist.h> 25*37263Sbostic #include <stdio.h> 26*37263Sbostic #include "pathnames.h" 276019Swnj 286019Swnj struct msgbuf msgbuf; 296019Swnj char *msgbufp; 306019Swnj int sflg; 316019Swnj int of = -1; 326019Swnj 336019Swnj struct msgbuf omesg; 346019Swnj struct nlist nl[2] = { 356019Swnj { "_msgbuf" }, 3610075Ssam { "" } 376019Swnj }; 386019Swnj 396019Swnj main(argc, argv) 406019Swnj char **argv; 416019Swnj { 426019Swnj int mem; 436019Swnj register char *mp, *omp, *mstart; 4433414Sbostic int samef, sawnl, ignore = 0; 456019Swnj 466019Swnj if (argc>1 && argv[1][0] == '-') { 476019Swnj sflg++; 486019Swnj argc--; 496019Swnj argv++; 506019Swnj } 516019Swnj if (sflg) { 52*37263Sbostic of = open(_PATH_MSGBUF, O_RDWR | O_CREAT, 0644); 5318257Sserge if (of < 0) 54*37263Sbostic done("Can't open msgbuf file\n"); 556019Swnj read(of, (char *)&omesg, sizeof(omesg)); 566019Swnj lseek(of, 0L, 0); 576019Swnj } 586019Swnj sflg = 0; 59*37263Sbostic nlist(argc>2? argv[2]:_PATH_VMUNIX, nl); 606019Swnj if (nl[0].n_type==0) 6118257Sserge done("Can't get kernel namelist\n"); 62*37263Sbostic if ((mem = open((argc>1? argv[1]: _PATH_KMEM), 0)) < 0) 6318257Sserge done("Can't read kernel memory\n"); 646019Swnj lseek(mem, (long)nl[0].n_value, 0); 656019Swnj read(mem, &msgbuf, sizeof (msgbuf)); 666019Swnj if (msgbuf.msg_magic != MSG_MAGIC) 676019Swnj done("Magic number wrong (namelist mismatch?)\n"); 6826166Skarels if (msgbuf.msg_bufx >= MSG_BSIZE) 6926166Skarels msgbuf.msg_bufx = 0; 7026261Skarels if (omesg.msg_bufx >= MSG_BSIZE) 7126261Skarels omesg.msg_bufx = 0; 726019Swnj mstart = &msgbuf.msg_bufc[omesg.msg_bufx]; 736019Swnj omp = &omesg.msg_bufc[msgbuf.msg_bufx]; 746019Swnj mp = msgbufp = &msgbuf.msg_bufc[msgbuf.msg_bufx]; 756019Swnj samef = 1; 766019Swnj do { 776019Swnj if (*mp++ != *omp++) { 786019Swnj mstart = msgbufp; 796019Swnj samef = 0; 806019Swnj pdate(); 816019Swnj printf("...\n"); 826019Swnj break; 836019Swnj } 8426166Skarels if (mp >= &msgbuf.msg_bufc[MSG_BSIZE]) 856019Swnj mp = msgbuf.msg_bufc; 8626166Skarels if (omp >= &omesg.msg_bufc[MSG_BSIZE]) 876019Swnj omp = omesg.msg_bufc; 886019Swnj } while (mp != mstart); 896019Swnj if (samef && omesg.msg_bufx == msgbuf.msg_bufx) 906019Swnj exit(0); 916019Swnj mp = mstart; 9226141Skarels pdate(); 9326141Skarels sawnl = 1; 946019Swnj do { 9526141Skarels if (sawnl && *mp == '<') 9626141Skarels ignore = 1; 9726141Skarels if (*mp && (*mp & 0200) == 0 && !ignore) 986019Swnj putchar(*mp); 9926141Skarels if (ignore && *mp == '>') 10026141Skarels ignore = 0; 10126141Skarels sawnl = (*mp == '\n'); 1026019Swnj mp++; 10326166Skarels if (mp >= &msgbuf.msg_bufc[MSG_BSIZE]) 1046019Swnj mp = msgbuf.msg_bufc; 1056019Swnj } while (mp != msgbufp); 1066019Swnj done((char *)NULL); 1076019Swnj } 1086019Swnj 1096019Swnj done(s) 1106019Swnj char *s; 1116019Swnj { 11226141Skarels if (s) { 1136019Swnj pdate(); 1146019Swnj printf(s); 11526141Skarels } else if (of != -1) 11626141Skarels write(of, (char *)&msgbuf, sizeof(msgbuf)); 1176019Swnj exit(s!=NULL); 1186019Swnj } 1196019Swnj 1206019Swnj pdate() 1216019Swnj { 1226019Swnj extern char *ctime(); 1236019Swnj static firstime; 1246019Swnj time_t tbuf; 1256019Swnj 1266019Swnj if (firstime==0) { 1276019Swnj firstime++; 1286019Swnj time(&tbuf); 1296019Swnj printf("\n%.12s\n", ctime(&tbuf)+4); 1306019Swnj } 1316019Swnj } 132