Commit | Line | Data |
---|---|---|
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 | ||
14 | char msgbuf[MSGBUFS]; | |
15 | char *msgbufp; | |
16 | int sflg; | |
17 | int of = -1; | |
18 | ||
19 | struct { | |
20 | char *omsgflg; | |
21 | int omindex; | |
22 | char omsgbuf[MSGBUFS]; | |
23 | } omesg; | |
24 | struct nlist nl[3] = { | |
25 | {"_msgbuf"}, | |
26 | {"_msgbufp"} | |
27 | }; | |
28 | ||
29 | main(argc, argv) | |
30 | char **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 | ||
92 | done(s) | |
93 | char *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 | ||
110 | pdate() | |
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 | ||
123 | timeout() | |
124 | { | |
125 | done("Buffer file screwed up\n"); | |
126 | } |