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