implemented numeric sort (sort -g)
[oweals/busybox.git] / dmesg.c
diff --git a/dmesg.c b/dmesg.c
index 9096621b03a1908aedb9ef74ea863070420032ad..aa26f5836c7e9c6e6b319d875c84920a96d614dc 100644 (file)
--- a/dmesg.c
+++ b/dmesg.c
@@ -1,80 +1,94 @@
-#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
+ * Larger buffersize 3 June 1998 by Nicolai Langfeldt, based on a patch
+ * by Peeter Joot.  This was also suggested by John Hudson.
+ * 1999-02-22 Arkadiusz Mi¶kiewicz <misiek@misiek.eu.org>
+ * - added Native Language Support
+ *
+ * from util-linux -- adapted for busybox by 
+ * Erik Andersen <andersee@debian.org>. I ripped out Native Language 
+ * Support, replaced getopt, added some gotos for redundant stuff.
  */
 
+#include "internal.h"
 #include <linux/unistd.h>
 #include <stdio.h>
 #include <getopt.h>
+#include <stdlib.h>
 
-#define __NR_klog __NR_syslog
+#if __GNU_LIBRARY__ < 5
+
+#ifndef __alpha__
+# define __NR_klogctl __NR_syslog
+  static inline _syscall3(int, klogctl, int, type, char *, b, int, len);
+#else /* __alpha__ */
+#define klogctl syslog
+#endif
 
-#if defined(__GLIBC__)
-#include <sys/klog.h>
-#define klog klogctl
 #else
-static inline _syscall3(int,klog,int,type,char *,b,int,len)
-#endif /* __GLIBC__ */
+# include <sys/klog.h>
+#endif
 
-const char                     dmesg_usage[] = "dmesg";
+static const char dmesg_usage[] = "dmesg [-c] [-n level] [-s bufsize]\n";
 
-int
-dmesg_main(int argc, char * * argv)
+int dmesg_main( int argc, char** argv )
 {
-
-   char buf[4096];
+   char *buf;
+   int bufsize=8196;
    int  i;
    int  n;
-   int  c;
    int  level = 0;
    int  lastc;
    int  cmd = 3;
 
-   while ((c = getopt( argc, argv, "cn:" )) != EOF) {
-      switch (c) {
-      case 'c':
-        cmd = 4;
-        break;
-      case 'n':
-        cmd = 8;
-        level = atoi(optarg);
-        break;
-      case '?':
-      default:
-        fprintf(stderr, "%s\n", dmesg_usage);
-        exit(1);
-      }
-   }
-   argc -= optind;
-   argv += optind;
+    /* 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;
+           case 's':
+               if (--argc == 0)
+                   goto end;
+               bufsize = atoi (*(++argv));
+               --argc;
+               ++argv;
+               break;
+           default:
+               goto end;
+           }
+    }
    
    if (argc > 1) {
-     fprintf(stderr, "%s\n", dmesg_usage);
-      exit(1);
+       goto end;
    }
 
    if (cmd == 8) {
-      n = klog( cmd, NULL, level );
+      n = klogctl( cmd, NULL, level );
       if (n < 0) {
-        perror( "klog" );
-        exit( 1 );
+         goto klogctl_error;
       }
-      exit( 0 );
+      exit( TRUE );
    }
 
-   n = klog( cmd, buf, sizeof( buf ) );
+   if (bufsize < 4096) bufsize = 4096;
+   buf = (char*)malloc(bufsize);
+   n = klogctl( cmd, buf, bufsize );
    if (n < 0) {
-      perror( "klog" );
-      exit( 1 );
+       goto klogctl_error;
    }
 
    lastc = '\n';
@@ -91,5 +105,12 @@ dmesg_main(int argc, char * * argv)
    }
    if (lastc != '\n')
       putchar( '\n' );
-   return 0;
+   exit( TRUE);
+end:
+    usage( dmesg_usage);
+    exit (FALSE);
+klogctl_error:
+    perror( "klogctl" );
+    exit( FALSE );
+
 }