xref: /minix3/external/bsd/bind/dist/lib/isc/win32/strerror.c (revision 00b67f09dd46474d133c95011a48590a8e8f94c7)
1*00b67f09SDavid van Moolenbroek /*	$NetBSD: strerror.c,v 1.4 2014/12/10 04:38:01 christos Exp $	*/
2*00b67f09SDavid van Moolenbroek 
3*00b67f09SDavid van Moolenbroek /*
4*00b67f09SDavid van Moolenbroek  * Copyright (C) 2004, 2007  Internet Systems Consortium, Inc. ("ISC")
5*00b67f09SDavid van Moolenbroek  * Copyright (C) 2001, 2002  Internet Software Consortium.
6*00b67f09SDavid van Moolenbroek  *
7*00b67f09SDavid van Moolenbroek  * Permission to use, copy, modify, and/or distribute this software for any
8*00b67f09SDavid van Moolenbroek  * purpose with or without fee is hereby granted, provided that the above
9*00b67f09SDavid van Moolenbroek  * copyright notice and this permission notice appear in all copies.
10*00b67f09SDavid van Moolenbroek  *
11*00b67f09SDavid van Moolenbroek  * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
12*00b67f09SDavid van Moolenbroek  * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
13*00b67f09SDavid van Moolenbroek  * AND FITNESS.  IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
14*00b67f09SDavid van Moolenbroek  * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
15*00b67f09SDavid van Moolenbroek  * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
16*00b67f09SDavid van Moolenbroek  * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
17*00b67f09SDavid van Moolenbroek  * PERFORMANCE OF THIS SOFTWARE.
18*00b67f09SDavid van Moolenbroek  */
19*00b67f09SDavid van Moolenbroek 
20*00b67f09SDavid van Moolenbroek /* Id: strerror.c,v 1.8 2007/06/19 23:47:19 tbox Exp  */
21*00b67f09SDavid van Moolenbroek 
22*00b67f09SDavid van Moolenbroek #include <config.h>
23*00b67f09SDavid van Moolenbroek 
24*00b67f09SDavid van Moolenbroek #include <stdio.h>
25*00b67f09SDavid van Moolenbroek #include <string.h>
26*00b67f09SDavid van Moolenbroek #include <winsock2.h>
27*00b67f09SDavid van Moolenbroek 
28*00b67f09SDavid van Moolenbroek #include <isc/mutex.h>
29*00b67f09SDavid van Moolenbroek #include <isc/once.h>
30*00b67f09SDavid van Moolenbroek #include <isc/print.h>
31*00b67f09SDavid van Moolenbroek #include <isc/strerror.h>
32*00b67f09SDavid van Moolenbroek #include <isc/util.h>
33*00b67f09SDavid van Moolenbroek 
34*00b67f09SDavid van Moolenbroek /*
35*00b67f09SDavid van Moolenbroek  * Forward declarations
36*00b67f09SDavid van Moolenbroek  */
37*00b67f09SDavid van Moolenbroek 
38*00b67f09SDavid van Moolenbroek char *
39*00b67f09SDavid van Moolenbroek FormatError(int error);
40*00b67f09SDavid van Moolenbroek 
41*00b67f09SDavid van Moolenbroek char *
42*00b67f09SDavid van Moolenbroek GetWSAErrorMessage(int errval);
43*00b67f09SDavid van Moolenbroek 
44*00b67f09SDavid van Moolenbroek char *
45*00b67f09SDavid van Moolenbroek NTstrerror(int err, BOOL *bfreebuf);
46*00b67f09SDavid van Moolenbroek 
47*00b67f09SDavid van Moolenbroek /*
48*00b67f09SDavid van Moolenbroek  * We need to do this this way for profiled locks.
49*00b67f09SDavid van Moolenbroek  */
50*00b67f09SDavid van Moolenbroek 
51*00b67f09SDavid van Moolenbroek static isc_mutex_t isc_strerror_lock;
init_lock(void)52*00b67f09SDavid van Moolenbroek static void init_lock(void) {
53*00b67f09SDavid van Moolenbroek 	RUNTIME_CHECK(isc_mutex_init(&isc_strerror_lock) == ISC_R_SUCCESS);
54*00b67f09SDavid van Moolenbroek }
55*00b67f09SDavid van Moolenbroek 
56*00b67f09SDavid van Moolenbroek /*
57*00b67f09SDavid van Moolenbroek  * This routine needs to free up any buffer allocated by FormatMessage
58*00b67f09SDavid van Moolenbroek  * if that routine gets used.
59*00b67f09SDavid van Moolenbroek  */
60*00b67f09SDavid van Moolenbroek 
61*00b67f09SDavid van Moolenbroek void
isc__strerror(int num,char * buf,size_t size)62*00b67f09SDavid van Moolenbroek isc__strerror(int num, char *buf, size_t size) {
63*00b67f09SDavid van Moolenbroek 	char *msg;
64*00b67f09SDavid van Moolenbroek 	BOOL freebuf;
65*00b67f09SDavid van Moolenbroek 	unsigned int unum = num;
66*00b67f09SDavid van Moolenbroek 	static isc_once_t once = ISC_ONCE_INIT;
67*00b67f09SDavid van Moolenbroek 
68*00b67f09SDavid van Moolenbroek 	REQUIRE(buf != NULL);
69*00b67f09SDavid van Moolenbroek 
70*00b67f09SDavid van Moolenbroek 	RUNTIME_CHECK(isc_once_do(&once, init_lock) == ISC_R_SUCCESS);
71*00b67f09SDavid van Moolenbroek 
72*00b67f09SDavid van Moolenbroek 	LOCK(&isc_strerror_lock);
73*00b67f09SDavid van Moolenbroek 	freebuf = FALSE;
74*00b67f09SDavid van Moolenbroek 	msg = NTstrerror(num, &freebuf);
75*00b67f09SDavid van Moolenbroek 	if (msg != NULL)
76*00b67f09SDavid van Moolenbroek 		snprintf(buf, size, "%s", msg);
77*00b67f09SDavid van Moolenbroek 	else
78*00b67f09SDavid van Moolenbroek 		snprintf(buf, size, "Unknown error: %u", unum);
79*00b67f09SDavid van Moolenbroek 	if(freebuf && msg != NULL) {
80*00b67f09SDavid van Moolenbroek 		LocalFree(msg);
81*00b67f09SDavid van Moolenbroek 	}
82*00b67f09SDavid van Moolenbroek 	UNLOCK(&isc_strerror_lock);
83*00b67f09SDavid van Moolenbroek }
84*00b67f09SDavid van Moolenbroek 
85*00b67f09SDavid van Moolenbroek /*
86*00b67f09SDavid van Moolenbroek  * Note this will cause a memory leak unless the memory allocated here
87*00b67f09SDavid van Moolenbroek  * is freed by calling LocalFree.  isc__strerror does this before unlocking.
88*00b67f09SDavid van Moolenbroek  * This only gets called if there is a system type of error and will likely
89*00b67f09SDavid van Moolenbroek  * be an unusual event.
90*00b67f09SDavid van Moolenbroek  */
91*00b67f09SDavid van Moolenbroek char *
FormatError(int error)92*00b67f09SDavid van Moolenbroek FormatError(int error) {
93*00b67f09SDavid van Moolenbroek 	LPVOID lpMsgBuf = NULL;
94*00b67f09SDavid van Moolenbroek 	FormatMessage(
95*00b67f09SDavid van Moolenbroek 		FORMAT_MESSAGE_ALLOCATE_BUFFER |
96*00b67f09SDavid van Moolenbroek 		FORMAT_MESSAGE_FROM_SYSTEM |
97*00b67f09SDavid van Moolenbroek 		FORMAT_MESSAGE_IGNORE_INSERTS,
98*00b67f09SDavid van Moolenbroek 		NULL,
99*00b67f09SDavid van Moolenbroek 		error,
100*00b67f09SDavid van Moolenbroek 		/* Default language */
101*00b67f09SDavid van Moolenbroek 		MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
102*00b67f09SDavid van Moolenbroek 		(LPTSTR) &lpMsgBuf,
103*00b67f09SDavid van Moolenbroek 		0,
104*00b67f09SDavid van Moolenbroek 		NULL);
105*00b67f09SDavid van Moolenbroek 
106*00b67f09SDavid van Moolenbroek 	return (lpMsgBuf);
107*00b67f09SDavid van Moolenbroek }
108*00b67f09SDavid van Moolenbroek 
109*00b67f09SDavid van Moolenbroek /*
110*00b67f09SDavid van Moolenbroek  * This routine checks the error value and calls the WSA Windows Sockets
111*00b67f09SDavid van Moolenbroek  * Error message function GetWSAErrorMessage below if it's within that range
112*00b67f09SDavid van Moolenbroek  * since those messages are not available in the system error messages.
113*00b67f09SDavid van Moolenbroek  */
114*00b67f09SDavid van Moolenbroek char *
NTstrerror(int err,BOOL * bfreebuf)115*00b67f09SDavid van Moolenbroek NTstrerror(int err, BOOL *bfreebuf) {
116*00b67f09SDavid van Moolenbroek 	char *retmsg = NULL;
117*00b67f09SDavid van Moolenbroek 
118*00b67f09SDavid van Moolenbroek 	/* Copy the error value first in case of other errors */
119*00b67f09SDavid van Moolenbroek 	DWORD errval = err;
120*00b67f09SDavid van Moolenbroek 
121*00b67f09SDavid van Moolenbroek 	*bfreebuf = FALSE;
122*00b67f09SDavid van Moolenbroek 
123*00b67f09SDavid van Moolenbroek 	/* Get the Winsock2 error messages */
124*00b67f09SDavid van Moolenbroek 	if (errval >= WSABASEERR && errval <= (WSABASEERR + 1015)) {
125*00b67f09SDavid van Moolenbroek 		retmsg = GetWSAErrorMessage(errval);
126*00b67f09SDavid van Moolenbroek 		if (retmsg != NULL)
127*00b67f09SDavid van Moolenbroek 			return (retmsg);
128*00b67f09SDavid van Moolenbroek 	}
129*00b67f09SDavid van Moolenbroek 	/*
130*00b67f09SDavid van Moolenbroek 	 * If it's not one of the standard Unix error codes,
131*00b67f09SDavid van Moolenbroek 	 * try a system error message
132*00b67f09SDavid van Moolenbroek 	 */
133*00b67f09SDavid van Moolenbroek 	if (errval > (DWORD) _sys_nerr) {
134*00b67f09SDavid van Moolenbroek 		*bfreebuf = TRUE;
135*00b67f09SDavid van Moolenbroek 		return (FormatError(errval));
136*00b67f09SDavid van Moolenbroek 	} else {
137*00b67f09SDavid van Moolenbroek 		return (strerror(errval));
138*00b67f09SDavid van Moolenbroek 	}
139*00b67f09SDavid van Moolenbroek }
140*00b67f09SDavid van Moolenbroek 
141*00b67f09SDavid van Moolenbroek /*
142*00b67f09SDavid van Moolenbroek  * This is a replacement for perror
143*00b67f09SDavid van Moolenbroek  */
144*00b67f09SDavid van Moolenbroek void __cdecl
NTperror(char * errmsg)145*00b67f09SDavid van Moolenbroek NTperror(char *errmsg) {
146*00b67f09SDavid van Moolenbroek 	/* Copy the error value first in case of other errors */
147*00b67f09SDavid van Moolenbroek 	int errval = errno;
148*00b67f09SDavid van Moolenbroek 	BOOL bfreebuf = FALSE;
149*00b67f09SDavid van Moolenbroek 	char *msg;
150*00b67f09SDavid van Moolenbroek 
151*00b67f09SDavid van Moolenbroek 	msg = NTstrerror(errval, &bfreebuf);
152*00b67f09SDavid van Moolenbroek 	fprintf(stderr, "%s: %s\n", errmsg, msg);
153*00b67f09SDavid van Moolenbroek 	if(bfreebuf == TRUE) {
154*00b67f09SDavid van Moolenbroek 		LocalFree(msg);
155*00b67f09SDavid van Moolenbroek 	}
156*00b67f09SDavid van Moolenbroek 
157*00b67f09SDavid van Moolenbroek }
158*00b67f09SDavid van Moolenbroek 
159*00b67f09SDavid van Moolenbroek /*
160*00b67f09SDavid van Moolenbroek  * Return the error string related to Winsock2 errors.
161*00b67f09SDavid van Moolenbroek  * This function is necessary since FormatMessage knows nothing about them
162*00b67f09SDavid van Moolenbroek  * and there is no function to get them.
163*00b67f09SDavid van Moolenbroek  */
164*00b67f09SDavid van Moolenbroek char *
GetWSAErrorMessage(int errval)165*00b67f09SDavid van Moolenbroek GetWSAErrorMessage(int errval) {
166*00b67f09SDavid van Moolenbroek 	char *msg;
167*00b67f09SDavid van Moolenbroek 
168*00b67f09SDavid van Moolenbroek 	switch (errval) {
169*00b67f09SDavid van Moolenbroek 
170*00b67f09SDavid van Moolenbroek 	case WSAEINTR:
171*00b67f09SDavid van Moolenbroek 		msg = "Interrupted system call";
172*00b67f09SDavid van Moolenbroek 		break;
173*00b67f09SDavid van Moolenbroek 
174*00b67f09SDavid van Moolenbroek 	case WSAEBADF:
175*00b67f09SDavid van Moolenbroek 		msg = "Bad file number";
176*00b67f09SDavid van Moolenbroek 		break;
177*00b67f09SDavid van Moolenbroek 
178*00b67f09SDavid van Moolenbroek 	case WSAEACCES:
179*00b67f09SDavid van Moolenbroek 		msg = "Permission denied";
180*00b67f09SDavid van Moolenbroek 		break;
181*00b67f09SDavid van Moolenbroek 
182*00b67f09SDavid van Moolenbroek 	case WSAEFAULT:
183*00b67f09SDavid van Moolenbroek 		msg = "Bad address";
184*00b67f09SDavid van Moolenbroek 		break;
185*00b67f09SDavid van Moolenbroek 
186*00b67f09SDavid van Moolenbroek 	case WSAEINVAL:
187*00b67f09SDavid van Moolenbroek 		msg = "Invalid argument";
188*00b67f09SDavid van Moolenbroek 		break;
189*00b67f09SDavid van Moolenbroek 
190*00b67f09SDavid van Moolenbroek 	case WSAEMFILE:
191*00b67f09SDavid van Moolenbroek 		msg = "Too many open sockets";
192*00b67f09SDavid van Moolenbroek 		break;
193*00b67f09SDavid van Moolenbroek 
194*00b67f09SDavid van Moolenbroek 	case WSAEWOULDBLOCK:
195*00b67f09SDavid van Moolenbroek 		msg = "Operation would block";
196*00b67f09SDavid van Moolenbroek 		break;
197*00b67f09SDavid van Moolenbroek 
198*00b67f09SDavid van Moolenbroek 	case WSAEINPROGRESS:
199*00b67f09SDavid van Moolenbroek 		msg = "Operation now in progress";
200*00b67f09SDavid van Moolenbroek 		break;
201*00b67f09SDavid van Moolenbroek 
202*00b67f09SDavid van Moolenbroek 	case WSAEALREADY:
203*00b67f09SDavid van Moolenbroek 		msg = "Operation already in progress";
204*00b67f09SDavid van Moolenbroek 		break;
205*00b67f09SDavid van Moolenbroek 
206*00b67f09SDavid van Moolenbroek 	case WSAENOTSOCK:
207*00b67f09SDavid van Moolenbroek 		msg = "Socket operation on non-socket";
208*00b67f09SDavid van Moolenbroek 		break;
209*00b67f09SDavid van Moolenbroek 
210*00b67f09SDavid van Moolenbroek 	case WSAEDESTADDRREQ:
211*00b67f09SDavid van Moolenbroek 		msg = "Destination address required";
212*00b67f09SDavid van Moolenbroek 		break;
213*00b67f09SDavid van Moolenbroek 
214*00b67f09SDavid van Moolenbroek 	case WSAEMSGSIZE:
215*00b67f09SDavid van Moolenbroek 		msg = "Message too long";
216*00b67f09SDavid van Moolenbroek 		break;
217*00b67f09SDavid van Moolenbroek 
218*00b67f09SDavid van Moolenbroek 	case WSAEPROTOTYPE:
219*00b67f09SDavid van Moolenbroek 		msg = "Protocol wrong type for socket";
220*00b67f09SDavid van Moolenbroek 		break;
221*00b67f09SDavid van Moolenbroek 
222*00b67f09SDavid van Moolenbroek 	case WSAENOPROTOOPT:
223*00b67f09SDavid van Moolenbroek 		msg = "Bad protocol option";
224*00b67f09SDavid van Moolenbroek 		break;
225*00b67f09SDavid van Moolenbroek 
226*00b67f09SDavid van Moolenbroek 	case WSAEPROTONOSUPPORT:
227*00b67f09SDavid van Moolenbroek 		msg = "Protocol not supported";
228*00b67f09SDavid van Moolenbroek 		break;
229*00b67f09SDavid van Moolenbroek 
230*00b67f09SDavid van Moolenbroek 	case WSAESOCKTNOSUPPORT:
231*00b67f09SDavid van Moolenbroek 		msg = "Socket type not supported";
232*00b67f09SDavid van Moolenbroek 		break;
233*00b67f09SDavid van Moolenbroek 
234*00b67f09SDavid van Moolenbroek 	case WSAEOPNOTSUPP:
235*00b67f09SDavid van Moolenbroek 		msg = "Operation not supported on socket";
236*00b67f09SDavid van Moolenbroek 		break;
237*00b67f09SDavid van Moolenbroek 
238*00b67f09SDavid van Moolenbroek 	case WSAEPFNOSUPPORT:
239*00b67f09SDavid van Moolenbroek 		msg = "Protocol family not supported";
240*00b67f09SDavid van Moolenbroek 		break;
241*00b67f09SDavid van Moolenbroek 
242*00b67f09SDavid van Moolenbroek 	case WSAEAFNOSUPPORT:
243*00b67f09SDavid van Moolenbroek 		msg = "Address family not supported";
244*00b67f09SDavid van Moolenbroek 		break;
245*00b67f09SDavid van Moolenbroek 
246*00b67f09SDavid van Moolenbroek 	case WSAEADDRINUSE:
247*00b67f09SDavid van Moolenbroek 		msg = "Address already in use";
248*00b67f09SDavid van Moolenbroek 		break;
249*00b67f09SDavid van Moolenbroek 
250*00b67f09SDavid van Moolenbroek 	case WSAEADDRNOTAVAIL:
251*00b67f09SDavid van Moolenbroek 		msg = "Can't assign requested address";
252*00b67f09SDavid van Moolenbroek 		break;
253*00b67f09SDavid van Moolenbroek 
254*00b67f09SDavid van Moolenbroek 	case WSAENETDOWN:
255*00b67f09SDavid van Moolenbroek 		msg = "Network is down";
256*00b67f09SDavid van Moolenbroek 		break;
257*00b67f09SDavid van Moolenbroek 
258*00b67f09SDavid van Moolenbroek 	case WSAENETUNREACH:
259*00b67f09SDavid van Moolenbroek 		msg = "Network is unreachable";
260*00b67f09SDavid van Moolenbroek 		break;
261*00b67f09SDavid van Moolenbroek 
262*00b67f09SDavid van Moolenbroek 	case WSAENETRESET:
263*00b67f09SDavid van Moolenbroek 		msg = "Net connection reset";
264*00b67f09SDavid van Moolenbroek 		break;
265*00b67f09SDavid van Moolenbroek 
266*00b67f09SDavid van Moolenbroek 	case WSAECONNABORTED:
267*00b67f09SDavid van Moolenbroek 		msg = "Software caused connection abort";
268*00b67f09SDavid van Moolenbroek 		break;
269*00b67f09SDavid van Moolenbroek 
270*00b67f09SDavid van Moolenbroek 	case WSAECONNRESET:
271*00b67f09SDavid van Moolenbroek 		msg = "Connection reset by peer";
272*00b67f09SDavid van Moolenbroek 		break;
273*00b67f09SDavid van Moolenbroek 
274*00b67f09SDavid van Moolenbroek 	case WSAENOBUFS:
275*00b67f09SDavid van Moolenbroek 		msg = "No buffer space available";
276*00b67f09SDavid van Moolenbroek 		break;
277*00b67f09SDavid van Moolenbroek 
278*00b67f09SDavid van Moolenbroek 	case WSAEISCONN:
279*00b67f09SDavid van Moolenbroek 		msg = "Socket is already connected";
280*00b67f09SDavid van Moolenbroek 		break;
281*00b67f09SDavid van Moolenbroek 
282*00b67f09SDavid van Moolenbroek 	case WSAENOTCONN:
283*00b67f09SDavid van Moolenbroek 		msg = "Socket is not connected";
284*00b67f09SDavid van Moolenbroek 		break;
285*00b67f09SDavid van Moolenbroek 
286*00b67f09SDavid van Moolenbroek 	case WSAESHUTDOWN:
287*00b67f09SDavid van Moolenbroek 		msg = "Can't send after socket shutdown";
288*00b67f09SDavid van Moolenbroek 		break;
289*00b67f09SDavid van Moolenbroek 
290*00b67f09SDavid van Moolenbroek 	case WSAETOOMANYREFS:
291*00b67f09SDavid van Moolenbroek 		msg = "Too many references: can't splice";
292*00b67f09SDavid van Moolenbroek 		break;
293*00b67f09SDavid van Moolenbroek 
294*00b67f09SDavid van Moolenbroek 	case WSAETIMEDOUT:
295*00b67f09SDavid van Moolenbroek 		msg = "Connection timed out";
296*00b67f09SDavid van Moolenbroek 		break;
297*00b67f09SDavid van Moolenbroek 
298*00b67f09SDavid van Moolenbroek 	case WSAECONNREFUSED:
299*00b67f09SDavid van Moolenbroek 		msg = "Connection refused";
300*00b67f09SDavid van Moolenbroek 		break;
301*00b67f09SDavid van Moolenbroek 
302*00b67f09SDavid van Moolenbroek 	case WSAELOOP:
303*00b67f09SDavid van Moolenbroek 		msg = "Too many levels of symbolic links";
304*00b67f09SDavid van Moolenbroek 		break;
305*00b67f09SDavid van Moolenbroek 
306*00b67f09SDavid van Moolenbroek 	case WSAENAMETOOLONG:
307*00b67f09SDavid van Moolenbroek 		msg = "File name too long";
308*00b67f09SDavid van Moolenbroek 		break;
309*00b67f09SDavid van Moolenbroek 
310*00b67f09SDavid van Moolenbroek 	case WSAEHOSTDOWN:
311*00b67f09SDavid van Moolenbroek 		msg = "Host is down";
312*00b67f09SDavid van Moolenbroek 		break;
313*00b67f09SDavid van Moolenbroek 
314*00b67f09SDavid van Moolenbroek 	case WSAEHOSTUNREACH:
315*00b67f09SDavid van Moolenbroek 		msg = "No route to host";
316*00b67f09SDavid van Moolenbroek 		break;
317*00b67f09SDavid van Moolenbroek 
318*00b67f09SDavid van Moolenbroek 	case WSAENOTEMPTY:
319*00b67f09SDavid van Moolenbroek 		msg = "Directory not empty";
320*00b67f09SDavid van Moolenbroek 		break;
321*00b67f09SDavid van Moolenbroek 
322*00b67f09SDavid van Moolenbroek 	case WSAEPROCLIM:
323*00b67f09SDavid van Moolenbroek 		msg = "Too many processes";
324*00b67f09SDavid van Moolenbroek 		break;
325*00b67f09SDavid van Moolenbroek 
326*00b67f09SDavid van Moolenbroek 	case WSAEUSERS:
327*00b67f09SDavid van Moolenbroek 		msg = "Too many users";
328*00b67f09SDavid van Moolenbroek 		break;
329*00b67f09SDavid van Moolenbroek 
330*00b67f09SDavid van Moolenbroek 	case WSAEDQUOT:
331*00b67f09SDavid van Moolenbroek 		msg = "Disc quota exceeded";
332*00b67f09SDavid van Moolenbroek 		break;
333*00b67f09SDavid van Moolenbroek 
334*00b67f09SDavid van Moolenbroek 	case WSAESTALE:
335*00b67f09SDavid van Moolenbroek 		msg = "Stale NFS file handle";
336*00b67f09SDavid van Moolenbroek 		break;
337*00b67f09SDavid van Moolenbroek 
338*00b67f09SDavid van Moolenbroek 	case WSAEREMOTE:
339*00b67f09SDavid van Moolenbroek 		msg = "Too many levels of remote in path";
340*00b67f09SDavid van Moolenbroek 		break;
341*00b67f09SDavid van Moolenbroek 
342*00b67f09SDavid van Moolenbroek 	case WSASYSNOTREADY:
343*00b67f09SDavid van Moolenbroek 		msg = "Network system is unavailable";
344*00b67f09SDavid van Moolenbroek 		break;
345*00b67f09SDavid van Moolenbroek 
346*00b67f09SDavid van Moolenbroek 	case WSAVERNOTSUPPORTED:
347*00b67f09SDavid van Moolenbroek 		msg = "Winsock version out of range";
348*00b67f09SDavid van Moolenbroek 		break;
349*00b67f09SDavid van Moolenbroek 
350*00b67f09SDavid van Moolenbroek 	case WSANOTINITIALISED:
351*00b67f09SDavid van Moolenbroek 		msg = "WSAStartup not yet called";
352*00b67f09SDavid van Moolenbroek 		break;
353*00b67f09SDavid van Moolenbroek 
354*00b67f09SDavid van Moolenbroek 	case WSAEDISCON:
355*00b67f09SDavid van Moolenbroek 		msg = "Graceful shutdown in progress";
356*00b67f09SDavid van Moolenbroek 		break;
357*00b67f09SDavid van Moolenbroek /*
358*00b67f09SDavid van Moolenbroek 	case WSAHOST_NOT_FOUND:
359*00b67f09SDavid van Moolenbroek 		msg = "Host not found";
360*00b67f09SDavid van Moolenbroek 		break;
361*00b67f09SDavid van Moolenbroek 
362*00b67f09SDavid van Moolenbroek 	case WSANO_DATA:
363*00b67f09SDavid van Moolenbroek 		msg = "No host data of that type was found";
364*00b67f09SDavid van Moolenbroek 		break;
365*00b67f09SDavid van Moolenbroek */
366*00b67f09SDavid van Moolenbroek 	default:
367*00b67f09SDavid van Moolenbroek 		msg = NULL;
368*00b67f09SDavid van Moolenbroek 		break;
369*00b67f09SDavid van Moolenbroek 	}
370*00b67f09SDavid van Moolenbroek 	return (msg);
371*00b67f09SDavid van Moolenbroek }
372*00b67f09SDavid van Moolenbroek 
373*00b67f09SDavid van Moolenbroek /*
374*00b67f09SDavid van Moolenbroek  * These error messages are more informative about CryptAPI Errors than the
375*00b67f09SDavid van Moolenbroek  * standard error messages
376*00b67f09SDavid van Moolenbroek  */
377*00b67f09SDavid van Moolenbroek 
378*00b67f09SDavid van Moolenbroek char *
GetCryptErrorMessage(int errval)379*00b67f09SDavid van Moolenbroek GetCryptErrorMessage(int errval) {
380*00b67f09SDavid van Moolenbroek 	char *msg;
381*00b67f09SDavid van Moolenbroek 
382*00b67f09SDavid van Moolenbroek 	switch (errval) {
383*00b67f09SDavid van Moolenbroek 
384*00b67f09SDavid van Moolenbroek 	case NTE_BAD_FLAGS:
385*00b67f09SDavid van Moolenbroek 		msg = "The dwFlags parameter has an illegal value.";
386*00b67f09SDavid van Moolenbroek 		break;
387*00b67f09SDavid van Moolenbroek 	case NTE_BAD_KEYSET:
388*00b67f09SDavid van Moolenbroek 		msg = "The Registry entry for the key container "
389*00b67f09SDavid van Moolenbroek 			"could not be opened and may not exist.";
390*00b67f09SDavid van Moolenbroek 		break;
391*00b67f09SDavid van Moolenbroek 	case NTE_BAD_KEYSET_PARAM:
392*00b67f09SDavid van Moolenbroek 		msg = "The pszContainer or pszProvider parameter "
393*00b67f09SDavid van Moolenbroek 			"is set to an illegal value.";
394*00b67f09SDavid van Moolenbroek 		break;
395*00b67f09SDavid van Moolenbroek 	case NTE_BAD_PROV_TYPE:
396*00b67f09SDavid van Moolenbroek 		msg = "The value of the dwProvType parameter is out "
397*00b67f09SDavid van Moolenbroek 			"of range. All provider types must be from "
398*00b67f09SDavid van Moolenbroek 			"1 to 999, inclusive.";
399*00b67f09SDavid van Moolenbroek 		break;
400*00b67f09SDavid van Moolenbroek 	case NTE_BAD_SIGNATURE:
401*00b67f09SDavid van Moolenbroek 		msg = "The provider DLL signature did not verify "
402*00b67f09SDavid van Moolenbroek 			"correctly. Either the DLL or the digital "
403*00b67f09SDavid van Moolenbroek 			"signature has been tampered with.";
404*00b67f09SDavid van Moolenbroek 		break;
405*00b67f09SDavid van Moolenbroek 	case NTE_EXISTS:
406*00b67f09SDavid van Moolenbroek 		msg = "The dwFlags parameter is CRYPT_NEWKEYSET, but the key"
407*00b67f09SDavid van Moolenbroek 		      " container already exists.";
408*00b67f09SDavid van Moolenbroek 		break;
409*00b67f09SDavid van Moolenbroek 	case NTE_KEYSET_ENTRY_BAD:
410*00b67f09SDavid van Moolenbroek 		msg = "The Registry entry for the pszContainer key container "
411*00b67f09SDavid van Moolenbroek 		      "was found (in the HKEY_CURRENT_USER window), but is "
412*00b67f09SDavid van Moolenbroek 		      "corrupt. See the section System Administration for "
413*00b67f09SDavid van Moolenbroek 		      " etails about CryptoAPI's Registry usage.";
414*00b67f09SDavid van Moolenbroek 		break;
415*00b67f09SDavid van Moolenbroek 	case NTE_KEYSET_NOT_DEF:
416*00b67f09SDavid van Moolenbroek 		msg = "No Registry entry exists in the HKEY_CURRENT_USER "
417*00b67f09SDavid van Moolenbroek 			"window for the key container specified by "
418*00b67f09SDavid van Moolenbroek 			"pszContainer.";
419*00b67f09SDavid van Moolenbroek 		break;
420*00b67f09SDavid van Moolenbroek 	case NTE_NO_MEMORY:
421*00b67f09SDavid van Moolenbroek 		msg = "The CSP ran out of memory during the operation.";
422*00b67f09SDavid van Moolenbroek 		break;
423*00b67f09SDavid van Moolenbroek 	case NTE_PROV_DLL_NOT_FOUND:
424*00b67f09SDavid van Moolenbroek 		msg = "The provider DLL file does not exist or is not on the "
425*00b67f09SDavid van Moolenbroek 		      "current path.";
426*00b67f09SDavid van Moolenbroek 		break;
427*00b67f09SDavid van Moolenbroek 	case NTE_PROV_TYPE_ENTRY_BAD:
428*00b67f09SDavid van Moolenbroek 		msg = "The Registry entry for the provider type specified by "
429*00b67f09SDavid van Moolenbroek 		      "dwProvType is corrupt. This error may relate to "
430*00b67f09SDavid van Moolenbroek 		      "either the user default CSP list or the machine "
431*00b67f09SDavid van Moolenbroek 		      "default CSP list. See the section System "
432*00b67f09SDavid van Moolenbroek 		      "Administration for details about CryptoAPI's "
433*00b67f09SDavid van Moolenbroek 		      "Registry usage.";
434*00b67f09SDavid van Moolenbroek 		break;
435*00b67f09SDavid van Moolenbroek 	case NTE_PROV_TYPE_NO_MATCH:
436*00b67f09SDavid van Moolenbroek 		msg = "The provider type specified by dwProvType does not "
437*00b67f09SDavid van Moolenbroek 		      "match the provider type found in the Registry. Note "
438*00b67f09SDavid van Moolenbroek 		      "that this error can only occur when pszProvider "
439*00b67f09SDavid van Moolenbroek 		      "specifies an actual CSP name.";
440*00b67f09SDavid van Moolenbroek 		break;
441*00b67f09SDavid van Moolenbroek 	case NTE_PROV_TYPE_NOT_DEF:
442*00b67f09SDavid van Moolenbroek 		msg = "No Registry entry exists for the provider type "
443*00b67f09SDavid van Moolenbroek 		      "specified by dwProvType.";
444*00b67f09SDavid van Moolenbroek 		break;
445*00b67f09SDavid van Moolenbroek 	case NTE_PROVIDER_DLL_FAIL:
446*00b67f09SDavid van Moolenbroek 		msg = "The provider DLL file could not be loaded, and "
447*00b67f09SDavid van Moolenbroek 		      "may not exist. If it exists, then the file is "
448*00b67f09SDavid van Moolenbroek 		      "not a valid DLL.";
449*00b67f09SDavid van Moolenbroek 		break;
450*00b67f09SDavid van Moolenbroek 	case NTE_SIGNATURE_FILE_BAD:
451*00b67f09SDavid van Moolenbroek 		msg = "An error occurred while loading the DLL file image, "
452*00b67f09SDavid van Moolenbroek 		      "prior to verifying its signature.";
453*00b67f09SDavid van Moolenbroek 		break;
454*00b67f09SDavid van Moolenbroek 
455*00b67f09SDavid van Moolenbroek 	default:
456*00b67f09SDavid van Moolenbroek 		msg = NULL;
457*00b67f09SDavid van Moolenbroek 		break;
458*00b67f09SDavid van Moolenbroek 	}
459*00b67f09SDavid van Moolenbroek 	return msg;
460*00b67f09SDavid van Moolenbroek }
461*00b67f09SDavid van Moolenbroek 
462