1dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <stdlib.h>
2dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <unistd.h>
3dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <stdio.h>
4dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <errno.h>
5dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <sys/klog.h>
6dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <string.h>
7dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
8dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define KLOG_BUF_SHIFT	17	/* CONFIG_LOG_BUF_SHIFT from our kernel */
9dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define KLOG_BUF_LEN	(1 << KLOG_BUF_SHIFT)
10dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
11dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectint dmesg_main(int argc, char **argv)
12dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
13dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    char buffer[KLOG_BUF_LEN + 1];
14dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    char *p = buffer;
15dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    ssize_t ret;
16dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    int n, op;
17dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
18dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    if((argc == 2) && (!strcmp(argv[1],"-c"))) {
19dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        op = KLOG_READ_CLEAR;
20dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    } else {
21dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        op = KLOG_READ_ALL;
22dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    }
23dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
24dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    n = klogctl(op, buffer, KLOG_BUF_LEN);
25dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    if (n < 0) {
26dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        perror("klogctl");
27dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        return EXIT_FAILURE;
28dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    }
29dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    buffer[n] = '\0';
30dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
31dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    while((ret = write(STDOUT_FILENO, p, n))) {
32dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        if (ret == -1) {
33dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	    if (errno == EINTR)
34dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                continue;
35dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	    perror("write");
36dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	    return EXIT_FAILURE;
37dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	}
38dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	p += ret;
39dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	n -= ret;
40dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    }
41dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
42dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    return 0;
43dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
44