* Copyright (c) 1991, 1993
* The Regents of the University of California. All rights reserved.
* %sccs.include.redist.c%
static char copyright
[] =
"@(#) Copyright (c) 1991, 1993\n\
The Regents of the University of California. All rights reserved.\n";
static char sccsid
[] = "@(#)dmesg.c 8.1 (Berkeley) %G%";
#define KREAD(addr, var) \
kvm_read(kd, addr, &var, sizeof(var)) != sizeof(var)
register int ch
, newl
, skip
;
struct msgbuf
*bufp
, cur
;
while ((ch
= getopt(argc
, argv
, "M:N:")) != EOF
)
* Discard setgid privileges if not the running kernel so that bad
* guys can't print interesting stuff from kernel memory.
if (memf
!= NULL
|| nlistf
!= NULL
)
/* Read in kernel message buffer, do sanity checks. */
if ((kd
= kvm_open(nlistf
, memf
, NULL
, O_RDONLY
, "dmesg")) == NULL
)
if (kvm_nlist(kd
, nl
) == -1)
errx(1, "kvm_nlist: %s", kvm_geterr(kd
));
if (nl
[X_MSGBUF
].n_type
== 0)
errx(1, "%s: msgbufp not found", nlistf
? nlistf
: "namelist");
if (KREAD(nl
[X_MSGBUF
].n_value
, bufp
) || KREAD((long)bufp
, cur
))
errx(1, "kvm_read: %s", kvm_geterr(kd
));
if (cur
.msg_magic
!= MSG_MAGIC
)
errx(1, "magic number incorrect");
if (cur
.msg_bufx
>= MSG_BSIZE
)
* The message buffer is circular; start at the read pointer, and
* go to the write pointer - 1.
p
= cur
.msg_bufc
+ cur
.msg_bufx
;
ep
= cur
.msg_bufc
+ cur
.msg_bufx
- 1;
for (newl
= skip
= 0; p
!= ep
; ++p
) {
if (p
== cur
.msg_bufc
+ MSG_BSIZE
)
/* Skip "\n<.*>" syslog sequences. */
(void)vis(buf
, ch
, 0, 0);
(void)fprintf(stderr
, "usage: dmesg [-M core] [-N system]\n");