|
|
researchv8 Dan Cross
static char *sccsid = "@(#)dmesg.c 4.3 (Berkeley) 2/28/81";
/*
* Suck up system messages
* dmesg
* print current buffer
* dmesg -
* print and update incremental history
*/
#include <stdio.h>
#include <sys/param.h>
#include <nlist.h>
#include <signal.h>
#include <sys/vm.h>
#include <sys/msgbuf.h>
struct msgbuf msgbuf;
char *msgbufp;
int sflg;
int wflg;
struct msgbuf omesg;
struct nlist nl[2] = {
{ "_msgbuf" },
{ 0 }
};
#define BUFFER "/usr/adm/msgbuf"
main(argc, argv)
char **argv;
{
int mem;
register char *mp, *omp, *mstart;
int timeout();
int samef;
signal(SIGALRM, timeout);
alarm(60);
if (argc>1 && argv[1][0] == '-') {
sflg++;
switch (argv[1][1]) {
default: /* ugh */
wflg++;
break;
case 'i':
break;
}
argc--;
argv++;
}
if (sflg)
openbuf();
sflg = 0;
timeout("can't read namelist\n");
nlist(argc>2? argv[2]:"/unix", nl);
if (nl[0].n_type==0)
done("No namelist\n");
if ((mem = open((argc>1? argv[1]: "/dev/kmem"), 0)) < 0)
done("No /dev/kmem\n");
lseek(mem, (long)nl[0].n_value, 0);
read(mem, &msgbuf, sizeof (msgbuf));
if (msgbuf.msg_magic != MSG_MAGIC)
done("Magic number wrong (namelist mismatch?)\n");
mstart = &msgbuf.msg_bufc[omesg.msg_bufx];
omp = &omesg.msg_bufc[msgbuf.msg_bufx];
mp = msgbufp = &msgbuf.msg_bufc[msgbuf.msg_bufx];
samef = 1;
do {
if (*mp++ != *omp++) {
mstart = msgbufp;
samef = 0;
pdate();
printf("...\n");
break;
}
if (mp == &msgbuf.msg_bufc[MSG_BSIZE])
mp = msgbuf.msg_bufc;
if (omp == &omesg.msg_bufc[MSG_BSIZE])
omp = omesg.msg_bufc;
} while (mp != mstart);
if (samef && omesg.msg_bufx == msgbuf.msg_bufx)
exit(0);
mp = mstart;
do {
pdate();
if (*mp && (*mp & 0200) == 0)
putchar(*mp);
mp++;
if (mp == &msgbuf.msg_bufc[MSG_BSIZE])
mp = msgbuf.msg_bufc;
} while (mp != msgbufp);
done((char *)NULL);
}
done(s)
char *s;
{
register char *p, *q;
if (s && s!=(char *)omesg.msg_magic && sflg==0) {
pdate();
printf(s);
}
if (wflg)
writebuf();
exit(s!=NULL);
}
openbuf()
{
int f;
timeout("can't read buffer file\n");
if ((f = open(BUFFER, 0)) < 0)
return;
if (read(f, (char *)&omesg, sizeof(omesg)) != sizeof(omesg)
|| omesg.msg_magic != MSG_MAGIC)
zero((char *)&omesg, sizeof(omesg));
close(f);
}
writebuf()
{
int f;
timeout("can't write buffer file\n");
if ((f = open(BUFFER, 1)) < 0)
done("can't open buffer\n");
if (write(f, (char *)&msgbuf, sizeof(msgbuf)) != sizeof(msgbuf))
done("error writing buffer\n");
close(f);
}
pdate()
{
extern char *ctime();
static firstime;
time_t tbuf;
if (firstime==0) {
firstime++;
time(&tbuf);
printf("\n%.12s\n", ctime(&tbuf)+4);
}
}
zero(b, n)
register char *b;
register int n;
{
while (--n >= 0)
*b++ = 0;
}
char *terr;
timeout(s)
char *s;
{
extern ttrap();
terr = s;
signal(SIGALRM, ttrap);
alarm(60);
}
ttrap()
{
char buf[100];
sprintf(buf, "timeout: %s", terr);
done(buf);
}
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.