1*472cd20dSToomas Soome /*
2*472cd20dSToomas Soome  * Copyright (c) 2003-2019 Apple Inc. All rights reserved.
34b22b933Srs  *
44b22b933Srs  * Licensed under the Apache License, Version 2.0 (the "License");
54b22b933Srs  * you may not use this file except in compliance with the License.
64b22b933Srs  * You may obtain a copy of the License at
75ffb0c9bSToomas Soome  *
84b22b933Srs  *     http://www.apache.org/licenses/LICENSE-2.0
95ffb0c9bSToomas Soome  *
104b22b933Srs  * Unless required by applicable law or agreed to in writing, software
114b22b933Srs  * distributed under the License is distributed on an "AS IS" BASIS,
124b22b933Srs  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
134b22b933Srs  * See the License for the specific language governing permissions and
144b22b933Srs  * limitations under the License.
155ffb0c9bSToomas Soome  */
164b22b933Srs 
174b22b933Srs #include <stdio.h>
184b22b933Srs 
195ffb0c9bSToomas Soome #if defined(WIN32) || defined(EFI32) || defined(EFI64) || defined(EFIX64)
205ffb0c9bSToomas Soome // Need to add Windows/EFI syslog support here
214b22b933Srs #define LOG_PID 0x01
224b22b933Srs #define LOG_CONS 0x02
234b22b933Srs #define LOG_PERROR 0x20
244b22b933Srs #else
254b22b933Srs #include <syslog.h>
264b22b933Srs #endif
274b22b933Srs 
284b22b933Srs #include "mDNSEmbeddedAPI.h"
294b22b933Srs 
305ffb0c9bSToomas Soome mDNSexport int mDNS_LoggingEnabled       = 0;
315ffb0c9bSToomas Soome mDNSexport int mDNS_PacketLoggingEnabled = 0;
325ffb0c9bSToomas Soome mDNSexport int mDNS_McastLoggingEnabled  = 0;
33c65ebfc7SToomas Soome mDNSexport int mDNS_McastTracingEnabled  = 0;
345ffb0c9bSToomas Soome 
354b22b933Srs #if MDNS_DEBUGMSGS
364b22b933Srs mDNSexport int mDNS_DebugMode = mDNStrue;
374b22b933Srs #else
384b22b933Srs mDNSexport int mDNS_DebugMode = mDNSfalse;
394b22b933Srs #endif
404b22b933Srs 
414b22b933Srs // Note, this uses mDNS_vsnprintf instead of standard "vsnprintf", because mDNS_vsnprintf knows
424b22b933Srs // how to print special data types like IP addresses and length-prefixed domain names
434b22b933Srs #if MDNS_DEBUGMSGS > 1
verbosedebugf_(const char * format,...)444b22b933Srs mDNSexport void verbosedebugf_(const char *format, ...)
455ffb0c9bSToomas Soome {
465ffb0c9bSToomas Soome     char buffer[512];
47*472cd20dSToomas Soome     va_list args;
48*472cd20dSToomas Soome     va_start(args, format);
49*472cd20dSToomas Soome     buffer[mDNS_vsnprintf(buffer, sizeof(buffer), format, args)] = 0;
50*472cd20dSToomas Soome     va_end(args);
515ffb0c9bSToomas Soome     mDNSPlatformWriteDebugMsg(buffer);
525ffb0c9bSToomas Soome }
534b22b933Srs #endif
544b22b933Srs 
555ffb0c9bSToomas Soome // Log message with default "mDNSResponder" ident string at the start
56*472cd20dSToomas Soome #if MDNSRESPONDER_SUPPORTS(APPLE, OS_LOG)
LogMsgWithLevelv(os_log_t category,os_log_type_t level,const char * format,va_list args)57*472cd20dSToomas Soome mDNSlocal void LogMsgWithLevelv(os_log_t category, os_log_type_t level, const char *format, va_list args)
58*472cd20dSToomas Soome {
59*472cd20dSToomas Soome     char buffer[512];
60*472cd20dSToomas Soome     mDNS_vsnprintf(buffer, (mDNSu32)sizeof(buffer), format, args);
61*472cd20dSToomas Soome     os_log_with_type(category ? category : mDNSLogCategory_Default, level, "%{private}s", buffer);
62*472cd20dSToomas Soome }
63*472cd20dSToomas Soome #else
LogMsgWithLevelv(const char * category,mDNSLogLevel_t level,const char * format,va_list args)64*472cd20dSToomas Soome mDNSlocal void LogMsgWithLevelv(const char *category, mDNSLogLevel_t level, const char *format, va_list args)
655ffb0c9bSToomas Soome {
665ffb0c9bSToomas Soome     char buffer[512];
67*472cd20dSToomas Soome     char *dst = buffer;
68*472cd20dSToomas Soome     const char *const lim = &buffer[512];
69*472cd20dSToomas Soome     if (category) mDNS_snprintf_add(&dst, lim, "%s: ", category);
70*472cd20dSToomas Soome     mDNS_vsnprintf(dst, (mDNSu32)(lim - dst), format, args);
71*472cd20dSToomas Soome     mDNSPlatformWriteLogMsg(ProgramName, buffer, level);
725ffb0c9bSToomas Soome }
73*472cd20dSToomas Soome #endif
745ffb0c9bSToomas Soome 
75*472cd20dSToomas Soome #define LOG_HELPER_BODY(CATEGORY, LEVEL) \
765ffb0c9bSToomas Soome     { \
77*472cd20dSToomas Soome         va_list args; \
78*472cd20dSToomas Soome         va_start(args,format); \
79*472cd20dSToomas Soome         LogMsgWithLevelv(CATEGORY, LEVEL, format, args); \
80*472cd20dSToomas Soome         va_end(args); \
815ffb0c9bSToomas Soome     }
825ffb0c9bSToomas Soome 
835ffb0c9bSToomas Soome // see mDNSDebug.h
845ffb0c9bSToomas Soome #if !MDNS_HAS_VA_ARG_MACROS
LogMsg_(const char * format,...)85*472cd20dSToomas Soome void LogMsg_(const char *format, ...)       LOG_HELPER_BODY(NULL, MDNS_LOG_INFO)
86*472cd20dSToomas Soome void LogOperation_(const char *format, ...) LOG_HELPER_BODY(NULL, MDNS_LOG_INFO)
87*472cd20dSToomas Soome void LogSPS_(const char *format, ...)       LOG_HELPER_BODY(NULL, MDNS_LOG_INFO)
88*472cd20dSToomas Soome void LogInfo_(const char *format, ...)      LOG_HELPER_BODY(NULL, MDNS_LOG_INFO)
89*472cd20dSToomas Soome void LogDebug_(const char *format, ...)     LOG_HELPER_BODY(NULL, MDNS_LOG_DEBUG)
905ffb0c9bSToomas Soome #endif
915ffb0c9bSToomas Soome 
925ffb0c9bSToomas Soome #if MDNS_DEBUGMSGS
935ffb0c9bSToomas Soome void debugf_(const char *format, ...)       LOG_HELPER_BODY(MDNS_LOG_DEBUG)
945ffb0c9bSToomas Soome #endif
954b22b933Srs 
964b22b933Srs // Log message with default "mDNSResponder" ident string at the start
97*472cd20dSToomas Soome mDNSexport void LogMsgWithLevel(mDNSLogCategory_t category, mDNSLogLevel_t level, const char *format, ...)
98*472cd20dSToomas Soome LOG_HELPER_BODY(category, level)
99*472cd20dSToomas Soome 
100*472cd20dSToomas Soome mDNSexport void LogToFD(int fd, const char *format, ...)
101*472cd20dSToomas Soome {
102*472cd20dSToomas Soome     va_list args;
103*472cd20dSToomas Soome     va_start(args, format);
104*472cd20dSToomas Soome #if APPLE_OSX_mDNSResponder
105*472cd20dSToomas Soome     char buffer[1024];
106*472cd20dSToomas Soome     buffer[mDNS_vsnprintf(buffer, (mDNSu32)sizeof(buffer), format, args)] = '\0';
107*472cd20dSToomas Soome     dprintf(fd, "%s\n", buffer);
108*472cd20dSToomas Soome #else
109*472cd20dSToomas Soome     (void)fd;
110*472cd20dSToomas Soome     LogMsgWithLevelv(NULL, MDNS_LOG_INFO, format, args);
111*472cd20dSToomas Soome #endif
112*472cd20dSToomas Soome     va_end(args);
113*472cd20dSToomas Soome }
114