xref: /original-bsd/sbin/dmesg/dmesg.c (revision 0b685140)
1 static char *sccsid = "@(#)dmesg.c	4.1 (Berkeley) 82/03/01";
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 	{ 0 }
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 		read(of, (char *)&omesg, sizeof(omesg));
46 		lseek(of, 0L, 0);
47 	}
48 	sflg = 0;
49 	nlist(argc>2? argv[2]:"/vmunix", nl);
50 	if (nl[0].n_type==0)
51 		done("No namelist\n");
52 	if ((mem = open((argc>1? argv[1]: "/dev/kmem"), 0)) < 0)
53 		done("No mem\n");
54 	lseek(mem, (long)nl[0].n_value, 0);
55 	read(mem, &msgbuf, sizeof (msgbuf));
56 	if (msgbuf.msg_magic != MSG_MAGIC)
57 		done("Magic number wrong (namelist mismatch?)\n");
58 	mstart = &msgbuf.msg_bufc[omesg.msg_bufx];
59 	omp = &omesg.msg_bufc[msgbuf.msg_bufx];
60 	mp = msgbufp = &msgbuf.msg_bufc[msgbuf.msg_bufx];
61 	samef = 1;
62 	do {
63 		if (*mp++ != *omp++) {
64 			mstart = msgbufp;
65 			samef = 0;
66 			pdate();
67 			printf("...\n");
68 			break;
69 		}
70 		if (mp == &msgbuf.msg_bufc[MSG_BSIZE])
71 			mp = msgbuf.msg_bufc;
72 		if (omp == &omesg.msg_bufc[MSG_BSIZE])
73 			omp = omesg.msg_bufc;
74 	} while (mp != mstart);
75 	if (samef && omesg.msg_bufx == msgbuf.msg_bufx)
76 		exit(0);
77 	mp = mstart;
78 	do {
79 		pdate();
80 		if (*mp && (*mp & 0200) == 0)
81 			putchar(*mp);
82 		mp++;
83 		if (mp == &msgbuf.msg_bufc[MSG_BSIZE])
84 			mp = msgbuf.msg_bufc;
85 	} while (mp != msgbufp);
86 	done((char *)NULL);
87 }
88 
89 done(s)
90 char *s;
91 {
92 	register char *p, *q;
93 
94 	if (s && s!=(char *)omesg.msg_magic && sflg==0) {
95 		pdate();
96 		printf(s);
97 	}
98 	write(of, (char *)&msgbuf, sizeof(msgbuf));
99 	exit(s!=NULL);
100 }
101 
102 pdate()
103 {
104 	extern char *ctime();
105 	static firstime;
106 	time_t tbuf;
107 
108 	if (firstime==0) {
109 		firstime++;
110 		time(&tbuf);
111 		printf("\n%.12s\n", ctime(&tbuf)+4);
112 	}
113 }
114 
115 timeout()
116 {
117 	done("Buffer file screwed up\n");
118 }
119