8d6397d9bf79dc5cca48367acc2ebf0392180a1c
[unix-history] / usr / src / sbin / dmesg / dmesg.c
/*
* Copyright (c) 1980 Regents of the University of California.
* All rights reserved. The Berkeley software License Agreement
* specifies the terms and conditions for redistribution.
*/
#ifndef lint
static char sccsid[] = "@(#)dmesg.c 5.7 (Berkeley) %G%";
#endif not lint
/*
* Suck up system messages
* dmesg
* print current buffer
* dmesg -
* print and update incremental history
*/
#include <sys/param.h>
#include <sys/signal.h>
#include <sys/file.h>
#include <sys/vm.h>
#include <sys/msgbuf.h>
#include <nlist.h>
#include <stdio.h>
#include "pathnames.h"
struct msgbuf msgbuf;
char *msgbufp;
int sflg;
int of = -1;
struct msgbuf omesg;
struct nlist nl[2] = {
{ "_msgbuf" },
{ "" }
};
main(argc, argv)
char **argv;
{
int mem;
register char *mp, *omp, *mstart;
int samef, sawnl, ignore = 0;
if (argc>1 && argv[1][0] == '-') {
sflg++;
argc--;
argv++;
}
if (sflg) {
of = open(_PATH_MSGBUF, O_RDWR | O_CREAT, 0644);
if (of < 0)
done("Can't open msgbuf file\n");
read(of, (char *)&omesg, sizeof(omesg));
lseek(of, 0L, 0);
}
sflg = 0;
nlist(argc>2? argv[2]:_PATH_UNIX, nl);
if (nl[0].n_type==0)
done("Can't get kernel namelist\n");
if ((mem = open((argc>1? argv[1]: _PATH_KMEM), 0)) < 0)
done("Can't read kernel memory\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");
if (msgbuf.msg_bufx >= MSG_BSIZE)
msgbuf.msg_bufx = 0;
if (omesg.msg_bufx >= MSG_BSIZE)
omesg.msg_bufx = 0;
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;
pdate();
sawnl = 1;
do {
if (sawnl && *mp == '<')
ignore = 1;
if (*mp && (*mp & 0200) == 0 && !ignore)
putchar(*mp);
if (ignore && *mp == '>')
ignore = 0;
sawnl = (*mp == '\n');
mp++;
if (mp >= &msgbuf.msg_bufc[MSG_BSIZE])
mp = msgbuf.msg_bufc;
} while (mp != msgbufp);
done((char *)NULL);
}
done(s)
char *s;
{
if (s) {
pdate();
printf(s);
} else if (of != -1)
write(of, (char *)&msgbuf, sizeof(msgbuf));
exit(s!=NULL);
}
pdate()
{
extern char *ctime();
static firstime;
time_t tbuf;
if (firstime==0) {
firstime++;
time(&tbuf);
printf("\n%.12s\n", ctime(&tbuf)+4);
}
}