xref: /csrg-svn/sbin/dmesg/dmesg.c (revision 37263)
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