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