summaryrefslogtreecommitdiff
path: root/util-linux/dmesg.c
blob: 64265b473e6049a560f324ae2c70f0067570dbc1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
#include "internal.h"
#include <stdlib.h>
#include <unistd.h>
#include <time.h>

/* dmesg.c -- Print out the contents of the kernel ring buffer
 * Created: Sat Oct  9 16:19:47 1993
 * Revised: Thu Oct 28 21:52:17 1993 by faith@cs.unc.edu
 * Copyright 1993 Theodore Ts'o (tytso@athena.mit.edu)
 * This program comes with ABSOLUTELY NO WARRANTY.
 * Modifications by Rick Sladkey (jrs@world.std.com)
 * from util-linux; adapted for busybox
 */

#include <linux/unistd.h>
#include <stdio.h>

#define __NR_klog __NR_syslog

#if defined(__GLIBC__)
#include <sys/klog.h>
#define klog klogctl
#else
static inline _syscall3 (int, klog, int, type, char *, b, int, len)
#endif				/* __GLIBC__ */



static const char dmesg_usage[] = "dmesg [-c] [-n level]\n";

int dmesg_main (int argc, char **argv)
{

    char buf[4096];
    int i;
    int n;
    int level = 0;
    int lastc;
    int cmd = 3;

    argc--;
    argv++;

    /* Parse any options */
    while (argc && **argv == '-') {
	while (*++(*argv))
	    switch (**argv) {
	    case 'c':
		cmd = 4;
		break;
	    case 'n':
		cmd = 8;
		if (--argc == 0)
		    goto end;
		level = atoi (*(++argv));
		--argc;
		++argv;
		break;
	    default:
		goto end;
	    }
    }

    if (cmd == 8) {
	n = klog (cmd, NULL, level);
	if (n < 0) {
	    perror ("klog");
	    exit (FALSE);
	}
	exit (TRUE);
    }

    n = klog (cmd, buf, sizeof (buf));
    if (n < 0) {
	perror ("klog");
	exit (FALSE);
    }

    lastc = '\n';
    for (i = 0; i < n; i++) {
	if ((i == 0 || buf[i - 1] == '\n') && buf[i] == '<') {
	    i++;
	    while (buf[i] >= '0' && buf[i] <= '9')
		i++;
	    if (buf[i] == '>')
		i++;
	}
	lastc = buf[i];
	putchar (lastc);
    }
    if (lastc != '\n')
	putchar ('\n');
    exit (TRUE);

  end:
    fprintf (stderr, "Usage: %s\n", dmesg_usage);
    exit (FALSE);
}