121de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn/* 221de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn * Copyright (C) 2005-2017 The Android Open Source Project 321de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn * 421de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn * Licensed under the Apache License, Version 2.0 (the "License"); 521de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn * you may not use this file except in compliance with the License. 621de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn * You may obtain a copy of the License at 721de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn * 821de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn * http://www.apache.org/licenses/LICENSE-2.0 921de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn * 1021de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn * Unless required by applicable law or agreed to in writing, software 1121de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn * distributed under the License is distributed on an "AS IS" BASIS, 1221de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1321de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn * See the License for the specific language governing permissions and 1421de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn * limitations under the License. 1521de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn */ 1621de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn 1721de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn#ifndef _LIBS_LOG_LOG_READ_H 1821de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn#define _LIBS_LOG_LOG_READ_H 1921de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn 2021de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn/* deal with possible sys/cdefs.h conflict with fcntl.h */ 2121de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn#ifdef __unused 2221de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn#define __unused_defined __unused 2321de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn#undef __unused 2421de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn#endif 2521de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn 2621de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn#include <fcntl.h> /* Pick up O_* macros */ 2721de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn 2821de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn/* restore definitions from above */ 2921de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn#ifdef __unused_defined 3021de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn#define __unused __attribute__((__unused__)) 3121de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn#endif 3221de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn 3321de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn#include <stdint.h> 3421de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn 3521de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn#include <log/log_id.h> 3621de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn#include <log/log_time.h> 3721de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn 3821de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn#ifdef __cplusplus 3921de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzynextern "C" { 4021de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn#endif 4121de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn 4221de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn/* 4321de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn * Native log reading interface section. See logcat for sample code. 4421de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn * 4521de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn * The preferred API is an exec of logcat. Likely uses of this interface 4621de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn * are if native code suffers from exec or filtration being too costly, 4721de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn * access to raw information, or parsing is an issue. 4821de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn */ 4921de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn 5021de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn/* 5121de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn * The userspace structure for version 1 of the logger_entry ABI. 5221de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn */ 5321de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn#ifndef __struct_logger_entry_defined 5421de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn#define __struct_logger_entry_defined 5521de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzynstruct logger_entry { 562ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn uint16_t len; /* length of the payload */ 572ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn uint16_t __pad; /* no matter what, we get 2 bytes of padding */ 582ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn int32_t pid; /* generating process's pid */ 592ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn int32_t tid; /* generating process's tid */ 602ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn int32_t sec; /* seconds since Epoch */ 612ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn int32_t nsec; /* nanoseconds */ 6221de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn#ifndef __cplusplus 632ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn char msg[0]; /* the entry's payload */ 6421de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn#endif 6521de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn}; 6621de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn#endif 6721de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn 6821de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn/* 6921de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn * The userspace structure for version 2 of the logger_entry ABI. 7021de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn */ 7121de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn#ifndef __struct_logger_entry_v2_defined 7221de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn#define __struct_logger_entry_v2_defined 7321de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzynstruct logger_entry_v2 { 742ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn uint16_t len; /* length of the payload */ 752ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn uint16_t hdr_size; /* sizeof(struct logger_entry_v2) */ 762ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn int32_t pid; /* generating process's pid */ 772ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn int32_t tid; /* generating process's tid */ 782ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn int32_t sec; /* seconds since Epoch */ 792ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn int32_t nsec; /* nanoseconds */ 802ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn uint32_t euid; /* effective UID of logger */ 8121de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn#ifndef __cplusplus 822ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn char msg[0]; /* the entry's payload */ 8321de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn#endif 8421de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn} __attribute__((__packed__)); 8521de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn#endif 8621de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn 8721de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn/* 8821de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn * The userspace structure for version 3 of the logger_entry ABI. 8921de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn */ 9021de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn#ifndef __struct_logger_entry_v3_defined 9121de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn#define __struct_logger_entry_v3_defined 9221de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzynstruct logger_entry_v3 { 932ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn uint16_t len; /* length of the payload */ 942ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn uint16_t hdr_size; /* sizeof(struct logger_entry_v3) */ 952ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn int32_t pid; /* generating process's pid */ 962ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn int32_t tid; /* generating process's tid */ 972ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn int32_t sec; /* seconds since Epoch */ 982ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn int32_t nsec; /* nanoseconds */ 992ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn uint32_t lid; /* log id of the payload */ 10021de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn#ifndef __cplusplus 1012ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn char msg[0]; /* the entry's payload */ 10221de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn#endif 10321de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn} __attribute__((__packed__)); 10421de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn#endif 10521de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn 10621de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn/* 10721de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn * The userspace structure for version 4 of the logger_entry ABI. 10821de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn */ 10921de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn#ifndef __struct_logger_entry_v4_defined 11021de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn#define __struct_logger_entry_v4_defined 11121de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzynstruct logger_entry_v4 { 1122ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn uint16_t len; /* length of the payload */ 1132ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn uint16_t hdr_size; /* sizeof(struct logger_entry_v4) */ 1142ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn int32_t pid; /* generating process's pid */ 1152ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn uint32_t tid; /* generating process's tid */ 1162ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn uint32_t sec; /* seconds since Epoch */ 1172ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn uint32_t nsec; /* nanoseconds */ 1182ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn uint32_t lid; /* log id of the payload, bottom 4 bits currently */ 1192ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn uint32_t uid; /* generating process's uid */ 12021de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn#ifndef __cplusplus 1212ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn char msg[0]; /* the entry's payload */ 12221de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn#endif 12321de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn}; 12421de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn#endif 12521de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn 12621de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn/* 12721de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn * The maximum size of the log entry payload that can be 12821de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn * written to the logger. An attempt to write more than 12921de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn * this amount will result in a truncated log entry. 13021de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn */ 13121de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn#define LOGGER_ENTRY_MAX_PAYLOAD 4068 13221de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn 13321de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn/* 13421de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn * The maximum size of a log entry which can be read. 13521de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn * An attempt to read less than this amount may result 13621de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn * in read() returning EINVAL. 13721de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn */ 1382ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn#define LOGGER_ENTRY_MAX_LEN (5 * 1024) 13921de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn 14021de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn#ifndef __struct_log_msg_defined 14121de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn#define __struct_log_msg_defined 14221de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzynstruct log_msg { 1432ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn union { 1442ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn unsigned char buf[LOGGER_ENTRY_MAX_LEN + 1]; 1452ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn struct logger_entry_v4 entry; 1462ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn struct logger_entry_v4 entry_v4; 1472ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn struct logger_entry_v3 entry_v3; 1482ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn struct logger_entry_v2 entry_v2; 1492ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn struct logger_entry entry_v1; 1502ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn } __attribute__((aligned(4))); 15121de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn#ifdef __cplusplus 1522ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn /* Matching log_time operators */ 1532ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn bool operator==(const log_msg& T) const { 1542ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn return (entry.sec == T.entry.sec) && (entry.nsec == T.entry.nsec); 1552ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn } 1562ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn bool operator!=(const log_msg& T) const { 1572ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn return !(*this == T); 1582ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn } 1592ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn bool operator<(const log_msg& T) const { 1602ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn return (entry.sec < T.entry.sec) || 1612ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn ((entry.sec == T.entry.sec) && (entry.nsec < T.entry.nsec)); 1622ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn } 1632ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn bool operator>=(const log_msg& T) const { 1642ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn return !(*this < T); 1652ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn } 1662ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn bool operator>(const log_msg& T) const { 1672ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn return (entry.sec > T.entry.sec) || 1682ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn ((entry.sec == T.entry.sec) && (entry.nsec > T.entry.nsec)); 1692ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn } 1702ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn bool operator<=(const log_msg& T) const { 1712ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn return !(*this > T); 1722ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn } 1732ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn uint64_t nsec() const { 1742ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn return static_cast<uint64_t>(entry.sec) * NS_PER_SEC + entry.nsec; 1752ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn } 17621de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn 1772ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn /* packet methods */ 1782ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn log_id_t id() { 1792ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn return static_cast<log_id_t>(entry.lid); 1802ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn } 1812ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn char* msg() { 1822ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn unsigned short hdr_size = entry.hdr_size; 1832ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn if (!hdr_size) { 1842ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn hdr_size = sizeof(entry_v1); 18521de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn } 1862ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn if ((hdr_size < sizeof(entry_v1)) || (hdr_size > sizeof(entry))) { 1872ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn return NULL; 18821de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn } 1892ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn return reinterpret_cast<char*>(buf) + hdr_size; 1902ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn } 1912ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn unsigned int len() { 1922ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn return (entry.hdr_size ? entry.hdr_size 1932ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn : static_cast<uint16_t>(sizeof(entry_v1))) + 1942ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn entry.len; 1952ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn } 19621de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn#endif 19721de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn}; 19821de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn#endif 19921de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn 20021de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn#ifndef __ANDROID_USE_LIBLOG_READER_INTERFACE 20121de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn#ifndef __ANDROID_API__ 20221de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn#define __ANDROID_USE_LIBLOG_READER_INTERFACE 3 20321de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn#elif __ANDROID_API__ > 23 /* > Marshmallow */ 20421de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn#define __ANDROID_USE_LIBLOG_READER_INTERFACE 3 20521de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn#elif __ANDROID_API__ > 22 /* > Lollipop */ 20621de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn#define __ANDROID_USE_LIBLOG_READER_INTERFACE 2 20721de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn#elif __ANDROID_API__ > 19 /* > KitKat */ 20821de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn#define __ANDROID_USE_LIBLOG_READER_INTERFACE 1 20921de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn#else 21021de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn#define __ANDROID_USE_LIBLOG_READER_INTERFACE 0 21121de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn#endif 21221de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn#endif 21321de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn 21421de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn#if __ANDROID_USE_LIBLOG_READER_INTERFACE 21521de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn 21621de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzynstruct logger; 21721de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn 21821de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzynlog_id_t android_logger_get_id(struct logger* logger); 21921de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn 22021de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzynint android_logger_clear(struct logger* logger); 22121de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzynlong android_logger_get_log_size(struct logger* logger); 22221de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzynint android_logger_set_log_size(struct logger* logger, unsigned long size); 22321de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzynlong android_logger_get_log_readable_size(struct logger* logger); 22421de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzynint android_logger_get_log_version(struct logger* logger); 22521de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn 22621de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzynstruct logger_list; 22721de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn 22821de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn#if __ANDROID_USE_LIBLOG_READER_INTERFACE > 1 22921de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzynssize_t android_logger_get_statistics(struct logger_list* logger_list, 23021de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn char* buf, size_t len); 23121de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzynssize_t android_logger_get_prune_list(struct logger_list* logger_list, 23221de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn char* buf, size_t len); 2332ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzynint android_logger_set_prune_list(struct logger_list* logger_list, char* buf, 2342ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn size_t len); 23521de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn#endif 23621de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn 2372ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn#define ANDROID_LOG_RDONLY O_RDONLY 2382ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn#define ANDROID_LOG_WRONLY O_WRONLY 2392ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn#define ANDROID_LOG_RDWR O_RDWR 2402ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn#define ANDROID_LOG_ACCMODE O_ACCMODE 24162d0d2d683f5d19cf9d451548bd03c4b4f53c42eMark Salyzyn#ifndef O_NONBLOCK 24262d0d2d683f5d19cf9d451548bd03c4b4f53c42eMark Salyzyn#define ANDROID_LOG_NONBLOCK 0x00000800 24362d0d2d683f5d19cf9d451548bd03c4b4f53c42eMark Salyzyn#else 24421de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn#define ANDROID_LOG_NONBLOCK O_NONBLOCK 24562d0d2d683f5d19cf9d451548bd03c4b4f53c42eMark Salyzyn#endif 24621de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn#if __ANDROID_USE_LIBLOG_READER_INTERFACE > 2 2472ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn#define ANDROID_LOG_WRAP 0x40000000 /* Block until buffer about to wrap */ 24821de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn#define ANDROID_LOG_WRAP_DEFAULT_TIMEOUT 7200 /* 2 hour default */ 24921de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn#endif 25021de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn#if __ANDROID_USE_LIBLOG_READER_INTERFACE > 1 2512ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn#define ANDROID_LOG_PSTORE 0x80000000 25221de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn#endif 25321de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn 2542ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzynstruct logger_list* android_logger_list_alloc(int mode, unsigned int tail, 25521de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn pid_t pid); 2562ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzynstruct logger_list* android_logger_list_alloc_time(int mode, log_time start, 25721de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn pid_t pid); 25821de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzynvoid android_logger_list_free(struct logger_list* logger_list); 25921de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn/* In the purest sense, the following two are orthogonal interfaces */ 26021de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzynint android_logger_list_read(struct logger_list* logger_list, 26121de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn struct log_msg* log_msg); 26221de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn 26321de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn/* Multiple log_id_t opens */ 2642ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzynstruct logger* android_logger_open(struct logger_list* logger_list, log_id_t id); 26521de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn#define android_logger_close android_logger_free 26621de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn/* Single log_id_t open */ 2672ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzynstruct logger_list* android_logger_list_open(log_id_t id, int mode, 2682ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn unsigned int tail, pid_t pid); 26921de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn#define android_logger_list_close android_logger_list_free 27021de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn 27121de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn#endif /* __ANDROID_USE_LIBLOG_READER_INTERFACE */ 27221de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn 27321de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn#ifdef __cplusplus 27421de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn} 27521de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn#endif 27621de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn 27721de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn#endif /* _LIBS_LOG_LOG_H */ 278