|
|
1.1 root 1: static char *sccsid = "@(#)dmesg.c 4.1 (Berkeley) 10/1/80";
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:
15: char msgbuf[MSGBUFS];
16: char *msgbufp;
17: int sflg;
18: int of = -1;
19:
20: struct {
21: char *omsgflg;
22: int omindex;
23: char omsgbuf[MSGBUFS];
24: } omesg;
25: struct nlist nl[3] = {
26: { "_msgbuf" },
27: { "_msgbufp" },
28: { 0 }
29: };
30:
31: main(argc, argv)
32: char **argv;
33: {
34: int mem;
35: register char *mp, *omp, *mstart;
36: int timeout();
37: int samef;
38:
39: signal(SIGALRM, timeout);
40: alarm(30);
41: if (argc>1 && argv[1][0] == '-') {
42: sflg++;
43: argc--;
44: argv++;
45: }
46: if (sflg)
47: of = open("/usr/adm/msgbuf", 2);
48: read(of, (char *)&omesg, sizeof(omesg));
49: lseek(of, 0L, 0);
50: sflg = 0;
51: nlist(argc>2? argv[2]:"/vmunix", nl);
52: if (nl[0].n_type==0)
53: done("No namelist\n");
54: if ((mem = open((argc>1? argv[1]: "/dev/kmem"), 0)) < 0)
55: done("No mem\n");
56: lseek(mem, (long)nl[0].n_value, 0);
57: read(mem, msgbuf, MSGBUFS);
58: lseek(mem, (long)nl[1].n_value, 0);
59: read(mem, (char *)&msgbufp, sizeof(msgbufp));
60: if (msgbufp < (char *)nl[0].n_value || msgbufp >= (char *)nl[0].n_value+MSGBUFS)
61: done("Namelist mismatch\n");
62: msgbufp += msgbuf - (char *)nl[0].n_value;
63: mstart = &msgbuf[omesg.omindex];
64: omp = &omesg.omsgbuf[msgbufp-msgbuf];
65: mp = msgbufp;
66: samef = 1;
67: do {
68: if (*mp++ != *omp++) {
69: mstart = msgbufp;
70: samef = 0;
71: pdate();
72: printf("...\n");
73: break;
74: }
75: if (mp == &msgbuf[MSGBUFS])
76: mp = msgbuf;
77: if (omp == &omesg.omsgbuf[MSGBUFS])
78: omp = omesg.omsgbuf;
79: } while (mp != mstart);
80: if (samef && mstart == msgbufp)
81: exit(0);
82: mp = mstart;
83: do {
84: pdate();
85: if (*mp)
86: putchar(*mp);
87: mp++;
88: if (mp == &msgbuf[MSGBUFS])
89: mp = msgbuf;
90: } while (mp != msgbufp);
91: done((char *)NULL);
92: }
93:
94: done(s)
95: char *s;
96: {
97: register char *p, *q;
98:
99: if (s && s!=omesg.omsgflg && sflg==0) {
100: pdate();
101: printf(s);
102: }
103: omesg.omsgflg = s;
104: q = omesg.omsgbuf;
105: for (p = msgbuf; p < &msgbuf[MSGBUFS]; )
106: *q++ = *p++;
107: omesg.omindex = msgbufp - msgbuf;
108: write(of, (char *)&omesg, sizeof(omesg));
109: exit(s!=NULL);
110: }
111:
112: pdate()
113: {
114: extern char *ctime();
115: static firstime;
116: time_t tbuf;
117:
118: if (firstime==0) {
119: firstime++;
120: time(&tbuf);
121: printf("\n%.12s\n", ctime(&tbuf)+4);
122: }
123: }
124:
125: timeout()
126: {
127: done("Buffer file screwed up\n");
128: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.