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