view toys/lsb/dmesg.c @ 1278:324306321d82 draft

Initial cleanup of last: mostly whitespace, move no record test to start of loop, don't bother to stat an empty file to report when an empty log was created (just report current time).
author Rob Landley <rob@landley.net>
date Sat, 10 May 2014 13:20:03 -0500
parents 786841fdb1e0
children d26f235323db
line wrap: on
line source

/* dmesg.c - display/control kernel ring buffer.
 *
 * Copyright 2006, 2007 Rob Landley <rob@landley.net>
 *
 * http://refspecs.linuxfoundation.org/LSB_4.1.0/LSB-Core-generic/LSB-Core-generic/dmesg.html

USE_DMESG(NEWTOY(dmesg, "s#n#c", TOYFLAG_BIN))

config DMESG
  bool "dmesg"
  default y
  help
    usage: dmesg [-n level] [-s bufsize] | -c

    Print or control the kernel ring buffer.

    -n	Set kernel logging level (1-9).
    -s	Size of buffer to read (in bytes), default 16384.
    -c	Clear the ring buffer after printing.
*/

#define FOR_dmesg
#include "toys.h"
#include <sys/klog.h>

GLOBALS(
  long level;
  long size;
)

void dmesg_main(void)
{
  // For -n just tell kernel to which messages to keep.
  if (toys.optflags & 2) {
    if (klogctl(8, NULL, TT.level)) error_exit("klogctl");
  } else {
    int size, i, last = '\n';
    char *data;

    // Figure out how much data we need, and fetch it.
    size = TT.size;
    if (size<2) size = 16384;
    data = xmalloc(size);
    size = klogctl(3 + (toys.optflags&1), data, size);
    if (size < 0) error_exit("klogctl");

    // Display data, filtering out level markers.
    for (i=0; i<size; ) {
      if (last=='\n' && data[i]=='<') i += 3;
      else xputc(last = data[i++]);
    }
    if (last!='\n') xputc('\n');
    if (CFG_TOYBOX_FREE) free(data);
  }
}