add rps and minfree arguments
[unix-history] / usr / src / sbin / dmesg / dmesg.c
CommitLineData
c10ca4d6 1static char *sccsid = "@(#)dmesg.c 4.2 (Berkeley) 83/01/02";
34a7981f
BJ
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
17struct msgbuf msgbuf;
18char *msgbufp;
19int sflg;
20int of = -1;
21
22struct msgbuf omesg;
23struct nlist nl[2] = {
24 { "_msgbuf" },
c10ca4d6 25 { "" }
34a7981f
BJ
26};
27
28main(argc, argv)
29char **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
89done(s)
90char *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
102pdate()
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
115timeout()
116{
117 done("Buffer file screwed up\n");
118}