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