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