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 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 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 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 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 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 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 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