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