• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
hwcplus_set_log_fn(hwcplus_log_fn_t fn)19 void hwcplus_set_log_fn(hwcplus_log_fn_t fn) {
20     hwcplus_log_fn = fn;
21 }
22 
23 #ifndef HAVE_STRLCPY
strlcpy(char * dst,const char * src,size_t siz)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 
default_log_fn(int prio,const char * tag,const char * msg)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 
__android_log_write(int prio,const char * tag,const char * msg)53 int __android_log_write(int prio, const char* tag, const char* msg) {
54     hwcplus_log_fn(prio, tag, msg);
55 }
56 
__android_log_print(int prio,const char * tag,const char * fmt,...)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 
__android_log_assert(const char * cond,const char * tag,const char * fmt,...)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 
property_get(const char * key,char * value,const char * default_value)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