|
|
1.1 root 1: static char *sccsid = "@(#)dmesg.c 4.2 (Berkeley) 83/01/02";
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: read(of, (char *)&omesg, sizeof(omesg));
46: lseek(of, 0L, 0);
47: }
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, sizeof (msgbuf));
56: if (msgbuf.msg_magic != MSG_MAGIC)
57: done("Magic number wrong (namelist mismatch?)\n");
58: mstart = &msgbuf.msg_bufc[omesg.msg_bufx];
59: omp = &omesg.msg_bufc[msgbuf.msg_bufx];
60: mp = msgbufp = &msgbuf.msg_bufc[msgbuf.msg_bufx];
61: samef = 1;
62: do {
63: if (*mp++ != *omp++) {
64: mstart = msgbufp;
65: samef = 0;
66: pdate();
67: printf("...\n");
68: break;
69: }
70: if (mp == &msgbuf.msg_bufc[MSG_BSIZE])
71: mp = msgbuf.msg_bufc;
72: if (omp == &omesg.msg_bufc[MSG_BSIZE])
73: omp = omesg.msg_bufc;
74: } while (mp != mstart);
75: if (samef && omesg.msg_bufx == msgbuf.msg_bufx)
76: exit(0);
77: mp = mstart;
78: do {
79: pdate();
80: if (*mp && (*mp & 0200) == 0)
81: putchar(*mp);
82: mp++;
83: if (mp == &msgbuf.msg_bufc[MSG_BSIZE])
84: mp = msgbuf.msg_bufc;
85: } while (mp != msgbufp);
86: done((char *)NULL);
87: }
88:
89: done(s)
90: char *s;
91: {
92: register char *p, *q;
93:
94: if (s && s!=(char *)omesg.msg_magic && sflg==0) {
95: pdate();
96: printf(s);
97: }
98: write(of, (char *)&msgbuf, sizeof(msgbuf));
99: exit(s!=NULL);
100: }
101:
102: pdate()
103: {
104: extern char *ctime();
105: static firstime;
106: time_t tbuf;
107:
108: if (firstime==0) {
109: firstime++;
110: time(&tbuf);
111: printf("\n%.12s\n", ctime(&tbuf)+4);
112: }
113: }
114:
115: timeout()
116: {
117: done("Buffer file screwed up\n");
118: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.