ISC DHCP  4.3.5
A reference DHCPv4 and DHCPv6 implementation
errwarn.c
Go to the documentation of this file.
1 /* errwarn.c
2 
3  Errors and warnings... */
4 
5 /*
6  * Copyright (c) 1995 RadioMail Corporation.
7  * Copyright (c) 2009,2014 by Internet Systems Consortium, Inc. ("ISC")
8  * Copyright (c) 2004,2007 by Internet Systems Consortium, Inc. ("ISC")
9  * Copyright (c) 1996-2003 by Internet Software Consortium
10  *
11  * Permission to use, copy, modify, and distribute this software for any
12  * purpose with or without fee is hereby granted, provided that the above
13  * copyright notice and this permission notice appear in all copies.
14  *
15  * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES
16  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
17  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR
18  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
19  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
20  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
21  * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
22  *
23  * Internet Systems Consortium, Inc.
24  * 950 Charter Street
25  * Redwood City, CA 94063
26  * <info@isc.org>
27  * https://www.isc.org/
28  *
29  * This software was written for RadioMail Corporation by Ted Lemon
30  * under a contract with Vixie Enterprises. Further modifications have
31  * been made for Internet Systems Consortium under a contract
32  * with Vixie Laboratories.
33  */
34 
35 #include "dhcpd.h"
36 
37 #include <omapip/omapip_p.h>
38 #include <errno.h>
39 #include <syslog.h>
40 
41 #ifdef DEBUG
42 int log_perror = -1;
43 #else
44 int log_perror = 1;
45 #endif
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_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  log_error ("%s", "");
78  log_error ("This version of ISC DHCP is based on the release available");
79  log_error ("on ftp.isc.org. Features have been added and other changes");
80  log_error ("have been made to the base software release in order to make");
81  log_error ("it work better with this distribution.");
82  log_error ("%s", "");
83  log_error ("Please report for this software via the Red Hat Bugzilla site:");
84  log_error (" http://bugzilla.redhat.com");
85  log_error ("%s", "");
86  log_error ("exiting.");
87 
88  if (log_cleanup)
89  (*log_cleanup) ();
90  exit (1);
91 }
92 
93 /* Log an error message... */
94 
95 int log_error (const char * fmt, ...)
96 {
97  va_list list;
98 
99  do_percentm (fbuf, fmt);
100 
101  /* %Audit% This is log output. %2004.06.17,Safe%
102  * If we truncate we hope the user can get a hint from the log.
103  */
104  va_start (list, fmt);
105  vsnprintf (mbuf, sizeof mbuf, fbuf, list);
106  va_end (list);
107 
108 #ifndef DEBUG
109  syslog (LOG_ERR, "%s", mbuf);
110 #endif
111 
112  if (log_perror) {
113  IGNORE_RET (write (STDERR_FILENO, mbuf, strlen (mbuf)));
114  IGNORE_RET (write (STDERR_FILENO, "\n", 1));
115  }
116 
117  return 0;
118 }
119 
120 /* Log a note... */
121 
122 int log_info (const char *fmt, ...)
123 {
124  va_list list;
125 
126  do_percentm (fbuf, fmt);
127 
128  /* %Audit% This is log output. %2004.06.17,Safe%
129  * If we truncate we hope the user can get a hint from the log.
130  */
131  va_start (list, fmt);
132  vsnprintf (mbuf, sizeof mbuf, fbuf, list);
133  va_end (list);
134 
135 #ifndef DEBUG
136  syslog (LOG_INFO, "%s", mbuf);
137 #endif
138 
139  if (log_perror) {
140  IGNORE_RET (write (STDERR_FILENO, mbuf, strlen (mbuf)));
141  IGNORE_RET (write (STDERR_FILENO, "\n", 1));
142  }
143 
144  return 0;
145 }
146 
147 /* Log a debug message... */
148 
149 int log_debug (const char *fmt, ...)
150 {
151  va_list list;
152 
153  do_percentm (fbuf, fmt);
154 
155  /* %Audit% This is log output. %2004.06.17,Safe%
156  * If we truncate we hope the user can get a hint from the log.
157  */
158  va_start (list, fmt);
159  vsnprintf (mbuf, sizeof mbuf, fbuf, list);
160  va_end (list);
161 
162 #ifndef DEBUG
163  syslog (LOG_DEBUG, "%s", mbuf);
164 #endif
165 
166  if (log_perror) {
167  IGNORE_RET (write (STDERR_FILENO, mbuf, strlen (mbuf)));
168  IGNORE_RET (write (STDERR_FILENO, "\n", 1));
169  }
170 
171  return 0;
172 }
173 
174 /* Find %m in the input string and substitute an error message string. */
175 
176 void do_percentm (obuf, ibuf)
177  char *obuf;
178  const char *ibuf;
179 {
180  const char *s = ibuf;
181  char *p = obuf;
182  int infmt = 0;
183  const char *m;
184  int len = 0;
185 
186  while (*s) {
187  if (infmt) {
188  if (*s == 'm') {
189 #ifndef __CYGWIN32__
190  m = strerror (errno);
191 #else
192  m = pWSAError ();
193 #endif
194  if (!m)
195  m = "<unknown error>";
196  len += strlen (m);
197  if (len > CVT_BUF_MAX)
198  goto out;
199  strcpy (p - 1, m);
200  p += strlen (p);
201  ++s;
202  } else {
203  if (++len > CVT_BUF_MAX)
204  goto out;
205  *p++ = *s++;
206  }
207  infmt = 0;
208  } else {
209  if (*s == '%')
210  infmt = 1;
211  if (++len > CVT_BUF_MAX)
212  goto out;
213  *p++ = *s++;
214  }
215  }
216  out:
217  *p = 0;
218 }
219 
220 #ifdef NO_STRERROR
221 char *strerror (err)
222  int err;
223 {
224  extern char *sys_errlist [];
225  extern int sys_nerr;
226  static char errbuf [128];
227 
228  if (err < 0 || err >= sys_nerr) {
229  sprintf (errbuf, "Error %d", err);
230  return errbuf;
231  }
232  return sys_errlist [err];
233 }
234 #endif /* NO_STRERROR */
235 
236 #ifdef _WIN32
237 char *pWSAError ()
238 {
239  int err = WSAGetLastError ();
240 
241  switch (err)
242  {
243  case WSAEACCES:
244  return "Permission denied";
245  case WSAEADDRINUSE:
246  return "Address already in use";
247  case WSAEADDRNOTAVAIL:
248  return "Cannot assign requested address";
249  case WSAEAFNOSUPPORT:
250  return "Address family not supported by protocol family";
251  case WSAEALREADY:
252  return "Operation already in progress";
253  case WSAECONNABORTED:
254  return "Software caused connection abort";
255  case WSAECONNREFUSED:
256  return "Connection refused";
257  case WSAECONNRESET:
258  return "Connection reset by peer";
259  case WSAEDESTADDRREQ:
260  return "Destination address required";
261  case WSAEFAULT:
262  return "Bad address";
263  case WSAEHOSTDOWN:
264  return "Host is down";
265  case WSAEHOSTUNREACH:
266  return "No route to host";
267  case WSAEINPROGRESS:
268  return "Operation now in progress";
269  case WSAEINTR:
270  return "Interrupted function call";
271  case WSAEINVAL:
272  return "Invalid argument";
273  case WSAEISCONN:
274  return "Socket is already connected";
275  case WSAEMFILE:
276  return "Too many open files";
277  case WSAEMSGSIZE:
278  return "Message too long";
279  case WSAENETDOWN:
280  return "Network is down";
281  case WSAENETRESET:
282  return "Network dropped connection on reset";
283  case WSAENETUNREACH:
284  return "Network is unreachable";
285  case WSAENOBUFS:
286  return "No buffer space available";
287  case WSAENOPROTOOPT:
288  return "Bad protocol option";
289  case WSAENOTCONN:
290  return "Socket is not connected";
291  case WSAENOTSOCK:
292  return "Socket operation on non-socket";
293  case WSAEOPNOTSUPP:
294  return "Operation not supported";
295  case WSAEPFNOSUPPORT:
296  return "Protocol family not supported";
297  case WSAEPROCLIM:
298  return "Too many processes";
299  case WSAEPROTONOSUPPORT:
300  return "Protocol not supported";
301  case WSAEPROTOTYPE:
302  return "Protocol wrong type for socket";
303  case WSAESHUTDOWN:
304  return "Cannot send after socket shutdown";
305  case WSAESOCKTNOSUPPORT:
306  return "Socket type not supported";
307  case WSAETIMEDOUT:
308  return "Connection timed out";
309  case WSAEWOULDBLOCK:
310  return "Resource temporarily unavailable";
311  case WSAHOST_NOT_FOUND:
312  return "Host not found";
313 #if 0
314  case WSA_INVALID_HANDLE:
315  return "Specified event object handle is invalid";
316  case WSA_INVALID_PARAMETER:
317  return "One or more parameters are invalid";
318  case WSAINVALIDPROCTABLE:
319  return "Invalid procedure table from service provider";
320  case WSAINVALIDPROVIDER:
321  return "Invalid service provider version number";
322  case WSA_IO_PENDING:
323  return "Overlapped operations will complete later";
324  case WSA_IO_INCOMPLETE:
325  return "Overlapped I/O event object not in signaled state";
326  case WSA_NOT_ENOUGH_MEMORY:
327  return "Insufficient memory available";
328 #endif
329  case WSANOTINITIALISED:
330  return "Successful WSAStartup not yet performer";
331  case WSANO_DATA:
332  return "Valid name, no data record of requested type";
333  case WSANO_RECOVERY:
334  return "This is a non-recoverable error";
335 #if 0
336  case WSAPROVIDERFAILEDINIT:
337  return "Unable to initialize a service provider";
338  case WSASYSCALLFAILURE:
339  return "System call failure";
340 #endif
341  case WSASYSNOTREADY:
342  return "Network subsystem is unavailable";
343  case WSATRY_AGAIN:
344  return "Non-authoritative host not found";
345  case WSAVERNOTSUPPORTED:
346  return "WINSOCK.DLL version out of range";
347  case WSAEDISCON:
348  return "Graceful shutdown in progress";
349 #if 0
350  case WSA_OPERATION_ABORTED:
351  return "Overlapped operation aborted";
352 #endif
353  }
354  return "Unknown WinSock error";
355 }
356 #endif /* _WIN32 */
int log_debug(const char *fmt,...)
Definition: errwarn.c:149
#define STDERR_FILENO
Definition: osdep.h:288
int log_error(const char *fmt,...)
Definition: errwarn.c:95
void log_fatal(const char *fmt,...)
Definition: errwarn.c:54
int log_perror
Definition: errwarn.c:44
void(* log_cleanup)(void)
Definition: errwarn.c:46
void do_percentm(char *obuf, const char *ibuf)
Definition: errwarn.c:176
#define CVT_BUF_MAX
Definition: errwarn.c:48
int log_info(const char *fmt,...)
Definition: errwarn.c:122
#define IGNORE_RET(x)
Definition: cdefs.h:55