blob: 4937042eb0234723b68c3772fe8610ea07a9b4fd [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
Tom Cherry026ddde2019-11-18 15:13:47 -080031#include "logd_reader.h"
Mark Salyzyn018a96d2016-03-01 13:45:42 -080032#include "logger.h"
Tom Cherry026ddde2019-11-18 15:13:47 -080033#include "pmsg_reader.h"
Mark Salyzyn018a96d2016-03-01 13:45:42 -080034
Mark Salyzyn018a96d2016-03-01 13:45:42 -080035/* method for getting the associated sublog id */
Tom Cherry2d9779e2019-02-08 11:46:19 -080036log_id_t android_logger_get_id(struct logger* logger) {
Tom Cherry9156c532019-11-14 08:56:39 -080037 return static_cast<log_id_t>(reinterpret_cast<uintptr_t>(logger) & LOGGER_LOG_ID_MASK);
Mark Salyzyn018a96d2016-03-01 13:45:42 -080038}
39
Tom Cherry9156c532019-11-14 08:56:39 -080040static struct logger_list* android_logger_list_alloc_internal(int mode, unsigned int tail,
41 log_time start, pid_t pid) {
42 auto* logger_list = static_cast<struct logger_list*>(calloc(1, sizeof(struct logger_list)));
Mark Salyzyn2ed51d72017-03-09 08:09:43 -080043 if (!logger_list) {
Tom Cherry9156c532019-11-14 08:56:39 -080044 return nullptr;
Mark Salyzyn2ed51d72017-03-09 08:09:43 -080045 }
Mark Salyzyn018a96d2016-03-01 13:45:42 -080046
Tom Cherry9156c532019-11-14 08:56:39 -080047 logger_list->mode = mode;
48 logger_list->start = start;
49 logger_list->tail = tail;
50 logger_list->pid = pid;
Mark Salyzyn2ed51d72017-03-09 08:09:43 -080051
Tom Cherry9156c532019-11-14 08:56:39 -080052 return logger_list;
Mark Salyzyn018a96d2016-03-01 13:45:42 -080053}
54
Tom Cherry2d9779e2019-02-08 11:46:19 -080055struct logger_list* android_logger_list_alloc(int mode, unsigned int tail, pid_t pid) {
Tom Cherry9156c532019-11-14 08:56:39 -080056 return android_logger_list_alloc_internal(mode, tail, log_time(0, 0), pid);
Mark Salyzyn018a96d2016-03-01 13:45:42 -080057}
58
Tom Cherry2d9779e2019-02-08 11:46:19 -080059struct logger_list* android_logger_list_alloc_time(int mode, log_time start, pid_t pid) {
Tom Cherry9156c532019-11-14 08:56:39 -080060 return android_logger_list_alloc_internal(mode, 0, start, pid);
Mark Salyzyn018a96d2016-03-01 13:45:42 -080061}
62
Mark Salyzyn018a96d2016-03-01 13:45:42 -080063/* Open the named log and add it to the logger list */
Tom Cherry2d9779e2019-02-08 11:46:19 -080064struct logger* android_logger_open(struct logger_list* logger_list, log_id_t logId) {
Tom Cherry828db1a2019-11-14 10:39:40 -080065 if (!logger_list || (logId >= LOG_ID_MAX)) {
Tom Cherryf7e1b1e2019-08-23 14:04:12 -070066 return nullptr;
Mark Salyzyn2ed51d72017-03-09 08:09:43 -080067 }
68
Tom Cherry9156c532019-11-14 08:56:39 -080069 logger_list->log_mask |= 1 << logId;
Mark Salyzyn018a96d2016-03-01 13:45:42 -080070
Tom Cherry9156c532019-11-14 08:56:39 -080071 uintptr_t logger = logId;
72 logger |= (logger_list->mode & ANDROID_LOG_PSTORE) ? LOGGER_PMSG : LOGGER_LOGD;
73 return reinterpret_cast<struct logger*>(logger);
Mark Salyzyn018a96d2016-03-01 13:45:42 -080074}
75
76/* Open the single named log and make it part of a new logger list */
Tom Cherry2d9779e2019-02-08 11:46:19 -080077struct logger_list* android_logger_list_open(log_id_t logId, int mode, unsigned int tail,
78 pid_t pid) {
Mark Salyzyn2ed51d72017-03-09 08:09:43 -080079 struct logger_list* logger_list = android_logger_list_alloc(mode, tail, pid);
Mark Salyzyn018a96d2016-03-01 13:45:42 -080080
Mark Salyzyn2ed51d72017-03-09 08:09:43 -080081 if (!logger_list) {
82 return NULL;
83 }
Mark Salyzyn018a96d2016-03-01 13:45:42 -080084
Mark Salyzyn2ed51d72017-03-09 08:09:43 -080085 if (!android_logger_open(logger_list, logId)) {
86 android_logger_list_free(logger_list);
87 return NULL;
88 }
Mark Salyzyn018a96d2016-03-01 13:45:42 -080089
Mark Salyzyn2ed51d72017-03-09 08:09:43 -080090 return logger_list;
Mark Salyzyn018a96d2016-03-01 13:45:42 -080091}
92
Tom Cherry9156c532019-11-14 08:56:39 -080093int android_logger_list_read(struct logger_list* logger_list, struct log_msg* log_msg) {
Tom Cherry026ddde2019-11-18 15:13:47 -080094 if (logger_list == nullptr || logger_list->log_mask == 0) {
Tom Cherry9156c532019-11-14 08:56:39 -080095 return -EINVAL;
96 }
97
Tom Cherry026ddde2019-11-18 15:13:47 -080098 int ret = 0;
Tom Cherry9156c532019-11-14 08:56:39 -080099
Tom Cherrye2187bf2020-01-27 15:45:52 -0800100#ifdef __ANDROID__
Tom Cherry026ddde2019-11-18 15:13:47 -0800101 if (logger_list->mode & ANDROID_LOG_PSTORE) {
102 ret = PmsgRead(logger_list, log_msg);
103 } else {
104 ret = LogdRead(logger_list, log_msg);
105 }
106#endif
Mark Salyzyn8fd1faa2016-05-13 12:25:55 -0700107
Tom Cherryb8bacea2019-11-15 16:41:36 -0800108 if (ret <= 0) {
Tom Cherry441054a2019-10-15 16:53:11 -0700109 return ret;
110 }
111
Tom Cherryd44a5f82020-02-05 14:55:27 -0800112 if (ret > LOGGER_ENTRY_MAX_LEN) {
113 ret = LOGGER_ENTRY_MAX_LEN;
Mark Salyzyn2ed51d72017-03-09 08:09:43 -0800114 }
115
Tom Cherry441054a2019-10-15 16:53:11 -0700116 if (ret < static_cast<int>(sizeof(log_msg->entry))) {
Mark Salyzyn2ed51d72017-03-09 08:09:43 -0800117 return -EINVAL;
118 }
119
Tom Cherry8d222532019-12-04 15:28:03 -0800120 if (log_msg->entry.hdr_size < sizeof(log_msg->entry) ||
Tom Cherryd44a5f82020-02-05 14:55:27 -0800121 log_msg->entry.hdr_size >= LOGGER_ENTRY_MAX_LEN - sizeof(log_msg->entry)) {
Tom Cherry441054a2019-10-15 16:53:11 -0700122 return -EINVAL;
123 }
124
125 if (log_msg->entry.len > ret - log_msg->entry.hdr_size) {
126 return -EINVAL;
Mark Salyzyn2ed51d72017-03-09 08:09:43 -0800127 }
128
Tom Cherryd44a5f82020-02-05 14:55:27 -0800129 log_msg->buf[log_msg->entry.len + log_msg->entry.hdr_size] = '\0';
130
Mark Salyzyn2ed51d72017-03-09 08:09:43 -0800131 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 Cherrye2187bf2020-01-27 15:45:52 -0800140#ifdef __ANDROID__
Tom Cherry026ddde2019-11-18 15:13:47 -0800141 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}