xref: /aosp_15_r20/system/logging/liblog/properties.cpp (revision 598139dc91b21518d67c408eaea2644226490971)
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