1b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Copyright 2014 The Chromium Authors. All rights reserved. 2b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Use of this source code is governed by a BSD-style license that can be 3b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// found in the LICENSE file. 4b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 5b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#include "base/mac/mach_logging.h" 6b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 7b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#include <iomanip> 8b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#include <string> 9b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 10b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#include "base/strings/stringprintf.h" 11cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko#include "build/build_config.h" 12b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 13b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#if !defined(OS_IOS) 14b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#include <servers/bootstrap.h> 15b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#endif // !OS_IOS 16b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 17b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratnamespace { 18b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 19b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratstd::string FormatMachErrorNumber(mach_error_t mach_err) { 20b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // For the os/kern subsystem, give the error number in decimal as in 21b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // <mach/kern_return.h>. Otherwise, give it in hexadecimal to make it easier 22b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // to visualize the various bits. See <mach/error.h>. 23b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat if (mach_err >= 0 && mach_err < KERN_RETURN_MAX) { 24b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat return base::StringPrintf(" (%d)", mach_err); 25b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 26b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat return base::StringPrintf(" (0x%08x)", mach_err); 27b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 28b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 29b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} // namespace 30b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 31b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratnamespace logging { 32b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 33b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratMachLogMessage::MachLogMessage(const char* file_path, 34b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat int line, 35b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat LogSeverity severity, 36b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat mach_error_t mach_err) 37b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat : LogMessage(file_path, line, severity), 38b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat mach_err_(mach_err) { 39b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 40b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 41b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratMachLogMessage::~MachLogMessage() { 42b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat stream() << ": " 43b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat << mach_error_string(mach_err_) 44b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat << FormatMachErrorNumber(mach_err_); 45b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 46b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 47b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#if !defined(OS_IOS) 48b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 49b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratBootstrapLogMessage::BootstrapLogMessage(const char* file_path, 50b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat int line, 51b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat LogSeverity severity, 52b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat kern_return_t bootstrap_err) 53b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat : LogMessage(file_path, line, severity), 54b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat bootstrap_err_(bootstrap_err) { 55b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 56b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 57b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratBootstrapLogMessage::~BootstrapLogMessage() { 58b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat stream() << ": " 59b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat << bootstrap_strerror(bootstrap_err_); 60b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 61b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat switch (bootstrap_err_) { 62b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat case BOOTSTRAP_SUCCESS: 63b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat case BOOTSTRAP_NOT_PRIVILEGED: 64b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat case BOOTSTRAP_NAME_IN_USE: 65b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat case BOOTSTRAP_UNKNOWN_SERVICE: 66b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat case BOOTSTRAP_SERVICE_ACTIVE: 67b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat case BOOTSTRAP_BAD_COUNT: 68b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat case BOOTSTRAP_NO_MEMORY: 69b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat case BOOTSTRAP_NO_CHILDREN: { 70b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Show known bootstrap errors in decimal because that's how they're 71b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // defined in <servers/bootstrap.h>. 72b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat stream() << " (" << bootstrap_err_ << ")"; 73b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat break; 74b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 75b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 76b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat default: { 77b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // bootstrap_strerror passes unknown errors to mach_error_string, so 78b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // format them as they would be if they were handled by 79b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // MachErrorMessage. 80b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat stream() << FormatMachErrorNumber(bootstrap_err_); 81b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat break; 82b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 83b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 84b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 85b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 86b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#endif // !OS_IOS 87b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 88b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} // namespace logging 89