Merge "liblog: remove the rest of the log reader transport"
am: 4023938914
Change-Id: I3564e38f14fdce5dda77f2a553d371ee6c1f25ff
This commit is contained in:
commit
06a0f824c0
6 changed files with 73 additions and 121 deletions
|
|
@ -14,6 +14,8 @@
|
|||
* limitations under the License.
|
||||
*/
|
||||
|
||||
#include "logd_reader.h"
|
||||
|
||||
#include <errno.h>
|
||||
#include <fcntl.h>
|
||||
#include <inttypes.h>
|
||||
|
|
@ -35,39 +37,8 @@
|
|||
#include <private/android_filesystem_config.h>
|
||||
#include <private/android_logger.h>
|
||||
|
||||
#include "log_portability.h"
|
||||
#include "logd_reader.h"
|
||||
#include "logger.h"
|
||||
|
||||
static int LogdAvailable(log_id_t LogId);
|
||||
static int LogdRead(struct logger_list* logger_list, struct android_log_transport_context* transp,
|
||||
struct log_msg* log_msg);
|
||||
static void LogdClose(struct logger_list* logger_list,
|
||||
struct android_log_transport_context* transp);
|
||||
|
||||
struct android_log_transport_read logdLoggerRead = {
|
||||
.name = "logd",
|
||||
.available = LogdAvailable,
|
||||
.close = LogdClose,
|
||||
.read = LogdRead,
|
||||
};
|
||||
|
||||
static int LogdAvailable(log_id_t logId) {
|
||||
if (logId >= LOG_ID_MAX) {
|
||||
return -EINVAL;
|
||||
}
|
||||
if (logId == LOG_ID_SECURITY) {
|
||||
uid_t uid = __android_log_uid();
|
||||
if (uid != AID_SYSTEM) {
|
||||
return -EPERM;
|
||||
}
|
||||
}
|
||||
if (access("/dev/socket/logdw", W_OK) == 0) {
|
||||
return 0;
|
||||
}
|
||||
return -EBADF;
|
||||
}
|
||||
|
||||
// Connects to /dev/socket/<name> and returns the associated fd or returns -1 on error.
|
||||
// O_CLOEXEC is always set.
|
||||
static int socket_local_client(const std::string& name, int type) {
|
||||
|
|
@ -296,15 +267,11 @@ int android_logger_set_prune_list(struct logger_list* logger_list, char* buf, si
|
|||
return check_log_success(buf, SendLogdControlMessage(buf, len));
|
||||
}
|
||||
|
||||
static int logdOpen(struct logger_list* logger_list, struct android_log_transport_context* transp) {
|
||||
static int logdOpen(struct logger_list* logger_list) {
|
||||
char buffer[256], *cp, c;
|
||||
int ret, remaining, sock;
|
||||
|
||||
if (!logger_list) {
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
sock = atomic_load(&transp->context.sock);
|
||||
sock = atomic_load(&logger_list->fd);
|
||||
if (sock > 0) {
|
||||
return sock;
|
||||
}
|
||||
|
|
@ -377,7 +344,7 @@ static int logdOpen(struct logger_list* logger_list, struct android_log_transpor
|
|||
return ret;
|
||||
}
|
||||
|
||||
ret = atomic_exchange(&transp->context.sock, sock);
|
||||
ret = atomic_exchange(&logger_list->fd, sock);
|
||||
if ((ret > 0) && (ret != sock)) {
|
||||
close(ret);
|
||||
}
|
||||
|
|
@ -385,9 +352,8 @@ static int logdOpen(struct logger_list* logger_list, struct android_log_transpor
|
|||
}
|
||||
|
||||
/* Read from the selected logs */
|
||||
static int LogdRead(struct logger_list* logger_list, struct android_log_transport_context* transp,
|
||||
struct log_msg* log_msg) {
|
||||
int ret = logdOpen(logger_list, transp);
|
||||
int LogdRead(struct logger_list* logger_list, struct log_msg* log_msg) {
|
||||
int ret = logdOpen(logger_list);
|
||||
if (ret < 0) {
|
||||
return ret;
|
||||
}
|
||||
|
|
@ -405,8 +371,8 @@ static int LogdRead(struct logger_list* logger_list, struct android_log_transpor
|
|||
}
|
||||
|
||||
/* Close all the logs */
|
||||
static void LogdClose(struct logger_list*, struct android_log_transport_context* transp) {
|
||||
int sock = atomic_exchange(&transp->context.sock, -1);
|
||||
void LogdClose(struct logger_list* logger_list) {
|
||||
int sock = atomic_exchange(&logger_list->fd, -1);
|
||||
if (sock > 0) {
|
||||
close(sock);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -18,10 +18,14 @@
|
|||
|
||||
#include <unistd.h>
|
||||
|
||||
#include "log/log_read.h"
|
||||
#include "log_portability.h"
|
||||
|
||||
__BEGIN_DECLS
|
||||
|
||||
int LogdRead(struct logger_list* logger_list, struct log_msg* log_msg);
|
||||
void LogdClose(struct logger_list* logger_list);
|
||||
|
||||
ssize_t SendLogdControlMessage(char* buf, size_t buf_size);
|
||||
|
||||
__END_DECLS
|
||||
|
|
|
|||
|
|
@ -46,32 +46,8 @@ struct android_log_transport_write {
|
|||
size_t nr);
|
||||
};
|
||||
|
||||
struct android_log_transport_context;
|
||||
|
||||
struct android_log_transport_read {
|
||||
const char* name; /* human name to describe the transport */
|
||||
|
||||
/* Does not cause resources to be taken */
|
||||
int (*available)(log_id_t logId);
|
||||
/* Release resources taken by the following interfaces */
|
||||
void (*close)(struct logger_list* logger_list, struct android_log_transport_context* transp);
|
||||
/*
|
||||
* Expect all to instantiate open automagically on any call,
|
||||
* so we do not have an explicit open call.
|
||||
*/
|
||||
int (*read)(struct logger_list* logger_list, struct android_log_transport_context* transp,
|
||||
struct log_msg* log_msg);
|
||||
};
|
||||
|
||||
struct android_log_transport_context {
|
||||
union android_log_context_union context; /* zero init per-transport context */
|
||||
|
||||
struct android_log_transport_read* transport;
|
||||
};
|
||||
|
||||
struct logger_list {
|
||||
android_log_transport_context transport_context;
|
||||
bool transport_initialized;
|
||||
atomic_int fd;
|
||||
int mode;
|
||||
unsigned int tail;
|
||||
log_time start;
|
||||
|
|
|
|||
|
|
@ -31,7 +31,9 @@
|
|||
#include <private/android_filesystem_config.h>
|
||||
|
||||
#include "log_portability.h"
|
||||
#include "logd_reader.h"
|
||||
#include "logger.h"
|
||||
#include "pmsg_reader.h"
|
||||
|
||||
/* method for getting the associated sublog id */
|
||||
log_id_t android_logger_get_id(struct logger* logger) {
|
||||
|
|
@ -50,14 +52,6 @@ static struct logger_list* android_logger_list_alloc_internal(int mode, unsigned
|
|||
logger_list->tail = tail;
|
||||
logger_list->pid = pid;
|
||||
|
||||
#if (FAKE_LOG_DEVICE == 0)
|
||||
extern struct android_log_transport_read logdLoggerRead;
|
||||
extern struct android_log_transport_read pmsgLoggerRead;
|
||||
|
||||
logger_list->transport_context.transport =
|
||||
(mode & ANDROID_LOG_PSTORE) ? &pmsgLoggerRead : &logdLoggerRead;
|
||||
#endif
|
||||
|
||||
return logger_list;
|
||||
}
|
||||
|
||||
|
|
@ -100,14 +94,19 @@ struct logger_list* android_logger_list_open(log_id_t logId, int mode, unsigned
|
|||
}
|
||||
|
||||
int android_logger_list_read(struct logger_list* logger_list, struct log_msg* log_msg) {
|
||||
if (logger_list == nullptr || logger_list->transport_context.transport == nullptr ||
|
||||
logger_list->log_mask == 0) {
|
||||
if (logger_list == nullptr || logger_list->log_mask == 0) {
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
android_log_transport_context* transp = &logger_list->transport_context;
|
||||
int ret = 0;
|
||||
|
||||
int ret = (*transp->transport->read)(logger_list, transp, log_msg);
|
||||
#if (FAKE_LOG_DEVICE == 0)
|
||||
if (logger_list->mode & ANDROID_LOG_PSTORE) {
|
||||
ret = PmsgRead(logger_list, log_msg);
|
||||
} else {
|
||||
ret = LogdRead(logger_list, log_msg);
|
||||
}
|
||||
#endif
|
||||
|
||||
if (ret <= 0) {
|
||||
return ret;
|
||||
|
|
@ -138,11 +137,13 @@ void android_logger_list_free(struct logger_list* logger_list) {
|
|||
return;
|
||||
}
|
||||
|
||||
android_log_transport_context* transport_context = &logger_list->transport_context;
|
||||
|
||||
if (transport_context->transport && transport_context->transport->close) {
|
||||
(*transport_context->transport->close)(logger_list, transport_context);
|
||||
#if (FAKE_LOG_DEVICE == 0)
|
||||
if (logger_list->mode & ANDROID_LOG_PSTORE) {
|
||||
PmsgClose(logger_list);
|
||||
} else {
|
||||
LogdClose(logger_list);
|
||||
}
|
||||
#endif
|
||||
|
||||
free(logger_list);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -14,6 +14,8 @@
|
|||
* limitations under the License.
|
||||
*/
|
||||
|
||||
#include "pmsg_reader.h"
|
||||
|
||||
#include <ctype.h>
|
||||
#include <errno.h>
|
||||
#include <fcntl.h>
|
||||
|
|
@ -26,31 +28,7 @@
|
|||
|
||||
#include "logger.h"
|
||||
|
||||
static int PmsgAvailable(log_id_t logId);
|
||||
static int PmsgRead(struct logger_list* logger_list, struct android_log_transport_context* transp,
|
||||
struct log_msg* log_msg);
|
||||
static void PmsgClose(struct logger_list* logger_list,
|
||||
struct android_log_transport_context* transp);
|
||||
|
||||
struct android_log_transport_read pmsgLoggerRead = {
|
||||
.name = "pmsg",
|
||||
.available = PmsgAvailable,
|
||||
.close = PmsgClose,
|
||||
.read = PmsgRead,
|
||||
};
|
||||
|
||||
static int PmsgAvailable(log_id_t logId) {
|
||||
if (logId > LOG_ID_SECURITY) {
|
||||
return -EINVAL;
|
||||
}
|
||||
if (access("/dev/pmsg0", W_OK) == 0) {
|
||||
return 0;
|
||||
}
|
||||
return -EBADF;
|
||||
}
|
||||
|
||||
static int PmsgRead(struct logger_list* logger_list, struct android_log_transport_context* transp,
|
||||
struct log_msg* log_msg) {
|
||||
int PmsgRead(struct logger_list* logger_list, struct log_msg* log_msg) {
|
||||
ssize_t ret;
|
||||
off_t current, next;
|
||||
struct __attribute__((__packed__)) {
|
||||
|
|
@ -62,7 +40,7 @@ static int PmsgRead(struct logger_list* logger_list, struct android_log_transpor
|
|||
|
||||
memset(log_msg, 0, sizeof(*log_msg));
|
||||
|
||||
if (atomic_load(&transp->context.fd) <= 0) {
|
||||
if (atomic_load(&logger_list->fd) <= 0) {
|
||||
int i, fd = open("/sys/fs/pstore/pmsg-ramoops-0", O_RDONLY | O_CLOEXEC);
|
||||
|
||||
if (fd < 0) {
|
||||
|
|
@ -75,7 +53,7 @@ static int PmsgRead(struct logger_list* logger_list, struct android_log_transpor
|
|||
return -errno;
|
||||
}
|
||||
}
|
||||
i = atomic_exchange(&transp->context.fd, fd);
|
||||
i = atomic_exchange(&logger_list->fd, fd);
|
||||
if ((i > 0) && (i != fd)) {
|
||||
close(i);
|
||||
}
|
||||
|
|
@ -86,7 +64,7 @@ static int PmsgRead(struct logger_list* logger_list, struct android_log_transpor
|
|||
int fd;
|
||||
|
||||
if (preread_count < sizeof(buf)) {
|
||||
fd = atomic_load(&transp->context.fd);
|
||||
fd = atomic_load(&logger_list->fd);
|
||||
if (fd <= 0) {
|
||||
return -EBADF;
|
||||
}
|
||||
|
|
@ -120,7 +98,7 @@ static int PmsgRead(struct logger_list* logger_list, struct android_log_transpor
|
|||
(!logger_list->pid || (logger_list->pid == buf.p.pid))) {
|
||||
char* msg = log_msg->entry.msg;
|
||||
*msg = buf.prio;
|
||||
fd = atomic_load(&transp->context.fd);
|
||||
fd = atomic_load(&logger_list->fd);
|
||||
if (fd <= 0) {
|
||||
return -EBADF;
|
||||
}
|
||||
|
|
@ -144,7 +122,7 @@ static int PmsgRead(struct logger_list* logger_list, struct android_log_transpor
|
|||
return ret + sizeof(buf.prio) + log_msg->entry.hdr_size;
|
||||
}
|
||||
|
||||
fd = atomic_load(&transp->context.fd);
|
||||
fd = atomic_load(&logger_list->fd);
|
||||
if (fd <= 0) {
|
||||
return -EBADF;
|
||||
}
|
||||
|
|
@ -152,7 +130,7 @@ static int PmsgRead(struct logger_list* logger_list, struct android_log_transpor
|
|||
if (current < 0) {
|
||||
return -errno;
|
||||
}
|
||||
fd = atomic_load(&transp->context.fd);
|
||||
fd = atomic_load(&logger_list->fd);
|
||||
if (fd <= 0) {
|
||||
return -EBADF;
|
||||
}
|
||||
|
|
@ -166,8 +144,8 @@ static int PmsgRead(struct logger_list* logger_list, struct android_log_transpor
|
|||
}
|
||||
}
|
||||
|
||||
static void PmsgClose(struct logger_list*, struct android_log_transport_context* transp) {
|
||||
int fd = atomic_exchange(&transp->context.fd, 0);
|
||||
void PmsgClose(struct logger_list* logger_list) {
|
||||
int fd = atomic_exchange(&logger_list->fd, 0);
|
||||
if (fd > 0) {
|
||||
close(fd);
|
||||
}
|
||||
|
|
@ -185,7 +163,6 @@ ssize_t __android_log_pmsg_file_read(log_id_t logId, char prio, const char* pref
|
|||
__android_log_pmsg_file_read_fn fn, void* arg) {
|
||||
ssize_t ret;
|
||||
struct logger_list logger_list;
|
||||
struct android_log_transport_context transp;
|
||||
struct content {
|
||||
struct listnode node;
|
||||
struct logger_entry entry;
|
||||
|
|
@ -207,7 +184,6 @@ ssize_t __android_log_pmsg_file_read(log_id_t logId, char prio, const char* pref
|
|||
|
||||
/* Add just enough clues in logger_list and transp to make API function */
|
||||
memset(&logger_list, 0, sizeof(logger_list));
|
||||
memset(&transp, 0, sizeof(transp));
|
||||
|
||||
logger_list.mode = ANDROID_LOG_PSTORE | ANDROID_LOG_NONBLOCK | ANDROID_LOG_RDONLY;
|
||||
logger_list.log_mask = (unsigned)-1;
|
||||
|
|
@ -241,7 +217,7 @@ ssize_t __android_log_pmsg_file_read(log_id_t logId, char prio, const char* pref
|
|||
|
||||
/* Read the file content */
|
||||
log_msg log_msg;
|
||||
while (PmsgRead(&logger_list, &transp, &log_msg) > 0) {
|
||||
while (PmsgRead(&logger_list, &log_msg) > 0) {
|
||||
const char* cp;
|
||||
size_t hdr_size = log_msg.entry.hdr_size;
|
||||
|
||||
|
|
@ -399,7 +375,7 @@ ssize_t __android_log_pmsg_file_read(log_id_t logId, char prio, const char* pref
|
|||
}
|
||||
list_add_head(node, &content->node);
|
||||
}
|
||||
PmsgClose(&logger_list, &transp);
|
||||
PmsgClose(&logger_list);
|
||||
|
||||
/* Progress through all the collected files */
|
||||
list_for_each_safe(node, n, &name_list) {
|
||||
|
|
|
|||
29
liblog/pmsg_reader.h
Normal file
29
liblog/pmsg_reader.h
Normal file
|
|
@ -0,0 +1,29 @@
|
|||
/*
|
||||
* Copyright 2019 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <unistd.h>
|
||||
|
||||
#include "log/log_read.h"
|
||||
#include "log_portability.h"
|
||||
|
||||
__BEGIN_DECLS
|
||||
|
||||
int PmsgRead(struct logger_list* logger_list, struct log_msg* log_msg);
|
||||
void PmsgClose(struct logger_list* logger_list);
|
||||
|
||||
__END_DECLS
|
||||
Loading…
Add table
Reference in a new issue