1facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn/* 2facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn * Copyright (C) 2016 The Android Open Source Project 3facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn * 4facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn * Licensed under the Apache License, Version 2.0 (the "License"); 5facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn * you may not use this file except in compliance with the License. 6facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn * You may obtain a copy of the License at 7facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn * 8facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn * http://www.apache.org/licenses/LICENSE-2.0 9facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn * 10facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn * Unless required by applicable law or agreed to in writing, software 11facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn * distributed under the License is distributed on an "AS IS" BASIS, 12facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn * See the License for the specific language governing permissions and 14facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn * limitations under the License. 15facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn */ 16facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn 17facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn#ifndef _LIBLOG_LOGGER_H__ 18facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn#define _LIBLOG_LOGGER_H__ 19facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn 20facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn#include <stdbool.h> 21facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn#include <log/uio.h> 22facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn 23facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn#include <cutils/list.h> 24facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn#include <log/log.h> 25facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn#include <log/log_read.h> 26facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn#include <log/logger.h> 27facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn 28facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn#include "log_portability.h" 29facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn 30facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn__BEGIN_DECLS 31facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn 32facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn/* Union, sock or fd of zero is not allowed unless static initialized */ 33facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzynunion android_log_context { 34facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn void *private; 35facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn int sock; 36facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn int fd; 37facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn struct listnode *node; 38facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn}; 39facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn 40facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzynstruct android_log_transport_write { 41facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn struct listnode node; 42facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn const char *name; 435e635f7c06a01ec635a9774d4cf942e058dddb11Mark Salyzyn unsigned logMask; /* cache of available success */ 44facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn union android_log_context context; /* Initialized by static allocation */ 45facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn 46facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn int (*available)(log_id_t logId); 47facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn int (*open)(); 48facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn void (*close)(); 49facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn int (*write)(log_id_t logId, struct timespec *ts, struct iovec *vec, size_t nr); 50facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn}; 51facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn 52facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzynstruct android_log_logger_list; 53facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzynstruct android_log_transport_context; 54facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzynstruct android_log_logger; 55facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn 56facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzynstruct android_log_transport_read { 57facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn struct listnode node; 58facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn const char *name; 59facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn 60facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn int (*available)(log_id_t logId); 61facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn int (*version)(struct android_log_logger *logger, 62facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn struct android_log_transport_context *transp); 63facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn void (*close)(struct android_log_logger_list *logger_list, 64facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn struct android_log_transport_context *transp); 65facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn 66facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn /* 67facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn * Expect all to instantiate open on any call, so we do not have 68facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn * an expicit open call 69facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn */ 70facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn int (*read)(struct android_log_logger_list *logger_list, 71facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn struct android_log_transport_context *transp, 72facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn struct log_msg *log_msg); 73facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn /* Assumption is only called if not ANDROID_LOG_NONBLOCK */ 74facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn int (*poll)(struct android_log_logger_list *logger_list, 75facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn struct android_log_transport_context *transp); 76facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn 77facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn int (*clear)(struct android_log_logger *logger, 78facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn struct android_log_transport_context *transp); 79facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn ssize_t (*setSize)(struct android_log_logger *logger, 80facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn struct android_log_transport_context *transp, 81facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn size_t size); 82facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn ssize_t (*getSize)(struct android_log_logger *logger, 83facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn struct android_log_transport_context *transp); 84facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn ssize_t (*getReadableSize)(struct android_log_logger *logger, 85facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn struct android_log_transport_context *transp); 86facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn 87facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn ssize_t (*getPrune)(struct android_log_logger_list *logger_list, 88facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn struct android_log_transport_context *transp, 89facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn char *buf, size_t len); 90facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn ssize_t (*setPrune)(struct android_log_logger_list *logger_list, 91facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn struct android_log_transport_context *transp, 92facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn char *buf, size_t len); 93facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn ssize_t (*getStats)(struct android_log_logger_list *logger_list, 94facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn struct android_log_transport_context *transp, 95facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn char *buf, size_t len); 96facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn}; 97facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn 98facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzynstruct android_log_logger_list { 99facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn struct listnode logger; 100facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn struct listnode transport; 101facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn int mode; 102facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn unsigned int tail; 103facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn log_time start; 104facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn pid_t pid; 105facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn}; 106facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn 107facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzynstruct android_log_logger { 108facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn struct listnode node; 109facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn struct android_log_logger_list *parent; 110facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn 111facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn log_id_t logId; 112facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn}; 113facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn 114facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzynstruct android_log_transport_context { 115facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn struct listnode node; 116facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn union android_log_context context; /* zero init per-transport context */ 117facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn struct android_log_logger_list *parent; 118facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn 119facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn struct android_log_transport_read *transport; 120facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn unsigned logMask; 121facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn int ret; 122facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn struct log_msg logMsg; /* valid is logMsg.len != 0 */ 123facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn}; 124facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn 125facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn/* assumes caller has structures read-locked, single threaded, or fenced */ 126facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn#define transport_context_for_each(transp, logger_list) \ 127facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn for (transp = node_to_item((logger_list)->transport.next, \ 128facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn struct android_log_transport_context, \ 129facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn node); \ 130facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn (transp != node_to_item(&(logger_list)->transport, \ 131facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn struct android_log_transport_context, \ 132facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn node)) && \ 133facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn (transp->parent == (logger_list)); \ 134facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn transp = node_to_item(transp->node.next, \ 135facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn struct android_log_transport_context, node)) 136facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn 137facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn#define logger_for_each(logp, logger_list) \ 138facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn for (logp = node_to_item((logger_list)->logger.next, \ 139facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn struct android_log_logger, node); \ 140facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn (logp != node_to_item(&(logger_list)->logger, \ 141facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn struct android_log_logger, node)) && \ 142facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn (logp->parent == (logger_list)); \ 143facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn logp = node_to_item((logp)->node.next, \ 144facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn struct android_log_logger, node)) 145facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn 146facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn/* OS specific dribs and drabs */ 147facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn 148facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn#if defined(_WIN32) 149facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyntypedef uint32_t uid_t; 150facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn#endif 151facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn 152facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark SalyzynLIBLOG_HIDDEN uid_t __android_log_uid(); 153facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark SalyzynLIBLOG_HIDDEN pid_t __android_log_pid(); 154facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark SalyzynLIBLOG_HIDDEN void __android_log_lock(); 155facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark SalyzynLIBLOG_HIDDEN int __android_log_trylock(); 156facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark SalyzynLIBLOG_HIDDEN void __android_log_unlock(); 157f58e58a15cea7ba39249093e924a0a6e293c26aaMark SalyzynLIBLOG_HIDDEN int __android_log_is_debuggable(); 158facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn 159facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn__END_DECLS 160facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn 161facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn#endif /* _LIBLOG_LOGGER_H__ */ 162