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