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