1*598139dcSAndroid Build Coastguard Worker /*
2*598139dcSAndroid Build Coastguard Worker ** Copyright 2014, The Android Open Source Project
3*598139dcSAndroid Build Coastguard Worker **
4*598139dcSAndroid Build Coastguard Worker ** Licensed under the Apache License, Version 2.0 (the "License");
5*598139dcSAndroid Build Coastguard Worker ** you may not use this file except in compliance with the License.
6*598139dcSAndroid Build Coastguard Worker ** You may obtain a copy of the License at
7*598139dcSAndroid Build Coastguard Worker **
8*598139dcSAndroid Build Coastguard Worker ** http://www.apache.org/licenses/LICENSE-2.0
9*598139dcSAndroid Build Coastguard Worker **
10*598139dcSAndroid Build Coastguard Worker ** Unless required by applicable law or agreed to in writing, software
11*598139dcSAndroid Build Coastguard Worker ** distributed under the License is distributed on an "AS IS" BASIS,
12*598139dcSAndroid Build Coastguard Worker ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*598139dcSAndroid Build Coastguard Worker ** See the License for the specific language governing permissions and
14*598139dcSAndroid Build Coastguard Worker ** limitations under the License.
15*598139dcSAndroid Build Coastguard Worker */
16*598139dcSAndroid Build Coastguard Worker
17*598139dcSAndroid Build Coastguard Worker #include <log/log_properties.h>
18*598139dcSAndroid Build Coastguard Worker
19*598139dcSAndroid Build Coastguard Worker #include <ctype.h>
20*598139dcSAndroid Build Coastguard Worker #include <pthread.h>
21*598139dcSAndroid Build Coastguard Worker #include <stdlib.h>
22*598139dcSAndroid Build Coastguard Worker #include <string.h>
23*598139dcSAndroid Build Coastguard Worker #include <unistd.h>
24*598139dcSAndroid Build Coastguard Worker
25*598139dcSAndroid Build Coastguard Worker #include <algorithm>
26*598139dcSAndroid Build Coastguard Worker
27*598139dcSAndroid Build Coastguard Worker #include <android-base/macros.h>
28*598139dcSAndroid Build Coastguard Worker
29*598139dcSAndroid Build Coastguard Worker #include <private/android_logger.h>
30*598139dcSAndroid Build Coastguard Worker
31*598139dcSAndroid Build Coastguard Worker #include "logger_write.h"
32*598139dcSAndroid Build Coastguard Worker
33*598139dcSAndroid Build Coastguard Worker #ifdef __ANDROID__
34*598139dcSAndroid Build Coastguard Worker #include <sys/system_properties.h>
35*598139dcSAndroid Build Coastguard Worker
36*598139dcSAndroid Build Coastguard Worker static pthread_mutex_t lock_loggable = PTHREAD_MUTEX_INITIALIZER;
37*598139dcSAndroid Build Coastguard Worker
trylock()38*598139dcSAndroid Build Coastguard Worker static bool trylock() {
39*598139dcSAndroid Build Coastguard Worker /*
40*598139dcSAndroid Build Coastguard Worker * If we trigger a signal handler in the middle of locked activity and the
41*598139dcSAndroid Build Coastguard Worker * signal handler logs a message, we could get into a deadlock state.
42*598139dcSAndroid Build Coastguard Worker */
43*598139dcSAndroid Build Coastguard Worker /*
44*598139dcSAndroid Build Coastguard Worker * Any contention, and we can turn around and use the non-cached method
45*598139dcSAndroid Build Coastguard Worker * in less time than the system call associated with a mutex to deal with
46*598139dcSAndroid Build Coastguard Worker * the contention.
47*598139dcSAndroid Build Coastguard Worker */
48*598139dcSAndroid Build Coastguard Worker return pthread_mutex_trylock(&lock_loggable) == 0;
49*598139dcSAndroid Build Coastguard Worker }
50*598139dcSAndroid Build Coastguard Worker
unlock()51*598139dcSAndroid Build Coastguard Worker static void unlock() {
52*598139dcSAndroid Build Coastguard Worker pthread_mutex_unlock(&lock_loggable);
53*598139dcSAndroid Build Coastguard Worker }
54*598139dcSAndroid Build Coastguard Worker
55*598139dcSAndroid Build Coastguard Worker struct cache {
56*598139dcSAndroid Build Coastguard Worker const prop_info* pinfo;
57*598139dcSAndroid Build Coastguard Worker uint32_t serial;
58*598139dcSAndroid Build Coastguard Worker };
59*598139dcSAndroid Build Coastguard Worker
60*598139dcSAndroid Build Coastguard Worker struct cache_char {
61*598139dcSAndroid Build Coastguard Worker struct cache cache;
62*598139dcSAndroid Build Coastguard Worker unsigned char c;
63*598139dcSAndroid Build Coastguard Worker };
64*598139dcSAndroid Build Coastguard Worker
check_cache(struct cache * cache)65*598139dcSAndroid Build Coastguard Worker static int check_cache(struct cache* cache) {
66*598139dcSAndroid Build Coastguard Worker return cache->pinfo && __system_property_serial(cache->pinfo) != cache->serial;
67*598139dcSAndroid Build Coastguard Worker }
68*598139dcSAndroid Build Coastguard Worker
69*598139dcSAndroid Build Coastguard Worker #define BOOLEAN_TRUE 0xFF
70*598139dcSAndroid Build Coastguard Worker #define BOOLEAN_FALSE 0xFE
71*598139dcSAndroid Build Coastguard Worker
refresh_cache(struct cache_char * cache,const char * key)72*598139dcSAndroid Build Coastguard Worker static void refresh_cache(struct cache_char* cache, const char* key) {
73*598139dcSAndroid Build Coastguard Worker char buf[PROP_VALUE_MAX];
74*598139dcSAndroid Build Coastguard Worker
75*598139dcSAndroid Build Coastguard Worker if (!cache->cache.pinfo) {
76*598139dcSAndroid Build Coastguard Worker cache->cache.pinfo = __system_property_find(key);
77*598139dcSAndroid Build Coastguard Worker if (!cache->cache.pinfo) {
78*598139dcSAndroid Build Coastguard Worker return;
79*598139dcSAndroid Build Coastguard Worker }
80*598139dcSAndroid Build Coastguard Worker }
81*598139dcSAndroid Build Coastguard Worker cache->cache.serial = __system_property_serial(cache->cache.pinfo);
82*598139dcSAndroid Build Coastguard Worker __system_property_read(cache->cache.pinfo, 0, buf);
83*598139dcSAndroid Build Coastguard Worker switch (buf[0]) {
84*598139dcSAndroid Build Coastguard Worker case 't':
85*598139dcSAndroid Build Coastguard Worker case 'T':
86*598139dcSAndroid Build Coastguard Worker cache->c = strcasecmp(buf + 1, "rue") ? buf[0] : BOOLEAN_TRUE;
87*598139dcSAndroid Build Coastguard Worker break;
88*598139dcSAndroid Build Coastguard Worker case 'f':
89*598139dcSAndroid Build Coastguard Worker case 'F':
90*598139dcSAndroid Build Coastguard Worker cache->c = strcasecmp(buf + 1, "alse") ? buf[0] : BOOLEAN_FALSE;
91*598139dcSAndroid Build Coastguard Worker break;
92*598139dcSAndroid Build Coastguard Worker default:
93*598139dcSAndroid Build Coastguard Worker cache->c = buf[0];
94*598139dcSAndroid Build Coastguard Worker }
95*598139dcSAndroid Build Coastguard Worker }
96*598139dcSAndroid Build Coastguard Worker
__android_log_level(const char * tag,size_t tag_len)97*598139dcSAndroid Build Coastguard Worker static int __android_log_level(const char* tag, size_t tag_len) {
98*598139dcSAndroid Build Coastguard Worker if (tag == nullptr || tag_len == 0) {
99*598139dcSAndroid Build Coastguard Worker auto& tag_string = GetDefaultTag();
100*598139dcSAndroid Build Coastguard Worker tag = tag_string.c_str();
101*598139dcSAndroid Build Coastguard Worker tag_len = tag_string.size();
102*598139dcSAndroid Build Coastguard Worker }
103*598139dcSAndroid Build Coastguard Worker
104*598139dcSAndroid Build Coastguard Worker /*
105*598139dcSAndroid Build Coastguard Worker * Single layer cache of four properties. Priorities are:
106*598139dcSAndroid Build Coastguard Worker * log.tag.<tag>
107*598139dcSAndroid Build Coastguard Worker * persist.log.tag.<tag>
108*598139dcSAndroid Build Coastguard Worker * log.tag
109*598139dcSAndroid Build Coastguard Worker * persist.log.tag
110*598139dcSAndroid Build Coastguard Worker * Where the missing tag matches all tags and becomes the
111*598139dcSAndroid Build Coastguard Worker * system global default. We do not support ro.log.tag* .
112*598139dcSAndroid Build Coastguard Worker */
113*598139dcSAndroid Build Coastguard Worker static std::string* last_tag = new std::string;
114*598139dcSAndroid Build Coastguard Worker static uint32_t global_serial;
115*598139dcSAndroid Build Coastguard Worker uint32_t current_global_serial;
116*598139dcSAndroid Build Coastguard Worker static cache_char tag_cache[2];
117*598139dcSAndroid Build Coastguard Worker static cache_char global_cache[2];
118*598139dcSAndroid Build Coastguard Worker
119*598139dcSAndroid Build Coastguard Worker static const char* log_namespace = "persist.log.tag.";
120*598139dcSAndroid Build Coastguard Worker char key[strlen(log_namespace) + tag_len + 1];
121*598139dcSAndroid Build Coastguard Worker strcpy(key, log_namespace);
122*598139dcSAndroid Build Coastguard Worker
123*598139dcSAndroid Build Coastguard Worker bool locked = trylock();
124*598139dcSAndroid Build Coastguard Worker bool change_detected, global_change_detected;
125*598139dcSAndroid Build Coastguard Worker global_change_detected = change_detected = !locked;
126*598139dcSAndroid Build Coastguard Worker
127*598139dcSAndroid Build Coastguard Worker char c = 0;
128*598139dcSAndroid Build Coastguard Worker if (locked) {
129*598139dcSAndroid Build Coastguard Worker // Check all known serial numbers for changes.
130*598139dcSAndroid Build Coastguard Worker for (size_t i = 0; i < arraysize(tag_cache); ++i) {
131*598139dcSAndroid Build Coastguard Worker if (check_cache(&tag_cache[i].cache)) {
132*598139dcSAndroid Build Coastguard Worker change_detected = true;
133*598139dcSAndroid Build Coastguard Worker }
134*598139dcSAndroid Build Coastguard Worker }
135*598139dcSAndroid Build Coastguard Worker for (size_t i = 0; i < arraysize(global_cache); ++i) {
136*598139dcSAndroid Build Coastguard Worker if (check_cache(&global_cache[i].cache)) {
137*598139dcSAndroid Build Coastguard Worker global_change_detected = true;
138*598139dcSAndroid Build Coastguard Worker }
139*598139dcSAndroid Build Coastguard Worker }
140*598139dcSAndroid Build Coastguard Worker
141*598139dcSAndroid Build Coastguard Worker current_global_serial = __system_property_area_serial();
142*598139dcSAndroid Build Coastguard Worker if (current_global_serial != global_serial) {
143*598139dcSAndroid Build Coastguard Worker global_change_detected = change_detected = true;
144*598139dcSAndroid Build Coastguard Worker }
145*598139dcSAndroid Build Coastguard Worker }
146*598139dcSAndroid Build Coastguard Worker
147*598139dcSAndroid Build Coastguard Worker if (tag_len != 0) {
148*598139dcSAndroid Build Coastguard Worker bool local_change_detected = change_detected;
149*598139dcSAndroid Build Coastguard Worker if (locked) {
150*598139dcSAndroid Build Coastguard Worker // compare() rather than == because tag isn't guaranteed 0-terminated.
151*598139dcSAndroid Build Coastguard Worker if (last_tag->compare(0, last_tag->size(), tag, tag_len) != 0) {
152*598139dcSAndroid Build Coastguard Worker // Invalidate log.tag.<tag> cache.
153*598139dcSAndroid Build Coastguard Worker for (size_t i = 0; i < arraysize(tag_cache); ++i) {
154*598139dcSAndroid Build Coastguard Worker tag_cache[i].cache.pinfo = NULL;
155*598139dcSAndroid Build Coastguard Worker tag_cache[i].c = '\0';
156*598139dcSAndroid Build Coastguard Worker }
157*598139dcSAndroid Build Coastguard Worker last_tag->assign(tag, tag_len);
158*598139dcSAndroid Build Coastguard Worker local_change_detected = true;
159*598139dcSAndroid Build Coastguard Worker }
160*598139dcSAndroid Build Coastguard Worker }
161*598139dcSAndroid Build Coastguard Worker *stpncpy(key + strlen(log_namespace), tag, tag_len) = '\0';
162*598139dcSAndroid Build Coastguard Worker
163*598139dcSAndroid Build Coastguard Worker for (size_t i = 0; i < arraysize(tag_cache); ++i) {
164*598139dcSAndroid Build Coastguard Worker cache_char* cache = &tag_cache[i];
165*598139dcSAndroid Build Coastguard Worker cache_char temp_cache;
166*598139dcSAndroid Build Coastguard Worker
167*598139dcSAndroid Build Coastguard Worker if (!locked) {
168*598139dcSAndroid Build Coastguard Worker temp_cache.cache.pinfo = NULL;
169*598139dcSAndroid Build Coastguard Worker temp_cache.c = '\0';
170*598139dcSAndroid Build Coastguard Worker cache = &temp_cache;
171*598139dcSAndroid Build Coastguard Worker }
172*598139dcSAndroid Build Coastguard Worker if (local_change_detected) {
173*598139dcSAndroid Build Coastguard Worker refresh_cache(cache, i == 0 ? key : key + strlen("persist."));
174*598139dcSAndroid Build Coastguard Worker }
175*598139dcSAndroid Build Coastguard Worker
176*598139dcSAndroid Build Coastguard Worker if (cache->c) {
177*598139dcSAndroid Build Coastguard Worker c = cache->c;
178*598139dcSAndroid Build Coastguard Worker break;
179*598139dcSAndroid Build Coastguard Worker }
180*598139dcSAndroid Build Coastguard Worker }
181*598139dcSAndroid Build Coastguard Worker }
182*598139dcSAndroid Build Coastguard Worker
183*598139dcSAndroid Build Coastguard Worker switch (toupper(c)) { /* if invalid, resort to global */
184*598139dcSAndroid Build Coastguard Worker case 'V':
185*598139dcSAndroid Build Coastguard Worker case 'D':
186*598139dcSAndroid Build Coastguard Worker case 'I':
187*598139dcSAndroid Build Coastguard Worker case 'W':
188*598139dcSAndroid Build Coastguard Worker case 'E':
189*598139dcSAndroid Build Coastguard Worker case 'F': /* Not officially supported */
190*598139dcSAndroid Build Coastguard Worker case 'A':
191*598139dcSAndroid Build Coastguard Worker case 'S':
192*598139dcSAndroid Build Coastguard Worker case BOOLEAN_FALSE: /* Not officially supported */
193*598139dcSAndroid Build Coastguard Worker break;
194*598139dcSAndroid Build Coastguard Worker default:
195*598139dcSAndroid Build Coastguard Worker /* clear '.' after log.tag */
196*598139dcSAndroid Build Coastguard Worker key[strlen(log_namespace) - 1] = '\0';
197*598139dcSAndroid Build Coastguard Worker
198*598139dcSAndroid Build Coastguard Worker for (size_t i = 0; i < arraysize(global_cache); ++i) {
199*598139dcSAndroid Build Coastguard Worker cache_char* cache = &global_cache[i];
200*598139dcSAndroid Build Coastguard Worker cache_char temp_cache;
201*598139dcSAndroid Build Coastguard Worker
202*598139dcSAndroid Build Coastguard Worker if (!locked) {
203*598139dcSAndroid Build Coastguard Worker temp_cache = *cache;
204*598139dcSAndroid Build Coastguard Worker if (temp_cache.cache.pinfo != cache->cache.pinfo) { // check atomic
205*598139dcSAndroid Build Coastguard Worker temp_cache.cache.pinfo = NULL;
206*598139dcSAndroid Build Coastguard Worker temp_cache.c = '\0';
207*598139dcSAndroid Build Coastguard Worker }
208*598139dcSAndroid Build Coastguard Worker cache = &temp_cache;
209*598139dcSAndroid Build Coastguard Worker }
210*598139dcSAndroid Build Coastguard Worker if (global_change_detected) {
211*598139dcSAndroid Build Coastguard Worker refresh_cache(cache, i == 0 ? key : key + strlen("persist."));
212*598139dcSAndroid Build Coastguard Worker }
213*598139dcSAndroid Build Coastguard Worker
214*598139dcSAndroid Build Coastguard Worker if (cache->c) {
215*598139dcSAndroid Build Coastguard Worker c = cache->c;
216*598139dcSAndroid Build Coastguard Worker break;
217*598139dcSAndroid Build Coastguard Worker }
218*598139dcSAndroid Build Coastguard Worker }
219*598139dcSAndroid Build Coastguard Worker break;
220*598139dcSAndroid Build Coastguard Worker }
221*598139dcSAndroid Build Coastguard Worker
222*598139dcSAndroid Build Coastguard Worker if (locked) {
223*598139dcSAndroid Build Coastguard Worker global_serial = current_global_serial;
224*598139dcSAndroid Build Coastguard Worker unlock();
225*598139dcSAndroid Build Coastguard Worker }
226*598139dcSAndroid Build Coastguard Worker
227*598139dcSAndroid Build Coastguard Worker switch (toupper(c)) {
228*598139dcSAndroid Build Coastguard Worker /* clang-format off */
229*598139dcSAndroid Build Coastguard Worker case 'V': return ANDROID_LOG_VERBOSE;
230*598139dcSAndroid Build Coastguard Worker case 'D': return ANDROID_LOG_DEBUG;
231*598139dcSAndroid Build Coastguard Worker case 'I': return ANDROID_LOG_INFO;
232*598139dcSAndroid Build Coastguard Worker case 'W': return ANDROID_LOG_WARN;
233*598139dcSAndroid Build Coastguard Worker case 'E': return ANDROID_LOG_ERROR;
234*598139dcSAndroid Build Coastguard Worker case 'F': /* FALLTHRU */ /* Not officially supported */
235*598139dcSAndroid Build Coastguard Worker case 'A': return ANDROID_LOG_FATAL;
236*598139dcSAndroid Build Coastguard Worker case BOOLEAN_FALSE: /* FALLTHRU */ /* Not Officially supported */
237*598139dcSAndroid Build Coastguard Worker case 'S': return ANDROID_LOG_SILENT;
238*598139dcSAndroid Build Coastguard Worker /* clang-format on */
239*598139dcSAndroid Build Coastguard Worker }
240*598139dcSAndroid Build Coastguard Worker return -1;
241*598139dcSAndroid Build Coastguard Worker }
242*598139dcSAndroid Build Coastguard Worker
__android_log_is_loggable_len(int prio,const char * tag,size_t len,int default_prio)243*598139dcSAndroid Build Coastguard Worker int __android_log_is_loggable_len(int prio, const char* tag, size_t len, int default_prio) {
244*598139dcSAndroid Build Coastguard Worker int minimum_log_priority = __android_log_get_minimum_priority();
245*598139dcSAndroid Build Coastguard Worker int property_log_level = __android_log_level(tag, len);
246*598139dcSAndroid Build Coastguard Worker
247*598139dcSAndroid Build Coastguard Worker if (property_log_level >= 0 && minimum_log_priority != ANDROID_LOG_DEFAULT) {
248*598139dcSAndroid Build Coastguard Worker return prio >= std::min(property_log_level, minimum_log_priority);
249*598139dcSAndroid Build Coastguard Worker } else if (property_log_level >= 0) {
250*598139dcSAndroid Build Coastguard Worker return prio >= property_log_level;
251*598139dcSAndroid Build Coastguard Worker } else if (minimum_log_priority != ANDROID_LOG_DEFAULT) {
252*598139dcSAndroid Build Coastguard Worker return prio >= minimum_log_priority;
253*598139dcSAndroid Build Coastguard Worker } else {
254*598139dcSAndroid Build Coastguard Worker return prio >= default_prio;
255*598139dcSAndroid Build Coastguard Worker }
256*598139dcSAndroid Build Coastguard Worker }
257*598139dcSAndroid Build Coastguard Worker
__android_log_is_loggable(int prio,const char * tag,int default_prio)258*598139dcSAndroid Build Coastguard Worker int __android_log_is_loggable(int prio, const char* tag, int default_prio) {
259*598139dcSAndroid Build Coastguard Worker auto len = tag ? strlen(tag) : 0;
260*598139dcSAndroid Build Coastguard Worker return __android_log_is_loggable_len(prio, tag, len, default_prio);
261*598139dcSAndroid Build Coastguard Worker }
262*598139dcSAndroid Build Coastguard Worker
__android_log_is_debuggable()263*598139dcSAndroid Build Coastguard Worker int __android_log_is_debuggable() {
264*598139dcSAndroid Build Coastguard Worker static int is_debuggable = [] {
265*598139dcSAndroid Build Coastguard Worker char value[PROP_VALUE_MAX] = {};
266*598139dcSAndroid Build Coastguard Worker return __system_property_get("ro.debuggable", value) > 0 && !strcmp(value, "1");
267*598139dcSAndroid Build Coastguard Worker }();
268*598139dcSAndroid Build Coastguard Worker
269*598139dcSAndroid Build Coastguard Worker return is_debuggable;
270*598139dcSAndroid Build Coastguard Worker }
271*598139dcSAndroid Build Coastguard Worker
__android_log_security()272*598139dcSAndroid Build Coastguard Worker int __android_log_security() {
273*598139dcSAndroid Build Coastguard Worker static pthread_mutex_t security_lock = PTHREAD_MUTEX_INITIALIZER;
274*598139dcSAndroid Build Coastguard Worker static cache_char security_prop = {{NULL, 0xFFFFFFFF}, BOOLEAN_FALSE};
275*598139dcSAndroid Build Coastguard Worker static uint32_t security_serial = 0;
276*598139dcSAndroid Build Coastguard Worker
277*598139dcSAndroid Build Coastguard Worker if (pthread_mutex_trylock(&security_lock)) {
278*598139dcSAndroid Build Coastguard Worker /* We are willing to accept some race in this context */
279*598139dcSAndroid Build Coastguard Worker return security_prop.c == BOOLEAN_TRUE;
280*598139dcSAndroid Build Coastguard Worker }
281*598139dcSAndroid Build Coastguard Worker
282*598139dcSAndroid Build Coastguard Worker int change_detected = check_cache(&security_prop.cache);
283*598139dcSAndroid Build Coastguard Worker uint32_t current_serial = __system_property_area_serial();
284*598139dcSAndroid Build Coastguard Worker if (current_serial != security_serial) {
285*598139dcSAndroid Build Coastguard Worker change_detected = 1;
286*598139dcSAndroid Build Coastguard Worker }
287*598139dcSAndroid Build Coastguard Worker if (change_detected) {
288*598139dcSAndroid Build Coastguard Worker refresh_cache(&security_prop, "persist.logd.security");
289*598139dcSAndroid Build Coastguard Worker security_serial = current_serial;
290*598139dcSAndroid Build Coastguard Worker }
291*598139dcSAndroid Build Coastguard Worker
292*598139dcSAndroid Build Coastguard Worker int res = security_prop.c == BOOLEAN_TRUE;
293*598139dcSAndroid Build Coastguard Worker
294*598139dcSAndroid Build Coastguard Worker pthread_mutex_unlock(&security_lock);
295*598139dcSAndroid Build Coastguard Worker
296*598139dcSAndroid Build Coastguard Worker return res;
297*598139dcSAndroid Build Coastguard Worker }
298*598139dcSAndroid Build Coastguard Worker
299*598139dcSAndroid Build Coastguard Worker #else
300*598139dcSAndroid Build Coastguard Worker
__android_log_is_loggable(int prio,const char *,int)301*598139dcSAndroid Build Coastguard Worker int __android_log_is_loggable(int prio, const char*, int) {
302*598139dcSAndroid Build Coastguard Worker int minimum_priority = __android_log_get_minimum_priority();
303*598139dcSAndroid Build Coastguard Worker if (minimum_priority == ANDROID_LOG_DEFAULT) {
304*598139dcSAndroid Build Coastguard Worker minimum_priority = ANDROID_LOG_INFO;
305*598139dcSAndroid Build Coastguard Worker }
306*598139dcSAndroid Build Coastguard Worker return prio >= minimum_priority;
307*598139dcSAndroid Build Coastguard Worker }
308*598139dcSAndroid Build Coastguard Worker
__android_log_is_loggable_len(int prio,const char *,size_t,int def)309*598139dcSAndroid Build Coastguard Worker int __android_log_is_loggable_len(int prio, const char*, size_t, int def) {
310*598139dcSAndroid Build Coastguard Worker return __android_log_is_loggable(prio, nullptr, def);
311*598139dcSAndroid Build Coastguard Worker }
312*598139dcSAndroid Build Coastguard Worker
__android_log_is_debuggable()313*598139dcSAndroid Build Coastguard Worker int __android_log_is_debuggable() {
314*598139dcSAndroid Build Coastguard Worker return 1;
315*598139dcSAndroid Build Coastguard Worker }
316*598139dcSAndroid Build Coastguard Worker
__android_log_security()317*598139dcSAndroid Build Coastguard Worker int __android_log_security() {
318*598139dcSAndroid Build Coastguard Worker return 0;
319*598139dcSAndroid Build Coastguard Worker }
320*598139dcSAndroid Build Coastguard Worker
321*598139dcSAndroid Build Coastguard Worker #endif
322