1*598139dcSAndroid Build Coastguard Worker /* 2*598139dcSAndroid Build Coastguard Worker * Copyright (C) 2005-2017 The Android Open Source Project 3*598139dcSAndroid Build Coastguard Worker * 4*598139dcSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*598139dcSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*598139dcSAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*598139dcSAndroid Build Coastguard Worker * 8*598139dcSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*598139dcSAndroid Build Coastguard Worker * 10*598139dcSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*598139dcSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*598139dcSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*598139dcSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*598139dcSAndroid Build Coastguard Worker * limitations under the License. 15*598139dcSAndroid Build Coastguard Worker */ 16*598139dcSAndroid Build Coastguard Worker 17*598139dcSAndroid Build Coastguard Worker #pragma once 18*598139dcSAndroid Build Coastguard Worker 19*598139dcSAndroid Build Coastguard Worker #include <stdint.h> 20*598139dcSAndroid Build Coastguard Worker #include <sys/types.h> 21*598139dcSAndroid Build Coastguard Worker 22*598139dcSAndroid Build Coastguard Worker #include <android/log.h> 23*598139dcSAndroid Build Coastguard Worker #include <log/log_time.h> 24*598139dcSAndroid Build Coastguard Worker 25*598139dcSAndroid Build Coastguard Worker #ifdef __cplusplus 26*598139dcSAndroid Build Coastguard Worker extern "C" { 27*598139dcSAndroid Build Coastguard Worker #endif 28*598139dcSAndroid Build Coastguard Worker 29*598139dcSAndroid Build Coastguard Worker #define ANDROID_LOG_WRAP_DEFAULT_TIMEOUT 7200 /* 2 hour default */ 30*598139dcSAndroid Build Coastguard Worker 31*598139dcSAndroid Build Coastguard Worker /* 32*598139dcSAndroid Build Coastguard Worker * Native log reading interface section. See logcat for sample code. 33*598139dcSAndroid Build Coastguard Worker * 34*598139dcSAndroid Build Coastguard Worker * The preferred API is an exec of logcat. Likely uses of this interface 35*598139dcSAndroid Build Coastguard Worker * are if native code suffers from exec or filtration being too costly, 36*598139dcSAndroid Build Coastguard Worker * access to raw information, or parsing is an issue. 37*598139dcSAndroid Build Coastguard Worker */ 38*598139dcSAndroid Build Coastguard Worker 39*598139dcSAndroid Build Coastguard Worker struct logger_entry { 40*598139dcSAndroid Build Coastguard Worker uint16_t len; /* length of the payload */ 41*598139dcSAndroid Build Coastguard Worker uint16_t hdr_size; /* sizeof(struct logger_entry) */ 42*598139dcSAndroid Build Coastguard Worker int32_t pid; /* generating process's pid */ 43*598139dcSAndroid Build Coastguard Worker uint32_t tid; /* generating process's tid */ 44*598139dcSAndroid Build Coastguard Worker uint32_t sec; /* seconds since Epoch */ 45*598139dcSAndroid Build Coastguard Worker uint32_t nsec; /* nanoseconds */ 46*598139dcSAndroid Build Coastguard Worker uint32_t lid; /* log id of the payload, bottom 4 bits currently */ 47*598139dcSAndroid Build Coastguard Worker uint32_t uid; /* generating process's uid */ 48*598139dcSAndroid Build Coastguard Worker }; 49*598139dcSAndroid Build Coastguard Worker 50*598139dcSAndroid Build Coastguard Worker /* 51*598139dcSAndroid Build Coastguard Worker * The maximum size of a log entry which can be read. 52*598139dcSAndroid Build Coastguard Worker * An attempt to read less than this amount may result 53*598139dcSAndroid Build Coastguard Worker * in read() returning EINVAL. 54*598139dcSAndroid Build Coastguard Worker */ 55*598139dcSAndroid Build Coastguard Worker #define LOGGER_ENTRY_MAX_LEN (5 * 1024) 56*598139dcSAndroid Build Coastguard Worker 57*598139dcSAndroid Build Coastguard Worker struct log_msg { 58*598139dcSAndroid Build Coastguard Worker union { 59*598139dcSAndroid Build Coastguard Worker unsigned char buf[LOGGER_ENTRY_MAX_LEN + 1]; 60*598139dcSAndroid Build Coastguard Worker struct logger_entry entry; 61*598139dcSAndroid Build Coastguard Worker } __attribute__((aligned(4))); 62*598139dcSAndroid Build Coastguard Worker #ifdef __cplusplus nseclog_msg63*598139dcSAndroid Build Coastguard Worker uint64_t nsec() const { 64*598139dcSAndroid Build Coastguard Worker return static_cast<uint64_t>(entry.sec) * NS_PER_SEC + entry.nsec; 65*598139dcSAndroid Build Coastguard Worker } idlog_msg66*598139dcSAndroid Build Coastguard Worker log_id_t id() { 67*598139dcSAndroid Build Coastguard Worker return static_cast<log_id_t>(entry.lid); 68*598139dcSAndroid Build Coastguard Worker } msglog_msg69*598139dcSAndroid Build Coastguard Worker char* msg() { 70*598139dcSAndroid Build Coastguard Worker unsigned short hdr_size = entry.hdr_size; 71*598139dcSAndroid Build Coastguard Worker if (hdr_size >= sizeof(struct log_msg) - sizeof(entry)) { 72*598139dcSAndroid Build Coastguard Worker return nullptr; 73*598139dcSAndroid Build Coastguard Worker } 74*598139dcSAndroid Build Coastguard Worker return reinterpret_cast<char*>(buf) + hdr_size; 75*598139dcSAndroid Build Coastguard Worker } lenlog_msg76*598139dcSAndroid Build Coastguard Worker unsigned int len() { return entry.hdr_size + entry.len; } 77*598139dcSAndroid Build Coastguard Worker #endif 78*598139dcSAndroid Build Coastguard Worker }; 79*598139dcSAndroid Build Coastguard Worker 80*598139dcSAndroid Build Coastguard Worker struct logger; 81*598139dcSAndroid Build Coastguard Worker 82*598139dcSAndroid Build Coastguard Worker log_id_t android_logger_get_id(struct logger* logger); 83*598139dcSAndroid Build Coastguard Worker 84*598139dcSAndroid Build Coastguard Worker /* Clears the given log buffer. */ 85*598139dcSAndroid Build Coastguard Worker int android_logger_clear(struct logger* logger); 86*598139dcSAndroid Build Coastguard Worker /* Return the allotted size for the given log buffer. */ 87*598139dcSAndroid Build Coastguard Worker long android_logger_get_log_size(struct logger* logger); 88*598139dcSAndroid Build Coastguard Worker /* Set the allotted size for the given log buffer. */ 89*598139dcSAndroid Build Coastguard Worker int android_logger_set_log_size(struct logger* logger, unsigned long size); 90*598139dcSAndroid Build Coastguard Worker /* Return the actual, uncompressed size that can be read from the given log buffer. */ 91*598139dcSAndroid Build Coastguard Worker long android_logger_get_log_readable_size(struct logger* logger); 92*598139dcSAndroid Build Coastguard Worker /* Return the actual, compressed size that the given log buffer is consuming. */ 93*598139dcSAndroid Build Coastguard Worker long android_logger_get_log_consumed_size(struct logger* logger); 94*598139dcSAndroid Build Coastguard Worker /* Deprecated. Always returns '4' regardless of input. */ 95*598139dcSAndroid Build Coastguard Worker int android_logger_get_log_version(struct logger* logger); 96*598139dcSAndroid Build Coastguard Worker 97*598139dcSAndroid Build Coastguard Worker struct logger_list; 98*598139dcSAndroid Build Coastguard Worker 99*598139dcSAndroid Build Coastguard Worker ssize_t android_logger_get_statistics(struct logger_list* logger_list, 100*598139dcSAndroid Build Coastguard Worker char* buf, size_t len); 101*598139dcSAndroid Build Coastguard Worker ssize_t android_logger_get_prune_list(struct logger_list* logger_list, 102*598139dcSAndroid Build Coastguard Worker char* buf, size_t len); 103*598139dcSAndroid Build Coastguard Worker int android_logger_set_prune_list(struct logger_list* logger_list, const char* buf, size_t len); 104*598139dcSAndroid Build Coastguard Worker 105*598139dcSAndroid Build Coastguard Worker /* The below values are used for the `mode` argument of the below functions. */ 106*598139dcSAndroid Build Coastguard Worker /* Note that 0x00000003 were previously used and should be considered reserved. */ 107*598139dcSAndroid Build Coastguard Worker #define ANDROID_LOG_NONBLOCK 0x00000800 108*598139dcSAndroid Build Coastguard Worker #define ANDROID_LOG_WRAP 0x40000000 /* Block until buffer about to wrap */ 109*598139dcSAndroid Build Coastguard Worker #define ANDROID_LOG_PSTORE 0x80000000 110*598139dcSAndroid Build Coastguard Worker 111*598139dcSAndroid Build Coastguard Worker struct logger_list* android_logger_list_alloc(int mode, unsigned int tail, 112*598139dcSAndroid Build Coastguard Worker pid_t pid); 113*598139dcSAndroid Build Coastguard Worker struct logger_list* android_logger_list_alloc_time(int mode, log_time start, 114*598139dcSAndroid Build Coastguard Worker pid_t pid); 115*598139dcSAndroid Build Coastguard Worker void android_logger_list_free(struct logger_list* logger_list); 116*598139dcSAndroid Build Coastguard Worker /* In the purest sense, the following two are orthogonal interfaces */ 117*598139dcSAndroid Build Coastguard Worker int android_logger_list_read(struct logger_list* logger_list, 118*598139dcSAndroid Build Coastguard Worker struct log_msg* log_msg); 119*598139dcSAndroid Build Coastguard Worker 120*598139dcSAndroid Build Coastguard Worker /* Multiple log_id_t opens */ 121*598139dcSAndroid Build Coastguard Worker struct logger* android_logger_open(struct logger_list* logger_list, log_id_t id); 122*598139dcSAndroid Build Coastguard Worker /* Single log_id_t open */ 123*598139dcSAndroid Build Coastguard Worker struct logger_list* android_logger_list_open(log_id_t id, int mode, 124*598139dcSAndroid Build Coastguard Worker unsigned int tail, pid_t pid); 125*598139dcSAndroid Build Coastguard Worker #define android_logger_list_close android_logger_list_free 126*598139dcSAndroid Build Coastguard Worker 127*598139dcSAndroid Build Coastguard Worker #ifdef __cplusplus 128*598139dcSAndroid Build Coastguard Worker } 129*598139dcSAndroid Build Coastguard Worker #endif 130