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