Add support for 'dmesg -c' which clears the dmesg buffer after it has

been printed.  This provides compatibility with other *nix systems
(including Linux).

While here use stdbool booleans for 'all'.

PR:		bin/178295
Submitted by:	Levent Serinol <lserinol@gmail.com>
Reviewed by:	will
This commit is contained in:
eadler 2013-05-10 03:42:48 +00:00
parent 9800f9b0a7
commit 56def3d68d
2 changed files with 18 additions and 6 deletions

View File

@ -36,7 +36,7 @@
.Nd "display the system message buffer"
.Sh SYNOPSIS
.Nm
.Op Fl a
.Op Fl ac
.Op Fl M Ar core Op Fl N Ar system
.Sh DESCRIPTION
The
@ -59,6 +59,8 @@ Show all data in the message buffer.
This includes any syslog records and
.Pa /dev/console
output.
.It Fl c
Clear the kernel buffer after printing.
.It Fl M
Extract values associated with the name list from the specified core.
.It Fl N

View File

@ -54,6 +54,7 @@ __FBSDID("$FreeBSD$");
#include <locale.h>
#include <nlist.h>
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
@ -79,15 +80,20 @@ main(int argc, char *argv[])
kvm_t *kd;
size_t buflen, bufpos;
long pri;
int all, ch;
int ch, clear;
bool all;
all = 0;
all = false;
clear = false;
(void) setlocale(LC_CTYPE, "");
memf = nlistf = NULL;
while ((ch = getopt(argc, argv, "aM:N:")) != -1)
while ((ch = getopt(argc, argv, "acM:N:")) != -1)
switch(ch) {
case 'a':
all++;
all = true;
break;
case 'c':
clear = true;
break;
case 'M':
memf = optarg;
@ -190,12 +196,16 @@ main(int argc, char *argv[])
(void)strvisx(visbp, p, nextp - p, 0);
(void)printf("%s", visbp);
}
if (clear)
if (sysctlbyname("kern.msgbuf_clear", NULL, NULL, &clear, sizeof(int)))
err(1, "sysctl kern.msgbuf_clear");
exit(0);
}
void
usage(void)
{
(void)fprintf(stderr, "usage: dmesg [-a] [-M core [-N system]]\n");
fprintf(stderr, "usage: dmesg [-ac] [-M core [-N system]]\n");
exit(1);
}