1 // Copyright (c) 2013 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 "crazy_linker_debug.h"
6
7 #include <errno.h>
8 #include <string.h>
9
10 #ifdef __ANDROID__
11 #include <android/log.h>
12 #endif
13 #include <stdarg.h>
14 #include <stdio.h>
15
16 namespace crazy {
17
18 #if CRAZY_DEBUG
19
20 namespace {
21
LogArgs(const char * fmt,va_list args,bool print_error,int error)22 void LogArgs(const char* fmt, va_list args, bool print_error, int error) {
23 const size_t buffer_size = 4096;
24 char* buffer = reinterpret_cast<char*>(::malloc(buffer_size));
25 int ret;
26
27 ret = vsnprintf(buffer, buffer_size, fmt, args);
28 if (ret >= static_cast<int>(buffer_size))
29 ret = static_cast<int>(buffer_size) - 1;
30
31 if (print_error) {
32 strlcat(buffer, ": ", buffer_size);
33 strlcat(buffer, strerror(error), buffer_size);
34 }
35
36 // First, send to stderr.
37 fprintf(stderr, "%.*s", ret, buffer);
38
39 #ifdef __ANDROID__
40 // Then to the Android log.
41 __android_log_write(ANDROID_LOG_INFO, "crazy_linker", buffer);
42 #endif
43
44 ::free(buffer);
45 }
46
47 } // namespace
48
Log(const char * fmt,...)49 void Log(const char* fmt, ...) {
50 int old_errno = errno;
51 va_list args;
52 va_start(args, fmt);
53 LogArgs(fmt, args, false, -1);
54 va_end(args);
55 errno = old_errno;
56 }
57
LogErrno(const char * fmt,...)58 void LogErrno(const char* fmt, ...) {
59 int old_errno = errno;
60 va_list args;
61 va_start(args, fmt);
62 LogArgs(fmt, args, true, old_errno);
63 va_end(args);
64 errno = old_errno;
65 }
66
67 #endif // CRAZY_DEBUG
68
69 } // namespace crazy
70