// Copyright (c) 2013 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "crazy_linker_debug.h" #include #include #ifdef __ANDROID__ #include #endif #include #include namespace crazy { #if CRAZY_DEBUG namespace { void LogArgs(const char* fmt, va_list args, bool print_error, int error) { const size_t buffer_size = 4096; char* buffer = reinterpret_cast(::malloc(buffer_size)); int ret; ret = vsnprintf(buffer, buffer_size, fmt, args); if (ret >= static_cast(buffer_size)) ret = static_cast(buffer_size) - 1; if (print_error) { strlcat(buffer, ": ", buffer_size); strlcat(buffer, strerror(error), buffer_size); } // First, send to stderr. fprintf(stderr, "%.*s", ret, buffer); #ifdef __ANDROID__ // Then to the Android log. __android_log_write(ANDROID_LOG_INFO, "crazy_linker", buffer); #endif ::free(buffer); } } // namespace void Log(const char* fmt, ...) { int old_errno = errno; va_list args; va_start(args, fmt); LogArgs(fmt, args, false, -1); va_end(args); errno = old_errno; } void LogErrno(const char* fmt, ...) { int old_errno = errno; va_list args; va_start(args, fmt); LogArgs(fmt, args, true, old_errno); va_end(args); errno = old_errno; } #endif // CRAZY_DEBUG } // namespace crazy