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 2005/11/04 00:06:50 dkf Exp $ |
---|
13 | */ |
---|
14 | |
---|
15 | #include "tclInt.h" |
---|
16 | |
---|
17 | /* |
---|
18 | * The following table contains the mapping from Win32 errors to errno errors. |
---|
19 | */ |
---|
20 | |
---|
21 | static 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 | |
---|
292 | static const unsigned int tableLen = sizeof(errorTable); |
---|
293 | |
---|
294 | /* |
---|
295 | * The following table contains the mapping from WinSock errors to |
---|
296 | * errno errors. |
---|
297 | */ |
---|
298 | |
---|
299 | static 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 | |
---|
355 | void |
---|
356 | TclWinConvertError( |
---|
357 | DWORD 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 | |
---|
382 | void |
---|
383 | TclWinConvertWSAError( |
---|
384 | DWORD 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 | } |
---|