blob: 4086ecb95401a66e753fb897bf90e964fcf0989e [file] [log] [blame]
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <errno.h>
#include <sys/klog.h>
#include <string.h>
// From Android sys/klog.h
#ifndef KLOG_READ_ALL
#define KLOG_READ_ALL 3
#endif
#ifndef KLOG_READ_CLEAR
#define KLOG_READ_CLEAR 4
#endif
#ifndef KLOG_SIZE_BUFFER
#define KLOG_SIZE_BUFFER 10
#endif
int dmesg_main(int argc, char **argv)
{
char *buffer;
char *p;
ssize_t ret;
int n, op, bufsize;
bufsize = klogctl(KLOG_SIZE_BUFFER, NULL, 0);
if (bufsize <= 0) {
perror("klogctl size_buffer");
return EXIT_FAILURE;
}
buffer = malloc(bufsize);
if (!buffer) {
perror("malloc");
return EXIT_FAILURE;
}
buffer[0] = 0;
if((argc == 2) && (!strcmp(argv[1],"-c"))) {
op = KLOG_READ_CLEAR;
} else {
op = KLOG_READ_ALL;
}
n = klogctl(op, buffer, bufsize);
if (n < 0) {
perror("klogctl");
return EXIT_FAILURE;
}
buffer[n] = '\0';
p = buffer;
while ((ret = write(STDOUT_FILENO, p, n))) {
if (ret == -1) {
if (errno == EINTR)
continue;
perror("write");
return EXIT_FAILURE;
}
p += ret;
n -= ret;
}
free(buffer);
return 0;
}