1 /* 2 * Copyright (C) 2015 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 /* This file is used to define the internal protocol for the Android Logger */ 18 19 #ifndef _SYSTEM_CORE_INCLUDE_PRIVATE_ANDROID_LOGGER_H_ 20 #define _SYSTEM_CORE_INCLUDE_PRIVATE_ANDROID_LOGGER_H_ 21 22 /* Android private interfaces */ 23 24 #include <stdbool.h> 25 #include <stdint.h> 26 #include <sys/types.h> 27 28 #if (defined(__cplusplus) && defined(_USING_LIBCXX)) 29 extern "C++" { 30 #include <string> 31 } 32 #endif 33 34 #include <log/log.h> 35 #include <log/log_event_list.h> 36 37 #define LOGGER_MAGIC 'l' 38 39 #if defined(__cplusplus) 40 extern "C" { 41 #endif 42 43 /* Header Structure to pstore */ 44 typedef struct __attribute__((__packed__)) { 45 uint8_t magic; 46 uint16_t len; 47 uint16_t uid; 48 uint16_t pid; 49 } android_pmsg_log_header_t; 50 51 /* Header Structure to logd, and second header for pstore */ 52 typedef struct __attribute__((__packed__)) { 53 typeof_log_id_t id; 54 uint16_t tid; 55 log_time realtime; 56 } android_log_header_t; 57 58 /* Event Header Structure to logd */ 59 typedef struct __attribute__((__packed__)) { 60 int32_t tag; // Little Endian Order 61 } android_event_header_t; 62 63 /* Event payload EVENT_TYPE_INT */ 64 typedef struct __attribute__((__packed__)) { 65 int8_t type; // EVENT_TYPE_INT 66 int32_t data; // Little Endian Order 67 } android_event_int_t; 68 69 /* Event with single EVENT_TYPE_INT */ 70 typedef struct __attribute__((__packed__)) { 71 android_event_header_t header; 72 android_event_int_t payload; 73 } android_log_event_int_t; 74 75 /* Event payload EVENT_TYPE_LONG */ 76 typedef struct __attribute__((__packed__)) { 77 int8_t type; // EVENT_TYPE_LONG 78 int64_t data; // Little Endian Order 79 } android_event_long_t; 80 81 /* Event with single EVENT_TYPE_LONG */ 82 typedef struct __attribute__((__packed__)) { 83 android_event_header_t header; 84 android_event_long_t payload; 85 } android_log_event_long_t; 86 87 /* 88 * Event payload EVENT_TYPE_STRING 89 * 90 * Danger: do not embed this structure into another structure. 91 * This structure uses a flexible array member, and when 92 * compiled using g++, __builtin_object_size(data, 1) returns 93 * a bad value. This is possibly a g++ bug, or a bug due to 94 * the fact that flexible array members are not supported 95 * in C++. 96 * http://stackoverflow.com/questions/4412749/are-flexible-array-members-valid-in-c 97 */ 98 99 typedef struct __attribute__((__packed__)) { 100 int8_t type; // EVENT_TYPE_STRING; 101 int32_t length; // Little Endian Order 102 char data[]; 103 } android_event_string_t; 104 105 /* Event with single EVENT_TYPE_STRING */ 106 typedef struct __attribute__((__packed__)) { 107 android_event_header_t header; 108 int8_t type; // EVENT_TYPE_STRING; 109 int32_t length; // Little Endian Order 110 char data[]; 111 } android_log_event_string_t; 112 113 #define ANDROID_LOG_PMSG_FILE_MAX_SEQUENCE 256 /* 1MB file */ 114 #define ANDROID_LOG_PMSG_FILE_SEQUENCE 1000 115 116 ssize_t __android_log_pmsg_file_write(log_id_t logId, char prio, 117 const char* filename, const char* buf, 118 size_t len); 119 120 #define LOG_ID_ANY ((log_id_t)-1) 121 #define ANDROID_LOG_ANY ANDROID_LOG_UNKNOWN 122 123 /* first 5 arguments match __android_log_msg_file_write, a cast is safe */ 124 typedef ssize_t (*__android_log_pmsg_file_read_fn)(log_id_t logId, char prio, 125 const char* filename, 126 const char* buf, size_t len, 127 void* arg); 128 129 ssize_t __android_log_pmsg_file_read(log_id_t logId, char prio, 130 const char* prefix, 131 __android_log_pmsg_file_read_fn fn, 132 void* arg); 133 134 int __android_log_security_bwrite(int32_t tag, const void* payload, size_t len); 135 int __android_log_security_bswrite(int32_t tag, const char* payload); 136 int __android_log_security(); /* Device Owner is present */ 137 138 #define BOOL_DEFAULT_FLAG_TRUE_FALSE 0x1 139 #define BOOL_DEFAULT_FALSE 0x0 /* false if property not present */ 140 #define BOOL_DEFAULT_TRUE 0x1 /* true if property not present */ 141 #define BOOL_DEFAULT_FLAG_PERSIST 0x2 /* <key>, persist.<key>, ro.<key> */ 142 #define BOOL_DEFAULT_FLAG_ENG 0x4 /* off for user */ 143 #define BOOL_DEFAULT_FLAG_SVELTE 0x8 /* off for low_ram */ 144 bool __android_logger_property_get_bool(const char* key, int flag); 145 146 #define LOG_BUFFER_SIZE (256 * 1024) /* Tuned with ro.logd.size per-platform \ 147 */ 148 #define LOG_BUFFER_MIN_SIZE (64 * 1024UL) 149 #define LOG_BUFFER_MAX_SIZE (256 * 1024 * 1024UL) 150 unsigned long __android_logger_get_buffer_size(log_id_t logId); 151 bool __android_logger_valid_buffer_size(unsigned long value); 152 153 /* Retrieve the composed event buffer */ 154 int android_log_write_list_buffer(android_log_context ctx, const char** msg); 155 156 #ifdef __cplusplus 157 #ifdef __class_android_log_event_list_defined 158 #ifndef __class_android_log_event_list_private_defined 159 #define __class_android_log_event_list_private_defined 160 /* android_log_context C++ helpers */ 161 extern "C++" { 162 class __android_log_event_list : public android_log_event_list { 163 __android_log_event_list(const android_log_event_list&) = delete; 164 void operator=(const __android_log_event_list&) = delete; 165 166 public: 167 explicit __android_log_event_list(int tag) : android_log_event_list(tag) { 168 } 169 explicit __android_log_event_list(log_msg& log_msg) 170 : android_log_event_list(log_msg) { 171 } 172 173 #if defined(_USING_LIBCXX) 174 operator std::string() { 175 if (ret) return std::string(""); 176 const char* cp = NULL; 177 ssize_t len = android_log_write_list_buffer(ctx, &cp); 178 if (len < 0) ret = len; 179 if (!cp || (len <= 0)) return std::string(""); 180 return std::string(cp, len); 181 } 182 #endif 183 }; 184 } 185 #endif 186 #endif 187 #endif 188 189 #if defined(__cplusplus) 190 } 191 #endif 192 193 #endif /* _SYSTEM_CORE_INCLUDE_PRIVATE_ANDROID_LOGGER_H_ */ 194