1 //===-- OsLogger.cpp --------------------------------------------*- C++ -*-===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 
10 #include "OsLogger.h"
11 #include <Availability.h>
12 
13 #if (LLDB_USE_OS_LOG) && (__MAC_OS_X_VERSION_MAX_ALLOWED >= 101200)
14 
15 #include <os/log.h>
16 
17 #include "DNBDefs.h"
18 #include "DNBLog.h"
19 
20 #define LLDB_OS_LOG_MAX_BUFFER_LENGTH 256
21 
22 namespace {
23 //----------------------------------------------------------------------
24 // Darwin os_log logging callback that can be registered with
25 // DNBLogSetLogCallback
26 //----------------------------------------------------------------------
27 void DarwinLogCallback(void *baton, uint32_t flags, const char *format,
28                        va_list args) {
29   if (format == nullptr)
30     return;
31 
32   static os_log_t g_logger;
33   if (!g_logger) {
34     g_logger = os_log_create("com.apple.dt.lldb", "debugserver");
35     if (!g_logger)
36       return;
37   }
38 
39   os_log_type_t log_type;
40   if (flags & DNBLOG_FLAG_FATAL)
41     log_type = OS_LOG_TYPE_FAULT;
42   else if (flags & DNBLOG_FLAG_ERROR)
43     log_type = OS_LOG_TYPE_ERROR;
44   else if (flags & DNBLOG_FLAG_WARNING)
45     log_type = OS_LOG_TYPE_DEFAULT;
46   else if (flags & DNBLOG_FLAG_VERBOSE)
47     log_type = OS_LOG_TYPE_DEBUG;
48   else
49     log_type = OS_LOG_TYPE_DEFAULT;
50 
51   // This code is unfortunate.  os_log* only takes static strings, but
52   // our current log API isn't set up to make use of that style.
53   char buffer[LLDB_OS_LOG_MAX_BUFFER_LENGTH];
54   vsnprintf(buffer, sizeof(buffer), format, args);
55   os_log_with_type(g_logger, log_type, "%{public}s", buffer);
56 }
57 }
58 
59 DNBCallbackLog OsLogger::GetLogFunction() { return DarwinLogCallback; }
60 
61 #else
62 
63 DNBCallbackLog OsLogger::GetLogFunction() { return nullptr; }
64 
65 #endif
66 
67