summaryrefslogtreecommitdiffstats
path: root/sbin/dmesg
diff options
context:
space:
mode:
authortmm <tmm@FreeBSD.org>2001-07-03 19:49:31 +0000
committertmm <tmm@FreeBSD.org>2001-07-03 19:49:31 +0000
commit71a96b46d0f87dc3a900df8ba9bcfd9771ef40e2 (patch)
treee6a415c76c8571453f2732332de9c928d83bb928 /sbin/dmesg
parent6dd375961b07fa6608ebb267904bfd314b0e4c55 (diff)
downloadFreeBSD-src-71a96b46d0f87dc3a900df8ba9bcfd9771ef40e2.zip
FreeBSD-src-71a96b46d0f87dc3a900df8ba9bcfd9771ef40e2.tar.gz
Use the kern.msgbuf sysctl to get the message buffer on a running
kernel, and remove setgid kmem, which is not needed any more.
Diffstat (limited to 'sbin/dmesg')
-rw-r--r--sbin/dmesg/Makefile2
-rw-r--r--sbin/dmesg/dmesg.c74
2 files changed, 44 insertions, 32 deletions
diff --git a/sbin/dmesg/Makefile b/sbin/dmesg/Makefile
index f73c99b..7779563 100644
--- a/sbin/dmesg/Makefile
+++ b/sbin/dmesg/Makefile
@@ -3,8 +3,6 @@
PROG= dmesg
MAN= dmesg.8
-BINGRP= kmem
-BINMODE=2555
LDADD= -lkvm
DPADD= ${LIBKVM}
diff --git a/sbin/dmesg/dmesg.c b/sbin/dmesg/dmesg.c
index 541e9df..6af42e7 100644
--- a/sbin/dmesg/dmesg.c
+++ b/sbin/dmesg/dmesg.c
@@ -45,7 +45,9 @@ static const char rcsid[] =
"$FreeBSD$";
#endif /* not lint */
+#include <sys/types.h>
#include <sys/msgbuf.h>
+#include <sys/sysctl.h>
#include <err.h>
#include <fcntl.h>
@@ -81,6 +83,8 @@ main(argc, argv)
char buf[5];
int all = 0;
int pri;
+ size_t buflen;
+ int bufpos;
(void) setlocale(LC_CTYPE, "");
memf = nlistf = NULL;
@@ -102,33 +106,43 @@ main(argc, argv)
argc -= optind;
argv += optind;
- /*
- * 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)
- setgid(getgid());
-
- /* Read in kernel message buffer, do sanity checks. */
- if ((kd = kvm_open(nlistf, memf, NULL, O_RDONLY, "dmesg")) == NULL)
- exit (1);
- 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, "kernel message buffer has different magic number");
- bp = malloc(cur.msg_size);
- if (!bp)
- errx(1, "malloc failed");
- if (kvm_read(kd, (long)cur.msg_ptr, bp, cur.msg_size) !=
- cur.msg_size)
- errx(1, "kvm_read: %s", kvm_geterr(kd));
- if (cur.msg_bufx >= cur.msg_size)
- cur.msg_bufx = 0;
- kvm_close(kd);
+ if (memf == NULL && nlistf == NULL) {
+ /* Running kernel. Use sysctl. */
+ if (sysctlbyname("kern.msgbuf", NULL, &buflen, NULL, 0) == -1)
+ err(1, "sysctl kern.msgbuf");
+ if ((bp = malloc(buflen)) == NULL)
+ errx(1, "malloc failed");
+ if (sysctlbyname("kern.msgbuf", bp, &buflen, NULL, 0) == -1)
+ err(1, "sysctl kern.msgbuf");
+ /* We get a dewrapped buffer using sysctl. */
+ bufpos = 0;
+ } else {
+ /* Read in kernel message buffer, do sanity checks. */
+ kd = kvm_open(nlistf, memf, NULL, O_RDONLY, "dmesg");
+ if (kd == NULL)
+ exit (1);
+ 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, "kernel message buffer has different magic "
+ "number");
+ bp = malloc(cur.msg_size);
+ if (!bp)
+ errx(1, "malloc failed");
+ if (kvm_read(kd, (long)cur.msg_ptr, bp, cur.msg_size) !=
+ cur.msg_size)
+ errx(1, "kvm_read: %s", kvm_geterr(kd));
+ kvm_close(kd);
+ buflen = cur.msg_size;
+ bufpos = cur.msg_bufx;
+ if (bufpos >= buflen)
+ bufpos = 0;
+ }
/*
* The message buffer is circular. If the buffer has wrapped, the
@@ -137,11 +151,11 @@ main(argc, argv)
* buffer starting at the write pointer and ignore nulls so that
* we effectively start at the oldest data.
*/
- p = bp + cur.msg_bufx;
- ep = (cur.msg_bufx == 0 ? bp + cur.msg_size : p);
+ p = bp + bufpos;
+ ep = (bufpos == 0 ? bp + buflen : p);
newl = skip = 0;
do {
- if (p == bp + cur.msg_size)
+ if (p == bp + buflen)
p = bp;
ch = *p;
/* Skip "\n<.*>" syslog sequences. */
OpenPOWER on IntegriCloud