Added sfdisk. Ststic-ified a bunch of stuff.
[oweals/busybox.git] / util-linux / dmesg.c
1 /* dmesg.c -- Print out the contents of the kernel ring buffer
2  * Created: Sat Oct  9 16:19:47 1993
3  * Revised: Thu Oct 28 21:52:17 1993 by faith@cs.unc.edu
4  * Copyright 1993 Theodore Ts'o (tytso@athena.mit.edu)
5  * This program comes with ABSOLUTELY NO WARRANTY.
6  * Modifications by Rick Sladkey (jrs@world.std.com)
7  * Larger buffersize 3 June 1998 by Nicolai Langfeldt, based on a patch
8  * by Peeter Joot.  This was also suggested by John Hudson.
9  * 1999-02-22 Arkadiusz Mi¶kiewicz <misiek@misiek.eu.org>
10  * - added Native Language Support
11  *
12  * from util-linux -- adapted for busybox by 
13  * Erik Andersen <andersee@debian.org>. I ripped out Native Language 
14  * Support, replaced getopt, added some gotos for redundant stuff.
15  */
16
17 #include "internal.h"
18 #include <linux/unistd.h>
19 #include <stdio.h>
20 #include <getopt.h>
21 #include <stdlib.h>
22
23 #if __GNU_LIBRARY__ < 5
24
25 #ifndef __alpha__
26 # define __NR_klogctl __NR_syslog
27   static inline _syscall3(int, klogctl, int, type, char *, b, int, len);
28 #else /* __alpha__ */
29 #define klogctl syslog
30 #endif
31
32 #else
33 # include <sys/klog.h>
34 #endif
35
36 static const char dmesg_usage[] = "dmesg [-c] [-n level] [-s bufsize]\n";
37
38 int dmesg_main( int argc, char** argv )
39 {
40    char *buf;
41    int  bufsize=8196;
42    int  i;
43    int  n;
44    int  level = 0;
45    int  lastc;
46    int  cmd = 3;
47
48     /* Parse any options */
49     while (argc && **argv == '-') {
50         while (*++(*argv))
51             switch (**argv) {
52             case 'c':
53                 cmd = 4;
54                 break;
55             case 'n':
56                 cmd = 8;
57                 if (--argc == 0)
58                     goto end;
59                 level = atoi (*(++argv));
60                 --argc;
61                 ++argv;
62                 break;
63             case 's':
64                 if (--argc == 0)
65                     goto end;
66                 bufsize = atoi (*(++argv));
67                 --argc;
68                 ++argv;
69                 break;
70             default:
71                 goto end;
72             }
73     }
74    
75    if (argc > 1) {
76         goto end;
77    }
78
79    if (cmd == 8) {
80       n = klogctl( cmd, NULL, level );
81       if (n < 0) {
82           goto klogctl_error;
83       }
84       exit( TRUE );
85    }
86
87    if (bufsize < 4096) bufsize = 4096;
88    buf = (char*)malloc(bufsize);
89    n = klogctl( cmd, buf, bufsize );
90    if (n < 0) {
91        goto klogctl_error;
92    }
93
94    lastc = '\n';
95    for (i = 0; i < n; i++) {
96       if ((i == 0 || buf[i - 1] == '\n') && buf[i] == '<') {
97          i++;
98          while (buf[i] >= '0' && buf[i] <= '9')
99             i++;
100          if (buf[i] == '>')
101             i++;
102       }
103       lastc = buf[i];
104       putchar( lastc );
105    }
106    if (lastc != '\n')
107       putchar( '\n' );
108    exit( TRUE);
109 end:
110     usage( dmesg_usage);
111     exit (FALSE);
112 klogctl_error:
113     perror( "klogctl" );
114     exit( FALSE );
115
116 }