Annotation of embedaddon/dhcp/omapip/errwarn.c, revision 1.1
1.1 ! misho 1: /* errwarn.c
! 2:
! 3: Errors and warnings... */
! 4:
! 5: /*
! 6: * Copyright (c) 1995 RadioMail Corporation.
! 7: * Copyright (c) 2004,2007,2009 by Internet Systems Consortium, Inc. ("ISC")
! 8: * Copyright (c) 1996-2003 by Internet Software Consortium
! 9: *
! 10: * Permission to use, copy, modify, and distribute this software for any
! 11: * purpose with or without fee is hereby granted, provided that the above
! 12: * copyright notice and this permission notice appear in all copies.
! 13: *
! 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.
! 21: *
! 22: * Internet Systems Consortium, Inc.
! 23: * 950 Charter Street
! 24: * Redwood City, CA 94063
! 25: * <info@isc.org>
! 26: * https://www.isc.org/
! 27: *
! 28: * This software was written for RadioMail Corporation by Ted Lemon
! 29: * under a contract with Vixie Enterprises. Further modifications have
! 30: * been made for Internet Systems Consortium under a contract
! 31: * with Vixie Laboratories.
! 32: */
! 33:
! 34: #include "dhcpd.h"
! 35:
! 36: #include <omapip/omapip_p.h>
! 37: #include <errno.h>
! 38: #include <syslog.h>
! 39:
! 40: #ifdef DEBUG
! 41: int log_perror = -1;
! 42: #else
! 43: int log_perror = 1;
! 44: #endif
! 45: int log_priority;
! 46: void (*log_cleanup) (void);
! 47:
! 48: #define CVT_BUF_MAX 1023
! 49: static char mbuf [CVT_BUF_MAX + 1];
! 50: static char fbuf [CVT_BUF_MAX + 1];
! 51:
! 52: /* Log an error message, then exit... */
! 53:
! 54: void log_fatal (const char * fmt, ... )
! 55: {
! 56: va_list list;
! 57:
! 58: do_percentm (fbuf, fmt);
! 59:
! 60: /* %Audit% This is log output. %2004.06.17,Safe%
! 61: * If we truncate we hope the user can get a hint from the log.
! 62: */
! 63: va_start (list, fmt);
! 64: vsnprintf (mbuf, sizeof mbuf, fbuf, list);
! 65: va_end (list);
! 66:
! 67: #ifndef DEBUG
! 68: syslog (log_priority | LOG_ERR, "%s", mbuf);
! 69: #endif
! 70:
! 71: /* Also log it to stderr? */
! 72: if (log_perror) {
! 73: IGNORE_RET (write (STDERR_FILENO, mbuf, strlen (mbuf)));
! 74: IGNORE_RET (write (STDERR_FILENO, "\n", 1));
! 75: }
! 76:
! 77: #if !defined (NOMINUM)
! 78: log_error ("%s", "");
! 79: log_error ("If you did not get this software from ftp.isc.org, please");
! 80: log_error ("get the latest from ftp.isc.org and install that before");
! 81: log_error ("requesting help.");
! 82: log_error ("%s", "");
! 83: log_error ("If you did get this software from ftp.isc.org and have not");
! 84: log_error ("yet read the README, please read it before requesting help.");
! 85: log_error ("If you intend to request help from the dhcp-server@isc.org");
! 86: log_error ("mailing list, please read the section on the README about");
! 87: log_error ("submitting bug reports and requests for help.");
! 88: log_error ("%s", "");
! 89: log_error ("Please do not under any circumstances send requests for");
! 90: log_error ("help directly to the authors of this software - please");
! 91: log_error ("send them to the appropriate mailing list as described in");
! 92: log_error ("the README file.");
! 93: log_error ("%s", "");
! 94: log_error ("exiting.");
! 95: #endif
! 96: if (log_cleanup)
! 97: (*log_cleanup) ();
! 98: exit (1);
! 99: }
! 100:
! 101: /* Log an error message... */
! 102:
! 103: int log_error (const char * fmt, ...)
! 104: {
! 105: va_list list;
! 106:
! 107: do_percentm (fbuf, fmt);
! 108:
! 109: /* %Audit% This is log output. %2004.06.17,Safe%
! 110: * If we truncate we hope the user can get a hint from the log.
! 111: */
! 112: va_start (list, fmt);
! 113: vsnprintf (mbuf, sizeof mbuf, fbuf, list);
! 114: va_end (list);
! 115:
! 116: #ifndef DEBUG
! 117: syslog (log_priority | LOG_ERR, "%s", mbuf);
! 118: #endif
! 119:
! 120: if (log_perror) {
! 121: IGNORE_RET (write (STDERR_FILENO, mbuf, strlen (mbuf)));
! 122: IGNORE_RET (write (STDERR_FILENO, "\n", 1));
! 123: }
! 124:
! 125: return 0;
! 126: }
! 127:
! 128: /* Log a note... */
! 129:
! 130: int log_info (const char *fmt, ...)
! 131: {
! 132: va_list list;
! 133:
! 134: do_percentm (fbuf, fmt);
! 135:
! 136: /* %Audit% This is log output. %2004.06.17,Safe%
! 137: * If we truncate we hope the user can get a hint from the log.
! 138: */
! 139: va_start (list, fmt);
! 140: vsnprintf (mbuf, sizeof mbuf, fbuf, list);
! 141: va_end (list);
! 142:
! 143: #ifndef DEBUG
! 144: syslog (log_priority | LOG_INFO, "%s", mbuf);
! 145: #endif
! 146:
! 147: if (log_perror) {
! 148: IGNORE_RET (write (STDERR_FILENO, mbuf, strlen (mbuf)));
! 149: IGNORE_RET (write (STDERR_FILENO, "\n", 1));
! 150: }
! 151:
! 152: return 0;
! 153: }
! 154:
! 155: /* Log a debug message... */
! 156:
! 157: int log_debug (const char *fmt, ...)
! 158: {
! 159: va_list list;
! 160:
! 161: do_percentm (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_priority | 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, ibuf)
! 185: char *obuf;
! 186: const char *ibuf;
! 187: {
! 188: const char *s = ibuf;
! 189: char *p = obuf;
! 190: int infmt = 0;
! 191: const char *m;
! 192: int len = 0;
! 193:
! 194: while (*s) {
! 195: if (infmt) {
! 196: if (*s == 'm') {
! 197: #ifndef __CYGWIN32__
! 198: m = strerror (errno);
! 199: #else
! 200: m = pWSAError ();
! 201: #endif
! 202: if (!m)
! 203: m = "<unknown error>";
! 204: len += strlen (m);
! 205: if (len > CVT_BUF_MAX)
! 206: goto out;
! 207: strcpy (p - 1, m);
! 208: p += strlen (p);
! 209: ++s;
! 210: } else {
! 211: if (++len > CVT_BUF_MAX)
! 212: goto out;
! 213: *p++ = *s++;
! 214: }
! 215: infmt = 0;
! 216: } else {
! 217: if (*s == '%')
! 218: infmt = 1;
! 219: if (++len > CVT_BUF_MAX)
! 220: goto out;
! 221: *p++ = *s++;
! 222: }
! 223: }
! 224: out:
! 225: *p = 0;
! 226: }
! 227:
! 228: #ifdef NO_STRERROR
! 229: char *strerror (err)
! 230: int err;
! 231: {
! 232: extern char *sys_errlist [];
! 233: extern int sys_nerr;
! 234: static char errbuf [128];
! 235:
! 236: if (err < 0 || err >= sys_nerr) {
! 237: sprintf (errbuf, "Error %d", err);
! 238: return errbuf;
! 239: }
! 240: return sys_errlist [err];
! 241: }
! 242: #endif /* NO_STRERROR */
! 243:
! 244: #ifdef _WIN32
! 245: char *pWSAError ()
! 246: {
! 247: int err = WSAGetLastError ();
! 248:
! 249: switch (err)
! 250: {
! 251: case WSAEACCES:
! 252: return "Permission denied";
! 253: case WSAEADDRINUSE:
! 254: return "Address already in use";
! 255: case WSAEADDRNOTAVAIL:
! 256: return "Cannot assign requested address";
! 257: case WSAEAFNOSUPPORT:
! 258: return "Address family not supported by protocol family";
! 259: case WSAEALREADY:
! 260: return "Operation already in progress";
! 261: case WSAECONNABORTED:
! 262: return "Software caused connection abort";
! 263: case WSAECONNREFUSED:
! 264: return "Connection refused";
! 265: case WSAECONNRESET:
! 266: return "Connection reset by peer";
! 267: case WSAEDESTADDRREQ:
! 268: return "Destination address required";
! 269: case WSAEFAULT:
! 270: return "Bad address";
! 271: case WSAEHOSTDOWN:
! 272: return "Host is down";
! 273: case WSAEHOSTUNREACH:
! 274: return "No route to host";
! 275: case WSAEINPROGRESS:
! 276: return "Operation now in progress";
! 277: case WSAEINTR:
! 278: return "Interrupted function call";
! 279: case WSAEINVAL:
! 280: return "Invalid argument";
! 281: case WSAEISCONN:
! 282: return "Socket is already connected";
! 283: case WSAEMFILE:
! 284: return "Too many open files";
! 285: case WSAEMSGSIZE:
! 286: return "Message too long";
! 287: case WSAENETDOWN:
! 288: return "Network is down";
! 289: case WSAENETRESET:
! 290: return "Network dropped connection on reset";
! 291: case WSAENETUNREACH:
! 292: return "Network is unreachable";
! 293: case WSAENOBUFS:
! 294: return "No buffer space available";
! 295: case WSAENOPROTOOPT:
! 296: return "Bad protocol option";
! 297: case WSAENOTCONN:
! 298: return "Socket is not connected";
! 299: case WSAENOTSOCK:
! 300: return "Socket operation on non-socket";
! 301: case WSAEOPNOTSUPP:
! 302: return "Operation not supported";
! 303: case WSAEPFNOSUPPORT:
! 304: return "Protocol family not supported";
! 305: case WSAEPROCLIM:
! 306: return "Too many processes";
! 307: case WSAEPROTONOSUPPORT:
! 308: return "Protocol not supported";
! 309: case WSAEPROTOTYPE:
! 310: return "Protocol wrong type for socket";
! 311: case WSAESHUTDOWN:
! 312: return "Cannot send after socket shutdown";
! 313: case WSAESOCKTNOSUPPORT:
! 314: return "Socket type not supported";
! 315: case WSAETIMEDOUT:
! 316: return "Connection timed out";
! 317: case WSAEWOULDBLOCK:
! 318: return "Resource temporarily unavailable";
! 319: case WSAHOST_NOT_FOUND:
! 320: return "Host not found";
! 321: #if 0
! 322: case WSA_INVALID_HANDLE:
! 323: return "Specified event object handle is invalid";
! 324: case WSA_INVALID_PARAMETER:
! 325: return "One or more parameters are invalid";
! 326: case WSAINVALIDPROCTABLE:
! 327: return "Invalid procedure table from service provider";
! 328: case WSAINVALIDPROVIDER:
! 329: return "Invalid service provider version number";
! 330: case WSA_IO_PENDING:
! 331: return "Overlapped operations will complete later";
! 332: case WSA_IO_INCOMPLETE:
! 333: return "Overlapped I/O event object not in signaled state";
! 334: case WSA_NOT_ENOUGH_MEMORY:
! 335: return "Insufficient memory available";
! 336: #endif
! 337: case WSANOTINITIALISED:
! 338: return "Successful WSAStartup not yet performer";
! 339: case WSANO_DATA:
! 340: return "Valid name, no data record of requested type";
! 341: case WSANO_RECOVERY:
! 342: return "This is a non-recoverable error";
! 343: #if 0
! 344: case WSAPROVIDERFAILEDINIT:
! 345: return "Unable to initialize a service provider";
! 346: case WSASYSCALLFAILURE:
! 347: return "System call failure";
! 348: #endif
! 349: case WSASYSNOTREADY:
! 350: return "Network subsystem is unavailable";
! 351: case WSATRY_AGAIN:
! 352: return "Non-authoritative host not found";
! 353: case WSAVERNOTSUPPORTED:
! 354: return "WINSOCK.DLL version out of range";
! 355: case WSAEDISCON:
! 356: return "Graceful shutdown in progress";
! 357: #if 0
! 358: case WSA_OPERATION_ABORTED:
! 359: return "Overlapped operation aborted";
! 360: #endif
! 361: }
! 362: return "Unknown WinSock error";
! 363: }
! 364: #endif /* _WIN32 */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>