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