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