From 71a96b46d0f87dc3a900df8ba9bcfd9771ef40e2 Mon Sep 17 00:00:00 2001 From: tmm Date: Tue, 3 Jul 2001 19:49:31 +0000 Subject: Use the kern.msgbuf sysctl to get the message buffer on a running kernel, and remove setgid kmem, which is not needed any more. --- sbin/dmesg/Makefile | 2 -- sbin/dmesg/dmesg.c | 74 +++++++++++++++++++++++++++++++---------------------- 2 files changed, 44 insertions(+), 32 deletions(-) (limited to 'sbin/dmesg') 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 #include +#include #include #include @@ -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. */ -- cgit v1.1