|
|
1.1 root 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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.