xref: /netbsd-src/external/mpl/dhcp/dist/omapip/errwarn.c (revision f407d9293b6650aa8c33d6a995f797bb6aaefd90)
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