ISC DHCP  4.3.0
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
47 void (*log_cleanup) (void);
48 
49 #define CVT_BUF_MAX 1023
50 static char mbuf [CVT_BUF_MAX + 1];
51 static char fbuf [CVT_BUF_MAX + 1];
52 
53 /* Log an error message, then exit... */
54 
55 void log_fatal (const char * fmt, ... )
56 {
57  va_list list;
58 
59  do_percentm (fbuf, fmt);
60 
61  /* %Audit% This is log output. %2004.06.17,Safe%
62  * If we truncate we hope the user can get a hint from the log.
63  */
64  va_start (list, fmt);
65  vsnprintf (mbuf, sizeof mbuf, fbuf, list);
66  va_end (list);
67 
68 #ifndef DEBUG
69  syslog (log_priority | LOG_ERR, "%s", mbuf);
70 #endif
71 
72  /* Also log it to stderr? */
73  if (log_perror) {
74  IGNORE_RET (write (STDERR_FILENO, mbuf, strlen (mbuf)));
75  IGNORE_RET (write (STDERR_FILENO, "\n", 1));
76  }
77 
78  log_error ("%s", "");
79  log_error ("This version of ISC DHCP is based on the release available");
80  log_error ("on ftp.isc.org. Features have been added and other changes");
81  log_error ("have been made to the base software release in order to make");
82  log_error ("it work better with this distribution.");
83  log_error ("%s", "");
84  log_error ("Please report for this software via the Red Hat Bugzilla site:");
85  log_error (" http://bugzilla.redhat.com");
86  log_error ("%s", "");
87  log_error ("exiting.");
88 
89  if (log_cleanup)
90  (*log_cleanup) ();
91  exit (1);
92 }
93 
94 /* Log an error message... */
95 
96 int log_error (const char * fmt, ...)
97 {
98  va_list list;
99 
100  do_percentm (fbuf, fmt);
101 
102  /* %Audit% This is log output. %2004.06.17,Safe%
103  * If we truncate we hope the user can get a hint from the log.
104  */
105  va_start (list, fmt);
106  vsnprintf (mbuf, sizeof mbuf, fbuf, list);
107  va_end (list);
108 
109 #ifndef DEBUG
110  syslog (log_priority | LOG_ERR, "%s", mbuf);
111 #endif
112 
113  if (log_perror) {
114  IGNORE_RET (write (STDERR_FILENO, mbuf, strlen (mbuf)));
115  IGNORE_RET (write (STDERR_FILENO, "\n", 1));
116  }
117 
118  return 0;
119 }
120 
121 /* Log a note... */
122 
123 int log_info (const char *fmt, ...)
124 {
125  va_list list;
126 
127  do_percentm (fbuf, fmt);
128 
129  /* %Audit% This is log output. %2004.06.17,Safe%
130  * If we truncate we hope the user can get a hint from the log.
131  */
132  va_start (list, fmt);
133  vsnprintf (mbuf, sizeof mbuf, fbuf, list);
134  va_end (list);
135 
136 #ifndef DEBUG
137  syslog (log_priority | LOG_INFO, "%s", mbuf);
138 #endif
139 
140  if (log_perror) {
141  IGNORE_RET (write (STDERR_FILENO, mbuf, strlen (mbuf)));
142  IGNORE_RET (write (STDERR_FILENO, "\n", 1));
143  }
144 
145  return 0;
146 }
147 
148 /* Log a debug message... */
149 
150 int log_debug (const char *fmt, ...)
151 {
152  va_list list;
153 
154  do_percentm (fbuf, fmt);
155 
156  /* %Audit% This is log output. %2004.06.17,Safe%
157  * If we truncate we hope the user can get a hint from the log.
158  */
159  va_start (list, fmt);
160  vsnprintf (mbuf, sizeof mbuf, fbuf, list);
161  va_end (list);
162 
163 #ifndef DEBUG
164  syslog (log_priority | LOG_DEBUG, "%s", mbuf);
165 #endif
166 
167  if (log_perror) {
168  IGNORE_RET (write (STDERR_FILENO, mbuf, strlen (mbuf)));
169  IGNORE_RET (write (STDERR_FILENO, "\n", 1));
170  }
171 
172  return 0;
173 }
174 
175 /* Find %m in the input string and substitute an error message string. */
176 
177 void do_percentm (obuf, ibuf)
178  char *obuf;
179  const char *ibuf;
180 {
181  const char *s = ibuf;
182  char *p = obuf;
183  int infmt = 0;
184  const char *m;
185  int len = 0;
186 
187  while (*s) {
188  if (infmt) {
189  if (*s == 'm') {
190 #ifndef __CYGWIN32__
191  m = strerror (errno);
192 #else
193  m = pWSAError ();
194 #endif
195  if (!m)
196  m = "<unknown error>";
197  len += strlen (m);
198  if (len > CVT_BUF_MAX)
199  goto out;
200  strcpy (p - 1, m);
201  p += strlen (p);
202  ++s;
203  } else {
204  if (++len > CVT_BUF_MAX)
205  goto out;
206  *p++ = *s++;
207  }
208  infmt = 0;
209  } else {
210  if (*s == '%')
211  infmt = 1;
212  if (++len > CVT_BUF_MAX)
213  goto out;
214  *p++ = *s++;
215  }
216  }
217  out:
218  *p = 0;
219 }
220 
221 #ifdef NO_STRERROR
222 char *strerror (err)
223  int err;
224 {
225  extern char *sys_errlist [];
226  extern int sys_nerr;
227  static char errbuf [128];
228 
229  if (err < 0 || err >= sys_nerr) {
230  sprintf (errbuf, "Error %d", err);
231  return errbuf;
232  }
233  return sys_errlist [err];
234 }
235 #endif /* NO_STRERROR */
236 
237 #ifdef _WIN32
238 char *pWSAError ()
239 {
240  int err = WSAGetLastError ();
241 
242  switch (err)
243  {
244  case WSAEACCES:
245  return "Permission denied";
246  case WSAEADDRINUSE:
247  return "Address already in use";
248  case WSAEADDRNOTAVAIL:
249  return "Cannot assign requested address";
250  case WSAEAFNOSUPPORT:
251  return "Address family not supported by protocol family";
252  case WSAEALREADY:
253  return "Operation already in progress";
254  case WSAECONNABORTED:
255  return "Software caused connection abort";
256  case WSAECONNREFUSED:
257  return "Connection refused";
258  case WSAECONNRESET:
259  return "Connection reset by peer";
260  case WSAEDESTADDRREQ:
261  return "Destination address required";
262  case WSAEFAULT:
263  return "Bad address";
264  case WSAEHOSTDOWN:
265  return "Host is down";
266  case WSAEHOSTUNREACH:
267  return "No route to host";
268  case WSAEINPROGRESS:
269  return "Operation now in progress";
270  case WSAEINTR:
271  return "Interrupted function call";
272  case WSAEINVAL:
273  return "Invalid argument";
274  case WSAEISCONN:
275  return "Socket is already connected";
276  case WSAEMFILE:
277  return "Too many open files";
278  case WSAEMSGSIZE:
279  return "Message too long";
280  case WSAENETDOWN:
281  return "Network is down";
282  case WSAENETRESET:
283  return "Network dropped connection on reset";
284  case WSAENETUNREACH:
285  return "Network is unreachable";
286  case WSAENOBUFS:
287  return "No buffer space available";
288  case WSAENOPROTOOPT:
289  return "Bad protocol option";
290  case WSAENOTCONN:
291  return "Socket is not connected";
292  case WSAENOTSOCK:
293  return "Socket operation on non-socket";
294  case WSAEOPNOTSUPP:
295  return "Operation not supported";
296  case WSAEPFNOSUPPORT:
297  return "Protocol family not supported";
298  case WSAEPROCLIM:
299  return "Too many processes";
300  case WSAEPROTONOSUPPORT:
301  return "Protocol not supported";
302  case WSAEPROTOTYPE:
303  return "Protocol wrong type for socket";
304  case WSAESHUTDOWN:
305  return "Cannot send after socket shutdown";
306  case WSAESOCKTNOSUPPORT:
307  return "Socket type not supported";
308  case WSAETIMEDOUT:
309  return "Connection timed out";
310  case WSAEWOULDBLOCK:
311  return "Resource temporarily unavailable";
312  case WSAHOST_NOT_FOUND:
313  return "Host not found";
314 #if 0
315  case WSA_INVALID_HANDLE:
316  return "Specified event object handle is invalid";
317  case WSA_INVALID_PARAMETER:
318  return "One or more parameters are invalid";
319  case WSAINVALIDPROCTABLE:
320  return "Invalid procedure table from service provider";
321  case WSAINVALIDPROVIDER:
322  return "Invalid service provider version number";
323  case WSA_IO_PENDING:
324  return "Overlapped operations will complete later";
325  case WSA_IO_INCOMPLETE:
326  return "Overlapped I/O event object not in signaled state";
327  case WSA_NOT_ENOUGH_MEMORY:
328  return "Insufficient memory available";
329 #endif
330  case WSANOTINITIALISED:
331  return "Successful WSAStartup not yet performer";
332  case WSANO_DATA:
333  return "Valid name, no data record of requested type";
334  case WSANO_RECOVERY:
335  return "This is a non-recoverable error";
336 #if 0
337  case WSAPROVIDERFAILEDINIT:
338  return "Unable to initialize a service provider";
339  case WSASYSCALLFAILURE:
340  return "System call failure";
341 #endif
342  case WSASYSNOTREADY:
343  return "Network subsystem is unavailable";
344  case WSATRY_AGAIN:
345  return "Non-authoritative host not found";
346  case WSAVERNOTSUPPORTED:
347  return "WINSOCK.DLL version out of range";
348  case WSAEDISCON:
349  return "Graceful shutdown in progress";
350 #if 0
351  case WSA_OPERATION_ABORTED:
352  return "Overlapped operation aborted";
353 #endif
354  }
355  return "Unknown WinSock error";
356 }
357 #endif /* _WIN32 */
int log_debug(const char *fmt,...)
Definition: errwarn.c:150
#define STDERR_FILENO
Definition: osdep.h:288
int log_priority
Definition: errwarn.c:46
int log_error(const char *fmt,...)
Definition: errwarn.c:96
void log_fatal(const char *fmt,...)
Definition: errwarn.c:55
int log_perror
Definition: errwarn.c:44
void(* log_cleanup)(void)
Definition: errwarn.c:47
void do_percentm(char *obuf, const char *ibuf)
Definition: errwarn.c:177
#define CVT_BUF_MAX
Definition: errwarn.c:49
int log_info(const char *fmt,...)
Definition: errwarn.c:123
#define IGNORE_RET(x)
Definition: cdefs.h:55