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