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