1 /* -*- Mode: C; tab-width: 4 -*-
2 *
3 * Copyright (c) 2003 Apple Computer, Inc. All rights reserved.
4 *
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
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
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.
16
17 File: mDNSDebug.c
18
19 Contains: Implementation of debugging utilities. Requires a POSIX environment.
20
21 Version: 1.0
22
23 Change History (most recent first):
24
25 $Log: mDNSDebug.c,v $
26 Revision 1.7 2006/08/14 23:24:56 cheshire
27 Re-licensed mDNSResponder daemon source code under Apache License, Version 2.0
28
29 Revision 1.6 2005/01/27 22:57:56 cheshire
30 Fix compile errors on gcc4
31
32 Revision 1.5 2004/09/17 01:08:55 cheshire
33 Renamed mDNSClientAPI.h to mDNSEmbeddedAPI.h
34 The name "mDNSClientAPI.h" is misleading to new developers looking at this code. The interfaces
35 declared in that file are ONLY appropriate to single-address-space embedded applications.
36 For clients on general-purpose computers, the interfaces defined in dns_sd.h should be used.
37
38 Revision 1.4 2004/06/11 22:36:51 cheshire
39 Fixes for compatibility with Windows
40
41 Revision 1.3 2004/01/28 21:14:23 cheshire
42 Reconcile debug_mode and gDebugLogging into a single flag (mDNS_DebugMode)
43
44 Revision 1.2 2003/12/09 01:30:40 rpantos
45 Fix usage of ARGS... macros to build properly on Windows.
46
47 Revision 1.1 2003/12/08 21:11:42; rpantos
48 Changes necessary to support mDNSResponder on Linux.
49
50 */
51
52 #pragma ident "%Z%%M% %I% %E% SMI"
53
54 #include "mDNSDebug.h"
55
56 #include <stdio.h>
57
58 #if defined(WIN32)
59 // Need to add Windows syslog support here
60 #define LOG_PID 0x01
61 #define LOG_CONS 0x02
62 #define LOG_PERROR 0x20
63 #define openlog(A,B,C) (void)(A); (void)(B)
64 #define syslog(A,B,C)
65 #define closelog()
66 #else
67 #include <syslog.h>
68 #endif
69
70 #include "mDNSEmbeddedAPI.h"
71
72 #if MDNS_DEBUGMSGS
73 mDNSexport int mDNS_DebugMode = mDNStrue;
74 #else
75 mDNSexport int mDNS_DebugMode = mDNSfalse;
76 #endif
77
78 // Note, this uses mDNS_vsnprintf instead of standard "vsnprintf", because mDNS_vsnprintf knows
79 // how to print special data types like IP addresses and length-prefixed domain names
80 #if MDNS_DEBUGMSGS
debugf_(const char * format,...)81 mDNSexport void debugf_(const char *format, ...)
82 {
83 unsigned char buffer[512];
84 va_list ptr;
85 va_start(ptr,format);
86 buffer[mDNS_vsnprintf((char *)buffer, sizeof(buffer), format, ptr)] = 0;
87 va_end(ptr);
88 fprintf(stderr,"%s\n", buffer);
89 fflush(stderr);
90 }
91 #endif
92
93 #if MDNS_DEBUGMSGS > 1
verbosedebugf_(const char * format,...)94 mDNSexport void verbosedebugf_(const char *format, ...)
95 {
96 unsigned char buffer[512];
97 va_list ptr;
98 va_start(ptr,format);
99 buffer[mDNS_vsnprintf((char *)buffer, sizeof(buffer), format, ptr)] = 0;
100 va_end(ptr);
101 fprintf(stderr,"%s\n", buffer);
102 fflush(stderr);
103 }
104 #endif
105
WriteLogMsg(const char * ident,const char * buffer,int logoptflags,int logpriority)106 mDNSlocal void WriteLogMsg(const char *ident, const char *buffer, int logoptflags, int logpriority)
107 {
108 if (mDNS_DebugMode) // In debug mode we write to stderr
109 {
110 fprintf(stderr,"%s\n", buffer);
111 fflush(stderr);
112 }
113 else // else, in production mode, we write to syslog
114 {
115 openlog(ident, LOG_PERROR | logoptflags, LOG_DAEMON);
116 syslog(logpriority, "%s", buffer);
117 closelog();
118 }
119 }
120
121 // Log message with default "mDNSResponder" ident string at the start
LogMsg(const char * format,...)122 mDNSexport void LogMsg(const char *format, ...)
123 {
124 char buffer[512];
125 va_list ptr;
126 va_start(ptr,format);
127 buffer[mDNS_vsnprintf((char *)buffer, sizeof(buffer), format, ptr)] = 0;
128 va_end(ptr);
129 WriteLogMsg("mDNSResponder", buffer, 0, LOG_ERR);
130 }
131
132 // Log message with specified ident string at the start
LogMsgIdent(const char * ident,const char * format,...)133 mDNSexport void LogMsgIdent(const char *ident, const char *format, ...)
134 {
135 char buffer[512];
136 va_list ptr;
137 va_start(ptr,format);
138 buffer[mDNS_vsnprintf((char *)buffer, sizeof(buffer), format, ptr)] = 0;
139 va_end(ptr);
140 WriteLogMsg(ident, buffer, ident && *ident ? LOG_PID : 0, LOG_INFO);
141 }
142
143 // Log message with no ident string at the start
LogMsgNoIdent(const char * format,...)144 mDNSexport void LogMsgNoIdent(const char *format, ...)
145 {
146 char buffer[512];
147 va_list ptr;
148 va_start(ptr,format);
149 buffer[mDNS_vsnprintf((char *)buffer, sizeof(buffer), format, ptr)] = 0;
150 va_end(ptr);
151 WriteLogMsg("", buffer, 0, LOG_INFO);
152 }
153