1*598139dcSAndroid Build Coastguard Worker /* 2*598139dcSAndroid Build Coastguard Worker * Copyright (C) 2015 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 /* This file is used to define the internal protocol for the Android Logger */ 18*598139dcSAndroid Build Coastguard Worker 19*598139dcSAndroid Build Coastguard Worker #pragma once 20*598139dcSAndroid Build Coastguard Worker 21*598139dcSAndroid Build Coastguard Worker /* Android private interfaces */ 22*598139dcSAndroid Build Coastguard Worker 23*598139dcSAndroid Build Coastguard Worker #include <stdbool.h> 24*598139dcSAndroid Build Coastguard Worker #include <stdint.h> 25*598139dcSAndroid Build Coastguard Worker #include <sys/types.h> 26*598139dcSAndroid Build Coastguard Worker 27*598139dcSAndroid Build Coastguard Worker #ifdef __cplusplus 28*598139dcSAndroid Build Coastguard Worker #include <string> 29*598139dcSAndroid Build Coastguard Worker #endif 30*598139dcSAndroid Build Coastguard Worker 31*598139dcSAndroid Build Coastguard Worker #include <log/log.h> 32*598139dcSAndroid Build Coastguard Worker #include <log/log_event_list.h> 33*598139dcSAndroid Build Coastguard Worker 34*598139dcSAndroid Build Coastguard Worker #define LOGGER_MAGIC 'l' 35*598139dcSAndroid Build Coastguard Worker 36*598139dcSAndroid Build Coastguard Worker #if defined(__cplusplus) 37*598139dcSAndroid Build Coastguard Worker extern "C" { 38*598139dcSAndroid Build Coastguard Worker #endif 39*598139dcSAndroid Build Coastguard Worker 40*598139dcSAndroid Build Coastguard Worker /* Header Structure to pstore */ 41*598139dcSAndroid Build Coastguard Worker typedef struct __attribute__((__packed__)) { 42*598139dcSAndroid Build Coastguard Worker uint8_t magic; 43*598139dcSAndroid Build Coastguard Worker uint16_t len; 44*598139dcSAndroid Build Coastguard Worker uint16_t uid; 45*598139dcSAndroid Build Coastguard Worker uint16_t pid; 46*598139dcSAndroid Build Coastguard Worker } android_pmsg_log_header_t; 47*598139dcSAndroid Build Coastguard Worker 48*598139dcSAndroid Build Coastguard Worker /* Header Structure to logd, and second header for pstore */ 49*598139dcSAndroid Build Coastguard Worker typedef struct __attribute__((__packed__)) { 50*598139dcSAndroid Build Coastguard Worker uint8_t id; 51*598139dcSAndroid Build Coastguard Worker uint16_t tid; 52*598139dcSAndroid Build Coastguard Worker log_time realtime; 53*598139dcSAndroid Build Coastguard Worker } android_log_header_t; 54*598139dcSAndroid Build Coastguard Worker 55*598139dcSAndroid Build Coastguard Worker /* Event Header Structure to logd */ 56*598139dcSAndroid Build Coastguard Worker typedef struct __attribute__((__packed__)) { 57*598139dcSAndroid Build Coastguard Worker int32_t tag; // Little Endian Order 58*598139dcSAndroid Build Coastguard Worker } android_event_header_t; 59*598139dcSAndroid Build Coastguard Worker 60*598139dcSAndroid Build Coastguard Worker // Event payload EVENT_TYPE_LIST 61*598139dcSAndroid Build Coastguard Worker typedef struct __attribute__((__packed__)) { 62*598139dcSAndroid Build Coastguard Worker int8_t type; // EVENT_TYPE_LIST 63*598139dcSAndroid Build Coastguard Worker int8_t element_count; 64*598139dcSAndroid Build Coastguard Worker } android_event_list_t; 65*598139dcSAndroid Build Coastguard Worker 66*598139dcSAndroid Build Coastguard Worker // Event payload EVENT_TYPE_FLOAT 67*598139dcSAndroid Build Coastguard Worker typedef struct __attribute__((__packed__)) { 68*598139dcSAndroid Build Coastguard Worker int8_t type; // EVENT_TYPE_FLOAT 69*598139dcSAndroid Build Coastguard Worker float data; 70*598139dcSAndroid Build Coastguard Worker } android_event_float_t; 71*598139dcSAndroid Build Coastguard Worker 72*598139dcSAndroid Build Coastguard Worker /* Event payload EVENT_TYPE_INT */ 73*598139dcSAndroid Build Coastguard Worker typedef struct __attribute__((__packed__)) { 74*598139dcSAndroid Build Coastguard Worker int8_t type; // EVENT_TYPE_INT 75*598139dcSAndroid Build Coastguard Worker int32_t data; // Little Endian Order 76*598139dcSAndroid Build Coastguard Worker } android_event_int_t; 77*598139dcSAndroid Build Coastguard Worker 78*598139dcSAndroid Build Coastguard Worker /* Event with single EVENT_TYPE_INT */ 79*598139dcSAndroid Build Coastguard Worker typedef struct __attribute__((__packed__)) { 80*598139dcSAndroid Build Coastguard Worker android_event_header_t header; 81*598139dcSAndroid Build Coastguard Worker android_event_int_t payload; 82*598139dcSAndroid Build Coastguard Worker } android_log_event_int_t; 83*598139dcSAndroid Build Coastguard Worker 84*598139dcSAndroid Build Coastguard Worker /* Event payload EVENT_TYPE_LONG */ 85*598139dcSAndroid Build Coastguard Worker typedef struct __attribute__((__packed__)) { 86*598139dcSAndroid Build Coastguard Worker int8_t type; // EVENT_TYPE_LONG 87*598139dcSAndroid Build Coastguard Worker int64_t data; // Little Endian Order 88*598139dcSAndroid Build Coastguard Worker } android_event_long_t; 89*598139dcSAndroid Build Coastguard Worker 90*598139dcSAndroid Build Coastguard Worker /* Event with single EVENT_TYPE_LONG */ 91*598139dcSAndroid Build Coastguard Worker typedef struct __attribute__((__packed__)) { 92*598139dcSAndroid Build Coastguard Worker android_event_header_t header; 93*598139dcSAndroid Build Coastguard Worker android_event_long_t payload; 94*598139dcSAndroid Build Coastguard Worker } android_log_event_long_t; 95*598139dcSAndroid Build Coastguard Worker 96*598139dcSAndroid Build Coastguard Worker /* 97*598139dcSAndroid Build Coastguard Worker * Event payload EVENT_TYPE_STRING 98*598139dcSAndroid Build Coastguard Worker * 99*598139dcSAndroid Build Coastguard Worker * Danger: do not embed this structure into another structure. 100*598139dcSAndroid Build Coastguard Worker * This structure uses a flexible array member, and when 101*598139dcSAndroid Build Coastguard Worker * compiled using g++, __builtin_object_size(data, 1) returns 102*598139dcSAndroid Build Coastguard Worker * a bad value. This is possibly a g++ bug, or a bug due to 103*598139dcSAndroid Build Coastguard Worker * the fact that flexible array members are not supported 104*598139dcSAndroid Build Coastguard Worker * in C++. 105*598139dcSAndroid Build Coastguard Worker * http://stackoverflow.com/questions/4412749/are-flexible-array-members-valid-in-c 106*598139dcSAndroid Build Coastguard Worker */ 107*598139dcSAndroid Build Coastguard Worker 108*598139dcSAndroid Build Coastguard Worker typedef struct __attribute__((__packed__)) { 109*598139dcSAndroid Build Coastguard Worker int8_t type; // EVENT_TYPE_STRING; 110*598139dcSAndroid Build Coastguard Worker int32_t length; // Little Endian Order 111*598139dcSAndroid Build Coastguard Worker char data[]; 112*598139dcSAndroid Build Coastguard Worker } android_event_string_t; 113*598139dcSAndroid Build Coastguard Worker 114*598139dcSAndroid Build Coastguard Worker /* Event with single EVENT_TYPE_STRING */ 115*598139dcSAndroid Build Coastguard Worker typedef struct __attribute__((__packed__)) { 116*598139dcSAndroid Build Coastguard Worker android_event_header_t header; 117*598139dcSAndroid Build Coastguard Worker int8_t type; // EVENT_TYPE_STRING; 118*598139dcSAndroid Build Coastguard Worker int32_t length; // Little Endian Order 119*598139dcSAndroid Build Coastguard Worker char data[]; 120*598139dcSAndroid Build Coastguard Worker } android_log_event_string_t; 121*598139dcSAndroid Build Coastguard Worker 122*598139dcSAndroid Build Coastguard Worker #define ANDROID_LOG_PMSG_FILE_MAX_SEQUENCE 256 /* 1MB file */ 123*598139dcSAndroid Build Coastguard Worker #define ANDROID_LOG_PMSG_FILE_SEQUENCE 1000 124*598139dcSAndroid Build Coastguard Worker 125*598139dcSAndroid Build Coastguard Worker ssize_t __android_log_pmsg_file_write(log_id_t logId, char prio, 126*598139dcSAndroid Build Coastguard Worker const char* filename, const char* buf, 127*598139dcSAndroid Build Coastguard Worker size_t len); 128*598139dcSAndroid Build Coastguard Worker 129*598139dcSAndroid Build Coastguard Worker #define ANDROID_LOG_ANY ANDROID_LOG_UNKNOWN 130*598139dcSAndroid Build Coastguard Worker 131*598139dcSAndroid Build Coastguard Worker /* first 5 arguments match __android_log_msg_file_write, a cast is safe */ 132*598139dcSAndroid Build Coastguard Worker typedef ssize_t (*__android_log_pmsg_file_read_fn)(log_id_t logId, char prio, 133*598139dcSAndroid Build Coastguard Worker const char* filename, 134*598139dcSAndroid Build Coastguard Worker const char* buf, size_t len, 135*598139dcSAndroid Build Coastguard Worker void* arg); 136*598139dcSAndroid Build Coastguard Worker 137*598139dcSAndroid Build Coastguard Worker ssize_t __android_log_pmsg_file_read(log_id_t logId, char prio, 138*598139dcSAndroid Build Coastguard Worker const char* prefix, 139*598139dcSAndroid Build Coastguard Worker __android_log_pmsg_file_read_fn fn, 140*598139dcSAndroid Build Coastguard Worker void* arg); 141*598139dcSAndroid Build Coastguard Worker 142*598139dcSAndroid Build Coastguard Worker int __android_log_security_bwrite(int32_t tag, const void* payload, size_t len); 143*598139dcSAndroid Build Coastguard Worker int __android_log_security_bswrite(int32_t tag, const char* payload); 144*598139dcSAndroid Build Coastguard Worker int __android_log_security(); /* Device Owner is present */ 145*598139dcSAndroid Build Coastguard Worker 146*598139dcSAndroid Build Coastguard Worker /* Retrieve the composed event buffer */ 147*598139dcSAndroid Build Coastguard Worker int android_log_write_list_buffer(android_log_context ctx, const char** msg); 148*598139dcSAndroid Build Coastguard Worker 149*598139dcSAndroid Build Coastguard Worker #if defined(__cplusplus) 150*598139dcSAndroid Build Coastguard Worker } 151*598139dcSAndroid Build Coastguard Worker #endif 152