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 8edee93dc5ba2dd1fd7b1e097a29cb40d1d8fe516James Sullins#define FALLBACK_KLOG_BUF_SHIFT 17 /* CONFIG_LOG_BUF_SHIFT from our kernel */ 9edee93dc5ba2dd1fd7b1e097a29cb40d1d8fe516James Sullins#define FALLBACK_KLOG_BUF_LEN (1 << FALLBACK_KLOG_BUF_SHIFT) 10dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 11dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectint dmesg_main(int argc, char **argv) 12dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 13edee93dc5ba2dd1fd7b1e097a29cb40d1d8fe516James Sullins char *buffer; 14edee93dc5ba2dd1fd7b1e097a29cb40d1d8fe516James Sullins char *p; 15dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ssize_t ret; 16edee93dc5ba2dd1fd7b1e097a29cb40d1d8fe516James Sullins int n, op, klog_buf_len; 17edee93dc5ba2dd1fd7b1e097a29cb40d1d8fe516James Sullins 18edee93dc5ba2dd1fd7b1e097a29cb40d1d8fe516James Sullins klog_buf_len = klogctl(KLOG_SIZE_BUFFER, 0, 0); 19edee93dc5ba2dd1fd7b1e097a29cb40d1d8fe516James Sullins 20edee93dc5ba2dd1fd7b1e097a29cb40d1d8fe516James Sullins if (klog_buf_len <= 0) { 21edee93dc5ba2dd1fd7b1e097a29cb40d1d8fe516James Sullins klog_buf_len = FALLBACK_KLOG_BUF_LEN; 22edee93dc5ba2dd1fd7b1e097a29cb40d1d8fe516James Sullins } 23edee93dc5ba2dd1fd7b1e097a29cb40d1d8fe516James Sullins 24edee93dc5ba2dd1fd7b1e097a29cb40d1d8fe516James Sullins buffer = (char *)malloc(klog_buf_len + 1); 25edee93dc5ba2dd1fd7b1e097a29cb40d1d8fe516James Sullins 26edee93dc5ba2dd1fd7b1e097a29cb40d1d8fe516James Sullins if (!buffer) { 27edee93dc5ba2dd1fd7b1e097a29cb40d1d8fe516James Sullins perror("malloc"); 28edee93dc5ba2dd1fd7b1e097a29cb40d1d8fe516James Sullins return EXIT_FAILURE; 29edee93dc5ba2dd1fd7b1e097a29cb40d1d8fe516James Sullins } 30edee93dc5ba2dd1fd7b1e097a29cb40d1d8fe516James Sullins 31edee93dc5ba2dd1fd7b1e097a29cb40d1d8fe516James Sullins p = buffer; 32dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 33dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if((argc == 2) && (!strcmp(argv[1],"-c"))) { 34dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project op = KLOG_READ_CLEAR; 35dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 36dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project op = KLOG_READ_ALL; 37dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 38dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 39edee93dc5ba2dd1fd7b1e097a29cb40d1d8fe516James Sullins n = klogctl(op, buffer, klog_buf_len); 40dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (n < 0) { 41dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project perror("klogctl"); 42dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return EXIT_FAILURE; 43dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 44dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project buffer[n] = '\0'; 45dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 46dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project while((ret = write(STDOUT_FILENO, p, n))) { 47dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (ret == -1) { 48dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (errno == EINTR) 49dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project continue; 50dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project perror("write"); 51dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return EXIT_FAILURE; 52dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 53dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project p += ret; 54dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project n -= ret; 55dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 56dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 57dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 0; 58dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 59