1 // Copyright 2014 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include <stdarg.h> 6 #include <stdio.h> 7 #include <string.h> 8 9 #include <android/log.h> 10 #include <cutils/properties.h> 11 #include <hardware/hardware.h> 12 13 #define LOG_BUF_SIZE 1024 14 15 static int default_log_fn(int prio, const char* tag, const char* msg); 16 17 static hwcplus_log_fn_t hwcplus_log_fn = default_log_fn; 18 19 void hwcplus_set_log_fn(hwcplus_log_fn_t fn) { 20 hwcplus_log_fn = fn; 21 } 22 23 #ifndef HAVE_STRLCPY 24 size_t strlcpy(char* dst, const char* src, size_t siz) { 25 char* d = dst; 26 const char* s = src; 27 size_t n = siz; 28 29 /* Copy as many bytes as will fit */ 30 if (n != 0) { 31 while (--n != 0) { 32 if ((*d++ = *s++) == '\0') 33 break; 34 } 35 } 36 37 /* Not enough room in dst, add NUL and traverse rest of src */ 38 if (n == 0) { 39 if (siz != 0) 40 *d = '\0'; /* NUL-terminate dst */ 41 while (*s++) { 42 } 43 } 44 45 return(s - src - 1); /* count does not include NUL */ 46 } 47 #endif 48 49 static int default_log_fn(int prio, const char* tag, const char* msg) { 50 fprintf(stderr, "<%d> %s %s\n", prio, tag, msg); 51 } 52 53 int __android_log_write(int prio, const char* tag, const char* msg) { 54 hwcplus_log_fn(prio, tag, msg); 55 } 56 57 int __android_log_print(int prio, const char* tag, const char* fmt, ...) { 58 va_list ap; 59 char buf[LOG_BUF_SIZE]; 60 61 va_start(ap, fmt); 62 vsnprintf(buf, LOG_BUF_SIZE, fmt, ap); 63 va_end(ap); 64 65 return __android_log_write(prio, tag, buf); 66 } 67 68 void __android_log_assert(const char* cond, 69 const char* tag, 70 const char* fmt, 71 ...) { 72 char buf[LOG_BUF_SIZE]; 73 74 if (fmt) { 75 va_list ap; 76 va_start(ap, fmt); 77 vsnprintf(buf, LOG_BUF_SIZE, fmt, ap); 78 va_end(ap); 79 } else { 80 /* Msg not provided, log condition. N.B. Do not use cond directly as 81 * format string as it could contain spurious '%' syntax (e.g. 82 * "%d" in "blocks%devs == 0"). 83 */ 84 if (cond) 85 snprintf(buf, LOG_BUF_SIZE, "Assertion failed: %s", cond); 86 else 87 snprintf(buf, LOG_BUF_SIZE, "Unspecified assertion failed"); 88 } 89 90 __android_log_write(ANDROID_LOG_FATAL, tag, buf); 91 92 __builtin_trap(); /* trap so we have a chance to debug the situation */ 93 } 94 95 int property_get(const char* key, char* value, const char* default_value) { 96 printf("property_get %s\n", key); 97 const char* r = default_value; 98 if (!r) 99 r = ""; 100 strncpy(value, r, PROPERTY_VALUE_MAX); 101 return strlen(r); 102 } 103