File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / dhcp / omapip / errwarn.c
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Tue Oct 9 09:06:54 2012 UTC (12 years, 5 months ago) by misho
Branches: dhcp, MAIN
CVS tags: v4_1_R7p0, v4_1_R7, v4_1_R4, HEAD
dhcp 4.1 r7

    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>