1f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 2f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// found in the LICENSE file. 4f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 5f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "crazy_linker_debug.h" 6f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 7f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include <errno.h> 8f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include <string.h> 9f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 10f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#ifdef __ANDROID__ 11f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include <android/log.h> 12f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#endif 13f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include <stdarg.h> 14f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include <stdio.h> 15f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 16f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)namespace crazy { 17f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 18f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#if CRAZY_DEBUG 19f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 20f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)namespace { 21f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 22f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void LogArgs(const char* fmt, va_list args, bool print_error, int error) { 23f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const size_t buffer_size = 4096; 24f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) char* buffer = reinterpret_cast<char*>(::malloc(buffer_size)); 25f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) int ret; 26f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 27f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ret = vsnprintf(buffer, buffer_size, fmt, args); 28f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (ret >= static_cast<int>(buffer_size)) 29f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ret = static_cast<int>(buffer_size) - 1; 30f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 31f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (print_error) { 32f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) strlcat(buffer, ": ", buffer_size); 33f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) strlcat(buffer, strerror(error), buffer_size); 34f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 35f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 36f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // First, send to stderr. 37f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) fprintf(stderr, "%.*s", ret, buffer); 38f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 39f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#ifdef __ANDROID__ 40f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Then to the Android log. 41f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) __android_log_write(ANDROID_LOG_INFO, "crazy_linker", buffer); 42f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#endif 43f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 44f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ::free(buffer); 45f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 46f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 47f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} // namespace 48f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 49f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void Log(const char* fmt, ...) { 50f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) int old_errno = errno; 51f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) va_list args; 52f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) va_start(args, fmt); 53f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) LogArgs(fmt, args, false, -1); 54f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) va_end(args); 55f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) errno = old_errno; 56f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 57f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 58f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void LogErrno(const char* fmt, ...) { 59f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) int old_errno = errno; 60f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) va_list args; 61f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) va_start(args, fmt); 62f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) LogArgs(fmt, args, true, old_errno); 63f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) va_end(args); 64f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) errno = old_errno; 65f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 66f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 67f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#endif // CRAZY_DEBUG 68f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 69f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} // namespace crazy 70