1 /* -*- Mode: C; tab-width: 4 -*-
3 * Copyright (c) 2003 Apple Computer, Inc. All rights reserved.
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
9 * http://www.apache.org/licenses/LICENSE-2.0
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
19 Contains: Implementation of debugging utilities. Requires a POSIX environment.
23 Change History (most recent first):
26 Revision 1.12 2007/10/01 19:06:19 cheshire
27 Defined symbolic constant MDNS_LOG_INITIAL_LEVEL to set the logging level we start out at
29 Revision 1.11 2007/07/27 20:19:56 cheshire
30 For now, comment out unused log levels MDNS_LOG_ERROR, MDNS_LOG_WARN, MDNS_LOG_INFO, MDNS_LOG_DEBUG
32 Revision 1.10 2007/06/15 21:54:51 cheshire
33 <rdar://problem/4883206> Add packet logging to help debugging private browsing over TLS
35 Revision 1.9 2007/04/05 19:52:32 cheshire
36 Display correct ident in syslog messages (i.e. in dnsextd, ProgramName is not "mDNSResponder")
38 Revision 1.8 2007/01/20 01:43:27 cheshire
39 <rdar://problem/4058383> Should not write log messages to /dev/console
41 Revision 1.7 2006/08/14 23:24:56 cheshire
42 Re-licensed mDNSResponder daemon source code under Apache License, Version 2.0
44 Revision 1.6 2005/01/27 22:57:56 cheshire
45 Fix compile errors on gcc4
47 Revision 1.5 2004/09/17 01:08:55 cheshire
48 Renamed mDNSClientAPI.h to mDNSEmbeddedAPI.h
49 The name "mDNSClientAPI.h" is misleading to new developers looking at this code. The interfaces
50 declared in that file are ONLY appropriate to single-address-space embedded applications.
51 For clients on general-purpose computers, the interfaces defined in dns_sd.h should be used.
53 Revision 1.4 2004/06/11 22:36:51 cheshire
54 Fixes for compatibility with Windows
56 Revision 1.3 2004/01/28 21:14:23 cheshire
57 Reconcile debug_mode and gDebugLogging into a single flag (mDNS_DebugMode)
59 Revision 1.2 2003/12/09 01:30:40 rpantos
60 Fix usage of ARGS... macros to build properly on Windows.
62 Revision 1.1 2003/12/08 21:11:42; rpantos
63 Changes necessary to support mDNSResponder on Linux.
67 #include "mDNSDebug.h"
72 // Need to add Windows syslog support here
75 #define LOG_PERROR 0x20
76 #define openlog(A,B,C) (void)(A); (void)(B)
83 #include "mDNSEmbeddedAPI.h"
85 mDNSexport LogLevel_t mDNS_LogLevel
= MDNS_LOG_INITIAL_LEVEL
;
88 mDNSexport
int mDNS_DebugMode
= mDNStrue
;
90 mDNSexport
int mDNS_DebugMode
= mDNSfalse
;
93 // Note, this uses mDNS_vsnprintf instead of standard "vsnprintf", because mDNS_vsnprintf knows
94 // how to print special data types like IP addresses and length-prefixed domain names
96 mDNSexport
void debugf_(const char *format
, ...)
98 unsigned char buffer
[512];
100 va_start(ptr
,format
);
101 buffer
[mDNS_vsnprintf((char *)buffer
, sizeof(buffer
), format
, ptr
)] = 0;
103 fprintf(stderr
,"%s\n", buffer
);
108 #if MDNS_DEBUGMSGS > 1
109 mDNSexport
void verbosedebugf_(const char *format
, ...)
111 unsigned char buffer
[512];
113 va_start(ptr
,format
);
114 buffer
[mDNS_vsnprintf((char *)buffer
, sizeof(buffer
), format
, ptr
)] = 0;
116 fprintf(stderr
,"%s\n", buffer
);
121 mDNSlocal
void WriteLogMsg(const char *ident
, const char *buffer
, int logoptflags
)
123 if (mDNS_DebugMode
) // In debug mode we write to stderr
125 fprintf(stderr
,"%s\n", buffer
);
128 else // else, in production mode, we write to syslog
130 openlog(ident
, LOG_CONS
| logoptflags
, LOG_DAEMON
);
131 syslog(LOG_ERR
, "%s", buffer
);
136 // Log message with default "mDNSResponder" ident string at the start
137 mDNSexport
void LogMsg(const char *format
, ...)
141 va_start(ptr
,format
);
142 buffer
[mDNS_vsnprintf((char *)buffer
, sizeof(buffer
), format
, ptr
)] = 0;
144 WriteLogMsg(ProgramName
, buffer
, 0);
147 // Log message with specified ident string at the start
148 mDNSexport
void LogMsgIdent(const char *ident
, const char *format
, ...)
152 va_start(ptr
,format
);
153 buffer
[mDNS_vsnprintf((char *)buffer
, sizeof(buffer
), format
, ptr
)] = 0;
155 WriteLogMsg(ident
, buffer
, ident
&& *ident
? LOG_PID
: 0);
158 // Log message with no ident string at the start
159 mDNSexport
void LogMsgNoIdent(const char *format
, ...)
163 va_start(ptr
,format
);
164 buffer
[mDNS_vsnprintf((char *)buffer
, sizeof(buffer
), format
, ptr
)] = 0;
166 WriteLogMsg("", buffer
, 0);
169 mDNSlocal
const char *CStringForLogLevel(LogLevel_t level
)
173 case MDNS_LOG_NONE
: return "MDNS_LOG_NONE";
174 // case MDNS_LOG_ERROR: return "MDNS_LOG_ERROR";
175 // case MDNS_LOG_WARN: return "MDNS_LOG_WARN";
176 // case MDNS_LOG_INFO: return "MDNS_LOG_INFO";
177 // case MDNS_LOG_DEBUG: return "MDNS_LOG_DEBUG";
178 case MDNS_LOG_VERBOSE_DEBUG
: return "MDNS_LOG_VERBOSE_DEBUG";
179 default: return "MDNS_LOG_UNKNOWN";
183 mDNSexport
void SigLogLevel(void)
185 if (mDNS_LogLevel
< MDNS_LOG_VERBOSE_DEBUG
) mDNS_LogLevel
++;
186 else mDNS_LogLevel
= MDNS_LOG_NONE
;
187 LogMsg("Log Level Changed to %s", CStringForLogLevel(mDNS_LogLevel
));