ANDROID: hook tpm2-tss into the android logging system

Bug: 148102516
Test: Build other code using this
Change-Id: I224ceb5c23be25b51766eef2b5a01d8d92657caa
diff --git a/Android.bp b/Android.bp
index 26c2e11..5332aa1 100644
--- a/Android.bp
+++ b/Android.bp
@@ -92,12 +92,16 @@
     defaults: [ "tpm2-tss-defaults" ],
     srcs: [
         "src/util/*.c",
+        "src/util/*.cpp",
     ],
     local_include_dirs: [
         "include/tss2",
         "src",
         "src/util",
     ],
+    shared_libs: [
+        "libbase",
+    ],
 }
 
 cc_library {
diff --git a/src/util/log.c b/src/util/log.cpp
similarity index 84%
rename from src/util/log.c
rename to src/util/log.cpp
index c28bc69..8ab9405 100644
--- a/src/util/log.c
+++ b/src/util/log.cpp
@@ -11,6 +11,8 @@
 #define LOGMODULE log
 #include "log.h"
 
+#include <android-base/logging.h>
+
 #if !defined(_MSC_VER) || defined(__INTEL_COMPILER)
 #define likely(x)       __builtin_expect(!!(x), 1)
 #define unlikely(x)     __builtin_expect(!!(x), 0)
@@ -20,6 +22,8 @@
 #define unlikely(x)     (x)
 #endif
 
+extern "C" {
+
 /**
  * Compares two strings byte by byte and ignores the
  * character's case. Stops at the n-th byte of both
@@ -159,25 +163,55 @@
     if (loglevel > *status)
         return;
 
-    int size = snprintf(NULL, 0, "%s:%s:%s:%d:%s() %s \n",
+    int size = snprintf(NULL, 0, "%s:%s:%s:%d:%s() %s ",
                 log_strings[loglevel], module, file, line, func, msg);
     char fmt[size+1];
-    snprintf(fmt, sizeof(fmt), "%s:%s:%s:%d:%s() %s \n",
+    snprintf(fmt, sizeof(fmt), "%s:%s:%s:%d:%s() %s ",
                 log_strings[loglevel], module, file, line, func, msg);
 
     va_list vaargs;
     va_start(vaargs, msg);
-    vfprintf (stderr, fmt,
-        /* log_strings[loglevel], module, file, func, line, */
-        vaargs);
+    int complete_size = vsnprintf(NULL, 0, fmt, vaargs);
     va_end(vaargs);
+
+    va_start(vaargs, msg);
+    char complete[complete_size+1];
+    vsnprintf(complete, sizeof(complete), fmt, vaargs);
+    va_end(vaargs);
+
+    fprintf(stderr, "%s\n", complete);
+
+    switch (loglevel) {
+      case LOGLEVEL_NONE:
+        LOG(ERROR) << complete;
+        break;
+      case LOGLEVEL_ERROR:
+        LOG(ERROR) << complete;
+        break;
+      case LOGLEVEL_WARNING:
+        LOG(WARNING) << complete;
+        break;
+      case LOGLEVEL_INFO:
+        LOG(INFO) << complete;
+        break;
+      case LOGLEVEL_DEBUG:
+        LOG(DEBUG) << complete;
+        break;
+      case LOGLEVEL_TRACE:
+        LOG(VERBOSE) << complete;
+        break;
+      case LOGLEVEL_UNDEFINED:
+      default:
+        LOG(WARNING) << complete;
+        break;
+    }
 }
 
 static log_level
 log_stringlevel(const char *n)
 {
     log_level i;
-    for(i = 0; i < sizeof(log_strings)/sizeof(log_strings[0]); i++) {
+    for(i = (log_level) 0; i < sizeof(log_strings)/sizeof(log_strings[0]); i = (log_level) ((int) i + 1)) {
         if (case_insensitive_strncmp(log_strings[i], n, strlen(log_strings[i])) == 0) {
             return i;
         }
@@ -206,3 +240,5 @@
     }
     return loglevel;
 }
+
+} // extern "C"
diff --git a/src/util/log.h b/src/util/log.h
index 01010a6..09b6d5a 100644
--- a/src/util/log.h
+++ b/src/util/log.h
@@ -151,6 +151,10 @@
 #define LOGBLOB_TRACE(FORMAT, ...) {}
 #endif
 
+#ifdef __cplusplus
+extern "C" {
+#endif
+
 void
 doLog(log_level loglevel, const char *module, log_level logdefault,
        log_level *status,
@@ -165,4 +169,8 @@
           const uint8_t *buffer, size_t size, const char *msg, ...)
     COMPILER_ATTR(unused, format (printf, 10, 11));
 
+#ifdef __cplusplus
+} // extern "C"
+#endif
+
 #endif /* LOG_H */