xref: /llvm-project/lldb/tools/debugserver/source/DNBError.cpp (revision 2946cd701067404b99c39fb29dc9c74bd7193eb3)
130fdc8d8SChris Lattner //===-- DNBError.cpp --------------------------------------------*- C++ -*-===//
230fdc8d8SChris Lattner //
3*2946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*2946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
5*2946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
630fdc8d8SChris Lattner //
730fdc8d8SChris Lattner //===----------------------------------------------------------------------===//
830fdc8d8SChris Lattner //
930fdc8d8SChris Lattner //  Created by Greg Clayton on 6/26/07.
1030fdc8d8SChris Lattner //
1130fdc8d8SChris Lattner //===----------------------------------------------------------------------===//
1230fdc8d8SChris Lattner 
1330fdc8d8SChris Lattner #include "DNBError.h"
1430fdc8d8SChris Lattner #include "CFString.h"
1530fdc8d8SChris Lattner #include "DNBLog.h"
1630fdc8d8SChris Lattner #include "PThreadMutex.h"
1730fdc8d8SChris Lattner 
1842999a48SJason Molenda #ifdef WITH_SPRINGBOARD
1930fdc8d8SChris Lattner #include <SpringBoardServices/SpringBoardServer.h>
2030fdc8d8SChris Lattner #endif
2130fdc8d8SChris Lattner 
AsString() const22b9c1b51eSKate Stone const char *DNBError::AsString() const {
2330fdc8d8SChris Lattner   if (Success())
2430fdc8d8SChris Lattner     return NULL;
2530fdc8d8SChris Lattner 
26b9c1b51eSKate Stone   if (m_str.empty()) {
2730fdc8d8SChris Lattner     const char *s = NULL;
28b9c1b51eSKate Stone     switch (m_flavor) {
2930fdc8d8SChris Lattner     case MachKernel:
3030fdc8d8SChris Lattner       s = ::mach_error_string(m_err);
3130fdc8d8SChris Lattner       break;
3230fdc8d8SChris Lattner 
3330fdc8d8SChris Lattner     case POSIX:
3430fdc8d8SChris Lattner       s = ::strerror(m_err);
3530fdc8d8SChris Lattner       break;
3630fdc8d8SChris Lattner 
3742999a48SJason Molenda #ifdef WITH_SPRINGBOARD
38b9c1b51eSKate Stone     case SpringBoard: {
3930fdc8d8SChris Lattner       CFStringRef statusStr = SBSApplicationLaunchingErrorString(m_err);
4030fdc8d8SChris Lattner       if (CFString::UTF8(statusStr, m_str) == NULL)
4130fdc8d8SChris Lattner         m_str.clear();
42b9c1b51eSKate Stone     } break;
4330fdc8d8SChris Lattner #endif
44a332978bSJason Molenda #ifdef WITH_BKS
45b9c1b51eSKate Stone     case BackBoard: {
46b9c1b51eSKate Stone       // You have to call ObjC routines to get the error string from
47b9c1b51eSKate Stone       // BackBoardServices.
48b9c1b51eSKate Stone       // Not sure I want to make DNBError.cpp an .mm file.  For now just make
49b9c1b51eSKate Stone       // sure you
50b9c1b51eSKate Stone       // pre-populate the error string when you make the DNBError of type
51b9c1b51eSKate Stone       // BackBoard.
52b9c1b51eSKate Stone       m_str.assign(
53b9c1b51eSKate Stone           "Should have set BackBoard error when making the error string.");
54b9c1b51eSKate Stone     } break;
55c611a740SJason Molenda #endif
56c611a740SJason Molenda #ifdef WITH_FBS
57b9c1b51eSKate Stone     case FrontBoard: {
58b9c1b51eSKate Stone       // You have to call ObjC routines to get the error string from
59b9c1b51eSKate Stone       // FrontBoardServices.
60b9c1b51eSKate Stone       // Not sure I want to make DNBError.cpp an .mm file.  For now just make
61b9c1b51eSKate Stone       // sure you
62b9c1b51eSKate Stone       // pre-populate the error string when you make the DNBError of type
63b9c1b51eSKate Stone       // FrontBoard.
64b9c1b51eSKate Stone       m_str.assign(
65b9c1b51eSKate Stone           "Should have set FrontBoard error when making the error string.");
66b9c1b51eSKate Stone     } break;
67a332978bSJason Molenda #endif
6830fdc8d8SChris Lattner     default:
6930fdc8d8SChris Lattner       break;
7030fdc8d8SChris Lattner     }
7130fdc8d8SChris Lattner     if (s)
7230fdc8d8SChris Lattner       m_str.assign(s);
7330fdc8d8SChris Lattner   }
7430fdc8d8SChris Lattner   if (m_str.empty())
7530fdc8d8SChris Lattner     return NULL;
7630fdc8d8SChris Lattner   return m_str.c_str();
7730fdc8d8SChris Lattner }
7830fdc8d8SChris Lattner 
LogThreadedIfError(const char * format,...) const79b9c1b51eSKate Stone void DNBError::LogThreadedIfError(const char *format, ...) const {
80b9c1b51eSKate Stone   if (Fail()) {
8130fdc8d8SChris Lattner     char *arg_msg = NULL;
8230fdc8d8SChris Lattner     va_list args;
8330fdc8d8SChris Lattner     va_start(args, format);
8430fdc8d8SChris Lattner     ::vasprintf(&arg_msg, format, args);
8530fdc8d8SChris Lattner     va_end(args);
8630fdc8d8SChris Lattner 
87b9c1b51eSKate Stone     if (arg_msg != NULL) {
8830fdc8d8SChris Lattner       const char *err_str = AsString();
8930fdc8d8SChris Lattner       if (err_str == NULL)
9030fdc8d8SChris Lattner         err_str = "???";
9130fdc8d8SChris Lattner       DNBLogThreaded("error: %s err = %s (0x%8.8x)", arg_msg, err_str, m_err);
9230fdc8d8SChris Lattner       free(arg_msg);
9330fdc8d8SChris Lattner     }
9430fdc8d8SChris Lattner   }
9530fdc8d8SChris Lattner }
9630fdc8d8SChris Lattner 
LogThreaded(const char * format,...) const97b9c1b51eSKate Stone void DNBError::LogThreaded(const char *format, ...) const {
9830fdc8d8SChris Lattner   char *arg_msg = NULL;
9930fdc8d8SChris Lattner   va_list args;
10030fdc8d8SChris Lattner   va_start(args, format);
10130fdc8d8SChris Lattner   ::vasprintf(&arg_msg, format, args);
10230fdc8d8SChris Lattner   va_end(args);
10330fdc8d8SChris Lattner 
104b9c1b51eSKate Stone   if (arg_msg != NULL) {
105b9c1b51eSKate Stone     if (Fail()) {
10630fdc8d8SChris Lattner       const char *err_str = AsString();
10730fdc8d8SChris Lattner       if (err_str == NULL)
10830fdc8d8SChris Lattner         err_str = "???";
10930fdc8d8SChris Lattner       DNBLogThreaded("error: %s err = %s (0x%8.8x)", arg_msg, err_str, m_err);
110b9c1b51eSKate Stone     } else {
11130fdc8d8SChris Lattner       DNBLogThreaded("%s err = 0x%8.8x", arg_msg, m_err);
11230fdc8d8SChris Lattner     }
11330fdc8d8SChris Lattner     free(arg_msg);
11430fdc8d8SChris Lattner   }
11530fdc8d8SChris Lattner }
116