1/*
2 * tclWinError.c --
3 *
4 *	This file contains code for converting from Win32 errors to
5 *	errno errors.
6 *
7 * Copyright (c) 1995-1996 by Sun Microsystems, Inc.
8 *
9 * See the file "license.terms" for information on usage and redistribution
10 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
11 *
12 * RCS: @(#) $Id: tclWinError.c,v 1.5 2002/05/27 10:14:21 dkf Exp $
13 */
14
15#include "tclWinInt.h"
16
17/*
18 * The following table contains the mapping from Win32 errors to
19 * errno errors.
20 */
21
22static char errorTable[] = {
23    0,
24    EINVAL,	/* ERROR_INVALID_FUNCTION	1 */
25    ENOENT,	/* ERROR_FILE_NOT_FOUND		2 */
26    ENOENT,	/* ERROR_PATH_NOT_FOUND		3 */
27    EMFILE,	/* ERROR_TOO_MANY_OPEN_FILES	4 */
28    EACCES,	/* ERROR_ACCESS_DENIED		5 */
29    EBADF,	/* ERROR_INVALID_HANDLE		6 */
30    ENOMEM,	/* ERROR_ARENA_TRASHED		7 */
31    ENOMEM,	/* ERROR_NOT_ENOUGH_MEMORY	8 */
32    ENOMEM,	/* ERROR_INVALID_BLOCK		9 */
33    E2BIG,	/* ERROR_BAD_ENVIRONMENT	10 */
34    ENOEXEC,	/* ERROR_BAD_FORMAT		11 */
35    EACCES,	/* ERROR_INVALID_ACCESS		12 */
36    EINVAL,	/* ERROR_INVALID_DATA		13 */
37    EFAULT,	/* ERROR_OUT_OF_MEMORY		14 */
38    ENOENT,	/* ERROR_INVALID_DRIVE		15 */
39    EACCES,	/* ERROR_CURRENT_DIRECTORY	16 */
40    EXDEV,	/* ERROR_NOT_SAME_DEVICE	17 */
41    ENOENT,	/* ERROR_NO_MORE_FILES		18 */
42    EROFS,	/* ERROR_WRITE_PROTECT		19 */
43    ENXIO,	/* ERROR_BAD_UNIT		20 */
44    EBUSY,	/* ERROR_NOT_READY		21 */
45    EIO,	/* ERROR_BAD_COMMAND		22 */
46    EIO,	/* ERROR_CRC			23 */
47    EIO,	/* ERROR_BAD_LENGTH		24 */
48    EIO,	/* ERROR_SEEK			25 */
49    EIO,	/* ERROR_NOT_DOS_DISK		26 */
50    ENXIO,	/* ERROR_SECTOR_NOT_FOUND	27 */
51    EBUSY,	/* ERROR_OUT_OF_PAPER		28 */
52    EIO,	/* ERROR_WRITE_FAULT		29 */
53    EIO,	/* ERROR_READ_FAULT		30 */
54    EIO,	/* ERROR_GEN_FAILURE		31 */
55    EACCES,	/* ERROR_SHARING_VIOLATION	32 */
56    EACCES,	/* ERROR_LOCK_VIOLATION		33 */
57    ENXIO,	/* ERROR_WRONG_DISK		34 */
58    ENFILE,	/* ERROR_FCB_UNAVAILABLE	35 */
59    ENFILE,	/* ERROR_SHARING_BUFFER_EXCEEDED	36 */
60    EINVAL,	/* 37 */
61    EINVAL,	/* 38 */
62    ENOSPC,	/* ERROR_HANDLE_DISK_FULL	39 */
63    EINVAL,	/* 40 */
64    EINVAL,	/* 41 */
65    EINVAL,	/* 42 */
66    EINVAL,	/* 43 */
67    EINVAL,	/* 44 */
68    EINVAL,	/* 45 */
69    EINVAL,	/* 46 */
70    EINVAL,	/* 47 */
71    EINVAL,	/* 48 */
72    EINVAL,	/* 49 */
73    ENODEV,	/* ERROR_NOT_SUPPORTED		50 */
74    EBUSY,	/* ERROR_REM_NOT_LIST		51 */
75    EEXIST,	/* ERROR_DUP_NAME		52 */
76    ENOENT,	/* ERROR_BAD_NETPATH		53 */
77    EBUSY,	/* ERROR_NETWORK_BUSY		54 */
78    ENODEV,	/* ERROR_DEV_NOT_EXIST		55 */
79    EAGAIN,	/* ERROR_TOO_MANY_CMDS		56 */
80    EIO,	/* ERROR_ADAP_HDW_ERR		57 */
81    EIO,	/* ERROR_BAD_NET_RESP		58 */
82    EIO,	/* ERROR_UNEXP_NET_ERR		59 */
83    EINVAL,	/* ERROR_BAD_REM_ADAP		60 */
84    EFBIG,	/* ERROR_PRINTQ_FULL		61 */
85    ENOSPC,	/* ERROR_NO_SPOOL_SPACE		62 */
86    ENOENT,	/* ERROR_PRINT_CANCELLED	63 */
87    ENOENT,	/* ERROR_NETNAME_DELETED	64 */
88    EACCES,	/* ERROR_NETWORK_ACCESS_DENIED	65 */
89    ENODEV,	/* ERROR_BAD_DEV_TYPE		66 */
90    ENOENT,	/* ERROR_BAD_NET_NAME		67 */
91    ENFILE,	/* ERROR_TOO_MANY_NAMES		68 */
92    EIO,	/* ERROR_TOO_MANY_SESS		69 */
93    EAGAIN,	/* ERROR_SHARING_PAUSED		70 */
94    EINVAL,	/* ERROR_REQ_NOT_ACCEP		71 */
95    EAGAIN,	/* ERROR_REDIR_PAUSED		72 */
96    EINVAL,	/* 73 */
97    EINVAL,	/* 74 */
98    EINVAL,	/* 75 */
99    EINVAL,	/* 76 */
100    EINVAL,	/* 77 */
101    EINVAL,	/* 78 */
102    EINVAL,	/* 79 */
103    EEXIST,	/* ERROR_FILE_EXISTS		80 */
104    EINVAL,	/* 81 */
105    ENOSPC,	/* ERROR_CANNOT_MAKE		82 */
106    EIO,	/* ERROR_FAIL_I24		83 */
107    ENFILE,	/* ERROR_OUT_OF_STRUCTURES	84 */
108    EEXIST,	/* ERROR_ALREADY_ASSIGNED	85 */
109    EPERM,	/* ERROR_INVALID_PASSWORD	86 */
110    EINVAL,	/* ERROR_INVALID_PARAMETER	87 */
111    EIO,	/* ERROR_NET_WRITE_FAULT	88 */
112    EAGAIN,	/* ERROR_NO_PROC_SLOTS		89 */
113    EINVAL,	/* 90 */
114    EINVAL,	/* 91 */
115    EINVAL,	/* 92 */
116    EINVAL,	/* 93 */
117    EINVAL,	/* 94 */
118    EINVAL,	/* 95 */
119    EINVAL,	/* 96 */
120    EINVAL,	/* 97 */
121    EINVAL,	/* 98 */
122    EINVAL,	/* 99 */
123    EINVAL,	/* 100 */
124    EINVAL,	/* 101 */
125    EINVAL,	/* 102 */
126    EINVAL,	/* 103 */
127    EINVAL,	/* 104 */
128    EINVAL,	/* 105 */
129    EINVAL,	/* 106 */
130    EXDEV,	/* ERROR_DISK_CHANGE		107 */
131    EAGAIN,	/* ERROR_DRIVE_LOCKED		108 */
132    EPIPE,	/* ERROR_BROKEN_PIPE		109 */
133    ENOENT,	/* ERROR_OPEN_FAILED		110 */
134    EINVAL,	/* ERROR_BUFFER_OVERFLOW	111 */
135    ENOSPC,	/* ERROR_DISK_FULL		112 */
136    EMFILE,	/* ERROR_NO_MORE_SEARCH_HANDLES	113 */
137    EBADF,	/* ERROR_INVALID_TARGET_HANDLE	114 */
138    EFAULT,	/* ERROR_PROTECTION_VIOLATION	115 */
139    EINVAL,	/* 116 */
140    EINVAL,	/* 117 */
141    EINVAL,	/* 118 */
142    EINVAL,	/* 119 */
143    EINVAL,	/* 120 */
144    EINVAL,	/* 121 */
145    EINVAL,	/* 122 */
146    ENOENT,	/* ERROR_INVALID_NAME		123 */
147    EINVAL,	/* 124 */
148    EINVAL,	/* 125 */
149    EINVAL,	/* 126 */
150    EINVAL,	/* ERROR_PROC_NOT_FOUND		127 */
151    ECHILD,	/* ERROR_WAIT_NO_CHILDREN	128 */
152    ECHILD,	/* ERROR_CHILD_NOT_COMPLETE	129 */
153    EBADF,	/* ERROR_DIRECT_ACCESS_HANDLE	130 */
154    EINVAL,	/* ERROR_NEGATIVE_SEEK		131 */
155    ESPIPE,	/* ERROR_SEEK_ON_DEVICE		132 */
156    EINVAL,	/* 133 */
157    EINVAL,	/* 134 */
158    EINVAL,	/* 135 */
159    EINVAL,	/* 136 */
160    EINVAL,	/* 137 */
161    EINVAL,	/* 138 */
162    EINVAL,	/* 139 */
163    EINVAL,	/* 140 */
164    EINVAL,	/* 141 */
165    EAGAIN,	/* ERROR_BUSY_DRIVE		142 */
166    EINVAL,	/* 143 */
167    EINVAL,	/* 144 */
168    EEXIST,	/* ERROR_DIR_NOT_EMPTY		145 */
169    EINVAL,	/* 146 */
170    EINVAL,	/* 147 */
171    EINVAL,	/* 148 */
172    EINVAL,	/* 149 */
173    EINVAL,	/* 150 */
174    EINVAL,	/* 151 */
175    EINVAL,	/* 152 */
176    EINVAL,	/* 153 */
177    EINVAL,	/* 154 */
178    EINVAL,	/* 155 */
179    EINVAL,	/* 156 */
180    EINVAL,	/* 157 */
181    EACCES,	/* ERROR_NOT_LOCKED		158 */
182    EINVAL,	/* 159 */
183    EINVAL,	/* 160 */
184    ENOENT,	/* ERROR_BAD_PATHNAME	        161 */
185    EINVAL,	/* 162 */
186    EINVAL,	/* 163 */
187    EINVAL,	/* 164 */
188    EINVAL,	/* 165 */
189    EINVAL,	/* 166 */
190    EACCES,	/* ERROR_LOCK_FAILED		167 */
191    EINVAL,	/* 168 */
192    EINVAL,	/* 169 */
193    EINVAL,	/* 170 */
194    EINVAL,	/* 171 */
195    EINVAL,	/* 172 */
196    EINVAL,	/* 173 */
197    EINVAL,	/* 174 */
198    EINVAL,	/* 175 */
199    EINVAL,	/* 176 */
200    EINVAL,	/* 177 */
201    EINVAL,	/* 178 */
202    EINVAL,	/* 179 */
203    EINVAL,	/* 180 */
204    EINVAL,	/* 181 */
205    EINVAL,	/* 182 */
206    EEXIST,	/* ERROR_ALREADY_EXISTS		183 */
207    ECHILD,	/* ERROR_NO_CHILD_PROCESS	184 */
208    EINVAL,	/* 185 */
209    EINVAL,	/* 186 */
210    EINVAL,	/* 187 */
211    EINVAL,	/* 188 */
212    EINVAL,	/* 189 */
213    EINVAL,	/* 190 */
214    EINVAL,	/* 191 */
215    EINVAL,	/* 192 */
216    EINVAL,	/* 193 */
217    EINVAL,	/* 194 */
218    EINVAL,	/* 195 */
219    EINVAL,	/* 196 */
220    EINVAL,	/* 197 */
221    EINVAL,	/* 198 */
222    EINVAL,	/* 199 */
223    EINVAL,	/* 200 */
224    EINVAL,	/* 201 */
225    EINVAL,	/* 202 */
226    EINVAL,	/* 203 */
227    EINVAL,	/* 204 */
228    EINVAL,	/* 205 */
229    ENAMETOOLONG,/* ERROR_FILENAME_EXCED_RANGE	206 */
230    EINVAL,	/* 207 */
231    EINVAL,	/* 208 */
232    EINVAL,	/* 209 */
233    EINVAL,	/* 210 */
234    EINVAL,	/* 211 */
235    EINVAL,	/* 212 */
236    EINVAL,	/* 213 */
237    EINVAL,	/* 214 */
238    EINVAL,	/* 215 */
239    EINVAL,	/* 216 */
240    EINVAL,	/* 217 */
241    EINVAL,	/* 218 */
242    EINVAL,	/* 219 */
243    EINVAL,	/* 220 */
244    EINVAL,	/* 221 */
245    EINVAL,	/* 222 */
246    EINVAL,	/* 223 */
247    EINVAL,	/* 224 */
248    EINVAL,	/* 225 */
249    EINVAL,	/* 226 */
250    EINVAL,	/* 227 */
251    EINVAL,	/* 228 */
252    EINVAL,	/* 229 */
253    EPIPE,	/* ERROR_BAD_PIPE		230 */
254    EAGAIN,	/* ERROR_PIPE_BUSY		231 */
255    EPIPE,	/* ERROR_NO_DATA		232 */
256    EPIPE,	/* ERROR_PIPE_NOT_CONNECTED	233 */
257    EINVAL,	/* 234 */
258    EINVAL,	/* 235 */
259    EINVAL,	/* 236 */
260    EINVAL,	/* 237 */
261    EINVAL,	/* 238 */
262    EINVAL,	/* 239 */
263    EINVAL,	/* 240 */
264    EINVAL,	/* 241 */
265    EINVAL,	/* 242 */
266    EINVAL,	/* 243 */
267    EINVAL,	/* 244 */
268    EINVAL,	/* 245 */
269    EINVAL,	/* 246 */
270    EINVAL,	/* 247 */
271    EINVAL,	/* 248 */
272    EINVAL,	/* 249 */
273    EINVAL,	/* 250 */
274    EINVAL,	/* 251 */
275    EINVAL,	/* 252 */
276    EINVAL,	/* 253 */
277    EINVAL,	/* 254 */
278    EINVAL,	/* 255 */
279    EINVAL,	/* 256 */
280    EINVAL,	/* 257 */
281    EINVAL,	/* 258 */
282    EINVAL,	/* 259 */
283    EINVAL,	/* 260 */
284    EINVAL,	/* 261 */
285    EINVAL,	/* 262 */
286    EINVAL,	/* 263 */
287    EINVAL,	/* 264 */
288    EINVAL,	/* 265 */
289    EINVAL,	/* 266 */
290    ENOTDIR,	/* ERROR_DIRECTORY		267 */
291};
292
293static const unsigned int tableLen = sizeof(errorTable);
294
295/*
296 * The following table contains the mapping from WinSock errors to
297 * errno errors.
298 */
299
300static int wsaErrorTable[] = {
301    EWOULDBLOCK,	/* WSAEWOULDBLOCK */
302    EINPROGRESS,	/* WSAEINPROGRESS */
303    EALREADY,		/* WSAEALREADY */
304    ENOTSOCK,		/* WSAENOTSOCK */
305    EDESTADDRREQ,	/* WSAEDESTADDRREQ */
306    EMSGSIZE,		/* WSAEMSGSIZE */
307    EPROTOTYPE,		/* WSAEPROTOTYPE */
308    ENOPROTOOPT,	/* WSAENOPROTOOPT */
309    EPROTONOSUPPORT,	/* WSAEPROTONOSUPPORT */
310    ESOCKTNOSUPPORT,	/* WSAESOCKTNOSUPPORT */
311    EOPNOTSUPP,		/* WSAEOPNOTSUPP */
312    EPFNOSUPPORT,	/* WSAEPFNOSUPPORT */
313    EAFNOSUPPORT,	/* WSAEAFNOSUPPORT */
314    EADDRINUSE,		/* WSAEADDRINUSE */
315    EADDRNOTAVAIL,	/* WSAEADDRNOTAVAIL */
316    ENETDOWN,		/* WSAENETDOWN */
317    ENETUNREACH,	/* WSAENETUNREACH */
318    ENETRESET,		/* WSAENETRESET */
319    ECONNABORTED,	/* WSAECONNABORTED */
320    ECONNRESET,		/* WSAECONNRESET */
321    ENOBUFS,		/* WSAENOBUFS */
322    EISCONN,		/* WSAEISCONN */
323    ENOTCONN,		/* WSAENOTCONN */
324    ESHUTDOWN,		/* WSAESHUTDOWN */
325    ETOOMANYREFS,	/* WSAETOOMANYREFS */
326    ETIMEDOUT,		/* WSAETIMEDOUT */
327    ECONNREFUSED,	/* WSAECONNREFUSED */
328    ELOOP,		/* WSAELOOP */
329    ENAMETOOLONG,	/* WSAENAMETOOLONG */
330    EHOSTDOWN,		/* WSAEHOSTDOWN */
331    EHOSTUNREACH,	/* WSAEHOSTUNREACH */
332    ENOTEMPTY,		/* WSAENOTEMPTY */
333    EAGAIN,		/* WSAEPROCLIM */
334    EUSERS,		/* WSAEUSERS */
335    EDQUOT,		/* WSAEDQUOT */
336    ESTALE,		/* WSAESTALE */
337    EREMOTE,		/* WSAEREMOTE */
338};
339
340/*
341 *----------------------------------------------------------------------
342 *
343 * TclWinConvertError --
344 *
345 *	This routine converts a Win32 error into an errno value.
346 *
347 * Results:
348 *	None.
349 *
350 * Side effects:
351 *	Sets the errno global variable.
352 *
353 *----------------------------------------------------------------------
354 */
355
356void
357TclWinConvertError(errCode)
358    DWORD errCode;		/* Win32 error code. */
359{
360    if (errCode >= tableLen) {
361	Tcl_SetErrno(EINVAL);
362    } else {
363	Tcl_SetErrno(errorTable[errCode]);
364    }
365}
366
367/*
368 *----------------------------------------------------------------------
369 *
370 * TclWinConvertWSAError --
371 *
372 *	This routine converts a WinSock error into an errno value.
373 *
374 * Results:
375 *	None.
376 *
377 * Side effects:
378 *	Sets the errno global variable.
379 *
380 *----------------------------------------------------------------------
381 */
382
383void
384TclWinConvertWSAError(errCode)
385    DWORD errCode;		/* Win32 error code. */
386{
387    if ((errCode >= WSAEWOULDBLOCK) && (errCode <= WSAEREMOTE)) {
388	Tcl_SetErrno(wsaErrorTable[errCode - WSAEWOULDBLOCK]);
389    } else {
390	Tcl_SetErrno(EINVAL);
391    }
392}
393