00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
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
00054
00055 void log_fatal (const char * fmt, ... )
00056 {
00057 va_list list;
00058
00059 do_percentm (fbuf, fmt);
00060
00061
00062
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
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
00095
00096 int log_error (const char * fmt, ...)
00097 {
00098 va_list list;
00099
00100 do_percentm (fbuf, fmt);
00101
00102
00103
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
00122
00123 int log_info (const char *fmt, ...)
00124 {
00125 va_list list;
00126
00127 do_percentm (fbuf, fmt);
00128
00129
00130
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
00149
00150 int log_debug (const char *fmt, ...)
00151 {
00152 va_list list;
00153
00154 do_percentm (fbuf, fmt);
00155
00156
00157
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
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
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