1 /* 2 * Copyright (c) 2003-2024 Apple Inc. All rights reserved. 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * https://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 #include <stdio.h> 18 #include <string.h> 19 20 #if defined(WIN32) || defined(EFI32) || defined(EFI64) || defined(EFIX64) 21 // Need to add Windows/EFI syslog support here 22 #define LOG_PID 0x01 23 #define LOG_CONS 0x02 24 #define LOG_PERROR 0x20 25 #else 26 #include <syslog.h> 27 #endif 28 29 #include "mDNSEmbeddedAPI.h" 30 #include "mdns_strict.h" 31 32 mDNSexport int mDNS_LoggingEnabled = 0; 33 mDNSexport int mDNS_DebugLoggingEnabled = 0; 34 mDNSexport int mDNS_PacketLoggingEnabled = 0; 35 mDNSexport int mDNS_McastLoggingEnabled = 0; 36 mDNSexport int mDNS_McastTracingEnabled = 0; 37 38 #if MDNS_DEBUGMSGS && defined(__APPLE__) 39 mDNSexport int mDNS_DebugMode = mDNStrue; 40 #else 41 mDNSexport int mDNS_DebugMode = mDNSfalse; 42 #endif 43 44 #if MDNSRESPONDER_SUPPORTS(APPLE, LOG_PRIVACY_LEVEL) 45 mDNSexport int gNumOfSensitiveLoggingEnabledQuestions = 0; 46 mDNSexport int gSensitiveLoggingEnabled = 0; 47 #endif 48 49 // Note, this uses mDNS_vsnprintf instead of standard "vsnprintf", because mDNS_vsnprintf knows 50 // how to print special data types like IP addresses and length-prefixed domain names 51 #if MDNS_DEBUGMSGS > 1 52 mDNSexport void verbosedebugf_(const char *format, ...) 53 { 54 char buffer[512]; 55 va_list args; 56 va_start(args, format); 57 mDNS_vsnprintf(buffer, sizeof(buffer), format, args); 58 va_end(args); 59 mDNSPlatformWriteDebugMsg(buffer); 60 } 61 #endif 62 63 // Log message with default "mDNSResponder" ident string at the start 64 #if MDNSRESPONDER_SUPPORTS(APPLE, OS_LOG) 65 mDNSlocal void LogMsgWithLevelv(os_log_t category, os_log_type_t level, const char *format, va_list args) 66 { 67 char buffer[512]; 68 mDNS_vsnprintf(buffer, (mDNSu32)sizeof(buffer), format, args); 69 os_log_with_type(category ? category : mDNSLogCategory_Default, level, "%{private}s", buffer); 70 } 71 #else 72 mDNSlocal void LogMsgWithLevelv(const char *category, mDNSLogLevel_t level, const char *format, va_list args) 73 { 74 // Do not print the logs if the log category is MDNS_LOG_CATEGORY_DISABLED. 75 if (strcmp(category, MDNS_LOG_CATEGORY_DISABLED) == 0) 76 { 77 return; 78 } 79 80 char buffer[512]; 81 char *dst = buffer; 82 const char *const lim = &buffer[512]; 83 if (category) mDNS_snprintf_add(&dst, lim, "%s: ", category); 84 mDNS_vsnprintf(dst, (mDNSu32)(lim - dst), format, args); 85 mDNSPlatformWriteLogMsg(ProgramName, buffer, level); 86 } 87 #endif 88 89 #define LOG_HELPER_BODY(CATEGORY, LEVEL) \ 90 { \ 91 va_list args; \ 92 va_start(args,format); \ 93 LogMsgWithLevelv(CATEGORY, LEVEL, format, args); \ 94 va_end(args); \ 95 } 96 97 // see mDNSDebug.h 98 #if !MDNS_HAS_VA_ARG_MACROS 99 void LogMsg_(const char *format, ...) LOG_HELPER_BODY(NULL, MDNS_LOG_DEFAULT) 100 void LogOperation_(const char *format, ...) LOG_HELPER_BODY(NULL, MDNS_LOG_DEFAULT) 101 void LogSPS_(const char *format, ...) LOG_HELPER_BODY(NULL, MDNS_LOG_DEFAULT) 102 void LogInfo_(const char *format, ...) LOG_HELPER_BODY(NULL, MDNS_LOG_DEFAULT) 103 void LogDebug_(const char *format, ...) LOG_HELPER_BODY(NULL, MDNS_LOG_DEBUG) 104 #endif 105 106 #if MDNS_DEBUGMSGS 107 void debugf_(const char *format, ...) LOG_HELPER_BODY(NULL, MDNS_LOG_DEBUG) 108 #endif 109 110 // Log message with default "mDNSResponder" ident string at the start 111 mDNSexport void LogMsgWithLevel(mDNSLogCategory_t category, mDNSLogLevel_t level, const char *format, ...) 112 LOG_HELPER_BODY(category, level) 113 114 mDNSexport void LogToFD(int fd, const char *format, ...) 115 { 116 va_list args; 117 va_start(args, format); 118 (void)fd; 119 LogMsgWithLevelv(NULL, MDNS_LOG_DEFAULT, format, args); 120 va_end(args); 121 } 122