Home | History | Annotate | Download | only in src
      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