blob: c65501c48dd258c07aa25093645f92d05deed274 [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"
Tom Cherry026ddde2019-11-18 15:13:47 -080034#include "logd_reader.h"
Mark Salyzyn018a96d2016-03-01 13:45:42 -080035#include "logger.h"
Tom Cherry026ddde2019-11-18 15:13:47 -080036#include "pmsg_reader.h"
Mark Salyzyn018a96d2016-03-01 13:45:42 -080037
Mark Salyzyn018a96d2016-03-01 13:45:42 -080038/* method for getting the associated sublog id */
Tom Cherry2d9779e2019-02-08 11:46:19 -080039log_id_t android_logger_get_id(struct logger* logger) {
Tom Cherry9156c532019-11-14 08:56:39 -080040 return static_cast<log_id_t>(reinterpret_cast<uintptr_t>(logger) & LOGGER_LOG_ID_MASK);
Mark Salyzyn018a96d2016-03-01 13:45:42 -080041}
42
Tom Cherry9156c532019-11-14 08:56:39 -080043static struct logger_list* android_logger_list_alloc_internal(int mode, unsigned int tail,
44 log_time start, pid_t pid) {
45 auto* logger_list = static_cast<struct logger_list*>(calloc(1, sizeof(struct logger_list)));
Mark Salyzyn2ed51d72017-03-09 08:09:43 -080046 if (!logger_list) {
Tom Cherry9156c532019-11-14 08:56:39 -080047 return nullptr;
Mark Salyzyn2ed51d72017-03-09 08:09:43 -080048 }
Mark Salyzyn018a96d2016-03-01 13:45:42 -080049
Tom Cherry9156c532019-11-14 08:56:39 -080050 logger_list->mode = mode;
51 logger_list->start = start;
52 logger_list->tail = tail;
53 logger_list->pid = pid;
Mark Salyzyn2ed51d72017-03-09 08:09:43 -080054
Tom Cherry9156c532019-11-14 08:56:39 -080055 return logger_list;
Mark Salyzyn018a96d2016-03-01 13:45:42 -080056}
57
Tom Cherry2d9779e2019-02-08 11:46:19 -080058struct logger_list* android_logger_list_alloc(int mode, unsigned int tail, pid_t pid) {
Tom Cherry9156c532019-11-14 08:56:39 -080059 return android_logger_list_alloc_internal(mode, tail, log_time(0, 0), pid);
Mark Salyzyn018a96d2016-03-01 13:45:42 -080060}
61
Tom Cherry2d9779e2019-02-08 11:46:19 -080062struct logger_list* android_logger_list_alloc_time(int mode, log_time start, pid_t pid) {
Tom Cherry9156c532019-11-14 08:56:39 -080063 return android_logger_list_alloc_internal(mode, 0, start, pid);
Mark Salyzyn018a96d2016-03-01 13:45:42 -080064}
65
Mark Salyzyn018a96d2016-03-01 13:45:42 -080066/* Open the named log and add it to the logger list */
Tom Cherry2d9779e2019-02-08 11:46:19 -080067struct logger* android_logger_open(struct logger_list* logger_list, log_id_t logId) {
Tom Cherry828db1a2019-11-14 10:39:40 -080068 if (!logger_list || (logId >= LOG_ID_MAX)) {
Tom Cherryf7e1b1e2019-08-23 14:04:12 -070069 return nullptr;
Mark Salyzyn2ed51d72017-03-09 08:09:43 -080070 }
71
Tom Cherry9156c532019-11-14 08:56:39 -080072 logger_list->log_mask |= 1 << logId;
Mark Salyzyn018a96d2016-03-01 13:45:42 -080073
Tom Cherry9156c532019-11-14 08:56:39 -080074 uintptr_t logger = logId;
75 logger |= (logger_list->mode & ANDROID_LOG_PSTORE) ? LOGGER_PMSG : LOGGER_LOGD;
76 return reinterpret_cast<struct logger*>(logger);
Mark Salyzyn018a96d2016-03-01 13:45:42 -080077}
78
79/* Open the single named log and make it part of a new logger list */
Tom Cherry2d9779e2019-02-08 11:46:19 -080080struct logger_list* android_logger_list_open(log_id_t logId, int mode, unsigned int tail,
81 pid_t pid) {
Mark Salyzyn2ed51d72017-03-09 08:09:43 -080082 struct logger_list* logger_list = android_logger_list_alloc(mode, tail, pid);
Mark Salyzyn018a96d2016-03-01 13:45:42 -080083
Mark Salyzyn2ed51d72017-03-09 08:09:43 -080084 if (!logger_list) {
85 return NULL;
86 }
Mark Salyzyn018a96d2016-03-01 13:45:42 -080087
Mark Salyzyn2ed51d72017-03-09 08:09:43 -080088 if (!android_logger_open(logger_list, logId)) {
89 android_logger_list_free(logger_list);
90 return NULL;
91 }
Mark Salyzyn018a96d2016-03-01 13:45:42 -080092
Mark Salyzyn2ed51d72017-03-09 08:09:43 -080093 return logger_list;
Mark Salyzyn018a96d2016-03-01 13:45:42 -080094}
95
Tom Cherry9156c532019-11-14 08:56:39 -080096int android_logger_list_read(struct logger_list* logger_list, struct log_msg* log_msg) {
Tom Cherry026ddde2019-11-18 15:13:47 -080097 if (logger_list == nullptr || logger_list->log_mask == 0) {
Tom Cherry9156c532019-11-14 08:56:39 -080098 return -EINVAL;
99 }
100
Tom Cherry026ddde2019-11-18 15:13:47 -0800101 int ret = 0;
Tom Cherry9156c532019-11-14 08:56:39 -0800102
Tom Cherry026ddde2019-11-18 15:13:47 -0800103#if (FAKE_LOG_DEVICE == 0)
104 if (logger_list->mode & ANDROID_LOG_PSTORE) {
105 ret = PmsgRead(logger_list, log_msg);
106 } else {
107 ret = LogdRead(logger_list, log_msg);
108 }
109#endif
Mark Salyzyn8fd1faa2016-05-13 12:25:55 -0700110
Tom Cherryb8bacea2019-11-15 16:41:36 -0800111 if (ret <= 0) {
Tom Cherry441054a2019-10-15 16:53:11 -0700112 return ret;
113 }
114
Mark Salyzyn2ed51d72017-03-09 08:09:43 -0800115 if (ret > (int)sizeof(*log_msg)) {
116 ret = sizeof(*log_msg);
117 }
118
Tom Cherry441054a2019-10-15 16:53:11 -0700119 if (ret < static_cast<int>(sizeof(log_msg->entry))) {
Mark Salyzyn2ed51d72017-03-09 08:09:43 -0800120 return -EINVAL;
121 }
122
Tom Cherry441054a2019-10-15 16:53:11 -0700123 if (log_msg->entry.hdr_size != sizeof(log_msg->entry)) {
124 return -EINVAL;
125 }
126
127 if (log_msg->entry.len > ret - log_msg->entry.hdr_size) {
128 return -EINVAL;
Mark Salyzyn2ed51d72017-03-09 08:09:43 -0800129 }
130
131 return ret;
Mark Salyzyn8fd1faa2016-05-13 12:25:55 -0700132}
133
Mark Salyzyn018a96d2016-03-01 13:45:42 -0800134/* Close all the logs */
Tom Cherry2d9779e2019-02-08 11:46:19 -0800135void android_logger_list_free(struct logger_list* logger_list) {
Tom Cherry828db1a2019-11-14 10:39:40 -0800136 if (logger_list == NULL) {
Mark Salyzyn2ed51d72017-03-09 08:09:43 -0800137 return;
138 }
139
Tom Cherry026ddde2019-11-18 15:13:47 -0800140#if (FAKE_LOG_DEVICE == 0)
141 if (logger_list->mode & ANDROID_LOG_PSTORE) {
142 PmsgClose(logger_list);
143 } else {
144 LogdClose(logger_list);
Mark Salyzyn2ed51d72017-03-09 08:09:43 -0800145 }
Tom Cherry026ddde2019-11-18 15:13:47 -0800146#endif
Mark Salyzyn018a96d2016-03-01 13:45:42 -0800147
Tom Cherry828db1a2019-11-14 10:39:40 -0800148 free(logger_list);
Mark Salyzyn018a96d2016-03-01 13:45:42 -0800149}