omapip/errwarn.c

Go to the documentation of this file.
00001 /* errwarn.c
00002 
00003    Errors and warnings... */
00004 
00005 /*
00006  * Copyright (c) 1995 RadioMail Corporation.
00007  * Copyright (c) 2009,2014 by Internet Systems Consortium, Inc. ("ISC")
00008  * Copyright (c) 2004,2007 by Internet Systems Consortium, Inc. ("ISC")
00009  * Copyright (c) 1996-2003 by Internet Software Consortium
00010  *
00011  * Permission to use, copy, modify, and distribute this software for any
00012  * purpose with or without fee is hereby granted, provided that the above
00013  * copyright notice and this permission notice appear in all copies.
00014  *
00015  * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES
00016  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
00017  * MERCHANTABILITY AND FITNESS.  IN NO EVENT SHALL ISC BE LIABLE FOR
00018  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
00019  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
00020  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
00021  * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
00022  *
00023  *   Internet Systems Consortium, Inc.
00024  *   950 Charter Street
00025  *   Redwood City, CA 94063
00026  *   <info@isc.org>
00027  *   https://www.isc.org/
00028  *
00029  * This software was written for RadioMail Corporation by Ted Lemon
00030  * under a contract with Vixie Enterprises.   Further modifications have
00031  * been made for Internet Systems Consortium under a contract
00032  * with Vixie Laboratories.
00033  */
00034 
00035 #include "dhcpd.h"
00036 
00037 #include <omapip/omapip_p.h>
00038 #include <errno.h>
00039 #include <syslog.h>
00040 
00041 #ifdef DEBUG
00042 int log_perror = -1;
00043 #else
00044 int log_perror = 1;
00045 #endif
00046 int log_priority;
00047 void (*log_cleanup) (void);
00048 
00049 #define CVT_BUF_MAX 1023
00050 static char mbuf [CVT_BUF_MAX + 1];
00051 static char fbuf [CVT_BUF_MAX + 1];
00052 
00053 /* Log an error message, then exit... */
00054 
00055 void log_fatal (const char * fmt, ... )
00056 {
00057   va_list list;
00058 
00059   do_percentm (fbuf, fmt);
00060 
00061   /* %Audit% This is log output. %2004.06.17,Safe%
00062    * If we truncate we hope the user can get a hint from the log.
00063    */
00064   va_start (list, fmt);
00065   vsnprintf (mbuf, sizeof mbuf, fbuf, list);
00066   va_end (list);
00067 
00068 #ifndef DEBUG
00069   syslog (log_priority | LOG_ERR, "%s", mbuf);
00070 #endif
00071 
00072   /* Also log it to stderr? */
00073   if (log_perror) {
00074           IGNORE_RET (write (STDERR_FILENO, mbuf, strlen (mbuf)));
00075           IGNORE_RET (write (STDERR_FILENO, "\n", 1));
00076   }
00077 
00078   log_error ("%s", "");
00079   log_error ("This version of ISC DHCP is based on the release available");
00080   log_error ("on ftp.isc.org.  Features have been added and other changes");
00081   log_error ("have been made to the base software release in order to make");
00082   log_error ("it work better with this distribution.");
00083   log_error ("%s", "");
00084   log_error ("Please report for this software via the Red Hat Bugzilla site:");
00085   log_error ("    http://bugzilla.redhat.com");
00086   log_error ("%s", "");
00087   log_error ("exiting.");
00088 
00089   if (log_cleanup)
00090           (*log_cleanup) ();
00091   exit (1);
00092 }
00093 
00094 /* Log an error message... */
00095 
00096 int log_error (const char * fmt, ...)
00097 {
00098   va_list list;
00099 
00100   do_percentm (fbuf, fmt);
00101 
00102   /* %Audit% This is log output. %2004.06.17,Safe%
00103    * If we truncate we hope the user can get a hint from the log.
00104    */
00105   va_start (list, fmt);
00106   vsnprintf (mbuf, sizeof mbuf, fbuf, list);
00107   va_end (list);
00108 
00109 #ifndef DEBUG
00110   syslog (log_priority | LOG_ERR, "%s", mbuf);
00111 #endif
00112 
00113   if (log_perror) {
00114           IGNORE_RET (write (STDERR_FILENO, mbuf, strlen (mbuf)));
00115           IGNORE_RET (write (STDERR_FILENO, "\n", 1));
00116   }
00117 
00118   return 0;
00119 }
00120 
00121 /* Log a note... */
00122 
00123 int log_info (const char *fmt, ...)
00124 {
00125   va_list list;
00126 
00127   do_percentm (fbuf, fmt);
00128 
00129   /* %Audit% This is log output. %2004.06.17,Safe%
00130    * If we truncate we hope the user can get a hint from the log.
00131    */
00132   va_start (list, fmt);
00133   vsnprintf (mbuf, sizeof mbuf, fbuf, list);
00134   va_end (list);
00135 
00136 #ifndef DEBUG
00137   syslog (log_priority | LOG_INFO, "%s", mbuf);
00138 #endif
00139 
00140   if (log_perror) {
00141           IGNORE_RET (write (STDERR_FILENO, mbuf, strlen (mbuf)));
00142           IGNORE_RET (write (STDERR_FILENO, "\n", 1));
00143   }
00144 
00145   return 0;
00146 }
00147 
00148 /* Log a debug message... */
00149 
00150 int log_debug (const char *fmt, ...)
00151 {
00152   va_list list;
00153 
00154   do_percentm (fbuf, fmt);
00155 
00156   /* %Audit% This is log output. %2004.06.17,Safe%
00157    * If we truncate we hope the user can get a hint from the log.
00158    */
00159   va_start (list, fmt);
00160   vsnprintf (mbuf, sizeof mbuf, fbuf, list);
00161   va_end (list);
00162 
00163 #ifndef DEBUG
00164   syslog (log_priority | LOG_DEBUG, "%s", mbuf);
00165 #endif
00166 
00167   if (log_perror) {
00168           IGNORE_RET (write (STDERR_FILENO, mbuf, strlen (mbuf)));
00169           IGNORE_RET (write (STDERR_FILENO, "\n", 1));
00170   }
00171 
00172   return 0;
00173 }
00174 
00175 /* Find %m in the input string and substitute an error message string. */
00176 
00177 void do_percentm (obuf, ibuf)
00178      char *obuf;
00179      const char *ibuf;
00180 {
00181         const char *s = ibuf;
00182         char *p = obuf;
00183         int infmt = 0;
00184         const char *m;
00185         int len = 0;
00186 
00187         while (*s) {
00188                 if (infmt) {
00189                         if (*s == 'm') {
00190 #ifndef __CYGWIN32__
00191                                 m = strerror (errno);
00192 #else
00193                                 m = pWSAError ();
00194 #endif
00195                                 if (!m)
00196                                         m = "<unknown error>";
00197                                 len += strlen (m);
00198                                 if (len > CVT_BUF_MAX)
00199                                         goto out;
00200                                 strcpy (p - 1, m);
00201                                 p += strlen (p);
00202                                 ++s;
00203                         } else {
00204                                 if (++len > CVT_BUF_MAX)
00205                                         goto out;
00206                                 *p++ = *s++;
00207                         }
00208                         infmt = 0;
00209                 } else {
00210                         if (*s == '%')
00211                                 infmt = 1;
00212                         if (++len > CVT_BUF_MAX)
00213                                 goto out;
00214                         *p++ = *s++;
00215                 }
00216         }
00217       out:
00218         *p = 0;
00219 }
00220 
00221 #ifdef NO_STRERROR
00222 char *strerror (err)
00223         int err;
00224 {
00225         extern char *sys_errlist [];
00226         extern int sys_nerr;
00227         static char errbuf [128];
00228 
00229         if (err < 0 || err >= sys_nerr) {
00230                 sprintf (errbuf, "Error %d", err);
00231                 return errbuf;
00232         }
00233         return sys_errlist [err];
00234 }
00235 #endif /* NO_STRERROR */
00236 
00237 #ifdef _WIN32
00238 char *pWSAError ()
00239 {
00240   int err = WSAGetLastError ();
00241 
00242   switch (err)
00243     {
00244     case WSAEACCES:
00245       return "Permission denied";
00246     case WSAEADDRINUSE:
00247       return "Address already in use";
00248     case WSAEADDRNOTAVAIL:
00249       return "Cannot assign requested address";
00250     case WSAEAFNOSUPPORT:
00251       return "Address family not supported by protocol family";
00252     case WSAEALREADY:
00253       return "Operation already in progress";
00254     case WSAECONNABORTED:
00255       return "Software caused connection abort";
00256     case WSAECONNREFUSED:
00257       return "Connection refused";
00258     case WSAECONNRESET:
00259       return "Connection reset by peer";
00260     case WSAEDESTADDRREQ:
00261       return "Destination address required";
00262     case WSAEFAULT:
00263       return "Bad address";
00264     case WSAEHOSTDOWN:
00265       return "Host is down";
00266     case WSAEHOSTUNREACH:
00267       return "No route to host";
00268     case WSAEINPROGRESS:
00269       return "Operation now in progress";
00270     case WSAEINTR:
00271       return "Interrupted function call";
00272     case WSAEINVAL:
00273       return "Invalid argument";
00274     case WSAEISCONN:
00275       return "Socket is already connected";
00276     case WSAEMFILE:
00277       return "Too many open files";
00278     case WSAEMSGSIZE:
00279       return "Message too long";
00280     case WSAENETDOWN:
00281       return "Network is down";
00282     case WSAENETRESET:
00283       return "Network dropped connection on reset";
00284     case WSAENETUNREACH:
00285       return "Network is unreachable";
00286     case WSAENOBUFS:
00287       return "No buffer space available";
00288     case WSAENOPROTOOPT:
00289       return "Bad protocol option";
00290     case WSAENOTCONN:
00291       return "Socket is not connected";
00292     case WSAENOTSOCK:
00293       return "Socket operation on non-socket";
00294     case WSAEOPNOTSUPP:
00295       return "Operation not supported";
00296     case WSAEPFNOSUPPORT:
00297       return "Protocol family not supported";
00298     case WSAEPROCLIM:
00299       return "Too many processes";
00300     case WSAEPROTONOSUPPORT:
00301       return "Protocol not supported";
00302     case WSAEPROTOTYPE:
00303       return "Protocol wrong type for socket";
00304     case WSAESHUTDOWN:
00305       return "Cannot send after socket shutdown";
00306     case WSAESOCKTNOSUPPORT:
00307       return "Socket type not supported";
00308     case WSAETIMEDOUT:
00309       return "Connection timed out";
00310     case WSAEWOULDBLOCK:
00311       return "Resource temporarily unavailable";
00312     case WSAHOST_NOT_FOUND:
00313       return "Host not found";
00314 #if 0
00315     case WSA_INVALID_HANDLE:
00316       return "Specified event object handle is invalid";
00317     case WSA_INVALID_PARAMETER:
00318       return "One or more parameters are invalid";
00319     case WSAINVALIDPROCTABLE:
00320       return "Invalid procedure table from service provider";
00321     case WSAINVALIDPROVIDER:
00322       return "Invalid service provider version number";
00323     case WSA_IO_PENDING:
00324       return "Overlapped operations will complete later";
00325     case WSA_IO_INCOMPLETE:
00326       return "Overlapped I/O event object not in signaled state";
00327     case WSA_NOT_ENOUGH_MEMORY:
00328       return "Insufficient memory available";
00329 #endif
00330     case WSANOTINITIALISED:
00331       return "Successful WSAStartup not yet performer";
00332     case WSANO_DATA:
00333       return "Valid name, no data record of requested type";
00334     case WSANO_RECOVERY:
00335       return "This is a non-recoverable error";
00336 #if 0
00337     case WSAPROVIDERFAILEDINIT:
00338       return "Unable to initialize a service provider";
00339     case WSASYSCALLFAILURE:
00340       return "System call failure";
00341 #endif
00342     case WSASYSNOTREADY:
00343       return "Network subsystem is unavailable";
00344     case WSATRY_AGAIN:
00345       return "Non-authoritative host not found";
00346     case WSAVERNOTSUPPORTED:
00347       return "WINSOCK.DLL version out of range";
00348     case WSAEDISCON:
00349       return "Graceful shutdown in progress";
00350 #if 0
00351     case WSA_OPERATION_ABORTED:
00352       return "Overlapped operation aborted";
00353 #endif
00354     }
00355   return "Unknown WinSock error";
00356 }
00357 #endif /* _WIN32 */

Generated on 5 Apr 2014 for ISC DHCP by  doxygen 1.6.1