1/*
2 * Copyright (C) 2005-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
17#ifndef _LIBS_LOG_LOG_H
18#define _LIBS_LOG_LOG_H
19
20/* Too many in the ecosystem assume these are included */
21#if !defined(_WIN32)
22#include <pthread.h>
23#endif
24#include <stdint.h> /* uint16_t, int32_t */
25#include <stdio.h>
26#include <sys/types.h>
27#include <time.h>
28#include <unistd.h>
29
30#include <android/log.h>
31#include <log/log_id.h>
32#include <log/log_main.h>
33#include <log/log_radio.h>
34#include <log/log_read.h>
35#include <log/log_safetynet.h>
36#include <log/log_system.h>
37#include <log/log_time.h>
38#include <log/uio.h> /* helper to define iovec for portability */
39
40#ifdef __cplusplus
41extern "C" {
42#endif
43
44/*
45 * LOG_TAG is the local tag used for the following simplified
46 * logging macros.  You can change this preprocessor definition
47 * before using the other macros to change the tag.
48 */
49
50#ifndef LOG_TAG
51#define LOG_TAG NULL
52#endif
53
54/*
55 * Normally we strip the effects of ALOGV (VERBOSE messages),
56 * LOG_FATAL and LOG_FATAL_IF (FATAL assert messages) from the
57 * release builds be defining NDEBUG.  You can modify this (for
58 * example with "#define LOG_NDEBUG 0" at the top of your source
59 * file) to change that behavior.
60 */
61
62#ifndef LOG_NDEBUG
63#ifdef NDEBUG
64#define LOG_NDEBUG 1
65#else
66#define LOG_NDEBUG 0
67#endif
68#endif
69
70/* --------------------------------------------------------------------- */
71
72/*
73 * This file uses ", ## __VA_ARGS__" zero-argument token pasting to
74 * work around issues with debug-only syntax errors in assertions
75 * that are missing format strings.  See commit
76 * 19299904343daf191267564fe32e6cd5c165cd42
77 */
78#if defined(__clang__)
79#pragma clang diagnostic push
80#pragma clang diagnostic ignored "-Wgnu-zero-variadic-macro-arguments"
81#endif
82
83/* --------------------------------------------------------------------- */
84
85/*
86 * Event logging.
87 */
88
89/*
90 * The following should not be used directly.
91 */
92
93int __android_log_bwrite(int32_t tag, const void* payload, size_t len);
94int __android_log_btwrite(int32_t tag, char type, const void* payload,
95                          size_t len);
96int __android_log_bswrite(int32_t tag, const char* payload);
97
98int __android_log_stats_bwrite(int32_t tag, const void* payload, size_t len);
99
100#define android_bWriteLog(tag, payload, len) \
101  __android_log_bwrite(tag, payload, len)
102#define android_btWriteLog(tag, type, payload, len) \
103  __android_log_btwrite(tag, type, payload, len)
104
105/*
106 * Event log entry types.
107 */
108#ifndef __AndroidEventLogType_defined
109#define __AndroidEventLogType_defined
110typedef enum {
111  /* Special markers for android_log_list_element type */
112  EVENT_TYPE_LIST_STOP = '\n', /* declare end of list  */
113  EVENT_TYPE_UNKNOWN = '?',    /* protocol error       */
114
115  /* must match with declaration in java/android/android/util/EventLog.java */
116  EVENT_TYPE_INT = 0,  /* int32_t */
117  EVENT_TYPE_LONG = 1, /* int64_t */
118  EVENT_TYPE_STRING = 2,
119  EVENT_TYPE_LIST = 3,
120  EVENT_TYPE_FLOAT = 4,
121} AndroidEventLogType;
122#endif
123#define sizeof_AndroidEventLogType sizeof(typeof_AndroidEventLogType)
124#define typeof_AndroidEventLogType unsigned char
125
126#ifndef LOG_EVENT_INT
127#define LOG_EVENT_INT(_tag, _value)                                          \
128  {                                                                          \
129    int intBuf = _value;                                                     \
130    (void)android_btWriteLog(_tag, EVENT_TYPE_INT, &intBuf, sizeof(intBuf)); \
131  }
132#endif
133#ifndef LOG_EVENT_LONG
134#define LOG_EVENT_LONG(_tag, _value)                                            \
135  {                                                                             \
136    long long longBuf = _value;                                                 \
137    (void)android_btWriteLog(_tag, EVENT_TYPE_LONG, &longBuf, sizeof(longBuf)); \
138  }
139#endif
140#ifndef LOG_EVENT_FLOAT
141#define LOG_EVENT_FLOAT(_tag, _value)                           \
142  {                                                             \
143    float floatBuf = _value;                                    \
144    (void)android_btWriteLog(_tag, EVENT_TYPE_FLOAT, &floatBuf, \
145                             sizeof(floatBuf));                 \
146  }
147#endif
148#ifndef LOG_EVENT_STRING
149#define LOG_EVENT_STRING(_tag, _value) \
150  (void)__android_log_bswrite(_tag, _value);
151#endif
152
153#ifdef __linux__
154
155#ifndef __ANDROID_USE_LIBLOG_CLOCK_INTERFACE
156#ifndef __ANDROID_API__
157#define __ANDROID_USE_LIBLOG_CLOCK_INTERFACE 1
158#elif __ANDROID_API__ > 22 /* > Lollipop */
159#define __ANDROID_USE_LIBLOG_CLOCK_INTERFACE 1
160#else
161#define __ANDROID_USE_LIBLOG_CLOCK_INTERFACE 0
162#endif
163#endif
164
165#if __ANDROID_USE_LIBLOG_CLOCK_INTERFACE
166clockid_t android_log_clockid(void);
167#endif
168
169#endif /* __linux__ */
170
171/* --------------------------------------------------------------------- */
172
173#ifndef __ANDROID_USE_LIBLOG_CLOSE_INTERFACE
174#ifndef __ANDROID_API__
175#define __ANDROID_USE_LIBLOG_CLOSE_INTERFACE 1
176#elif __ANDROID_API__ > 18 /* > JellyBean */
177#define __ANDROID_USE_LIBLOG_CLOSE_INTERFACE 1
178#else
179#define __ANDROID_USE_LIBLOG_CLOSE_INTERFACE 0
180#endif
181#endif
182
183#if __ANDROID_USE_LIBLOG_CLOSE_INTERFACE
184/*
185 * Release any logger resources (a new log write will immediately re-acquire)
186 *
187 * May be used to clean up File descriptors after a Fork, the resources are
188 * all O_CLOEXEC so wil self clean on exec().
189 */
190void __android_log_close(void);
191#endif
192
193#ifndef __ANDROID_USE_LIBLOG_RATELIMIT_INTERFACE
194#ifndef __ANDROID_API__
195#define __ANDROID_USE_LIBLOG_RATELIMIT_INTERFACE 1
196#elif __ANDROID_API__ > 25 /* > OC */
197#define __ANDROID_USE_LIBLOG_RATELIMIT_INTERFACE 1
198#else
199#define __ANDROID_USE_LIBLOG_RATELIMIT_INTERFACE 0
200#endif
201#endif
202
203#if __ANDROID_USE_LIBLOG_RATELIMIT_INTERFACE
204
205/*
206 * if last is NULL, caller _must_ provide a consistent value for seconds.
207 *
208 * Return -1 if we can not acquire a lock, which below will permit the logging,
209 * error on allowing a log message through.
210 */
211int __android_log_ratelimit(time_t seconds, time_t* last);
212
213/*
214 * Usage:
215 *
216 *   // Global default and state
217 *   IF_ALOG_RATELIMIT() {
218 *      ALOG*(...);
219 *   }
220 *
221 *   // local state, 10 seconds ratelimit
222 *   static time_t local_state;
223 *   IF_ALOG_RATELIMIT_LOCAL(10, &local_state) {
224 *     ALOG*(...);
225 *   }
226 */
227
228#define IF_ALOG_RATELIMIT() if (__android_log_ratelimit(0, NULL) > 0)
229#define IF_ALOG_RATELIMIT_LOCAL(seconds, state) \
230  if (__android_log_ratelimit(seconds, state) > 0)
231
232#else
233
234/* No ratelimiting as API unsupported */
235#define IF_ALOG_RATELIMIT() if (1)
236#define IF_ALOG_RATELIMIT_LOCAL(...) if (1)
237
238#endif
239
240#if defined(__clang__)
241#pragma clang diagnostic pop
242#endif
243
244#ifdef __cplusplus
245}
246#endif
247
248#endif /* _LIBS_LOG_LOG_H */
249