BSD 3 development
[unix-history] / usr / src / cmd / dmesg.c
CommitLineData
42ddb7eb
BJ
1/*
2 * Suck up system messages
3 * dmesg
4 * print current buffer
5 * dmesg -
6 * print and update incremental history
7 */
8
9#include <stdio.h>
10#include <sys/param.h>
11#include <a.out.h>
12#include <signal.h>
13
14char msgbuf[MSGBUFS];
15char *msgbufp;
16int sflg;
17int of = -1;
18
19struct {
20 char *omsgflg;
21 int omindex;
22 char omsgbuf[MSGBUFS];
23} omesg;
24struct nlist nl[3] = {
25 {"_msgbuf"},
26 {"_msgbufp"}
27};
28
29main(argc, argv)
30char **argv;
31{
32 int mem;
33 register char *mp, *omp, *mstart;
34 int timeout();
35 int samef;
36
37 signal(SIGALRM, timeout);
38 alarm(30);
39 if (argc>1 && argv[1][0] == '-') {
40 sflg++;
41 argc--;
42 argv++;
43 }
44 if (sflg)
45 of = open("/usr/adm/msgbuf", 2);
46 read(of, (char *)&omesg, sizeof(omesg));
47 lseek(of, 0L, 0);
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, MSGBUFS);
56 lseek(mem, (long)nl[1].n_value, 0);
57 read(mem, (char *)&msgbufp, sizeof(msgbufp));
58 if (msgbufp < (char *)nl[0].n_value || msgbufp >= (char *)nl[0].n_value+MSGBUFS)
59 done("Namelist mismatch\n");
60 msgbufp += msgbuf - (char *)nl[0].n_value;
61 mstart = &msgbuf[omesg.omindex];
62 omp = &omesg.omsgbuf[msgbufp-msgbuf];
63 mp = msgbufp;
64 samef = 1;
65 do {
66 if (*mp++ != *omp++) {
67 mstart = msgbufp;
68 samef = 0;
69 pdate();
70 printf("...\n");
71 break;
72 }
73 if (mp == &msgbuf[MSGBUFS])
74 mp = msgbuf;
75 if (omp == &omesg.omsgbuf[MSGBUFS])
76 omp = omesg.omsgbuf;
77 } while (mp != mstart);
78 if (samef && mstart == msgbufp)
79 exit(0);
80 mp = mstart;
81 do {
82 pdate();
83 if (*mp)
84 putchar(*mp);
85 mp++;
86 if (mp == &msgbuf[MSGBUFS])
87 mp = msgbuf;
88 } while (mp != msgbufp);
89 done((char *)NULL);
90}
91
92done(s)
93char *s;
94{
95 register char *p, *q;
96
97 if (s && s!=omesg.omsgflg && sflg==0) {
98 pdate();
99 printf(s);
100 }
101 omesg.omsgflg = s;
102 q = omesg.omsgbuf;
103 for (p = msgbuf; p < &msgbuf[MSGBUFS]; )
104 *q++ = *p++;
105 omesg.omindex = msgbufp - msgbuf;
106 write(of, (char *)&omesg, sizeof(omesg));
107 exit(s!=NULL);
108}
109
110pdate()
111{
112 extern char *ctime();
113 static firstime;
114 time_t tbuf;
115
116 if (firstime==0) {
117 firstime++;
118 time(&tbuf);
119 printf("\n%.12s\n", ctime(&tbuf)+4);
120 }
121}
122
123timeout()
124{
125 done("Buffer file screwed up\n");
126}