17ec681f3Smrg/* 27ec681f3Smrg * Copyright (C) 2005-2017 The Android Open Source Project 37ec681f3Smrg * 47ec681f3Smrg * Licensed under the Apache License, Version 2.0 (the "License"); 57ec681f3Smrg * you may not use this file except in compliance with the License. 67ec681f3Smrg * You may obtain a copy of the License at 77ec681f3Smrg * 87ec681f3Smrg * http://www.apache.org/licenses/LICENSE-2.0 97ec681f3Smrg * 107ec681f3Smrg * Unless required by applicable law or agreed to in writing, software 117ec681f3Smrg * distributed under the License is distributed on an "AS IS" BASIS, 127ec681f3Smrg * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 137ec681f3Smrg * See the License for the specific language governing permissions and 147ec681f3Smrg * limitations under the License. 157ec681f3Smrg */ 167ec681f3Smrg 177ec681f3Smrg#pragma once 187ec681f3Smrg 197ec681f3Smrg#include <stdint.h> 207ec681f3Smrg#include <sys/types.h> 217ec681f3Smrg 227ec681f3Smrg#include <android/log.h> 237ec681f3Smrg#include <log/log_time.h> 247ec681f3Smrg 257ec681f3Smrg#ifdef __cplusplus 267ec681f3Smrgextern "C" { 277ec681f3Smrg#endif 287ec681f3Smrg 297ec681f3Smrg#define ANDROID_LOG_WRAP_DEFAULT_TIMEOUT 7200 /* 2 hour default */ 307ec681f3Smrg 317ec681f3Smrg/* 327ec681f3Smrg * Native log reading interface section. See logcat for sample code. 337ec681f3Smrg * 347ec681f3Smrg * The preferred API is an exec of logcat. Likely uses of this interface 357ec681f3Smrg * are if native code suffers from exec or filtration being too costly, 367ec681f3Smrg * access to raw information, or parsing is an issue. 377ec681f3Smrg */ 387ec681f3Smrg 397ec681f3Smrgstruct logger_entry { 407ec681f3Smrg uint16_t len; /* length of the payload */ 417ec681f3Smrg uint16_t hdr_size; /* sizeof(struct logger_entry) */ 427ec681f3Smrg int32_t pid; /* generating process's pid */ 437ec681f3Smrg uint32_t tid; /* generating process's tid */ 447ec681f3Smrg uint32_t sec; /* seconds since Epoch */ 457ec681f3Smrg uint32_t nsec; /* nanoseconds */ 467ec681f3Smrg uint32_t lid; /* log id of the payload, bottom 4 bits currently */ 477ec681f3Smrg uint32_t uid; /* generating process's uid */ 487ec681f3Smrg}; 497ec681f3Smrg 507ec681f3Smrg/* 517ec681f3Smrg * The maximum size of a log entry which can be read. 527ec681f3Smrg * An attempt to read less than this amount may result 537ec681f3Smrg * in read() returning EINVAL. 547ec681f3Smrg */ 557ec681f3Smrg#define LOGGER_ENTRY_MAX_LEN (5 * 1024) 567ec681f3Smrg 577ec681f3Smrgstruct log_msg { 587ec681f3Smrg union { 597ec681f3Smrg unsigned char buf[LOGGER_ENTRY_MAX_LEN + 1]; 607ec681f3Smrg struct logger_entry entry; 617ec681f3Smrg } __attribute__((aligned(4))); 627ec681f3Smrg#ifdef __cplusplus 637ec681f3Smrg uint64_t nsec() const { 647ec681f3Smrg return static_cast<uint64_t>(entry.sec) * NS_PER_SEC + entry.nsec; 657ec681f3Smrg } 667ec681f3Smrg log_id_t id() { 677ec681f3Smrg return static_cast<log_id_t>(entry.lid); 687ec681f3Smrg } 697ec681f3Smrg char* msg() { 707ec681f3Smrg unsigned short hdr_size = entry.hdr_size; 717ec681f3Smrg if (hdr_size >= sizeof(struct log_msg) - sizeof(entry)) { 727ec681f3Smrg return nullptr; 737ec681f3Smrg } 747ec681f3Smrg return reinterpret_cast<char*>(buf) + hdr_size; 757ec681f3Smrg } 767ec681f3Smrg unsigned int len() { return entry.hdr_size + entry.len; } 777ec681f3Smrg#endif 787ec681f3Smrg}; 797ec681f3Smrg 807ec681f3Smrgstruct logger; 817ec681f3Smrg 827ec681f3Smrglog_id_t android_logger_get_id(struct logger* logger); 837ec681f3Smrg 847ec681f3Smrg/* Clears the given log buffer. */ 857ec681f3Smrgint android_logger_clear(struct logger* logger); 867ec681f3Smrg/* Return the allotted size for the given log buffer. */ 877ec681f3Smrglong android_logger_get_log_size(struct logger* logger); 887ec681f3Smrg/* Set the allotted size for the given log buffer. */ 897ec681f3Smrgint android_logger_set_log_size(struct logger* logger, unsigned long size); 907ec681f3Smrg/* Return the actual, uncompressed size that can be read from the given log buffer. */ 917ec681f3Smrglong android_logger_get_log_readable_size(struct logger* logger); 927ec681f3Smrg/* Return the actual, compressed size that the given log buffer is consuming. */ 937ec681f3Smrglong android_logger_get_log_consumed_size(struct logger* logger); 947ec681f3Smrg/* Deprecated. Always returns '4' regardless of input. */ 957ec681f3Smrgint android_logger_get_log_version(struct logger* logger); 967ec681f3Smrg 977ec681f3Smrgstruct logger_list; 987ec681f3Smrg 997ec681f3Smrgssize_t android_logger_get_statistics(struct logger_list* logger_list, 1007ec681f3Smrg char* buf, size_t len); 1017ec681f3Smrgssize_t android_logger_get_prune_list(struct logger_list* logger_list, 1027ec681f3Smrg char* buf, size_t len); 1037ec681f3Smrgint android_logger_set_prune_list(struct logger_list* logger_list, const char* buf, size_t len); 1047ec681f3Smrg 1057ec681f3Smrg/* The below values are used for the `mode` argument of the below functions. */ 1067ec681f3Smrg/* Note that 0x00000003 were previously used and should be considered reserved. */ 1077ec681f3Smrg#define ANDROID_LOG_NONBLOCK 0x00000800 1087ec681f3Smrg#define ANDROID_LOG_WRAP 0x40000000 /* Block until buffer about to wrap */ 1097ec681f3Smrg#define ANDROID_LOG_PSTORE 0x80000000 1107ec681f3Smrg 1117ec681f3Smrgstruct logger_list* android_logger_list_alloc(int mode, unsigned int tail, 1127ec681f3Smrg pid_t pid); 1137ec681f3Smrgstruct logger_list* android_logger_list_alloc_time(int mode, log_time start, 1147ec681f3Smrg pid_t pid); 1157ec681f3Smrgvoid android_logger_list_free(struct logger_list* logger_list); 1167ec681f3Smrg/* In the purest sense, the following two are orthogonal interfaces */ 1177ec681f3Smrgint android_logger_list_read(struct logger_list* logger_list, 1187ec681f3Smrg struct log_msg* log_msg); 1197ec681f3Smrg 1207ec681f3Smrg/* Multiple log_id_t opens */ 1217ec681f3Smrgstruct logger* android_logger_open(struct logger_list* logger_list, log_id_t id); 1227ec681f3Smrg/* Single log_id_t open */ 1237ec681f3Smrgstruct logger_list* android_logger_list_open(log_id_t id, int mode, 1247ec681f3Smrg unsigned int tail, pid_t pid); 1257ec681f3Smrg#define android_logger_list_close android_logger_list_free 1267ec681f3Smrg 1277ec681f3Smrg#ifdef __cplusplus 1287ec681f3Smrg} 1297ec681f3Smrg#endif 130