blob: 79b40a9879682765c839d7b836edee530e66e177 [file] [log] [blame]
Mark Salyzyn018a96d2016-03-01 13:45:42 -08001/*
2** Copyright 2013-2014, 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
Tom Cherry71ba1642019-01-10 10:37:36 -080017#include "log/log_read.h"
18
Mark Salyzyn018a96d2016-03-01 13:45:42 -080019#include <errno.h>
20#include <fcntl.h>
21#include <pthread.h>
22#include <sched.h>
23#include <stddef.h>
Tom Cherry9156c532019-11-14 08:56:39 -080024#include <stdint.h>
Mark Salyzyn018a96d2016-03-01 13:45:42 -080025#include <stdlib.h>
26#include <string.h>
27#include <unistd.h>
28
Mark Salyzyn6584d0a2016-09-28 13:26:55 -070029#include <android/log.h>
Mark Salyzyn018a96d2016-03-01 13:45:42 -080030#include <cutils/list.h>
Mark Salyzync33103c2016-03-28 16:20:29 -070031#include <private/android_filesystem_config.h>
Mark Salyzyn018a96d2016-03-01 13:45:42 -080032
Mark Salyzyn018a96d2016-03-01 13:45:42 -080033#include "log_portability.h"
34#include "logger.h"
35
Mark Salyzyn018a96d2016-03-01 13:45:42 -080036/* method for getting the associated sublog id */
Tom Cherry2d9779e2019-02-08 11:46:19 -080037log_id_t android_logger_get_id(struct logger* logger) {
Tom Cherry9156c532019-11-14 08:56:39 -080038 return static_cast<log_id_t>(reinterpret_cast<uintptr_t>(logger) & LOGGER_LOG_ID_MASK);
Mark Salyzyn018a96d2016-03-01 13:45:42 -080039}
40
Tom Cherry9156c532019-11-14 08:56:39 -080041static struct logger_list* android_logger_list_alloc_internal(int mode, unsigned int tail,
42 log_time start, pid_t pid) {
43 auto* logger_list = static_cast<struct logger_list*>(calloc(1, sizeof(struct logger_list)));
Mark Salyzyn2ed51d72017-03-09 08:09:43 -080044 if (!logger_list) {
Tom Cherry9156c532019-11-14 08:56:39 -080045 return nullptr;
Mark Salyzyn2ed51d72017-03-09 08:09:43 -080046 }
Mark Salyzyn018a96d2016-03-01 13:45:42 -080047
Tom Cherry9156c532019-11-14 08:56:39 -080048 logger_list->mode = mode;
49 logger_list->start = start;
50 logger_list->tail = tail;
51 logger_list->pid = pid;
Mark Salyzyn2ed51d72017-03-09 08:09:43 -080052
Tom Cherryf7e1b1e2019-08-23 14:04:12 -070053#if (FAKE_LOG_DEVICE == 0)
54 extern struct android_log_transport_read logdLoggerRead;
55 extern struct android_log_transport_read pmsgLoggerRead;
Mark Salyzyn2ed51d72017-03-09 08:09:43 -080056
Tom Cherry9156c532019-11-14 08:56:39 -080057 logger_list->transport_context.transport =
58 (mode & ANDROID_LOG_PSTORE) ? &pmsgLoggerRead : &logdLoggerRead;
Tom Cherryf7e1b1e2019-08-23 14:04:12 -070059#endif
Mark Salyzyn018a96d2016-03-01 13:45:42 -080060
Tom Cherry9156c532019-11-14 08:56:39 -080061 return logger_list;
Mark Salyzyn018a96d2016-03-01 13:45:42 -080062}
63
Tom Cherry2d9779e2019-02-08 11:46:19 -080064struct logger_list* android_logger_list_alloc(int mode, unsigned int tail, pid_t pid) {
Tom Cherry9156c532019-11-14 08:56:39 -080065 return android_logger_list_alloc_internal(mode, tail, log_time(0, 0), pid);
Mark Salyzyn018a96d2016-03-01 13:45:42 -080066}
67
Tom Cherry2d9779e2019-02-08 11:46:19 -080068struct logger_list* android_logger_list_alloc_time(int mode, log_time start, pid_t pid) {
Tom Cherry9156c532019-11-14 08:56:39 -080069 return android_logger_list_alloc_internal(mode, 0, start, pid);
Mark Salyzyn018a96d2016-03-01 13:45:42 -080070}
71
Mark Salyzyn018a96d2016-03-01 13:45:42 -080072/* Open the named log and add it to the logger list */
Tom Cherry2d9779e2019-02-08 11:46:19 -080073struct logger* android_logger_open(struct logger_list* logger_list, log_id_t logId) {
Tom Cherry828db1a2019-11-14 10:39:40 -080074 if (!logger_list || (logId >= LOG_ID_MAX)) {
Tom Cherryf7e1b1e2019-08-23 14:04:12 -070075 return nullptr;
Mark Salyzyn2ed51d72017-03-09 08:09:43 -080076 }
77
Tom Cherry9156c532019-11-14 08:56:39 -080078 logger_list->log_mask |= 1 << logId;
Mark Salyzyn018a96d2016-03-01 13:45:42 -080079
Tom Cherry9156c532019-11-14 08:56:39 -080080 uintptr_t logger = logId;
81 logger |= (logger_list->mode & ANDROID_LOG_PSTORE) ? LOGGER_PMSG : LOGGER_LOGD;
82 return reinterpret_cast<struct logger*>(logger);
Mark Salyzyn018a96d2016-03-01 13:45:42 -080083}
84
85/* Open the single named log and make it part of a new logger list */
Tom Cherry2d9779e2019-02-08 11:46:19 -080086struct logger_list* android_logger_list_open(log_id_t logId, int mode, unsigned int tail,
87 pid_t pid) {
Mark Salyzyn2ed51d72017-03-09 08:09:43 -080088 struct logger_list* logger_list = android_logger_list_alloc(mode, tail, pid);
Mark Salyzyn018a96d2016-03-01 13:45:42 -080089
Mark Salyzyn2ed51d72017-03-09 08:09:43 -080090 if (!logger_list) {
91 return NULL;
92 }
Mark Salyzyn018a96d2016-03-01 13:45:42 -080093
Mark Salyzyn2ed51d72017-03-09 08:09:43 -080094 if (!android_logger_open(logger_list, logId)) {
95 android_logger_list_free(logger_list);
96 return NULL;
97 }
Mark Salyzyn018a96d2016-03-01 13:45:42 -080098
Mark Salyzyn2ed51d72017-03-09 08:09:43 -080099 return logger_list;
Mark Salyzyn018a96d2016-03-01 13:45:42 -0800100}
101
Tom Cherry9156c532019-11-14 08:56:39 -0800102int android_logger_list_read(struct logger_list* logger_list, struct log_msg* log_msg) {
103 if (logger_list == nullptr || logger_list->transport_context.transport == nullptr ||
104 logger_list->log_mask == 0) {
105 return -EINVAL;
106 }
107
108 android_log_transport_context* transp = &logger_list->transport_context;
109
Mark Salyzyn2ed51d72017-03-09 08:09:43 -0800110 int ret = (*transp->transport->read)(logger_list, transp, log_msg);
Mark Salyzyn8fd1faa2016-05-13 12:25:55 -0700111
Tom Cherry441054a2019-10-15 16:53:11 -0700112 if (ret < 0) {
113 return ret;
114 }
115
Mark Salyzyn2ed51d72017-03-09 08:09:43 -0800116 if (ret > (int)sizeof(*log_msg)) {
117 ret = sizeof(*log_msg);
118 }
119
Tom Cherry441054a2019-10-15 16:53:11 -0700120 if (ret < static_cast<int>(sizeof(log_msg->entry))) {
Mark Salyzyn2ed51d72017-03-09 08:09:43 -0800121 return -EINVAL;
122 }
123
Tom Cherry441054a2019-10-15 16:53:11 -0700124 if (log_msg->entry.hdr_size != sizeof(log_msg->entry)) {
125 return -EINVAL;
126 }
127
128 if (log_msg->entry.len > ret - log_msg->entry.hdr_size) {
129 return -EINVAL;
Mark Salyzyn2ed51d72017-03-09 08:09:43 -0800130 }
131
132 return ret;
Mark Salyzyn8fd1faa2016-05-13 12:25:55 -0700133}
134
Mark Salyzyn018a96d2016-03-01 13:45:42 -0800135/* Close all the logs */
Tom Cherry2d9779e2019-02-08 11:46:19 -0800136void android_logger_list_free(struct logger_list* logger_list) {
Tom Cherry828db1a2019-11-14 10:39:40 -0800137 if (logger_list == NULL) {
Mark Salyzyn2ed51d72017-03-09 08:09:43 -0800138 return;
139 }
140
Tom Cherry828db1a2019-11-14 10:39:40 -0800141 android_log_transport_context* transport_context = &logger_list->transport_context;
Mark Salyzyn2ed51d72017-03-09 08:09:43 -0800142
Tom Cherryf7e1b1e2019-08-23 14:04:12 -0700143 if (transport_context->transport && transport_context->transport->close) {
Tom Cherry828db1a2019-11-14 10:39:40 -0800144 (*transport_context->transport->close)(logger_list, transport_context);
Mark Salyzyn2ed51d72017-03-09 08:09:43 -0800145 }
Mark Salyzyn018a96d2016-03-01 13:45:42 -0800146
Tom Cherry828db1a2019-11-14 10:39:40 -0800147 free(logger_list);
Mark Salyzyn018a96d2016-03-01 13:45:42 -0800148}