1: /*
2: * Copyright (c) 1980 Regents of the University of California.
3: * All rights reserved. The Berkeley software License Agreement
4: * specifies the terms and conditions for redistribution.
5: */
6:
7: #if defined(DOSCCS) && !defined(lint)
8: static char sccsid[] = "@(#)dmesg.c 5.4.1 (2.11BSD GTE) 1/1/94";
9: #endif
10:
11: /*
12: * Suck up system messages
13: * dmesg
14: * print current buffer
15: * dmesg -
16: * print and update incremental history
17: */
18:
19: #include <stdio.h>
20: #include <sys/param.h>
21: #include <nlist.h>
22: #include <signal.h>
23: #include <sys/file.h>
24: #include <sys/vm.h>
25: #include <sys/msgbuf.h>
26:
27: struct msgbuf msgbuf;
28: char *msgbufp;
29: int sflg;
30: int of = -1;
31:
32: struct msgbuf omesg;
33: struct nlist nl[2] = {
34: { "_msgbuf" },
35: { "" }
36: };
37:
38: main(argc, argv)
39: char **argv;
40: {
41: int mem;
42: register char *mp, *omp, *mstart;
43: int samef, sawnl, ignore;
44: #ifdef pdp11
45: char msgb[MSG_BSIZE];
46: #endif
47:
48: if (argc>1 && argv[1][0] == '-') {
49: sflg++;
50: argc--;
51: argv++;
52: }
53: if (sflg) {
54: of = open("/usr/adm/msgbuf", O_RDWR | O_CREAT, 0644);
55: if (of < 0)
56: done("Can't open /usr/adm/msgbuf\n");
57: read(of, (char *)&omesg, sizeof(omesg));
58: lseek(of, 0L, 0);
59: }
60: sflg = 0;
61: #ifdef pdp11
62: nlist(argc>2? argv[2]:"/unix", nl);
63: #else
64: nlist(argc>2? argv[2]:"/vmunix", nl);
65: #endif
66: if (nl[0].n_type==0)
67: done("Can't get kernel namelist\n");
68: if ((mem = open((argc>1? argv[1]: "/dev/mem"), 0)) < 0)
69: done("Can't read kernel memory\n");
70: lseek(mem, (long)nl[0].n_value, 0);
71: read(mem, &msgbuf, sizeof (msgbuf));
72: if (msgbuf.msg_magic != MSG_MAGIC)
73: done("Magic number wrong (namelist mismatch?)\n");
74: if (msgbuf.msg_bufx >= MSG_BSIZE)
75: msgbuf.msg_bufx = 0;
76: if (omesg.msg_bufx >= MSG_BSIZE)
77: omesg.msg_bufx = 0;
78: #ifdef pdp11
79: msgbuf.msg_bufc = msgb;
80: lseek(mem, (long)ctob((long)msgbuf.msg_click), 0);
81: read(mem, msgbuf.msg_bufc, MSG_BSIZE);
82: #endif
83: mstart = &msgbuf.msg_bufc[omesg.msg_bufx];
84: omp = &omesg.msg_bufc[msgbuf.msg_bufx];
85: mp = msgbufp = &msgbuf.msg_bufc[msgbuf.msg_bufx];
86: samef = 1;
87: do {
88: if (*mp++ != *omp++) {
89: mstart = msgbufp;
90: samef = 0;
91: pdate();
92: printf("...\n");
93: break;
94: }
95: if (mp >= &msgbuf.msg_bufc[MSG_BSIZE])
96: mp = msgbuf.msg_bufc;
97: if (omp >= &omesg.msg_bufc[MSG_BSIZE])
98: omp = omesg.msg_bufc;
99: } while (mp != mstart);
100: if (samef && omesg.msg_bufx == msgbuf.msg_bufx)
101: exit(0);
102: mp = mstart;
103: pdate();
104: sawnl = 1;
105: do {
106: if (sawnl && *mp == '<')
107: ignore = 1;
108: if (*mp && (*mp & 0200) == 0 && !ignore)
109: putchar(*mp);
110: if (ignore && *mp == '>')
111: ignore = 0;
112: sawnl = (*mp == '\n');
113: mp++;
114: if (mp >= &msgbuf.msg_bufc[MSG_BSIZE])
115: mp = msgbuf.msg_bufc;
116: } while (mp != msgbufp);
117: done((char *)NULL);
118: }
119:
120: done(s)
121: char *s;
122: {
123: register char *p, *q;
124:
125: if (s) {
126: pdate();
127: printf(s);
128: } else if (of != -1)
129: write(of, (char *)&msgbuf, sizeof(msgbuf));
130: exit(s!=NULL);
131: }
132:
133: pdate()
134: {
135: extern char *ctime();
136: static firstime;
137: time_t tbuf;
138:
139: if (firstime==0) {
140: firstime++;
141: time(&tbuf);
142: printf("\n%.12s\n", ctime(&tbuf)+4);
143: }
144: }
Defined functions
done
defined in line
120; used 5 times
main
defined in line
38;
never used
Defined variables
msgbuf
defined in line
27; used 19 times
nl
defined in line
33; used 4 times
of
defined in line
30; used 6 times
omesg
defined in line
32; used 9 times
sccsid
defined in line
8;
never used
sflg
defined in line
29; used 3 times