]> git.ipfire.org Git - thirdparty/dhcp.git/blob - omapip/errwarn.c
Merged rt44950 (MA compat)
[thirdparty/dhcp.git] / omapip / errwarn.c
1 /* errwarn.c
2
3 Errors and warnings... */
4
5 /*
6 * Copyright (c) 1995 RadioMail Corporation.
7 * Copyright (c) 2004-2017 by Internet Systems Consortium, Inc. ("ISC")
8 * Copyright (c) 1996-2003 by Internet Software Consortium
9 *
10 * This Source Code Form is subject to the terms of the Mozilla Public
11 * License, v. 2.0. If a copy of the MPL was not distributed with this
12 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
13 *
14 * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES
15 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
16 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR
17 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
18 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
19 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
20 * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
21 *
22 * Internet Systems Consortium, Inc.
23 * 950 Charter Street
24 * Redwood City, CA 94063
25 * <info@isc.org>
26 * https://www.isc.org/
27 *
28 * This software was written for RadioMail Corporation by Ted Lemon
29 * under a contract with Vixie Enterprises. Further modifications have
30 * been made for Internet Systems Consortium under a contract
31 * with Vixie Laboratories.
32 */
33
34 #include "dhcpd.h"
35
36 #include <omapip/omapip_p.h>
37 #include <errno.h>
38 #include <syslog.h>
39
40 #ifdef DEBUG
41 int log_perror = -1;
42 #else
43 int log_perror = 1;
44 #endif
45 void (*log_cleanup) (void);
46
47 #define CVT_BUF_MAX 1023
48 static char mbuf [CVT_BUF_MAX + 1];
49 static char fbuf [CVT_BUF_MAX + 1];
50
51 /* Log an error message, then exit... */
52
53 void log_fatal (const char * fmt, ... )
54 {
55 va_list list;
56
57 do_percentm (fbuf, fmt);
58
59 /* %Audit% This is log output. %2004.06.17,Safe%
60 * If we truncate we hope the user can get a hint from the log.
61 */
62 va_start (list, fmt);
63 vsnprintf (mbuf, sizeof mbuf, fbuf, list);
64 va_end (list);
65
66 #ifndef DEBUG
67 syslog (LOG_ERR, "%s", mbuf);
68 #endif
69
70 /* Also log it to stderr? */
71 if (log_perror) {
72 IGNORE_RET (write (STDERR_FILENO, mbuf, strlen (mbuf)));
73 IGNORE_RET (write (STDERR_FILENO, "\n", 1));
74 }
75
76 log_error ("%s", "");
77 log_error ("If you think you have received this message due to a bug rather");
78 log_error ("than a configuration issue please read the section on submitting");
79 log_error ("bugs on either our web page at www.isc.org or in the README file");
80 log_error ("before submitting a bug. These pages explain the proper");
81 log_error ("process and the information we find helpful for debugging.");
82 log_error ("%s", "");
83 log_error ("exiting.");
84
85 if (log_cleanup)
86 (*log_cleanup) ();
87 exit (1);
88 }
89
90 /* Log an error message... */
91
92 int log_error (const char * fmt, ...)
93 {
94 va_list list;
95
96 do_percentm (fbuf, fmt);
97
98 /* %Audit% This is log output. %2004.06.17,Safe%
99 * If we truncate we hope the user can get a hint from the log.
100 */
101 va_start (list, fmt);
102 vsnprintf (mbuf, sizeof mbuf, fbuf, list);
103 va_end (list);
104
105 #ifndef DEBUG
106 syslog (LOG_ERR, "%s", mbuf);
107 #endif
108
109 if (log_perror) {
110 IGNORE_RET (write (STDERR_FILENO, mbuf, strlen (mbuf)));
111 IGNORE_RET (write (STDERR_FILENO, "\n", 1));
112 }
113
114 return 0;
115 }
116
117 /* Log a note... */
118
119 int log_info (const char *fmt, ...)
120 {
121 va_list list;
122
123 do_percentm (fbuf, fmt);
124
125 /* %Audit% This is log output. %2004.06.17,Safe%
126 * If we truncate we hope the user can get a hint from the log.
127 */
128 va_start (list, fmt);
129 vsnprintf (mbuf, sizeof mbuf, fbuf, list);
130 va_end (list);
131
132 #ifndef DEBUG
133 syslog (LOG_INFO, "%s", mbuf);
134 #endif
135
136 if (log_perror) {
137 IGNORE_RET (write (STDERR_FILENO, mbuf, strlen (mbuf)));
138 IGNORE_RET (write (STDERR_FILENO, "\n", 1));
139 }
140
141 return 0;
142 }
143
144 /* Log a debug message... */
145
146 int log_debug (const char *fmt, ...)
147 {
148 va_list list;
149
150 do_percentm (fbuf, fmt);
151
152 /* %Audit% This is log output. %2004.06.17,Safe%
153 * If we truncate we hope the user can get a hint from the log.
154 */
155 va_start (list, fmt);
156 vsnprintf (mbuf, sizeof mbuf, fbuf, list);
157 va_end (list);
158
159 #ifndef DEBUG
160 syslog (LOG_DEBUG, "%s", mbuf);
161 #endif
162
163 if (log_perror) {
164 IGNORE_RET (write (STDERR_FILENO, mbuf, strlen (mbuf)));
165 IGNORE_RET (write (STDERR_FILENO, "\n", 1));
166 }
167
168 return 0;
169 }
170
171 /* Find %m in the input string and substitute an error message string. */
172
173 void do_percentm (obuf, ibuf)
174 char *obuf;
175 const char *ibuf;
176 {
177 const char *s = ibuf;
178 char *p = obuf;
179 int infmt = 0;
180 const char *m;
181 int len = 0;
182
183 while (*s) {
184 if (infmt) {
185 if (*s == 'm') {
186 #ifndef __CYGWIN32__
187 m = strerror (errno);
188 #else
189 m = pWSAError ();
190 #endif
191 if (!m)
192 m = "<unknown error>";
193 len += strlen (m);
194 if (len > CVT_BUF_MAX)
195 goto out;
196 strcpy (p - 1, m);
197 p += strlen (p);
198 ++s;
199 } else {
200 if (++len > CVT_BUF_MAX)
201 goto out;
202 *p++ = *s++;
203 }
204 infmt = 0;
205 } else {
206 if (*s == '%')
207 infmt = 1;
208 if (++len > CVT_BUF_MAX)
209 goto out;
210 *p++ = *s++;
211 }
212 }
213 out:
214 *p = 0;
215 }
216
217 #ifdef NO_STRERROR
218 char *strerror (err)
219 int err;
220 {
221 extern char *sys_errlist [];
222 extern int sys_nerr;
223 static char errbuf [128];
224
225 if (err < 0 || err >= sys_nerr) {
226 sprintf (errbuf, "Error %d", err);
227 return errbuf;
228 }
229 return sys_errlist [err];
230 }
231 #endif /* NO_STRERROR */
232
233 #ifdef _WIN32
234 char *pWSAError ()
235 {
236 int err = WSAGetLastError ();
237
238 switch (err)
239 {
240 case WSAEACCES:
241 return "Permission denied";
242 case WSAEADDRINUSE:
243 return "Address already in use";
244 case WSAEADDRNOTAVAIL:
245 return "Cannot assign requested address";
246 case WSAEAFNOSUPPORT:
247 return "Address family not supported by protocol family";
248 case WSAEALREADY:
249 return "Operation already in progress";
250 case WSAECONNABORTED:
251 return "Software caused connection abort";
252 case WSAECONNREFUSED:
253 return "Connection refused";
254 case WSAECONNRESET:
255 return "Connection reset by peer";
256 case WSAEDESTADDRREQ:
257 return "Destination address required";
258 case WSAEFAULT:
259 return "Bad address";
260 case WSAEHOSTDOWN:
261 return "Host is down";
262 case WSAEHOSTUNREACH:
263 return "No route to host";
264 case WSAEINPROGRESS:
265 return "Operation now in progress";
266 case WSAEINTR:
267 return "Interrupted function call";
268 case WSAEINVAL:
269 return "Invalid argument";
270 case WSAEISCONN:
271 return "Socket is already connected";
272 case WSAEMFILE:
273 return "Too many open files";
274 case WSAEMSGSIZE:
275 return "Message too long";
276 case WSAENETDOWN:
277 return "Network is down";
278 case WSAENETRESET:
279 return "Network dropped connection on reset";
280 case WSAENETUNREACH:
281 return "Network is unreachable";
282 case WSAENOBUFS:
283 return "No buffer space available";
284 case WSAENOPROTOOPT:
285 return "Bad protocol option";
286 case WSAENOTCONN:
287 return "Socket is not connected";
288 case WSAENOTSOCK:
289 return "Socket operation on non-socket";
290 case WSAEOPNOTSUPP:
291 return "Operation not supported";
292 case WSAEPFNOSUPPORT:
293 return "Protocol family not supported";
294 case WSAEPROCLIM:
295 return "Too many processes";
296 case WSAEPROTONOSUPPORT:
297 return "Protocol not supported";
298 case WSAEPROTOTYPE:
299 return "Protocol wrong type for socket";
300 case WSAESHUTDOWN:
301 return "Cannot send after socket shutdown";
302 case WSAESOCKTNOSUPPORT:
303 return "Socket type not supported";
304 case WSAETIMEDOUT:
305 return "Connection timed out";
306 case WSAEWOULDBLOCK:
307 return "Resource temporarily unavailable";
308 case WSAHOST_NOT_FOUND:
309 return "Host not found";
310 #if 0
311 case WSA_INVALID_HANDLE:
312 return "Specified event object handle is invalid";
313 case WSA_INVALID_PARAMETER:
314 return "One or more parameters are invalid";
315 case WSAINVALIDPROCTABLE:
316 return "Invalid procedure table from service provider";
317 case WSAINVALIDPROVIDER:
318 return "Invalid service provider version number";
319 case WSA_IO_PENDING:
320 return "Overlapped operations will complete later";
321 case WSA_IO_INCOMPLETE:
322 return "Overlapped I/O event object not in signaled state";
323 case WSA_NOT_ENOUGH_MEMORY:
324 return "Insufficient memory available";
325 #endif
326 case WSANOTINITIALISED:
327 return "Successful WSAStartup not yet performer";
328 case WSANO_DATA:
329 return "Valid name, no data record of requested type";
330 case WSANO_RECOVERY:
331 return "This is a non-recoverable error";
332 #if 0
333 case WSAPROVIDERFAILEDINIT:
334 return "Unable to initialize a service provider";
335 case WSASYSCALLFAILURE:
336 return "System call failure";
337 #endif
338 case WSASYSNOTREADY:
339 return "Network subsystem is unavailable";
340 case WSATRY_AGAIN:
341 return "Non-authoritative host not found";
342 case WSAVERNOTSUPPORTED:
343 return "WINSOCK.DLL version out of range";
344 case WSAEDISCON:
345 return "Graceful shutdown in progress";
346 #if 0
347 case WSA_OPERATION_ABORTED:
348 return "Overlapped operation aborted";
349 #endif
350 }
351 return "Unknown WinSock error";
352 }
353 #endif /* _WIN32 */